From c0c195331c7c0383b634a9d848bd82af96d81eab Mon Sep 17 00:00:00 2001 From: ZXCLI Date: Fri, 12 Jun 2026 16:22:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 28379d_P_SFRA/.ccsproject | 12 + 28379d_P_SFRA/.clangd | 8 + 28379d_P_SFRA/.cproject | 215 + 28379d_P_SFRA/.project | 37 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 15 + 28379d_P_SFRA/.theia/launch.json | 71 + 28379d_P_SFRA/2837xD_FLASH_lnk_cpu1.cmd | 182 + 28379d_P_SFRA/2837xD_RAM_lnk_cpu1.cmd | 141 + .../clangd/index/_defs.h.39F345F2FD66E401.idx | Bin 0 -> 5788 bytes .../index/_limits.h.344B2116E1D94CB5.idx | Bin 0 -> 958 bytes .../index/_stdint.h.197BC6D65EA02101.idx | Bin 0 -> 1560 bytes .../index/_stdint.h.415269F042D2A201.idx | Bin 0 -> 1486 bytes .../index/_stdint40.h.7C423B932F3FDFD8.idx | Bin 0 -> 242 bytes .../index/_string.h.831697C7DD4F5E2D.idx | Bin 0 -> 798 bytes .../index/_ti_config.h.EAEED0DE25AF55A1.idx | Bin 0 -> 500 bytes .../index/_types.h.9B6053A3B460A657.idx | Bin 0 -> 4000 bytes .../index/_types.h.A7E3BCDCA3D52814.idx | Bin 0 -> 3888 bytes .../clangd/index/adc.h.7643FFA0F0495BDB.idx | Bin 0 -> 71682 bytes .../index/asysctl.h.6B7A1E576DB00B93.idx | Bin 0 -> 2396 bytes .../clangd/index/board.c.0C2E67B58D684010.idx | Bin 0 -> 1518 bytes .../clangd/index/board.c.6F44E7CA7D811DD7.idx | Bin 0 -> 2774 bytes .../clangd/index/board.c.D97F0BFC00085C2D.idx | Bin 0 -> 2768 bytes .../clangd/index/board.h.6B9DDD0CD960ED8F.idx | Bin 0 -> 1270 bytes .../clangd/index/board.h.B602F7E483353EDA.idx | Bin 0 -> 1686 bytes .../clangd/index/board.h.C366A3B4A21CF1C9.idx | Bin 0 -> 1626 bytes ...c2000ware_libraries.c.15324FE04D019F7A.idx | Bin 0 -> 362 bytes ...c2000ware_libraries.c.68B17F5345C3DF40.idx | Bin 0 -> 376 bytes ...c2000ware_libraries.c.F0FF8E40920652CE.idx | Bin 0 -> 382 bytes ...c2000ware_libraries.h.C36DB41F135CB14E.idx | Bin 0 -> 478 bytes ...c2000ware_libraries.h.CB1FADC4790BDAB1.idx | Bin 0 -> 458 bytes ...c2000ware_libraries.h.E7563C27A6820166.idx | Bin 0 -> 390 bytes .../clangd/index/can.h.9E3FC4B8900B7465.idx | Bin 0 -> 174 bytes .../clangd/index/cdefs.h.543ADD3A5BABD5D3.idx | Bin 0 -> 2648 bytes .../clangd/index/cla.h.5DC7BC19533B3061.idx | Bin 0 -> 2436 bytes .../clangd/index/clb.h.56151511229BBA8B.idx | Bin 0 -> 53894 bytes .../index/clocktree.h.66134BD5011CCAA1.idx | Bin 0 -> 374 bytes .../clangd/index/cmpss.h.59945CDA950EB7D6.idx | Bin 0 -> 35734 bytes .../clangd/index/cpu.h.F8DE4A1566FF8E5C.idx | Bin 0 -> 1070 bytes .../index/cputimer.h.192BC9D5B45FA0AC.idx | Bin 0 -> 180 bytes .../clangd/index/dac.h.37C11C37B22880CC.idx | Bin 0 -> 13934 bytes .../clangd/index/dcsm.h.CB1085BAF53705B4.idx | Bin 0 -> 21114 bytes .../clangd/index/debug.h.DB49613BE03FB157.idx | Bin 0 -> 762 bytes .../index/device.c.0B8A578C07DBB270.idx | Bin 0 -> 15466 bytes .../index/device.c.986757CC17904C43.idx | Bin 0 -> 15496 bytes .../index/device.c.D0CBA94E9FDF489A.idx | Bin 0 -> 15488 bytes .../index/device.h.1D43A9D0D509FAB8.idx | Bin 0 -> 7182 bytes .../index/device.h.37057073C9A08AAB.idx | Bin 0 -> 7124 bytes .../index/device.h.B30C87AC9A848133.idx | Bin 0 -> 7206 bytes .../clangd/index/dma.h.780BE45E34CDCB6E.idx | Bin 0 -> 38708 bytes ...terminology_mapping.h.2717AD4B05C9ECCA.idx | Bin 0 -> 1450 bytes .../index/driverlib.h.145F05FD2B7B5404.idx | Bin 0 -> 3118 bytes .../index/driverlib.h.65EB2857F01F4A36.idx | Bin 0 -> 3108 bytes .../index/driverlib.h.F78186796B611663.idx | Bin 0 -> 3114 bytes .../clangd/index/ecap.h.2E6968E1813CA158.idx | Bin 0 -> 33320 bytes .../clangd/index/emif.h.E89C81E8E7479F41.idx | Bin 0 -> 36266 bytes ...mpty_driverlib_main.c.6F76583ADBF50123.idx | Bin 0 -> 764 bytes .../clangd/index/epwm.h.D42342DF6DDB1774.idx | Bin 0 -> 239976 bytes .../clangd/index/eqep.h.C6DD593B893B2934.idx | Bin 0 -> 48976 bytes .../index/fast_tri.c.3109B13531C2F3DC.idx | Bin 0 -> 1778 bytes .../index/fast_tri.c.3D42EC1E511A716C.idx | Bin 0 -> 1798 bytes .../index/fast_tri.c.7769E057D87727EE.idx | Bin 0 -> 1762 bytes .../index/fast_tri.h.68CDEA8E023F06F3.idx | Bin 0 -> 1272 bytes .../index/fast_tri.h.7DC4267892CAA0F9.idx | Bin 0 -> 1236 bytes .../index/fast_tri.h.E2A5A60CA0C53E85.idx | Bin 0 -> 1252 bytes .../index/filter_rc.h.37AD27353E0A9129.idx | Bin 0 -> 1646 bytes .../index/filter_rc.h.99C0989066A77D2C.idx | Bin 0 -> 1636 bytes .../clangd/index/flash.h.1E1E2C72888579BA.idx | Bin 0 -> 39776 bytes .../clangd/index/gpio.h.FFF2FF8CA70DCFCF.idx | Bin 0 -> 34220 bytes .../clangd/index/hrpwm.h.A2071BEBB454D887.idx | Bin 0 -> 44058 bytes .../index/hw_adc.h.F20272F6A904DC5D.idx | Bin 0 -> 11678 bytes .../index/hw_asysctl.h.BCF2D572A8486A9C.idx | Bin 0 -> 1166 bytes .../index/hw_cla.h.9E23A77F9EA5338A.idx | Bin 0 -> 2392 bytes .../index/hw_clb.h.33180ACCDB02F349.idx | Bin 0 -> 8760 bytes .../index/hw_clbxbar.h.30EE3FFD6D0E8D7E.idx | Bin 0 -> 20198 bytes .../index/hw_cmpss.h.B0E48D704AE68711.idx | Bin 0 -> 2190 bytes .../index/hw_dac.h.441A3FDC9232B7C2.idx | Bin 0 -> 756 bytes .../index/hw_dcsm.h.ECF8E68D9B698C7E.idx | Bin 0 -> 6700 bytes .../index/hw_dma.h.373D68AD07CDEE71.idx | Bin 0 -> 1592 bytes .../index/hw_ecap.h.D8BB3575B7C3C83B.idx | Bin 0 -> 1730 bytes .../index/hw_emif.h.3A87699B60E548AB.idx | Bin 0 -> 3214 bytes .../index/hw_epwm.h.0433AC57B0811C1A.idx | Bin 0 -> 14682 bytes .../index/hw_epwmxbar.h.27E6C3826583F178.idx | Bin 0 -> 20184 bytes .../index/hw_eqep.h.B02F91094E1E775E.idx | Bin 0 -> 2970 bytes .../index/hw_flash.h.DDEDE01080B4D1A7.idx | Bin 0 -> 2530 bytes .../index/hw_gpio.h.41FA06E19287CD49.idx | Bin 0 -> 80276 bytes .../index/hw_hrpwm.h.062BC46FA06797A2.idx | Bin 0 -> 14684 bytes .../index/hw_i2c.h.EB302DDB2BB42BAD.idx | Bin 0 -> 2124 bytes .../index/hw_inputxbar.h.4DA7259243D37193.idx | Bin 0 -> 900 bytes .../index/hw_ints.h.8C00FF7FD800144E.idx | Bin 0 -> 3616 bytes .../index/hw_ipc.h.03E10185AF90B29F.idx | Bin 0 -> 4550 bytes .../index/hw_mcbsp.h.0C163392A534F83A.idx | Bin 0 -> 3462 bytes .../index/hw_memcfg.h.A519B1472C2C820F.idx | Bin 0 -> 10292 bytes .../index/hw_memmap.h.1F0EFD10F73ECB85.idx | Bin 0 -> 3930 bytes .../index/hw_nmi.h.F6208B23496C8165.idx | Bin 0 -> 1312 bytes .../index/hw_otp.h.2F365A12F0AEBBD3.idx | Bin 0 -> 366 bytes .../hw_outputxbar.h.3B8BA44E03A20CBF.idx | Bin 0 -> 21096 bytes ...clusive_terminology.h.0890348B2F7480A5.idx | Bin 0 -> 406 bytes .../index/hw_sci.h.82AC5C14D87F95F3.idx | Bin 0 -> 2000 bytes .../index/hw_sdfm.h.4C9266CD6A5311BB.idx | Bin 0 -> 4452 bytes .../index/hw_spi.h.51B150874501A7D3.idx | Bin 0 -> 1450 bytes .../index/hw_sysctl.h.818DA5A762DBC613.idx | Bin 0 -> 17282 bytes .../index/hw_types.h.3EE2C317F1D1EBC4.idx | Bin 0 -> 1118 bytes .../index/hw_upp.h.536226D452BC0CC1.idx | Bin 0 -> 3108 bytes .../index/hw_xbar.h.2EAA26D1296240AA.idx | Bin 0 -> 4552 bytes .../index/hw_xint.h.2027292CA87C8DCC.idx | Bin 0 -> 710 bytes .../clangd/index/i2c.h.7C76D219DDFBE67A.idx | Bin 0 -> 45338 bytes .../index/interrupt.h.72C09B09D23A1424.idx | Bin 0 -> 180 bytes .../clangd/index/ipc.h.0D3D6CDE1416C56D.idx | Bin 0 -> 31546 bytes .../index/libsfra.c.145BDE08646F4A0A.idx | Bin 0 -> 4506 bytes .../index/libsfra.c.473FB5CABF6EB2AC.idx | Bin 0 -> 4472 bytes .../index/libsfra.c.6202D2A6BB923FBF.idx | Bin 0 -> 4434 bytes .../index/libsfra.c.ACCD0CD37BC496C8.idx | Bin 0 -> 4418 bytes .../index/libsfra.h.51696F63CFB19E46.idx | Bin 0 -> 4204 bytes .../index/libsfra.h.A0CBF8B0662422E4.idx | Bin 0 -> 4408 bytes .../index/libsfra.h.DA60C8E49C152C9C.idx | Bin 0 -> 4408 bytes .../index/libsfra.h.E973DD7529BD6449.idx | Bin 0 -> 4220 bytes .../libsfra_config.h.C04FFCBFA24491DA.idx | Bin 0 -> 256 bytes .../libsfra_config.h.E2F8787514A45D20.idx | Bin 0 -> 256 bytes .../libsfra_test_c2000.c.65A029E46C9A85C9.idx | Bin 0 -> 218 bytes .../libsfra_ti_hal.c.B6CA10369432859E.idx | Bin 0 -> 4928 bytes .../libsfra_ti_hal.h.058FEEA52F352324.idx | Bin 0 -> 1542 bytes .../index/linkage.h.EFAF2659D07C2D82.idx | Bin 0 -> 328 bytes .../index/lowpass.h.84541DECAA7D5656.idx | Bin 0 -> 1586 bytes .../index/lowpass.h.9E9F47540CAE52AD.idx | Bin 0 -> 1594 bytes .../index/lowpass.h.CD2C4B20615A82E7.idx | Bin 0 -> 1596 bytes .../clangd/index/main.c.5E5ABC5F2D248B1F.idx | Bin 0 -> 806 bytes .../clangd/index/main.c.A351196A44ADCDD8.idx | Bin 0 -> 824 bytes .../clangd/index/main.c.BCB492FE2DB70AFD.idx | Bin 0 -> 764 bytes .../clangd/index/math.h.4BFF696D8B1CDAE8.idx | Bin 0 -> 17580 bytes .../clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx | Bin 0 -> 115374 bytes .../index/memcfg.h.CD2C1B5527DC931A.idx | Bin 0 -> 39238 bytes .../index/pin_map.h.6826F2A444524F26.idx | Bin 0 -> 16826 bytes .../pin_map_legacy.h.88A2DC44F63B02AD.idx | Bin 0 -> 752 bytes .../clangd/index/sci.h.E64A437F6118C151.idx | Bin 0 -> 47856 bytes .../clangd/index/sdfm.h.32C80F3732C73C66.idx | Bin 0 -> 32954 bytes .../index/sfra-test.c.5893E44B82B216C6.idx | Bin 0 -> 2460 bytes .../index/sfra-test.c.EA6DA4E99BE72265.idx | Bin 0 -> 2612 bytes .../index/sfra-test.h.8E824D412DF67181.idx | Bin 0 -> 312 bytes .../index/sfra_f32.c.98B4DD83BE82CAB5.idx | Bin 0 -> 13212 bytes .../index/sfra_f32.h.0C3253801F259A0F.idx | Bin 0 -> 7314 bytes .../index/sfra_f32.h.2D157CAC91C1DCCB.idx | Bin 0 -> 7330 bytes .../index/sfra_f32.h.3247C948FFD8A47A.idx | Bin 0 -> 7442 bytes .../index/sfra_f32.h.BF006D178E4BA6C0.idx | Bin 0 -> 7448 bytes ..._scicomms_driverlib.c.3CF6F5243B443559.idx | Bin 0 -> 14352 bytes ..._scicomms_driverlib.c.96F1BC03347E2CA1.idx | Bin 0 -> 14312 bytes ..._scicomms_driverlib.c.98F4E99A34ED2684.idx | Bin 0 -> 14340 bytes ..._scicomms_driverlib.h.81D800D165BC8F68.idx | Bin 0 -> 2924 bytes ..._scicomms_driverlib.h.CED1AE54E7A18FAD.idx | Bin 0 -> 2880 bytes ..._scicomms_driverlib.h.CED519BC40C71C6D.idx | Bin 0 -> 2868 bytes .../index/sfra_test.c.1AEF57FD49B949EB.idx | Bin 0 -> 2460 bytes .../index/sfra_test.c.CBB96F09F9A0FC32.idx | Bin 0 -> 2402 bytes .../index/sfra_test.c.CC8FF5B2CC920A3D.idx | Bin 0 -> 3726 bytes .../index/sfra_test.h.038257A9D02586F7.idx | Bin 0 -> 644 bytes .../index/sfra_test.h.1C76397F76896143.idx | Bin 0 -> 1552 bytes .../index/sfra_test.h.7F9797C53D5FB643.idx | Bin 0 -> 312 bytes .../clangd/index/spi.h.3FDB82D9CF0119F5.idx | Bin 0 -> 51042 bytes .../index/stdarg.h.A61B4A3DD19995EB.idx | Bin 0 -> 588 bytes .../index/stdbool.h.6D5F9834DD64C05A.idx | Bin 0 -> 422 bytes .../index/stddef.h.B9D639BB288EACD8.idx | Bin 0 -> 940 bytes .../index/stdint.h.2B221F242309F99E.idx | Bin 0 -> 2470 bytes .../index/stdint.h.C8EE9E4CF97EC8C9.idx | Bin 0 -> 550 bytes .../clangd/index/stdio.h.57070E279D9CC442.idx | Bin 0 -> 14234 bytes .../index/string.h.9E28FAFBAB9F1BE8.idx | Bin 0 -> 4784 bytes .../index/sysctl.h.344D1E9F41E13594.idx | Bin 0 -> 119316 bytes .../clangd/index/upp.h.BCE80B45D7E726CE.idx | Bin 0 -> 49892 bytes .../index/version.h.DF725F1B99C81115.idx | Bin 0 -> 924 bytes .../clangd/index/xbar.h.CF276281CCE6626E.idx | Bin 0 -> 65672 bytes .../CPU1_FLASH/.clangd/compile_commands.json | 42 + 28379d_P_SFRA/CPU1_FLASH/28379d.map | 783 ++ 28379d_P_SFRA/CPU1_FLASH/28379d.out | Bin 0 -> 120388 bytes 28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.map | 729 ++ 28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.out | Bin 0 -> 193772 bytes .../CPU1_FLASH/28379d_P_SFRA_linkInfo.xml | 9513 ++++++++++++++++ 28379d_P_SFRA/CPU1_FLASH/28379d_linkInfo.xml | 9226 +++++++++++++++ 28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.map | 823 ++ 28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.out | Bin 0 -> 134596 bytes .../CPU1_FLASH/28379d_test_SFRA_linkInfo.xml | 9553 ++++++++++++++++ .../CPU1_FLASH/LIBSFAR/subdir_rules.mk | 14 + .../CPU1_FLASH/LIBSFAR/subdir_vars.mk | 26 + 28379d_P_SFRA/CPU1_FLASH/LIBSFRA/fast_tri.d | 48 + .../CPU1_FLASH/LIBSFRA/subdir_rules.mk | 14 + .../CPU1_FLASH/LIBSFRA/subdir_vars.mk | 26 + 28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_f32.d | 51 + 28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_f32.obj | Bin 0 -> 65900 bytes .../SFRA/sfra_gui_scicomms_driverlib.d | 291 + .../SFRA/sfra_gui_scicomms_driverlib.obj | Bin 0 -> 91596 bytes 28379d_P_SFRA/CPU1_FLASH/SFRA/subdir_rules.mk | 14 + 28379d_P_SFRA/CPU1_FLASH/SFRA/subdir_vars.mk | 32 + 28379d_P_SFRA/CPU1_FLASH/ccsObjs.opt | 12 + .../device/F2837xD_CodeStartBranch.obj | Bin 0 -> 3688 bytes 28379d_P_SFRA/CPU1_FLASH/device/device.d | 273 + 28379d_P_SFRA/CPU1_FLASH/device/device.obj | Bin 0 -> 28428 bytes .../CPU1_FLASH/device/subdir_rules.mk | 20 + .../CPU1_FLASH/device/subdir_vars.mk | 40 + .../CPU1_FLASH/empty_driverlib_main.d | 279 + 28379d_P_SFRA/CPU1_FLASH/main.d | 288 + 28379d_P_SFRA/CPU1_FLASH/main.obj | Bin 0 -> 5232 bytes 28379d_P_SFRA/CPU1_FLASH/makefile | 160 + 28379d_P_SFRA/CPU1_FLASH/objects.mk | 8 + 28379d_P_SFRA/CPU1_FLASH/sfra-test.d | 300 + 28379d_P_SFRA/CPU1_FLASH/sfra_test.d | 309 + 28379d_P_SFRA/CPU1_FLASH/sfra_test.obj | Bin 0 -> 67532 bytes 28379d_P_SFRA/CPU1_FLASH/sources.mk | 124 + 28379d_P_SFRA/CPU1_FLASH/subdir_rules.mk | 39 + 28379d_P_SFRA/CPU1_FLASH/subdir_vars.mk | 96 + 28379d_P_SFRA/CPU1_FLASH/syscfg/board.c | 154 + .../CPU1_FLASH/syscfg/board.cmd.genlibs | 20 + 28379d_P_SFRA/CPU1_FLASH/syscfg/board.d | 276 + 28379d_P_SFRA/CPU1_FLASH/syscfg/board.h | 142 + 28379d_P_SFRA/CPU1_FLASH/syscfg/board.json | 8 + 28379d_P_SFRA/CPU1_FLASH/syscfg/board.obj | Bin 0 -> 19916 bytes 28379d_P_SFRA/CPU1_FLASH/syscfg/board.opt | 21 + .../CPU1_FLASH/syscfg/c2000ware_libraries.c | 40 + .../syscfg/c2000ware_libraries.cmd.genlibs | 20 + .../CPU1_FLASH/syscfg/c2000ware_libraries.d | 279 + .../CPU1_FLASH/syscfg/c2000ware_libraries.h | 62 + .../CPU1_FLASH/syscfg/c2000ware_libraries.obj | Bin 0 -> 4288 bytes .../CPU1_FLASH/syscfg/c2000ware_libraries.opt | 0 28379d_P_SFRA/CPU1_FLASH/syscfg/clocktree.h | 208 + 28379d_P_SFRA/CPU1_FLASH/syscfg/pinmux.csv | 211 + .../CPU1_RAM/.clangd/compile_commands.json | 37 + 28379d_P_SFRA/SFRA/sfra_f32.c | 454 + 28379d_P_SFRA/SFRA/sfra_f32.h | 182 + .../SFRA/sfra_gui_scicomms_driverlib.c | 880 ++ .../SFRA/sfra_gui_scicomms_driverlib.h | 86 + 28379d_P_SFRA/c2000.syscfg | 42 + .../device/F2837xD_CodeStartBranch.asm | 112 + 28379d_P_SFRA/device/device.c | 706 ++ 28379d_P_SFRA/device/device.h | 395 + 28379d_P_SFRA/device/driverlib.h | 87 + 28379d_P_SFRA/device/driverlib/adc.c | 342 + 28379d_P_SFRA/device/driverlib/adc.h | 2098 ++++ 28379d_P_SFRA/device/driverlib/asysctl.c | 43 + 28379d_P_SFRA/device/driverlib/asysctl.h | 160 + 28379d_P_SFRA/device/driverlib/can.c | 1122 ++ 28379d_P_SFRA/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 + 28379d_P_SFRA/device/driverlib/cla.c | 89 + 28379d_P_SFRA/device/driverlib/cla.h | 984 ++ 28379d_P_SFRA/device/driverlib/clb.c | 145 + 28379d_P_SFRA/device/driverlib/clb.h | 1290 +++ 28379d_P_SFRA/device/driverlib/cmpss.c | 223 + 28379d_P_SFRA/device/driverlib/cmpss.h | 1325 +++ 28379d_P_SFRA/device/driverlib/cpu.h | 172 + 28379d_P_SFRA/device/driverlib/cputimer.c | 61 + 28379d_P_SFRA/device/driverlib/cputimer.h | 509 + 28379d_P_SFRA/device/driverlib/dac.c | 93 + 28379d_P_SFRA/device/driverlib/dac.h | 604 + 28379d_P_SFRA/device/driverlib/dcsm.c | 377 + 28379d_P_SFRA/device/driverlib/dcsm.h | 669 ++ 28379d_P_SFRA/device/driverlib/debug.h | 91 + 28379d_P_SFRA/device/driverlib/dma.c | 370 + 28379d_P_SFRA/device/driverlib/dma.h | 1171 ++ .../driver_inclusive_terminology_mapping.h | 109 + 28379d_P_SFRA/device/driverlib/ecap.c | 61 + 28379d_P_SFRA/device/driverlib/ecap.h | 1164 ++ 28379d_P_SFRA/device/driverlib/emif.c | 46 + 28379d_P_SFRA/device/driverlib/emif.h | 1369 +++ 28379d_P_SFRA/device/driverlib/epwm.c | 363 + 28379d_P_SFRA/device/driverlib/epwm.h | 7496 +++++++++++++ 28379d_P_SFRA/device/driverlib/eqep.c | 149 + 28379d_P_SFRA/device/driverlib/eqep.h | 1691 +++ 28379d_P_SFRA/device/driverlib/flash.c | 175 + 28379d_P_SFRA/device/driverlib/flash.h | 1671 +++ 28379d_P_SFRA/device/driverlib/gpio.c | 489 + 28379d_P_SFRA/device/driverlib/gpio.h | 1047 ++ 28379d_P_SFRA/device/driverlib/hrpwm.c | 47 + 28379d_P_SFRA/device/driverlib/hrpwm.h | 1657 +++ .../driverlib/hw_reg_inclusive_terminology.h | 29 + 28379d_P_SFRA/device/driverlib/i2c.c | 351 + 28379d_P_SFRA/device/driverlib/i2c.h | 1386 +++ 28379d_P_SFRA/device/driverlib/inc/hw_adc.h | 911 ++ .../device/driverlib/inc/hw_asysctl.h | 145 + 28379d_P_SFRA/device/driverlib/inc/hw_can.h | 514 + 28379d_P_SFRA/device/driverlib/inc/hw_cla.h | 241 + 28379d_P_SFRA/device/driverlib/inc/hw_clb.h | 661 ++ .../device/driverlib/inc/hw_clbxbar.h | 1272 +++ 28379d_P_SFRA/device/driverlib/inc/hw_cmpss.h | 235 + .../device/driverlib/inc/hw_cputimer.h | 112 + 28379d_P_SFRA/device/driverlib/inc/hw_dac.h | 122 + 28379d_P_SFRA/device/driverlib/inc/hw_dcsm.h | 442 + 28379d_P_SFRA/device/driverlib/inc/hw_dma.h | 165 + 28379d_P_SFRA/device/driverlib/inc/hw_ecap.h | 157 + 28379d_P_SFRA/device/driverlib/inc/hw_emif.h | 259 + 28379d_P_SFRA/device/driverlib/inc/hw_epwm.h | 1050 ++ .../device/driverlib/inc/hw_epwmxbar.h | 1192 ++ 28379d_P_SFRA/device/driverlib/inc/hw_eqep.h | 225 + 28379d_P_SFRA/device/driverlib/inc/hw_flash.h | 286 + 28379d_P_SFRA/device/driverlib/inc/hw_gpio.h | 4018 +++++++ 28379d_P_SFRA/device/driverlib/inc/hw_hic.h | 344 + 28379d_P_SFRA/device/driverlib/inc/hw_hrpwm.h | 1058 ++ 28379d_P_SFRA/device/driverlib/inc/hw_i2c.h | 208 + .../device/driverlib/inc/hw_inputxbar.h | 92 + 28379d_P_SFRA/device/driverlib/inc/hw_ints.h | 212 + 28379d_P_SFRA/device/driverlib/inc/hw_ipc.h | 323 + 28379d_P_SFRA/device/driverlib/inc/hw_mcbsp.h | 286 + .../device/driverlib/inc/hw_memcfg.h | 870 ++ .../device/driverlib/inc/hw_memmap.h | 208 + 28379d_P_SFRA/device/driverlib/inc/hw_nmi.h | 134 + 28379d_P_SFRA/device/driverlib/inc/hw_otp.h | 63 + .../device/driverlib/inc/hw_outputxbar.h | 1340 +++ 28379d_P_SFRA/device/driverlib/inc/hw_pie.h | 636 ++ 28379d_P_SFRA/device/driverlib/inc/hw_sci.h | 209 + 28379d_P_SFRA/device/driverlib/inc/hw_sdfm.h | 431 + 28379d_P_SFRA/device/driverlib/inc/hw_spi.h | 157 + .../device/driverlib/inc/hw_sysctl.h | 1428 +++ 28379d_P_SFRA/device/driverlib/inc/hw_types.h | 166 + 28379d_P_SFRA/device/driverlib/inc/hw_upp.h | 306 + 28379d_P_SFRA/device/driverlib/inc/hw_usb.h | 4614 ++++++++ 28379d_P_SFRA/device/driverlib/inc/hw_xbar.h | 271 + 28379d_P_SFRA/device/driverlib/inc/hw_xint.h | 108 + 28379d_P_SFRA/device/driverlib/interrupt.c | 425 + 28379d_P_SFRA/device/driverlib/interrupt.h | 504 + 28379d_P_SFRA/device/driverlib/ipc.c | 445 + 28379d_P_SFRA/device/driverlib/ipc.h | 880 ++ 28379d_P_SFRA/device/driverlib/mcbsp.c | 1621 +++ 28379d_P_SFRA/device/driverlib/mcbsp.h | 3340 ++++++ 28379d_P_SFRA/device/driverlib/memcfg.c | 701 ++ 28379d_P_SFRA/device/driverlib/memcfg.h | 1266 +++ 28379d_P_SFRA/device/driverlib/pin_map.h | 894 ++ .../device/driverlib/pin_map_legacy.h | 95 + 28379d_P_SFRA/device/driverlib/sci.c | 421 + 28379d_P_SFRA/device/driverlib/sci.h | 1646 +++ 28379d_P_SFRA/device/driverlib/sdfm.c | 188 + 28379d_P_SFRA/device/driverlib/sdfm.h | 1178 ++ 28379d_P_SFRA/device/driverlib/spi.c | 661 ++ 28379d_P_SFRA/device/driverlib/spi.h | 1743 +++ 28379d_P_SFRA/device/driverlib/sysctl.c | 1469 +++ 28379d_P_SFRA/device/driverlib/sysctl.h | 3531 ++++++ 28379d_P_SFRA/device/driverlib/upp.c | 298 + 28379d_P_SFRA/device/driverlib/upp.h | 1574 +++ 28379d_P_SFRA/device/driverlib/usb.c | 4018 +++++++ 28379d_P_SFRA/device/driverlib/usb.h | 560 + 28379d_P_SFRA/device/driverlib/version.c | 54 + 28379d_P_SFRA/device/driverlib/version.h | 100 + 28379d_P_SFRA/device/driverlib/xbar.c | 255 + 28379d_P_SFRA/device/driverlib/xbar.h | 1294 +++ 28379d_P_SFRA/lowpass.h | 46 + 28379d_P_SFRA/main.c | 105 + 28379d_P_SFRA/sfra_test.c | 124 + 28379d_P_SFRA/sfra_test.h | 12 + .../targetConfigs/TMS320F28377D.ccxml | 22 + 28379d_P_SFRA/targetConfigs/readme.txt | 9 + 28379d_test_SFRA/.ccsproject | 12 + 28379d_test_SFRA/.clangd | 8 + 28379d_test_SFRA/.cproject | 214 + 28379d_test_SFRA/.project | 37 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 15 + 28379d_test_SFRA/.theia/launch.json | 49 + 28379d_test_SFRA/2837xD_FLASH_lnk_cpu1.cmd | 182 + 28379d_test_SFRA/2837xD_RAM_lnk_cpu1.cmd | 141 + .../clangd/index/_defs.h.39F345F2FD66E401.idx | Bin 0 -> 5788 bytes .../index/_limits.h.344B2116E1D94CB5.idx | Bin 0 -> 958 bytes .../index/_stdint.h.197BC6D65EA02101.idx | Bin 0 -> 1560 bytes .../index/_stdint.h.415269F042D2A201.idx | Bin 0 -> 1486 bytes .../index/_stdint40.h.7C423B932F3FDFD8.idx | Bin 0 -> 242 bytes .../index/_string.h.831697C7DD4F5E2D.idx | Bin 0 -> 798 bytes .../index/_ti_config.h.EAEED0DE25AF55A1.idx | Bin 0 -> 500 bytes .../index/_types.h.9B6053A3B460A657.idx | Bin 0 -> 4000 bytes .../index/_types.h.A7E3BCDCA3D52814.idx | Bin 0 -> 3888 bytes .../clangd/index/adc.h.7643FFA0F0495BDB.idx | Bin 0 -> 71682 bytes .../index/asysctl.h.6B7A1E576DB00B93.idx | Bin 0 -> 2396 bytes .../clangd/index/board.c.0C2E67B58D684010.idx | Bin 0 -> 1518 bytes .../clangd/index/board.c.6F44E7CA7D811DD7.idx | Bin 0 -> 2774 bytes .../clangd/index/board.h.6B9DDD0CD960ED8F.idx | Bin 0 -> 1270 bytes .../clangd/index/board.h.C366A3B4A21CF1C9.idx | Bin 0 -> 1626 bytes ...c2000ware_libraries.c.15324FE04D019F7A.idx | Bin 0 -> 362 bytes ...c2000ware_libraries.c.F0FF8E40920652CE.idx | Bin 0 -> 382 bytes ...c2000ware_libraries.h.CB1FADC4790BDAB1.idx | Bin 0 -> 458 bytes ...c2000ware_libraries.h.E7563C27A6820166.idx | Bin 0 -> 390 bytes .../clangd/index/can.h.9E3FC4B8900B7465.idx | Bin 0 -> 174 bytes .../clangd/index/cdefs.h.543ADD3A5BABD5D3.idx | Bin 0 -> 2648 bytes .../clangd/index/cla.h.5DC7BC19533B3061.idx | Bin 0 -> 2436 bytes .../clangd/index/clb.h.56151511229BBA8B.idx | Bin 0 -> 53894 bytes .../clangd/index/cmpss.h.59945CDA950EB7D6.idx | Bin 0 -> 35734 bytes .../clangd/index/cpu.h.F8DE4A1566FF8E5C.idx | Bin 0 -> 1070 bytes .../index/cputimer.h.192BC9D5B45FA0AC.idx | Bin 0 -> 180 bytes .../clangd/index/dac.h.37C11C37B22880CC.idx | Bin 0 -> 13934 bytes .../clangd/index/dcsm.h.CB1085BAF53705B4.idx | Bin 0 -> 21114 bytes .../clangd/index/debug.h.DB49613BE03FB157.idx | Bin 0 -> 762 bytes .../index/device.c.0B8A578C07DBB270.idx | Bin 0 -> 15466 bytes .../index/device.c.986757CC17904C43.idx | Bin 0 -> 15496 bytes .../index/device.h.1D43A9D0D509FAB8.idx | Bin 0 -> 7182 bytes .../index/device.h.B30C87AC9A848133.idx | Bin 0 -> 7206 bytes .../clangd/index/dma.h.780BE45E34CDCB6E.idx | Bin 0 -> 38708 bytes ...terminology_mapping.h.2717AD4B05C9ECCA.idx | Bin 0 -> 1450 bytes .../index/driverlib.h.145F05FD2B7B5404.idx | Bin 0 -> 3118 bytes .../index/driverlib.h.65EB2857F01F4A36.idx | Bin 0 -> 3108 bytes .../clangd/index/ecap.h.2E6968E1813CA158.idx | Bin 0 -> 33320 bytes .../clangd/index/emif.h.E89C81E8E7479F41.idx | Bin 0 -> 36266 bytes ...mpty_driverlib_main.c.6F76583ADBF50123.idx | Bin 0 -> 764 bytes .../clangd/index/epwm.h.D42342DF6DDB1774.idx | Bin 0 -> 239976 bytes .../clangd/index/eqep.h.C6DD593B893B2934.idx | Bin 0 -> 48976 bytes .../index/fast_tri.c.3109B13531C2F3DC.idx | Bin 0 -> 1778 bytes .../index/fast_tri.c.3D42EC1E511A716C.idx | Bin 0 -> 1798 bytes .../index/fast_tri.c.7769E057D87727EE.idx | Bin 0 -> 1762 bytes .../index/fast_tri.h.68CDEA8E023F06F3.idx | Bin 0 -> 1272 bytes .../index/fast_tri.h.7DC4267892CAA0F9.idx | Bin 0 -> 1236 bytes .../index/fast_tri.h.E2A5A60CA0C53E85.idx | Bin 0 -> 1252 bytes .../index/filter_rc.h.37AD27353E0A9129.idx | Bin 0 -> 1646 bytes .../index/filter_rc.h.99C0989066A77D2C.idx | Bin 0 -> 1636 bytes .../clangd/index/flash.h.1E1E2C72888579BA.idx | Bin 0 -> 39776 bytes .../clangd/index/gpio.h.FFF2FF8CA70DCFCF.idx | Bin 0 -> 34220 bytes .../clangd/index/hrpwm.h.A2071BEBB454D887.idx | Bin 0 -> 44058 bytes .../index/hw_adc.h.F20272F6A904DC5D.idx | Bin 0 -> 11678 bytes .../index/hw_asysctl.h.BCF2D572A8486A9C.idx | Bin 0 -> 1166 bytes .../index/hw_cla.h.9E23A77F9EA5338A.idx | Bin 0 -> 2392 bytes .../index/hw_clb.h.33180ACCDB02F349.idx | Bin 0 -> 8760 bytes .../index/hw_clbxbar.h.30EE3FFD6D0E8D7E.idx | Bin 0 -> 20198 bytes .../index/hw_cmpss.h.B0E48D704AE68711.idx | Bin 0 -> 2190 bytes .../index/hw_dac.h.441A3FDC9232B7C2.idx | Bin 0 -> 756 bytes .../index/hw_dcsm.h.ECF8E68D9B698C7E.idx | Bin 0 -> 6700 bytes .../index/hw_dma.h.373D68AD07CDEE71.idx | Bin 0 -> 1592 bytes .../index/hw_ecap.h.D8BB3575B7C3C83B.idx | Bin 0 -> 1730 bytes .../index/hw_emif.h.3A87699B60E548AB.idx | Bin 0 -> 3214 bytes .../index/hw_epwm.h.0433AC57B0811C1A.idx | Bin 0 -> 14682 bytes .../index/hw_epwmxbar.h.27E6C3826583F178.idx | Bin 0 -> 20184 bytes .../index/hw_eqep.h.B02F91094E1E775E.idx | Bin 0 -> 2970 bytes .../index/hw_flash.h.DDEDE01080B4D1A7.idx | Bin 0 -> 2530 bytes .../index/hw_gpio.h.41FA06E19287CD49.idx | Bin 0 -> 80276 bytes .../index/hw_hrpwm.h.062BC46FA06797A2.idx | Bin 0 -> 14684 bytes .../index/hw_i2c.h.EB302DDB2BB42BAD.idx | Bin 0 -> 2124 bytes .../index/hw_inputxbar.h.4DA7259243D37193.idx | Bin 0 -> 900 bytes .../index/hw_ints.h.8C00FF7FD800144E.idx | Bin 0 -> 3616 bytes .../index/hw_ipc.h.03E10185AF90B29F.idx | Bin 0 -> 4550 bytes .../index/hw_mcbsp.h.0C163392A534F83A.idx | Bin 0 -> 3462 bytes .../index/hw_memcfg.h.A519B1472C2C820F.idx | Bin 0 -> 10292 bytes .../index/hw_memmap.h.1F0EFD10F73ECB85.idx | Bin 0 -> 3930 bytes .../index/hw_nmi.h.F6208B23496C8165.idx | Bin 0 -> 1312 bytes .../index/hw_otp.h.2F365A12F0AEBBD3.idx | Bin 0 -> 366 bytes .../hw_outputxbar.h.3B8BA44E03A20CBF.idx | Bin 0 -> 21096 bytes ...clusive_terminology.h.0890348B2F7480A5.idx | Bin 0 -> 406 bytes .../index/hw_sci.h.82AC5C14D87F95F3.idx | Bin 0 -> 2000 bytes .../index/hw_sdfm.h.4C9266CD6A5311BB.idx | Bin 0 -> 4452 bytes .../index/hw_spi.h.51B150874501A7D3.idx | Bin 0 -> 1450 bytes .../index/hw_sysctl.h.818DA5A762DBC613.idx | Bin 0 -> 17282 bytes .../index/hw_types.h.3EE2C317F1D1EBC4.idx | Bin 0 -> 1118 bytes .../index/hw_upp.h.536226D452BC0CC1.idx | Bin 0 -> 3108 bytes .../index/hw_xbar.h.2EAA26D1296240AA.idx | Bin 0 -> 4552 bytes .../index/hw_xint.h.2027292CA87C8DCC.idx | Bin 0 -> 710 bytes .../clangd/index/i2c.h.7C76D219DDFBE67A.idx | Bin 0 -> 45338 bytes .../index/interrupt.h.72C09B09D23A1424.idx | Bin 0 -> 180 bytes .../clangd/index/ipc.h.0D3D6CDE1416C56D.idx | Bin 0 -> 31546 bytes .../index/libsfra.c.145BDE08646F4A0A.idx | Bin 0 -> 4506 bytes .../index/libsfra.c.473FB5CABF6EB2AC.idx | Bin 0 -> 4472 bytes .../index/libsfra.c.6202D2A6BB923FBF.idx | Bin 0 -> 4434 bytes .../index/libsfra.c.ACCD0CD37BC496C8.idx | Bin 0 -> 4418 bytes .../index/libsfra.h.51696F63CFB19E46.idx | Bin 0 -> 4204 bytes .../index/libsfra.h.A0CBF8B0662422E4.idx | Bin 0 -> 4408 bytes .../index/libsfra.h.DA60C8E49C152C9C.idx | Bin 0 -> 4408 bytes .../index/libsfra.h.E973DD7529BD6449.idx | Bin 0 -> 4220 bytes .../libsfra_config.h.C04FFCBFA24491DA.idx | Bin 0 -> 256 bytes .../libsfra_config.h.E2F8787514A45D20.idx | Bin 0 -> 256 bytes .../libsfra_test_c2000.c.65A029E46C9A85C9.idx | Bin 0 -> 218 bytes .../libsfra_ti_hal.c.B6CA10369432859E.idx | Bin 0 -> 4928 bytes .../libsfra_ti_hal.h.058FEEA52F352324.idx | Bin 0 -> 1542 bytes .../index/linkage.h.EFAF2659D07C2D82.idx | Bin 0 -> 328 bytes .../index/lowpass.h.84541DECAA7D5656.idx | Bin 0 -> 1586 bytes .../index/lowpass.h.CD2C4B20615A82E7.idx | Bin 0 -> 1596 bytes .../clangd/index/main.c.A351196A44ADCDD8.idx | Bin 0 -> 824 bytes .../clangd/index/main.c.BCB492FE2DB70AFD.idx | Bin 0 -> 764 bytes .../clangd/index/math.h.4BFF696D8B1CDAE8.idx | Bin 0 -> 17580 bytes .../clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx | Bin 0 -> 115374 bytes .../index/memcfg.h.CD2C1B5527DC931A.idx | Bin 0 -> 39238 bytes .../index/pin_map.h.6826F2A444524F26.idx | Bin 0 -> 16826 bytes .../pin_map_legacy.h.88A2DC44F63B02AD.idx | Bin 0 -> 752 bytes .../clangd/index/sci.h.E64A437F6118C151.idx | Bin 0 -> 47856 bytes .../clangd/index/sdfm.h.32C80F3732C73C66.idx | Bin 0 -> 32954 bytes .../index/sfra-test.c.5893E44B82B216C6.idx | Bin 0 -> 2460 bytes .../index/sfra-test.c.EA6DA4E99BE72265.idx | Bin 0 -> 2612 bytes .../index/sfra-test.h.8E824D412DF67181.idx | Bin 0 -> 312 bytes .../index/sfra_f32.h.0C3253801F259A0F.idx | Bin 0 -> 7314 bytes .../index/sfra_f32.h.2D157CAC91C1DCCB.idx | Bin 0 -> 7330 bytes .../index/sfra_f32.h.3247C948FFD8A47A.idx | Bin 0 -> 7442 bytes ..._scicomms_driverlib.c.3CF6F5243B443559.idx | Bin 0 -> 14352 bytes ..._scicomms_driverlib.c.96F1BC03347E2CA1.idx | Bin 0 -> 14312 bytes ..._scicomms_driverlib.h.81D800D165BC8F68.idx | Bin 0 -> 2924 bytes ..._scicomms_driverlib.h.CED1AE54E7A18FAD.idx | Bin 0 -> 2880 bytes .../index/sfra_test.c.1AEF57FD49B949EB.idx | Bin 0 -> 2460 bytes .../index/sfra_test.c.CC8FF5B2CC920A3D.idx | Bin 0 -> 3636 bytes .../index/sfra_test.h.1C76397F76896143.idx | Bin 0 -> 1552 bytes .../index/sfra_test.h.7F9797C53D5FB643.idx | Bin 0 -> 312 bytes .../clangd/index/spi.h.3FDB82D9CF0119F5.idx | Bin 0 -> 51042 bytes .../index/stdarg.h.A61B4A3DD19995EB.idx | Bin 0 -> 588 bytes .../index/stdbool.h.6D5F9834DD64C05A.idx | Bin 0 -> 422 bytes .../index/stddef.h.B9D639BB288EACD8.idx | Bin 0 -> 940 bytes .../index/stdint.h.2B221F242309F99E.idx | Bin 0 -> 2470 bytes .../index/stdint.h.C8EE9E4CF97EC8C9.idx | Bin 0 -> 550 bytes .../clangd/index/stdio.h.57070E279D9CC442.idx | Bin 0 -> 14234 bytes .../index/string.h.9E28FAFBAB9F1BE8.idx | Bin 0 -> 4784 bytes .../index/sysctl.h.344D1E9F41E13594.idx | Bin 0 -> 119316 bytes .../clangd/index/upp.h.BCE80B45D7E726CE.idx | Bin 0 -> 49892 bytes .../index/version.h.DF725F1B99C81115.idx | Bin 0 -> 924 bytes .../clangd/index/xbar.h.CF276281CCE6626E.idx | Bin 0 -> 65672 bytes .../CPU1_FLASH/.clangd/compile_commands.json | 47 + 28379d_test_SFRA/CPU1_FLASH/28379d.map | 783 ++ 28379d_test_SFRA/CPU1_FLASH/28379d.out | Bin 0 -> 120388 bytes .../CPU1_FLASH/28379d_linkInfo.xml | 9226 +++++++++++++++ .../CPU1_FLASH/28379d_test_SFRA.map | 785 ++ .../CPU1_FLASH/28379d_test_SFRA.out | Bin 0 -> 206700 bytes .../CPU1_FLASH/28379d_test_SFRA_linkInfo.xml | 9978 +++++++++++++++++ .../CPU1_FLASH/LIBSFAR/subdir_rules.mk | 14 + .../CPU1_FLASH/LIBSFAR/subdir_vars.mk | 26 + .../CPU1_FLASH/LIBSFRA/fast_tri.d | 48 + 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra.d | 51 + .../CPU1_FLASH/LIBSFRA/libsfra.obj | Bin 0 -> 59360 bytes .../CPU1_FLASH/LIBSFRA/libsfra_ti_hal.d | 66 + .../CPU1_FLASH/LIBSFRA/libsfra_ti_hal.obj | Bin 0 -> 61708 bytes .../CPU1_FLASH/LIBSFRA/subdir_rules.mk | 14 + .../CPU1_FLASH/LIBSFRA/subdir_vars.mk | 32 + .../SFRA/sfra_gui_scicomms_driverlib.d | 288 + .../SFRA/sfra_gui_scicomms_driverlib.obj | Bin 0 -> 91708 bytes .../CPU1_FLASH/SFRA/subdir_rules.mk | 14 + .../CPU1_FLASH/SFRA/subdir_vars.mk | 26 + 28379d_test_SFRA/CPU1_FLASH/ccsObjs.opt | 13 + .../device/F2837xD_CodeStartBranch.obj | Bin 0 -> 3696 bytes 28379d_test_SFRA/CPU1_FLASH/device/device.d | 270 + 28379d_test_SFRA/CPU1_FLASH/device/device.obj | Bin 0 -> 28436 bytes .../CPU1_FLASH/device/subdir_rules.mk | 20 + .../CPU1_FLASH/device/subdir_vars.mk | 40 + .../CPU1_FLASH/empty_driverlib_main.d | 279 + 28379d_test_SFRA/CPU1_FLASH/main.d | 300 + 28379d_test_SFRA/CPU1_FLASH/main.obj | Bin 0 -> 51104 bytes 28379d_test_SFRA/CPU1_FLASH/makefile | 163 + 28379d_test_SFRA/CPU1_FLASH/objects.mk | 8 + 28379d_test_SFRA/CPU1_FLASH/sfra-test.d | 300 + 28379d_test_SFRA/CPU1_FLASH/sfra_test.d | 315 + 28379d_test_SFRA/CPU1_FLASH/sfra_test.obj | Bin 0 -> 77836 bytes 28379d_test_SFRA/CPU1_FLASH/sources.mk | 125 + 28379d_test_SFRA/CPU1_FLASH/subdir_rules.mk | 39 + 28379d_test_SFRA/CPU1_FLASH/subdir_vars.mk | 96 + 28379d_test_SFRA/CPU1_FLASH/syscfg/board.c | 154 + .../CPU1_FLASH/syscfg/board.cmd.genlibs | 20 + 28379d_test_SFRA/CPU1_FLASH/syscfg/board.d | 273 + 28379d_test_SFRA/CPU1_FLASH/syscfg/board.h | 142 + 28379d_test_SFRA/CPU1_FLASH/syscfg/board.json | 8 + 28379d_test_SFRA/CPU1_FLASH/syscfg/board.obj | Bin 0 -> 19920 bytes 28379d_test_SFRA/CPU1_FLASH/syscfg/board.opt | 21 + .../CPU1_FLASH/syscfg/c2000ware_libraries.c | 40 + .../syscfg/c2000ware_libraries.cmd.genlibs | 20 + .../CPU1_FLASH/syscfg/c2000ware_libraries.d | 276 + .../CPU1_FLASH/syscfg/c2000ware_libraries.h | 62 + .../CPU1_FLASH/syscfg/c2000ware_libraries.obj | Bin 0 -> 4296 bytes .../CPU1_FLASH/syscfg/c2000ware_libraries.opt | 0 .../CPU1_FLASH/syscfg/clocktree.h | 208 + 28379d_test_SFRA/CPU1_FLASH/syscfg/pinmux.csv | 211 + .../CPU1_RAM/.clangd/compile_commands.json | 42 + 28379d_test_SFRA/LIBSFRA/libsfra.c | 200 + 28379d_test_SFRA/LIBSFRA/libsfra.h | 131 + 28379d_test_SFRA/LIBSFRA/libsfra_config.h | 15 + 28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.c | 145 + 28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h | 36 + 28379d_test_SFRA/SFRA/sfra_f32.h | 182 + 28379d_test_SFRA/SFRA/sfra_f32_tmu_eabi.lib | Bin 0 -> 25368 bytes .../SFRA/sfra_gui_scicomms_driverlib.c | 880 ++ .../SFRA/sfra_gui_scicomms_driverlib.h | 86 + 28379d_test_SFRA/c2000.syscfg | 45 + .../device/F2837xD_CodeStartBranch.asm | 112 + 28379d_test_SFRA/device/device.c | 706 ++ 28379d_test_SFRA/device/device.h | 394 + 28379d_test_SFRA/device/driverlib.h | 87 + 28379d_test_SFRA/device/driverlib/adc.c | 342 + 28379d_test_SFRA/device/driverlib/adc.h | 2098 ++++ 28379d_test_SFRA/device/driverlib/asysctl.c | 43 + 28379d_test_SFRA/device/driverlib/asysctl.h | 160 + 28379d_test_SFRA/device/driverlib/can.c | 1122 ++ 28379d_test_SFRA/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 + 28379d_test_SFRA/device/driverlib/cla.c | 89 + 28379d_test_SFRA/device/driverlib/cla.h | 984 ++ 28379d_test_SFRA/device/driverlib/clb.c | 145 + 28379d_test_SFRA/device/driverlib/clb.h | 1290 +++ 28379d_test_SFRA/device/driverlib/cmpss.c | 223 + 28379d_test_SFRA/device/driverlib/cmpss.h | 1325 +++ 28379d_test_SFRA/device/driverlib/cpu.h | 172 + 28379d_test_SFRA/device/driverlib/cputimer.c | 61 + 28379d_test_SFRA/device/driverlib/cputimer.h | 509 + 28379d_test_SFRA/device/driverlib/dac.c | 93 + 28379d_test_SFRA/device/driverlib/dac.h | 604 + 28379d_test_SFRA/device/driverlib/dcsm.c | 377 + 28379d_test_SFRA/device/driverlib/dcsm.h | 669 ++ 28379d_test_SFRA/device/driverlib/debug.h | 91 + 28379d_test_SFRA/device/driverlib/dma.c | 370 + 28379d_test_SFRA/device/driverlib/dma.h | 1171 ++ .../driver_inclusive_terminology_mapping.h | 109 + 28379d_test_SFRA/device/driverlib/ecap.c | 61 + 28379d_test_SFRA/device/driverlib/ecap.h | 1164 ++ 28379d_test_SFRA/device/driverlib/emif.c | 46 + 28379d_test_SFRA/device/driverlib/emif.h | 1369 +++ 28379d_test_SFRA/device/driverlib/epwm.c | 363 + 28379d_test_SFRA/device/driverlib/epwm.h | 7496 +++++++++++++ 28379d_test_SFRA/device/driverlib/eqep.c | 149 + 28379d_test_SFRA/device/driverlib/eqep.h | 1691 +++ 28379d_test_SFRA/device/driverlib/flash.c | 175 + 28379d_test_SFRA/device/driverlib/flash.h | 1671 +++ 28379d_test_SFRA/device/driverlib/gpio.c | 489 + 28379d_test_SFRA/device/driverlib/gpio.h | 1047 ++ 28379d_test_SFRA/device/driverlib/hrpwm.c | 47 + 28379d_test_SFRA/device/driverlib/hrpwm.h | 1657 +++ .../driverlib/hw_reg_inclusive_terminology.h | 29 + 28379d_test_SFRA/device/driverlib/i2c.c | 351 + 28379d_test_SFRA/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 + 28379d_test_SFRA/device/driverlib/interrupt.c | 425 + 28379d_test_SFRA/device/driverlib/interrupt.h | 504 + 28379d_test_SFRA/device/driverlib/ipc.c | 445 + 28379d_test_SFRA/device/driverlib/ipc.h | 880 ++ 28379d_test_SFRA/device/driverlib/mcbsp.c | 1621 +++ 28379d_test_SFRA/device/driverlib/mcbsp.h | 3340 ++++++ 28379d_test_SFRA/device/driverlib/memcfg.c | 701 ++ 28379d_test_SFRA/device/driverlib/memcfg.h | 1266 +++ 28379d_test_SFRA/device/driverlib/pin_map.h | 894 ++ .../device/driverlib/pin_map_legacy.h | 95 + 28379d_test_SFRA/device/driverlib/sci.c | 421 + 28379d_test_SFRA/device/driverlib/sci.h | 1646 +++ 28379d_test_SFRA/device/driverlib/sdfm.c | 188 + 28379d_test_SFRA/device/driverlib/sdfm.h | 1178 ++ 28379d_test_SFRA/device/driverlib/spi.c | 661 ++ 28379d_test_SFRA/device/driverlib/spi.h | 1743 +++ 28379d_test_SFRA/device/driverlib/sysctl.c | 1469 +++ 28379d_test_SFRA/device/driverlib/sysctl.h | 3531 ++++++ 28379d_test_SFRA/device/driverlib/upp.c | 298 + 28379d_test_SFRA/device/driverlib/upp.h | 1574 +++ 28379d_test_SFRA/device/driverlib/usb.c | 4018 +++++++ 28379d_test_SFRA/device/driverlib/usb.h | 560 + 28379d_test_SFRA/device/driverlib/version.c | 54 + 28379d_test_SFRA/device/driverlib/version.h | 100 + 28379d_test_SFRA/device/driverlib/xbar.c | 255 + 28379d_test_SFRA/device/driverlib/xbar.h | 1294 +++ 28379d_test_SFRA/lowpass.h | 46 + 28379d_test_SFRA/main.c | 105 + 28379d_test_SFRA/sfra_test.c | 257 + 28379d_test_SFRA/sfra_test.h | 94 + .../targetConfigs/TMS320F28377D.ccxml | 22 + 28379d_test_SFRA/targetConfigs/readme.txt | 9 + README.md | 129 +- fig/SFRA_TYPE.png | Bin 0 -> 12205 bytes fig/所需文件.png | Bin 0 -> 4809 bytes fig/排除编译.png | Bin 0 -> 28823 bytes fig/排除编译1.png | Bin 0 -> 36992 bytes 693 files changed, 243421 insertions(+), 1 deletion(-) create mode 100644 28379d_P_SFRA/.ccsproject create mode 100644 28379d_P_SFRA/.clangd create mode 100644 28379d_P_SFRA/.cproject create mode 100644 28379d_P_SFRA/.project create mode 100644 28379d_P_SFRA/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 28379d_P_SFRA/.settings/org.eclipse.core.resources.prefs create mode 100644 28379d_P_SFRA/.theia/launch.json create mode 100644 28379d_P_SFRA/2837xD_FLASH_lnk_cpu1.cmd create mode 100644 28379d_P_SFRA/2837xD_RAM_lnk_cpu1.cmd create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_defs.h.39F345F2FD66E401.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_limits.h.344B2116E1D94CB5.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.197BC6D65EA02101.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.415269F042D2A201.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint40.h.7C423B932F3FDFD8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_string.h.831697C7DD4F5E2D.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_ti_config.h.EAEED0DE25AF55A1.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.9B6053A3B460A657.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.A7E3BCDCA3D52814.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/adc.h.7643FFA0F0495BDB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/asysctl.h.6B7A1E576DB00B93.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.0C2E67B58D684010.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.6F44E7CA7D811DD7.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.D97F0BFC00085C2D.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.6B9DDD0CD960ED8F.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.B602F7E483353EDA.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.C366A3B4A21CF1C9.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.15324FE04D019F7A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.68B17F5345C3DF40.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.F0FF8E40920652CE.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.C36DB41F135CB14E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.CB1FADC4790BDAB1.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.E7563C27A6820166.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/can.h.9E3FC4B8900B7465.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cdefs.h.543ADD3A5BABD5D3.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cla.h.5DC7BC19533B3061.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clb.h.56151511229BBA8B.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clocktree.h.66134BD5011CCAA1.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cmpss.h.59945CDA950EB7D6.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cpu.h.F8DE4A1566FF8E5C.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cputimer.h.192BC9D5B45FA0AC.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dac.h.37C11C37B22880CC.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dcsm.h.CB1085BAF53705B4.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/debug.h.DB49613BE03FB157.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.0B8A578C07DBB270.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.986757CC17904C43.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.D0CBA94E9FDF489A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.1D43A9D0D509FAB8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.37057073C9A08AAB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.B30C87AC9A848133.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dma.h.780BE45E34CDCB6E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driver_inclusive_terminology_mapping.h.2717AD4B05C9ECCA.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.145F05FD2B7B5404.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.65EB2857F01F4A36.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.F78186796B611663.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ecap.h.2E6968E1813CA158.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/emif.h.E89C81E8E7479F41.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/empty_driverlib_main.c.6F76583ADBF50123.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/epwm.h.D42342DF6DDB1774.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/eqep.h.C6DD593B893B2934.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3109B13531C2F3DC.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3D42EC1E511A716C.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.7769E057D87727EE.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.68CDEA8E023F06F3.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.7DC4267892CAA0F9.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.E2A5A60CA0C53E85.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.37AD27353E0A9129.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.99C0989066A77D2C.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/flash.h.1E1E2C72888579BA.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/gpio.h.FFF2FF8CA70DCFCF.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hrpwm.h.A2071BEBB454D887.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_adc.h.F20272F6A904DC5D.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_asysctl.h.BCF2D572A8486A9C.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cla.h.9E23A77F9EA5338A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_clb.h.33180ACCDB02F349.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_clbxbar.h.30EE3FFD6D0E8D7E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cmpss.h.B0E48D704AE68711.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dac.h.441A3FDC9232B7C2.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dcsm.h.ECF8E68D9B698C7E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dma.h.373D68AD07CDEE71.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ecap.h.D8BB3575B7C3C83B.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_emif.h.3A87699B60E548AB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwm.h.0433AC57B0811C1A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwmxbar.h.27E6C3826583F178.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_eqep.h.B02F91094E1E775E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_flash.h.DDEDE01080B4D1A7.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_gpio.h.41FA06E19287CD49.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_hrpwm.h.062BC46FA06797A2.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_i2c.h.EB302DDB2BB42BAD.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_inputxbar.h.4DA7259243D37193.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ints.h.8C00FF7FD800144E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ipc.h.03E10185AF90B29F.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_mcbsp.h.0C163392A534F83A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memcfg.h.A519B1472C2C820F.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memmap.h.1F0EFD10F73ECB85.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_nmi.h.F6208B23496C8165.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_otp.h.2F365A12F0AEBBD3.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_outputxbar.h.3B8BA44E03A20CBF.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_reg_inclusive_terminology.h.0890348B2F7480A5.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_sci.h.82AC5C14D87F95F3.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_sdfm.h.4C9266CD6A5311BB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_spi.h.51B150874501A7D3.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_sysctl.h.818DA5A762DBC613.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_types.h.3EE2C317F1D1EBC4.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_upp.h.536226D452BC0CC1.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xbar.h.2EAA26D1296240AA.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xint.h.2027292CA87C8DCC.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/i2c.h.7C76D219DDFBE67A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/interrupt.h.72C09B09D23A1424.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ipc.h.0D3D6CDE1416C56D.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.145BDE08646F4A0A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.473FB5CABF6EB2AC.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.6202D2A6BB923FBF.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.ACCD0CD37BC496C8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.51696F63CFB19E46.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.A0CBF8B0662422E4.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.DA60C8E49C152C9C.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.E973DD7529BD6449.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.C04FFCBFA24491DA.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.E2F8787514A45D20.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_test_c2000.c.65A029E46C9A85C9.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.c.B6CA10369432859E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.h.058FEEA52F352324.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/linkage.h.EFAF2659D07C2D82.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.84541DECAA7D5656.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.9E9F47540CAE52AD.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.CD2C4B20615A82E7.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.5E5ABC5F2D248B1F.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.A351196A44ADCDD8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.BCB492FE2DB70AFD.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/math.h.4BFF696D8B1CDAE8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/memcfg.h.CD2C1B5527DC931A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map.h.6826F2A444524F26.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map_legacy.h.88A2DC44F63B02AD.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sci.h.E64A437F6118C151.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sdfm.h.32C80F3732C73C66.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.5893E44B82B216C6.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.EA6DA4E99BE72265.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.h.8E824D412DF67181.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.c.98B4DD83BE82CAB5.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.0C3253801F259A0F.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.2D157CAC91C1DCCB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.3247C948FFD8A47A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.BF006D178E4BA6C0.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.3CF6F5243B443559.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.96F1BC03347E2CA1.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.98F4E99A34ED2684.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.81D800D165BC8F68.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED1AE54E7A18FAD.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED519BC40C71C6D.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.1AEF57FD49B949EB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CBB96F09F9A0FC32.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CC8FF5B2CC920A3D.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.038257A9D02586F7.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.1C76397F76896143.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.7F9797C53D5FB643.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/spi.h.3FDB82D9CF0119F5.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdarg.h.A61B4A3DD19995EB.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdbool.h.6D5F9834DD64C05A.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stddef.h.B9D639BB288EACD8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.2B221F242309F99E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.C8EE9E4CF97EC8C9.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdio.h.57070E279D9CC442.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/string.h.9E28FAFBAB9F1BE8.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sysctl.h.344D1E9F41E13594.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/upp.h.BCE80B45D7E726CE.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/version.h.DF725F1B99C81115.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/xbar.h.CF276281CCE6626E.idx create mode 100644 28379d_P_SFRA/CPU1_FLASH/.clangd/compile_commands.json create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d.map create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d.out create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.map create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.out create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA_linkInfo.xml create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_linkInfo.xml create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.map create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.out create mode 100644 28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA_linkInfo.xml create mode 100644 28379d_P_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/LIBSFAR/subdir_vars.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/LIBSFRA/fast_tri.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/LIBSFRA/subdir_rules.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/LIBSFRA/subdir_vars.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_f32.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_f32.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/SFRA/subdir_rules.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/SFRA/subdir_vars.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/ccsObjs.opt create mode 100644 28379d_P_SFRA/CPU1_FLASH/device/F2837xD_CodeStartBranch.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/device/device.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/device/device.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/device/subdir_rules.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/device/subdir_vars.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/empty_driverlib_main.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/main.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/main.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/makefile create mode 100644 28379d_P_SFRA/CPU1_FLASH/objects.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/sfra-test.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/sfra_test.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/sfra_test.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/sources.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/subdir_rules.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/subdir_vars.mk create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.c create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.h create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.json create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/board.opt create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.c create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.cmd.genlibs create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.d create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.h create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.obj create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.opt create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/clocktree.h create mode 100644 28379d_P_SFRA/CPU1_FLASH/syscfg/pinmux.csv create mode 100644 28379d_P_SFRA/CPU1_RAM/.clangd/compile_commands.json create mode 100644 28379d_P_SFRA/SFRA/sfra_f32.c create mode 100644 28379d_P_SFRA/SFRA/sfra_f32.h create mode 100644 28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.c create mode 100644 28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.h create mode 100644 28379d_P_SFRA/c2000.syscfg create mode 100644 28379d_P_SFRA/device/F2837xD_CodeStartBranch.asm create mode 100644 28379d_P_SFRA/device/device.c create mode 100644 28379d_P_SFRA/device/device.h create mode 100644 28379d_P_SFRA/device/driverlib.h create mode 100644 28379d_P_SFRA/device/driverlib/adc.c create mode 100644 28379d_P_SFRA/device/driverlib/adc.h create mode 100644 28379d_P_SFRA/device/driverlib/asysctl.c create mode 100644 28379d_P_SFRA/device/driverlib/asysctl.h create mode 100644 28379d_P_SFRA/device/driverlib/can.c create mode 100644 28379d_P_SFRA/device/driverlib/can.h create mode 100644 28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib.lib create mode 100644 28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib_coff.lib create mode 100644 28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib_eabi.lib create mode 100644 28379d_P_SFRA/device/driverlib/ccs/Release/driverlib.lib create mode 100644 28379d_P_SFRA/device/driverlib/ccs/Release/driverlib_coff.lib create mode 100644 28379d_P_SFRA/device/driverlib/ccs/Release/driverlib_eabi.lib create mode 100644 28379d_P_SFRA/device/driverlib/ccs/driverlib.projectspec create mode 100644 28379d_P_SFRA/device/driverlib/cla.c create mode 100644 28379d_P_SFRA/device/driverlib/cla.h create mode 100644 28379d_P_SFRA/device/driverlib/clb.c create mode 100644 28379d_P_SFRA/device/driverlib/clb.h create mode 100644 28379d_P_SFRA/device/driverlib/cmpss.c create mode 100644 28379d_P_SFRA/device/driverlib/cmpss.h create mode 100644 28379d_P_SFRA/device/driverlib/cpu.h create mode 100644 28379d_P_SFRA/device/driverlib/cputimer.c create mode 100644 28379d_P_SFRA/device/driverlib/cputimer.h create mode 100644 28379d_P_SFRA/device/driverlib/dac.c create mode 100644 28379d_P_SFRA/device/driverlib/dac.h create mode 100644 28379d_P_SFRA/device/driverlib/dcsm.c create mode 100644 28379d_P_SFRA/device/driverlib/dcsm.h create mode 100644 28379d_P_SFRA/device/driverlib/debug.h create mode 100644 28379d_P_SFRA/device/driverlib/dma.c create mode 100644 28379d_P_SFRA/device/driverlib/dma.h create mode 100644 28379d_P_SFRA/device/driverlib/driver_inclusive_terminology_mapping.h create mode 100644 28379d_P_SFRA/device/driverlib/ecap.c create mode 100644 28379d_P_SFRA/device/driverlib/ecap.h create mode 100644 28379d_P_SFRA/device/driverlib/emif.c create mode 100644 28379d_P_SFRA/device/driverlib/emif.h create mode 100644 28379d_P_SFRA/device/driverlib/epwm.c create mode 100644 28379d_P_SFRA/device/driverlib/epwm.h create mode 100644 28379d_P_SFRA/device/driverlib/eqep.c create mode 100644 28379d_P_SFRA/device/driverlib/eqep.h create mode 100644 28379d_P_SFRA/device/driverlib/flash.c create mode 100644 28379d_P_SFRA/device/driverlib/flash.h create mode 100644 28379d_P_SFRA/device/driverlib/gpio.c create mode 100644 28379d_P_SFRA/device/driverlib/gpio.h create mode 100644 28379d_P_SFRA/device/driverlib/hrpwm.c create mode 100644 28379d_P_SFRA/device/driverlib/hrpwm.h create mode 100644 28379d_P_SFRA/device/driverlib/hw_reg_inclusive_terminology.h create mode 100644 28379d_P_SFRA/device/driverlib/i2c.c create mode 100644 28379d_P_SFRA/device/driverlib/i2c.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_adc.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_asysctl.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_can.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_cla.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_clb.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_clbxbar.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_cmpss.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_cputimer.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_dac.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_dcsm.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_dma.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_ecap.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_emif.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_epwm.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_epwmxbar.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_eqep.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_flash.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_gpio.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_hic.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_hrpwm.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_i2c.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_inputxbar.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_ints.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_ipc.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_mcbsp.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_memcfg.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_memmap.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_nmi.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_otp.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_outputxbar.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_pie.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_sci.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_sdfm.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_spi.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_sysctl.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_types.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_upp.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_usb.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_xbar.h create mode 100644 28379d_P_SFRA/device/driverlib/inc/hw_xint.h create mode 100644 28379d_P_SFRA/device/driverlib/interrupt.c create mode 100644 28379d_P_SFRA/device/driverlib/interrupt.h create mode 100644 28379d_P_SFRA/device/driverlib/ipc.c create mode 100644 28379d_P_SFRA/device/driverlib/ipc.h create mode 100644 28379d_P_SFRA/device/driverlib/mcbsp.c create mode 100644 28379d_P_SFRA/device/driverlib/mcbsp.h create mode 100644 28379d_P_SFRA/device/driverlib/memcfg.c create mode 100644 28379d_P_SFRA/device/driverlib/memcfg.h create mode 100644 28379d_P_SFRA/device/driverlib/pin_map.h create mode 100644 28379d_P_SFRA/device/driverlib/pin_map_legacy.h create mode 100644 28379d_P_SFRA/device/driverlib/sci.c create mode 100644 28379d_P_SFRA/device/driverlib/sci.h create mode 100644 28379d_P_SFRA/device/driverlib/sdfm.c create mode 100644 28379d_P_SFRA/device/driverlib/sdfm.h create mode 100644 28379d_P_SFRA/device/driverlib/spi.c create mode 100644 28379d_P_SFRA/device/driverlib/spi.h create mode 100644 28379d_P_SFRA/device/driverlib/sysctl.c create mode 100644 28379d_P_SFRA/device/driverlib/sysctl.h create mode 100644 28379d_P_SFRA/device/driverlib/upp.c create mode 100644 28379d_P_SFRA/device/driverlib/upp.h create mode 100644 28379d_P_SFRA/device/driverlib/usb.c create mode 100644 28379d_P_SFRA/device/driverlib/usb.h create mode 100644 28379d_P_SFRA/device/driverlib/version.c create mode 100644 28379d_P_SFRA/device/driverlib/version.h create mode 100644 28379d_P_SFRA/device/driverlib/xbar.c create mode 100644 28379d_P_SFRA/device/driverlib/xbar.h create mode 100644 28379d_P_SFRA/lowpass.h create mode 100644 28379d_P_SFRA/main.c create mode 100644 28379d_P_SFRA/sfra_test.c create mode 100644 28379d_P_SFRA/sfra_test.h create mode 100644 28379d_P_SFRA/targetConfigs/TMS320F28377D.ccxml create mode 100644 28379d_P_SFRA/targetConfigs/readme.txt create mode 100644 28379d_test_SFRA/.ccsproject create mode 100644 28379d_test_SFRA/.clangd create mode 100644 28379d_test_SFRA/.cproject create mode 100644 28379d_test_SFRA/.project create mode 100644 28379d_test_SFRA/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 28379d_test_SFRA/.settings/org.eclipse.core.resources.prefs create mode 100644 28379d_test_SFRA/.theia/launch.json create mode 100644 28379d_test_SFRA/2837xD_FLASH_lnk_cpu1.cmd create mode 100644 28379d_test_SFRA/2837xD_RAM_lnk_cpu1.cmd create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_defs.h.39F345F2FD66E401.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_limits.h.344B2116E1D94CB5.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.197BC6D65EA02101.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.415269F042D2A201.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint40.h.7C423B932F3FDFD8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_string.h.831697C7DD4F5E2D.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_ti_config.h.EAEED0DE25AF55A1.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.9B6053A3B460A657.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.A7E3BCDCA3D52814.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/adc.h.7643FFA0F0495BDB.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/asysctl.h.6B7A1E576DB00B93.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.0C2E67B58D684010.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.6F44E7CA7D811DD7.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.6B9DDD0CD960ED8F.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.C366A3B4A21CF1C9.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.15324FE04D019F7A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.F0FF8E40920652CE.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.CB1FADC4790BDAB1.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.E7563C27A6820166.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/can.h.9E3FC4B8900B7465.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cdefs.h.543ADD3A5BABD5D3.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cla.h.5DC7BC19533B3061.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clb.h.56151511229BBA8B.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cmpss.h.59945CDA950EB7D6.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cpu.h.F8DE4A1566FF8E5C.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cputimer.h.192BC9D5B45FA0AC.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dac.h.37C11C37B22880CC.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dcsm.h.CB1085BAF53705B4.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/debug.h.DB49613BE03FB157.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.0B8A578C07DBB270.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.986757CC17904C43.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.1D43A9D0D509FAB8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.B30C87AC9A848133.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dma.h.780BE45E34CDCB6E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driver_inclusive_terminology_mapping.h.2717AD4B05C9ECCA.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.145F05FD2B7B5404.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.65EB2857F01F4A36.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ecap.h.2E6968E1813CA158.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/emif.h.E89C81E8E7479F41.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/empty_driverlib_main.c.6F76583ADBF50123.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/epwm.h.D42342DF6DDB1774.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/eqep.h.C6DD593B893B2934.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3109B13531C2F3DC.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3D42EC1E511A716C.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.7769E057D87727EE.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.68CDEA8E023F06F3.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.7DC4267892CAA0F9.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.E2A5A60CA0C53E85.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.37AD27353E0A9129.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.99C0989066A77D2C.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/flash.h.1E1E2C72888579BA.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/gpio.h.FFF2FF8CA70DCFCF.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hrpwm.h.A2071BEBB454D887.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_adc.h.F20272F6A904DC5D.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_asysctl.h.BCF2D572A8486A9C.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cla.h.9E23A77F9EA5338A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_clb.h.33180ACCDB02F349.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_clbxbar.h.30EE3FFD6D0E8D7E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cmpss.h.B0E48D704AE68711.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dac.h.441A3FDC9232B7C2.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dcsm.h.ECF8E68D9B698C7E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dma.h.373D68AD07CDEE71.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ecap.h.D8BB3575B7C3C83B.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_emif.h.3A87699B60E548AB.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwm.h.0433AC57B0811C1A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwmxbar.h.27E6C3826583F178.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_eqep.h.B02F91094E1E775E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_flash.h.DDEDE01080B4D1A7.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_gpio.h.41FA06E19287CD49.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_hrpwm.h.062BC46FA06797A2.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_i2c.h.EB302DDB2BB42BAD.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_inputxbar.h.4DA7259243D37193.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ints.h.8C00FF7FD800144E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ipc.h.03E10185AF90B29F.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_mcbsp.h.0C163392A534F83A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memcfg.h.A519B1472C2C820F.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memmap.h.1F0EFD10F73ECB85.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_nmi.h.F6208B23496C8165.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_otp.h.2F365A12F0AEBBD3.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_outputxbar.h.3B8BA44E03A20CBF.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_reg_inclusive_terminology.h.0890348B2F7480A5.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_sci.h.82AC5C14D87F95F3.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_sdfm.h.4C9266CD6A5311BB.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_spi.h.51B150874501A7D3.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_sysctl.h.818DA5A762DBC613.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_types.h.3EE2C317F1D1EBC4.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_upp.h.536226D452BC0CC1.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xbar.h.2EAA26D1296240AA.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xint.h.2027292CA87C8DCC.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/i2c.h.7C76D219DDFBE67A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/interrupt.h.72C09B09D23A1424.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ipc.h.0D3D6CDE1416C56D.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.145BDE08646F4A0A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.473FB5CABF6EB2AC.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.6202D2A6BB923FBF.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.ACCD0CD37BC496C8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.51696F63CFB19E46.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.A0CBF8B0662422E4.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.DA60C8E49C152C9C.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.E973DD7529BD6449.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.C04FFCBFA24491DA.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.E2F8787514A45D20.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_test_c2000.c.65A029E46C9A85C9.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.c.B6CA10369432859E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.h.058FEEA52F352324.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/linkage.h.EFAF2659D07C2D82.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.84541DECAA7D5656.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.CD2C4B20615A82E7.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.A351196A44ADCDD8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.BCB492FE2DB70AFD.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/math.h.4BFF696D8B1CDAE8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/memcfg.h.CD2C1B5527DC931A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map.h.6826F2A444524F26.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map_legacy.h.88A2DC44F63B02AD.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sci.h.E64A437F6118C151.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sdfm.h.32C80F3732C73C66.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.5893E44B82B216C6.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.EA6DA4E99BE72265.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.h.8E824D412DF67181.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.0C3253801F259A0F.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.2D157CAC91C1DCCB.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.3247C948FFD8A47A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.3CF6F5243B443559.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.96F1BC03347E2CA1.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.81D800D165BC8F68.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED1AE54E7A18FAD.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.1AEF57FD49B949EB.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CC8FF5B2CC920A3D.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.1C76397F76896143.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.7F9797C53D5FB643.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/spi.h.3FDB82D9CF0119F5.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdarg.h.A61B4A3DD19995EB.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdbool.h.6D5F9834DD64C05A.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stddef.h.B9D639BB288EACD8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.2B221F242309F99E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.C8EE9E4CF97EC8C9.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdio.h.57070E279D9CC442.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/string.h.9E28FAFBAB9F1BE8.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sysctl.h.344D1E9F41E13594.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/upp.h.BCE80B45D7E726CE.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/version.h.DF725F1B99C81115.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/xbar.h.CF276281CCE6626E.idx create mode 100644 28379d_test_SFRA/CPU1_FLASH/.clangd/compile_commands.json create mode 100644 28379d_test_SFRA/CPU1_FLASH/28379d.map create mode 100644 28379d_test_SFRA/CPU1_FLASH/28379d.out create mode 100644 28379d_test_SFRA/CPU1_FLASH/28379d_linkInfo.xml create mode 100644 28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.map create mode 100644 28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.out create mode 100644 28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA_linkInfo.xml create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFAR/subdir_vars.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/fast_tri.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/subdir_rules.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/LIBSFRA/subdir_vars.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/SFRA/subdir_rules.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/SFRA/subdir_vars.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/ccsObjs.opt create mode 100644 28379d_test_SFRA/CPU1_FLASH/device/F2837xD_CodeStartBranch.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/device/device.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/device/device.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/device/subdir_rules.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/device/subdir_vars.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/empty_driverlib_main.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/main.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/main.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/makefile create mode 100644 28379d_test_SFRA/CPU1_FLASH/objects.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/sfra-test.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/sfra_test.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/sfra_test.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/sources.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/subdir_rules.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/subdir_vars.mk create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.c create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.h create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.json create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/board.opt create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.c create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.cmd.genlibs create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.d create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.h create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.obj create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.opt create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/clocktree.h create mode 100644 28379d_test_SFRA/CPU1_FLASH/syscfg/pinmux.csv create mode 100644 28379d_test_SFRA/CPU1_RAM/.clangd/compile_commands.json create mode 100644 28379d_test_SFRA/LIBSFRA/libsfra.c create mode 100644 28379d_test_SFRA/LIBSFRA/libsfra.h create mode 100644 28379d_test_SFRA/LIBSFRA/libsfra_config.h create mode 100644 28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.c create mode 100644 28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h create mode 100644 28379d_test_SFRA/SFRA/sfra_f32.h create mode 100644 28379d_test_SFRA/SFRA/sfra_f32_tmu_eabi.lib create mode 100644 28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.c create mode 100644 28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.h create mode 100644 28379d_test_SFRA/c2000.syscfg create mode 100644 28379d_test_SFRA/device/F2837xD_CodeStartBranch.asm create mode 100644 28379d_test_SFRA/device/device.c create mode 100644 28379d_test_SFRA/device/device.h create mode 100644 28379d_test_SFRA/device/driverlib.h create mode 100644 28379d_test_SFRA/device/driverlib/adc.c create mode 100644 28379d_test_SFRA/device/driverlib/adc.h create mode 100644 28379d_test_SFRA/device/driverlib/asysctl.c create mode 100644 28379d_test_SFRA/device/driverlib/asysctl.h create mode 100644 28379d_test_SFRA/device/driverlib/can.c create mode 100644 28379d_test_SFRA/device/driverlib/can.h create mode 100644 28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib.lib create mode 100644 28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib_coff.lib create mode 100644 28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib_eabi.lib create mode 100644 28379d_test_SFRA/device/driverlib/ccs/Release/driverlib.lib create mode 100644 28379d_test_SFRA/device/driverlib/ccs/Release/driverlib_coff.lib create mode 100644 28379d_test_SFRA/device/driverlib/ccs/Release/driverlib_eabi.lib create mode 100644 28379d_test_SFRA/device/driverlib/ccs/driverlib.projectspec create mode 100644 28379d_test_SFRA/device/driverlib/cla.c create mode 100644 28379d_test_SFRA/device/driverlib/cla.h create mode 100644 28379d_test_SFRA/device/driverlib/clb.c create mode 100644 28379d_test_SFRA/device/driverlib/clb.h create mode 100644 28379d_test_SFRA/device/driverlib/cmpss.c create mode 100644 28379d_test_SFRA/device/driverlib/cmpss.h create mode 100644 28379d_test_SFRA/device/driverlib/cpu.h create mode 100644 28379d_test_SFRA/device/driverlib/cputimer.c create mode 100644 28379d_test_SFRA/device/driverlib/cputimer.h create mode 100644 28379d_test_SFRA/device/driverlib/dac.c create mode 100644 28379d_test_SFRA/device/driverlib/dac.h create mode 100644 28379d_test_SFRA/device/driverlib/dcsm.c create mode 100644 28379d_test_SFRA/device/driverlib/dcsm.h create mode 100644 28379d_test_SFRA/device/driverlib/debug.h create mode 100644 28379d_test_SFRA/device/driverlib/dma.c create mode 100644 28379d_test_SFRA/device/driverlib/dma.h create mode 100644 28379d_test_SFRA/device/driverlib/driver_inclusive_terminology_mapping.h create mode 100644 28379d_test_SFRA/device/driverlib/ecap.c create mode 100644 28379d_test_SFRA/device/driverlib/ecap.h create mode 100644 28379d_test_SFRA/device/driverlib/emif.c create mode 100644 28379d_test_SFRA/device/driverlib/emif.h create mode 100644 28379d_test_SFRA/device/driverlib/epwm.c create mode 100644 28379d_test_SFRA/device/driverlib/epwm.h create mode 100644 28379d_test_SFRA/device/driverlib/eqep.c create mode 100644 28379d_test_SFRA/device/driverlib/eqep.h create mode 100644 28379d_test_SFRA/device/driverlib/flash.c create mode 100644 28379d_test_SFRA/device/driverlib/flash.h create mode 100644 28379d_test_SFRA/device/driverlib/gpio.c create mode 100644 28379d_test_SFRA/device/driverlib/gpio.h create mode 100644 28379d_test_SFRA/device/driverlib/hrpwm.c create mode 100644 28379d_test_SFRA/device/driverlib/hrpwm.h create mode 100644 28379d_test_SFRA/device/driverlib/hw_reg_inclusive_terminology.h create mode 100644 28379d_test_SFRA/device/driverlib/i2c.c create mode 100644 28379d_test_SFRA/device/driverlib/i2c.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_adc.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_asysctl.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_can.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_cla.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_clb.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_clbxbar.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_cmpss.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_cputimer.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_dac.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_dcsm.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_dma.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_ecap.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_emif.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_epwm.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_epwmxbar.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_eqep.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_flash.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_gpio.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_hic.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_hrpwm.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_i2c.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_inputxbar.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_ints.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_ipc.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_mcbsp.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_memcfg.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_memmap.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_nmi.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_otp.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_outputxbar.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_pie.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_sci.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_sdfm.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_spi.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_sysctl.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_types.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_upp.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_usb.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_xbar.h create mode 100644 28379d_test_SFRA/device/driverlib/inc/hw_xint.h create mode 100644 28379d_test_SFRA/device/driverlib/interrupt.c create mode 100644 28379d_test_SFRA/device/driverlib/interrupt.h create mode 100644 28379d_test_SFRA/device/driverlib/ipc.c create mode 100644 28379d_test_SFRA/device/driverlib/ipc.h create mode 100644 28379d_test_SFRA/device/driverlib/mcbsp.c create mode 100644 28379d_test_SFRA/device/driverlib/mcbsp.h create mode 100644 28379d_test_SFRA/device/driverlib/memcfg.c create mode 100644 28379d_test_SFRA/device/driverlib/memcfg.h create mode 100644 28379d_test_SFRA/device/driverlib/pin_map.h create mode 100644 28379d_test_SFRA/device/driverlib/pin_map_legacy.h create mode 100644 28379d_test_SFRA/device/driverlib/sci.c create mode 100644 28379d_test_SFRA/device/driverlib/sci.h create mode 100644 28379d_test_SFRA/device/driverlib/sdfm.c create mode 100644 28379d_test_SFRA/device/driverlib/sdfm.h create mode 100644 28379d_test_SFRA/device/driverlib/spi.c create mode 100644 28379d_test_SFRA/device/driverlib/spi.h create mode 100644 28379d_test_SFRA/device/driverlib/sysctl.c create mode 100644 28379d_test_SFRA/device/driverlib/sysctl.h create mode 100644 28379d_test_SFRA/device/driverlib/upp.c create mode 100644 28379d_test_SFRA/device/driverlib/upp.h create mode 100644 28379d_test_SFRA/device/driverlib/usb.c create mode 100644 28379d_test_SFRA/device/driverlib/usb.h create mode 100644 28379d_test_SFRA/device/driverlib/version.c create mode 100644 28379d_test_SFRA/device/driverlib/version.h create mode 100644 28379d_test_SFRA/device/driverlib/xbar.c create mode 100644 28379d_test_SFRA/device/driverlib/xbar.h create mode 100644 28379d_test_SFRA/lowpass.h create mode 100644 28379d_test_SFRA/main.c create mode 100644 28379d_test_SFRA/sfra_test.c create mode 100644 28379d_test_SFRA/sfra_test.h create mode 100644 28379d_test_SFRA/targetConfigs/TMS320F28377D.ccxml create mode 100644 28379d_test_SFRA/targetConfigs/readme.txt create mode 100644 fig/SFRA_TYPE.png create mode 100644 fig/所需文件.png create mode 100644 fig/排除编译.png create mode 100644 fig/排除编译1.png diff --git a/28379d_P_SFRA/.ccsproject b/28379d_P_SFRA/.ccsproject new file mode 100644 index 0000000..6936707 --- /dev/null +++ b/28379d_P_SFRA/.ccsproject @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/28379d_P_SFRA/.clangd b/28379d_P_SFRA/.clangd new file mode 100644 index 0000000..a8a6d76 --- /dev/null +++ b/28379d_P_SFRA/.clangd @@ -0,0 +1,8 @@ +# This is an auto-generated file - do not add it to source-control + +CompileFlags: + CompilationDatabase: CPU1_FLASH/.clangd + +Diagnostics: + Suppress: '*' + diff --git a/28379d_P_SFRA/.cproject b/28379d_P_SFRA/.cproject new file mode 100644 index 0000000..1ce1d2d --- /dev/null +++ b/28379d_P_SFRA/.cproject @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/28379d_P_SFRA/.project b/28379d_P_SFRA/.project new file mode 100644 index 0000000..7a1b5f7 --- /dev/null +++ b/28379d_P_SFRA/.project @@ -0,0 +1,37 @@ + + + 28379d_P_SFRA + + + + + + 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 + + + C2000WARE_ROOT + $%7BCOM_TI_C2000WARE_INSTALL_DIR%7D + + + diff --git a/28379d_P_SFRA/.settings/org.eclipse.cdt.codan.core.prefs b/28379d_P_SFRA/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..f653028 --- /dev/null +++ b/28379d_P_SFRA/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/28379d_P_SFRA/.settings/org.eclipse.core.resources.prefs b/28379d_P_SFRA/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..2972fa4 --- /dev/null +++ b/28379d_P_SFRA/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +encoding//CPU1_FLASH/LIBSFAR/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/LIBSFAR/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/LIBSFRA/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/LIBSFRA/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/SFRA/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/SFRA/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/device/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/device/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/makefile=UTF-8 +encoding//CPU1_FLASH/objects.mk=UTF-8 +encoding//CPU1_FLASH/sources.mk=UTF-8 +encoding//CPU1_FLASH/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/subdir_vars.mk=UTF-8 +encoding/=UTF-8 diff --git a/28379d_P_SFRA/.theia/launch.json b/28379d_P_SFRA/.theia/launch.json new file mode 100644 index 0000000..fa57eea --- /dev/null +++ b/28379d_P_SFRA/.theia/launch.json @@ -0,0 +1,71 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "28379d", + "type": "ccs-debug", + "request": "launch", + "projectInfo": { + "name": "28379d", + "resourceId": "/28379d" + }, + "connections": [ + { + "name": "Texas Instruments XDS100v2 USB Debug Probe_0", + "cores": [ + { + "name": "C28xx_CPU1", + "debuggerSettings": { + "data": "\n\n" + } + } + ] + } + ] + }, + { + "name": "28379d_PP_SFRA", + "type": "ccs-debug", + "request": "launch", + "projectInfo": { + "name": "28379d_PP_SFRA", + "resourceId": "/28379d_PP_SFRA" + }, + "connections": [ + { + "name": "Texas Instruments XDS100v2 USB Debug Probe_0", + "cores": [ + { + "name": "C28xx_CPU1", + "debuggerSettings": { + "data": "\n\n" + } + } + ] + } + ] + }, + { + "name": "28379d_P_SFRA", + "type": "ccs-debug", + "request": "launch", + "projectInfo": { + "name": "28379d_P_SFRA", + "resourceId": "/28379d_P_SFRA" + }, + "connections": [ + { + "name": "Texas Instruments XDS100v2 USB Debug Probe_0", + "cores": [ + { + "name": "C28xx_CPU1", + "debuggerSettings": { + "data": "\n\n" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/28379d_P_SFRA/2837xD_FLASH_lnk_cpu1.cmd b/28379d_P_SFRA/2837xD_FLASH_lnk_cpu1.cmd new file mode 100644 index 0000000..c8635b9 --- /dev/null +++ b/28379d_P_SFRA/2837xD_FLASH_lnk_cpu1.cmd @@ -0,0 +1,182 @@ + +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) + .cinit : > FLASHC PAGE = 0, ALIGN(8) // 原为 FLASHB,改为 FLASHC + .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 为多个 RAM 区域,扩大容量 + .bss : > RAMLS5 | RAMGS0 | RAMGS1, 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 + + // 添加 SFRA 库需要的段 + // SFRA_F32_Data : > RAMGS0, PAGE = 1 + + 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/28379d_P_SFRA/2837xD_RAM_lnk_cpu1.cmd b/28379d_P_SFRA/2837xD_RAM_lnk_cpu1.cmd new file mode 100644 index 0000000..5d5167a --- /dev/null +++ b/28379d_P_SFRA/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/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_defs.h.39F345F2FD66E401.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_defs.h.39F345F2FD66E401.idx new file mode 100644 index 0000000000000000000000000000000000000000..12f8f460b23030680995f65b05e760f0b9f32507 GIT binary patch literal 5788 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 W8ku%2otjk;6m!sLV3%i;Nc10xonQI@ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.415269F042D2A201.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.415269F042D2A201.idx new file mode 100644 index 0000000000000000000000000000000000000000..8753927ccfdadaf8d801bfa1999cffa9f29aba10 GIT binary patch literal 1486 zcmYL|e@s(X6vuBX%&V7a=xZaC%9==#f%H9Ui=;S*GbLJ)G9OZ;7{pSrrawsEV}ZC$ zahlOaPaQ4?c~e`t(9mbtiP=f3W|*QDp%eEL1# z-h0ovE0@*RU(F?CN!POeWK8YMA%qCAx5$TR6Vt!E+m-t0B zE=Hq@NAgKLi)uQZP{e3D*$a{k{8}09Q7fY!Ns>A|K6h1>TXHuv%VIngP4soeL}fq` zJJ6VbeN}ab%JY0rHdlMIxh9*Eo&DKGubP2HA6D>%R>Bur4PWpgp0ibal`T^SlIw;| zgsctk$+>m!WC0`72{8w(0f!dIH0{79Q|`sB-o5F8^F@s0fxs{L?OHGdKaCc>Jt&`^ z!w3aI$Qp8J!4ME<&C@5+>v@dK0D)|ii?v_~T8o9}cMs)-8JP-#ur=(^f+0BZcZb&VpBkneDq3Mi>Z!)}TWRhTz)K zKU)6!`q~g9AA%raixg|Y5UA~mh0iOheq#it#OxKkb}bl!QrFPP-0)`;j7$MRxlnG` zf+6^4(zfQ8&xal|@&O1+EF}e6Fa()cx8j2018rZmdCvSvOnK%24Op;60r!jJskP^F z0E<-2$1^83uU9u6r@4TGG-$z--m_h}U3NW}0S?o!1@9QmOw+S{&JH%gE(7K*{+|-; zEnwbQ#Mn{5yq$<2Onz^h<@>!Fa1(9PP5!>K$9wp6Pb2K4j@DVQnJwS^+aTW@Z31;O zZ7xESVfVLJoXW2&0oT)d-30d!m=6f5(F`yj3&dslbH>u!Yg^$jWhx7}-y6-o!jp{~ z+dy4GD+*DKHwl=J4q~N@z5jUEmvJx&(U1l2;(p9(56EF4V<8bAT-{_e41=|AZT3V}{Y#VGT-Pd2T4e)Zh zT;CwhEMPvc=>3U2_~Q)w(;oo)s82U}_vmG#yko^~!0ohMzwf@Ko8LR_XZOQSA~YhP zC+-N;eAdx>GUZxzY{Tqvz)tF%g*enbcBzN;a_pk60>qamB72{$ViSN{X{&C6R|c3r z6IA2-0L&i;;^dLh%8MIE-T+=q7wc-0i6uI@M#)6sS;LDmA2oeCK6q@npOF6m%EMU5 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint40.h.7C423B932F3FDFD8.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint40.h.7C423B932F3FDFD8.idx new file mode 100644 index 0000000000000000000000000000000000000000..2fb86fe16610e385ffd6c8ac6e6a7889cf504845 GIT binary patch literal 242 zcmWIYbaQ*fz`)>~;#rZKT9U{DWD5gvaY<2TG>`^^w9K4TD}8-^XDj`ZO#S5KVj}}n z0}!oWlAoVbte>2pTL4s21eDcHPA}0-HZm|Uh&M9TGc?pQ(DMli*3ZmK&M8ev)sHVO zNy*GBF)`4~0NPQRn*=hyC^fCv3rPRyee*qA$WoV?hf$qDT?}kBklpNTNmt^WECl?zTm>Pg+{gV9roMQdt z{M-Vdk|Ln2ZgP5wZZgo52JuFwdWMF226{dr!TOnb$vLGdsrsN0$xGMEprVl#5Vz{b z!_CgjD`9|nfC1toP*f!6=j6oafLIl2MY%v0LvdwpQamtf44IGXM76~R@-Xm#ql$rn zL!VWjkAahgiIJ0y;c#R~vo4$0E*=J6n6v?hfgl4XD>DN(8zVcbpyZ2XPIa+|xEZ*B zS`{P}6u|@oCscV+YFhD4Ap2gsfOp_oPa#Gg4h4P%ahSG`Y)Pvelbd9ic{ud>^+lkX z7=S!keI*3XK*~TK#)G+-krU!lsQA>>fTsD%JEIu6IJ7vlq+qJUP4@Q+T9vc`h2=Tq zC1Juae*p~v`v)oxa~3lf#1~LupmVhKjbRq^Z~&v&0%ih3QEE;iNL_JJaxpiMX5yI2 NZ1Q`R(sW>m0RYfP#3uj% literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_ti_config.h.EAEED0DE25AF55A1.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_ti_config.h.EAEED0DE25AF55A1.idx new file mode 100644 index 0000000000000000000000000000000000000000..113bed16282427d81e3cd2c59dd3a65659d04dca GIT binary patch literal 500 zcmWIYbaQ*d$iU#7;#rZKT9U}Zz`!63#Kk2=nHzvK7^G$9q+03g>pNTNmt^WECl?zT zm>Pg+{gV9roMQdt{M-Vdk|Ln2ZgP5wZnBYqfkC{Hsh**so`IfENU(lpUUE)pN~(T* zNoIUGr}3t8&2aWNWk8p*?ic^FL@OvMm9GX^sx zo;ia#63>Fc0*Tkd$k4+G=i7+Hw)>{d4h7n(#-Sz(GjPq^Jxe76)Y5>$X7)&4n444>slex59 LWOpSoGBE%E8f$D` literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.9B6053A3B460A657.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.9B6053A3B460A657.idx new file mode 100644 index 0000000000000000000000000000000000000000..d310e59fc009a37ff9510bc3cd63bd70c6773354 GIT binary patch literal 4000 zcmZvfZEPIH8OLYSm`puO$nKKHi5+`wW7i?I?=mD2q*4j72sm-=P`@U1bza}?*^AG2 zr`t8gj_q?C2SchVNgG5!yp*&w(3B+fC26aI0;njJT2wx`RUi^-6cJh|YCeDR674S(^XVYLvVTX;y(Ej*v-E?kTG z@d9+=YRu=u_mRVe>!E~&6D(X2MW`v}*F+?7QA8hCTKQWKw=4o*Bvll7no0yg#Uq^Jp|0 z;~N^*t!s!jG`F`!ymUM@oNyyUPJF;iyOEgK>VCrjoR86=zAHt9JhN+J7eD<8VZ8O%ZWU1fLG$e@7K z)Ig9wNsAb%1fZp~rA7t;z-fhByuJLDx9ZLnF-E=yK)2alCWD%xWAxgKlP}i;uo8d) zbD&%X1#J7>rDZeGR)djh0LHEHDj5{;+2K5W^wWP^jKDkdS#9O4R$XWm^w&3kkv{X@ zxe`Wh0I1DsE0aM0i{yj8`*Fj2lixL~8TmQ@Q<^mevxJSBrRuG)EU)JXCC=xHzVHwV8j|Jmq7ttuU1~%^+I_MBT(>ppV?>2pn%K2Irua0@*DsZ zfR1Gyt7K5X%DKC{)*iiQfRWVzWJ|KP3<~h;*tInW$2~??0MJv?Qze4}F06d!`v-RB z(~J}YaA(<_H8Ln*@#jTHhF@zA7`YXIoRzDPK>@#_n+|`=-8RaI4nULDR3?J}!sBq} z;_>`HukQ!oW&q-5+?GMjaN>hCHMLLOHo-_e08eU5pVU?q8Ucap!J)eJT-S5mw@>C7 zSprbI*|0y3DTCGALl#PjH{(K>^!e z-{1M)jw63yq!xg@m9LgT0qOY%o{=>GOj?swGALmD#Vgb2dzvpWQU<`FIan%#0)BqWiBE36qw^9Y1^@{&Q7MB0 zjONKl7yaYd6-G(`=r8TBl|ccs+gnaGUfKIGBQ*ewS!0zlD1hYLq~8Pu4l93gaai$X z!6!uLZM4nAQmFGR&6;>@be^L*6L+}IN9c%&r&j0Vblk*3tV3C(Q<{ktQ-_*C_i84V z6CG+9ozYAzb2@wyx=%ClYoY6C#i8329!|Ts^~ZhZ>lT4rOKahahd;C+S{zzWLDqRY zZ8z{B=)8+|8Mq~N-a~r~JnlMosAJ%U*SSkw18b+wJ?a^_&vZUW2Mzp?Xl;v&Lra^# zu}^&y517s;=!A)Hq(iBvdo&YW0L>3xNjP6&27;CcvhX{UaeYA+E{8JO8_1!zVFJG+ zB!r)#jGqPMf_)V-XkL&I&V@WaEXW0;DrE5cK_c`hyaKHW62g~I#zh5LxDm=|LpKzM z_EXSxK1Rn(+|oMVO?R6(vCb#yq=`pP=Xshpv0CV0K6F|$(U)-7!CgZK!}}rtiO{t$ zfo25>;Z!K&W(QgL6Ut~zAPZMQ8SMyU;YBFpX#!a|5X!h0K^DG)G8zsnjc^;3bsnQJ z1M8>GdugwM1xn{}8aL2Jbe^CI11pQp2k3x-y9gC(n8Uw!&3M z;lTo0*cQrod_fjwg)+Jn$ikvfKKagH)|}n{{wa_j*672U_@`0+utGpWI2Ovd)F2C= zLK(Ll$ikga#&Q9&@FbM6yn!4#5hl=pAW^WLLI%GnB!uH2fBkCekE133`4h;8G12m?YM3l_-2c2LG$0kSX~l+k5C78Zjt9z>9Zv7ii&l5)hr&&7TCAAl_4AJ%ui LIv33TnUMbh0HXl$ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.A7E3BCDCA3D52814.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.A7E3BCDCA3D52814.idx new file mode 100644 index 0000000000000000000000000000000000000000..fe637c190eb7a3391312f9b790293f6acfeadd20 GIT binary patch literal 3888 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/asysctl.h.6B7A1E576DB00B93.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/asysctl.h.6B7A1E576DB00B93.idx new file mode 100644 index 0000000000000000000000000000000000000000..8631aace56d2477f89b6e8fdfb45e32e780b17b6 GIT binary patch literal 2396 zcmds2O=uHA6rO2U(@9p_(jG*L-GfNAG`o%VhbV;-Ef(uOs7eqP2Q*cGJlQsvtC89LVf^Z{B?GeeVsE zL;ZbyaRfjt(|^*yG$jB48rY9eTYI&NE!@$v8EmQK2nMB{8cC&fEKzJ^v7Mqh8%qS6 z#InO|H$I^eX)I@|RI^MeQ}iVgo%r1W$;#1ej!M+>9C~-gT#6AJGg4F9XPKDcN~XW1 z;?>w?{&g|1=lUPlV!%?5|52W5nbfv)$;RUvq1d}D|FqM+g9Q?!dUELw#{KI$=-pPp z9g2PV^S;hxE#Fn6c`&BwI4a9>EGkn?jzttj8A{nW*_l+7q|(l2Ib&;iZ0lND9*cBu z?K+t$v!qCYs8kP6tdvO2=2lLU!Rg%i%4sxHl_yRlE2eFU&%lO}%2q5rTF7Fuj7?QZ zMCnju_LZq+=|om7Bg>j>v;MZJFtg5epXqB{Z^X&Z0_8Acbn8PG& zn1ssG$8{1sr_&4TdZ=~nwFp)-ry(%Z>`ksiwdVkAJVvIf0JwFqyXlKIDpZLm(UI8W z{jsn~M6`?UNi#ZzON-7awR$Ein~77xyy zVVNaDi6(AlnnSb#Zq(3W3t@bd&13^p7o^qKfhaab+Te| zGt7!yXIqq(o9oYSS);)A2aAXZPi%1XXWoQxxCSeKNSWmg0#8yetU95Gd;;7{d m07Cw<6dzQf9nryOmmbeu4Aj+%Yu1K>K=l3U{ADQ`0KWhpgilNW literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.0C2E67B58D684010.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.0C2E67B58D684010.idx new file mode 100644 index 0000000000000000000000000000000000000000..390a1f60458dde84f624be15b713382de7f51305 GIT binary patch literal 1518 zcmb_bOHUI~6uuW3kvn6-mWL6EAfi}=p@5=jNU*lpghwqcXhNv%blMqS#ZFs+g}Om} z#b_cLF(xJ$11=0fL=zS!MqL;KE_^IBafP}d(YP>5M7=Z3argn;q|@{G&Ue2v=Zwo? zw|`;~vIZP|-D1?2j1V%>pAwD8Q#l(c?lzSRteF
{D%iWpJ&fj)sh9*%S>y*@$o3W5@qMA^re@2;rY6X5Bc7O%a&w)r5h z^eaLz#QW8zONEspl2CU)G**_784t?=r1W?DKhv>&uuj#~+Gkk~(W#O~rqRgy8NU&w zVvN?NVwU-G?etRh)9wNet)hSurX-E^F}^evkfZ^6UtMiCk3OUTx*~+;46MKi2A$!8 z_vo9VGhG%At)YM#rY4;g88KZ4JgXd^{V`m1ibE+BKyyY`6`}(IzogWMeSfAow3-5r zF~>}7fC-p%K=Zcr!TQN73moDoz{R*SSvzCT)Bz|W29?Dmz278`l;d&(bVsz-wMC|n zyfe3Y@%uIob0maA8$e%RaN_5;;=?92To|f=@US8G#n-LzoYfp@&S@?N5{|gD-P?4} zli}H-do3GU%(~Z_(Yh>mB=<-O1KE|{I@jRLSiiYZFSi({k2snS=X}%H5a;ds9Ee%%^5n9Y1kCZfiRt4 zPH34NDO=j4=j8Qr9(ce{JMd$_0p2gswiH0?$UV=yl$lZ5y($&D-}$knW2$}R0o5d9 zIUA^8nJHx@u1o_o(e@fB=ZjL^k2(im(pvR}LU?lQ$>Q0ithXxVX1NR~Vf`s(6K+}u m-!##_1gMROT|U)TB7%~w8m#)z&MH!n`RmTf^f!x`MgIVa;Chk( literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.6F44E7CA7D811DD7.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.6F44E7CA7D811DD7.idx new file mode 100644 index 0000000000000000000000000000000000000000..6f11e7a8d60c39b6484e6d0ae6550e87cc9055e7 GIT binary patch literal 2774 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.6B9DDD0CD960ED8F.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.6B9DDD0CD960ED8F.idx new file mode 100644 index 0000000000000000000000000000000000000000..8d6c88695671fc61fa2f7657f00b9fcb4c392979 GIT binary patch literal 1270 zcmb`FPiWIn9LHblo~BvSb}hq!3UdRU)h(M2r$q}}ZMMK#OSZwbgEdWFw>SG|OS;<4 zix^G+N`OVvbJDn_8KciWbjr<{=Se zpOK+OT1N5o*r<|BsLpCIt(^xTw`tvTq@H>+s+UyBS>4!l{s$#n}+@c|0i8=n?V9>lc4U9~asMv;}}p+!+uxtOaU- z*9Kl*It1i%eqSU`woJC!K#+$cE@w`^>bR8e z5fBFrF&qnu1e0LB;YshE)o;sv=LNJ40QeRXYd5U}#`kI8O7+)60c{0f4$p-}0~_Hw zFtRszVfg;l4FNR)pklRIl(F1g2TYQ)2LAHl@i`vc8!!8JJ^Qk!vctoR2`@q>XC}uoC76XxodMGb<3=Hr#k)Y2(VvMY#`3#<}tB ztmM&5e0}h_e+J?tmkhF)nS&DB7|VC2o;G|~y9M+FH?g0kOe4^?J~w~wi=2D0TYL?4 tjEl80nmGm9cIoCO$!oQ#W$IQtj9!sHtRH(9&L8jw{K)T8F#HjK&~Iz|EIt4L literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.B602F7E483353EDA.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.B602F7E483353EDA.idx new file mode 100644 index 0000000000000000000000000000000000000000..ec1c171415798e9c77e010d74518e598a27a8832 GIT binary patch literal 1686 zcmb`HZ)_Ar7{=c%uFhTe`iEkK7HTa<>uFfPDtc%`dvx0~*Yk4MBP6C>uX}sFE%%4+ z?wwaGZD|5DO(l{567-9)tw9Ww#z3OP_@QF_(ioz_U_Th6&; zo0S*}Odtdwur6ve_*A!XZ#RKD=@e*OID76h*H`j2NnJi2L%2_)bROW9*G8 zs;nr6nNYQ;xb>A6x4jyZgK}63wTif`V5C^d2{i3B+ zS}Yf!P>qG=8sSG)gM;H>jljA1n@>+IpW|yc2v(_Df*hZ#DhZZ9ICRgmklHA~D(iW4 z*w62;EC|XhhrK_X=yiW`5d}OGjPj!uC5Jm7{;~3Y^T{RwoB&lfxau2Rooit2K%*t8 zF2`L=$#4JEG?CmQ0AU{E96!$8w~ud|PcQy+eA}1+k1~u)|w7nT^0wnMxv$--` zKYzAA{|4eN(zTA^>H3dXmil7>#GRzGs2(0`Nq;%~-2mbQNfckd>AW*=VdkX_Vu?s= znF%{n+>3RVlzWfXMAxM14x&0svc)AOW&OEdYj2)F>?i)B$!kk5+!|f?@+@M57`4p% z*4^{Bc;G8zq%!NTv~YS$g^cdtC<`WbNxX=$JoShb;zRb`ZaH6f*s47>kE qb%aEUZwk7aj20w@t{5A!FLUkQr@i-kujg=CWd&5wr?D#*0ltCMuo)>b)Mwbm+Hqn!0pZ&8bF?6#3KhNKZeY)m)XW@|3GyNRjR zwidh~^>7N_P+vr?ctL9s3o7D+7km*BMbSQp9HpQ>94ZG6Uhu!WGl|dAflX$9^YP8h zH~(FqOAvhH5ORiH>6oO2#v+7@;88V2UYr9Ry_L^H_R(xsYiV^Nq=ZYIiFmWzl2k&P zoQSJd>u4@wN5&dKIWB9+=?yfv>T7)FsMhP+VD?;|h8mwQ;B7F6?wWPM>S$6jM_xHz zpG=#5ztd%Q44Z{Pm*0m(hYOw*YL=stgXejtgAb^ZqVl`aBEK`CY*V*~L@6kWsuq#t z5WjfElI1JIK}}M%pkMG+@vy5!LBU<+ujAD=RcvnIoAg-zjQqZ3SW3yF#G8MkVWh|@ zNr}o$;3da36l+^VGfmJCVKt4q2#RFT?I-Y}tK;|BqM((?4!<2wpX#*}53E ziz&)V{BsNTxd)DX;?M*t*~o63locpav#P=yIo$hZ>e`N6ma*DoEYBxmbozDcOM9*x z16Hu|2gURj7>k)c;WT@|M&<<5!~q*g6HIdkY~)Mu>noRzeqJ+S4lG%Q%kl|DG;~lK zVG~ZH223I*6PvG|^GO$KD!|5rJu|4yv%Zpnt1apEfa`Jn6pGK4oEaHv33~w7;kt~v zy{j^QtNl?c;0TUnj$eM=>bZG-X#%i-g~`-}-YM+GxJ$yFy+xskv8nq&oy5t^l7cwx z+S}rf#{j#rJ7cnXXu+4xDa-l*t5_|j-e105FFAB_m5#UIEd><6l)B?RmoHxgtYIyq z{(ApzYUIQDe!#W3HnSwHDcB&XCE`OX2_{Gdk%`Cs)uj#Z4m|{;9e9WS2{+mYi+%UA znYLGeD{*Bhp@>!+*ceqt`0ay2{I7QVzn~7_K<1=Kk)k18qAH>~OYh|AKW59^JIb+b Q+9e(odZG*1}a@-tHyiYs%I6oH=m zl)3oq#6L4ic^H@&7+6$TRb*L>SdC;EI2jok*q9kvSs98_(~8BBR5Egbl|e!VNEW5$ dB!W1_Maf`w%q)@m>y6|?69X7o8Cc=U7ywdn1LA|-f*kdo140es-FzH_J@kt!i<8sR^^-xCl%rUpmrPUBGZ@P9GgBCf zD|3?+fnNQTx%lkFKQl^s7?>CsSX5Y5WLb?^jbs@(85tSam>F4F8H!TVip7ysGID{H kLBa`07NzDSf;h!R$zXNNERp)_jpRcU0~lEuSmDYT0LQ>+wEzGB literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.F0FF8E40920652CE.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.c.F0FF8E40920652CE.idx new file mode 100644 index 0000000000000000000000000000000000000000..0e1122d433abb47da946464b7fad99bed08ab293 GIT binary patch literal 382 zcmWIYbaN|XWMFVk@vO*AElFfyU|nOHzwV;)C6S9QB<8LJi~Hd>n&4^ouKtlhe}mlR@^Bqu8UDOlu1=7|QZ9 zQy7XXbCVQ-9{!ZM`0T_#GfH_Fm>3vXR9IDHS&dkYWEnUa85!7^8Ch8wic-^x#gSAp na)FgWLJLS1rRF4pIK@TDV08?va4BY%Nd5Ij@}Y?VjI0a*RG4d_ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.C36DB41F135CB14E.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.C36DB41F135CB14E.idx new file mode 100644 index 0000000000000000000000000000000000000000..d351eeb36c629e11cafee47cfa930d49eb3ec6de GIT binary patch literal 478 zcmWIYbaT7L$iU#7;#rZKT9U}Zz`!63#Kk2=nPxz7FwoFsa5ge9FbGd9N{!FSOe#t& z%1kYe&&bVqjoZVO5c3Gh#K8W#D9FWMF4zWMgG0 zN=+-)LsH4e2~hzFcm{RGY!}ai2j($yu_K4EE43t}ISYOV>}zPb^B&%b?t#WRNqYl8ePb3{Vt7027? literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.E7563C27A6820166.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.E7563C27A6820166.idx new file mode 100644 index 0000000000000000000000000000000000000000..6bf01c374f6b5cfb2081365230b9e22134516d06 GIT binary patch literal 390 zcmWIYbaSg?WMFVk@vO*AElFfyU|nOHzwV;)C6S9QB<8LJi~Hd>n&4^ouKtlhe}mlkyXbQuH#YX=F0U>E$R+ z2U<{;pP9l?T$!7s2=wBo%*AIX{+UtA!@vafGOH1*kt_ozBO?PFGb1Z2Ls4p4u^y62 zMox$dsB(42Y!}ai2j($yu_|#W$wEbex^fah?Bb&2VsRkN#OgIObkZK5nd=!@7(hV{ F1pvdiYrg;h literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/can.h.9E3FC4B8900B7465.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/can.h.9E3FC4B8900B7465.idx new file mode 100644 index 0000000000000000000000000000000000000000..87590bd624c102885e9743dac7c00815a2d31f5a GIT binary patch literal 174 zcmWIYbaPwAz`)>~;#rZKT9U{DWD5gvaY<387mx;nw9K4TD}8-^XDj`ZOnqk~0|SHb z#G=%Avv>o8cmqQqsh?7mS(aLqlbNKSW@KS(UXg+%lAM^Qm%&h6nVSSMttd6ESR6>R utTbC1B6mHSk&97_LyH$|5kx*G5kwakB^Pr8X(q-^O>q)me1BhJU;qH^LM!e7 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cdefs.h.543ADD3A5BABD5D3.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cdefs.h.543ADD3A5BABD5D3.idx new file mode 100644 index 0000000000000000000000000000000000000000..c8725eb8a3469dfd84dde87e209462f1f59438e7 GIT binary patch literal 2648 zcmb`}i&s=d7y$5{JG1wG;R+-oVUYPeX38#}vWJzKxJY4<())q3EQT$j?3QU+#s-QD zl01(n@lY4AC@Vmd9-0N>11&%WEQQS1LJ0||aIo*%xpVgqXwTVm&)nagnQy+i-|Q|3 zGa4g2G@3avVeiD7ZHt*kqw&G7)s`6d6<%+BV&g34hxK~>oQL(cIK9baoo=|_AYb*i zganIKZ%T+?j*ldwPBSgBO*2h57z|OY;jShgk`aD zOM>3e{C~q*S78t_=2$C^YF!l{Ek~V*&8KhEXm0!P`mhK6?;^xQuv4&8&;Qn>(YUr{ z44&HmC`0HZ&`G=$_$>Fgh_bxzWJs4FUAj|&UFl8Z3d3_e5JDkTPSdT=G>iY)-}ZXy z@OFv-DZ)qvBHN#juJjuvLq3Ci=Bq%&?2N*MzlvpWYQd@HJ$Czmb=|d_GL$hWQ+t&6 z#3#?0I(|690D}SMtqisN{NYhwEE|xaM1&I2Pl0YRdgp9YQUJm!0;kAu1==QG=>6r~ zQ-KIa2^=MSsISt}J&MYgjzzF*!LH>A$!#C4%P!d{Lm7oK%6ru8KKCV@erFs)od|W} zSY?is%3Pn4Q0Ei`hXfAEUx61!3PX)Qk*166jPq787n&d zYuZW;2yFz~)E=3WhrM>MbIg4Rtpr*L-`GiI-Lb*`kuwnbDD=@0%H)^E9=*eF^1g=< z8VEEH4r8e8&Et2^eFR~P7Pe^l*3Jx$^)**m9!Dq^p;+Wmg|V2}{wdB7gtZc^m2Ow& zsQzY8P4y26a}jnh*unVLj$FFo^5D2$BZ3i(e4yu!zOnqL^cA6a`wW9K>c%ciU${5S z+&2#)TY_wf50v4x+Hj(!VLn2R1UVAl@v@t%tD@GNm!XbAox1LfiGS}|y7++w2=yY= zi+3x*ezeBU!YnV!kfntzE#FwLrV)wJP2Wc&oD|`t$V*^BSL^T2qG~fj5`!ehQ)n1S z3p%i=WeGwmg;dI;(l_t-_@iR{n+PRZDADpv#jMTK?C`6yAoNn`RePLjotrz)=#s&~ zz`=Nruvy~l`+B}kK)4~o4KYAjhu?{Sy2wTQS0WrHa9AznQDYn8*KBN(;UIy7>dQ0x zrtea(`jpiOE(R`j9VZ%RzV>X>85s&F6sS?PEPqaX{9N372u=o0#@~_YJM|wPs=6x) zVVels#8FCAS7YtA`5~9rAtX^qQeWvGy(9M?-mi1`cnI4GY$rTdI^i4YJH4Y@y`LRkuR8!wHrH1~EU zWtr~ne9H3O+eMTWxwlKHwv@WXf043_?tX=`EAH(f%7)zA*^FhYsnrSFnRdHcL$$gm zjsy&E$iR&5)WS}+P7`LmvMi^+>tlp|3jOK{)gv4`IP*YhHiAn8mwG%_oNsKu-IlT$ z!7hPaJ>-X6(&z($)iO+iNxV*d+D0G$e3q~UZ&y&Lpn*zGzdMa}+7cy0IfHV>lV2nG zcxHKgv=t#)f@J9qrAK>i$RocN6c->2iZCeh!?DXdXOXY>nokgNDdegJJn!c*U0$2( zOAxXI$P#!(%z7s0jCX#x6XB`|SJk05EneU8c|}w?fHoTK-^GL8@5)dlLXmm~j=$ctFCeYG2Ej$ZrB>Zv8^b%U zt=zK@;adjZs=s35iW7%=K6tVgp<9G*k)Iwjj_WgCKJW;_ z5dufl0)EW0>)pK63BMrJ5~wA^lR z`NV02O9UI9Azn%xLUI=o6t&4Y#m^Em>in(T8wdfa?NJ`-9Uu z!sqpOTtjFf(4zi?Zk|82?8#o!079V%g=*O(nk|dvyjc@XR{7Wxgv$KD&<{qeuOvi6 Jl#FUL{{m3aJ{SN1 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cla.h.5DC7BC19533B3061.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cla.h.5DC7BC19533B3061.idx new file mode 100644 index 0000000000000000000000000000000000000000..f1be8a68380f4599e053fabdfbe5c1a4a3d84033 GIT binary patch literal 2436 zcmb_dZD<@t7@oUclFc=}i~Y(aZJG@UHfhc6-KDvNSkW{#7>r3tf@zwxo4vicyQTYa z-Pvs#Od$ldfBL_O)(59O1C|u%f$|h)zLqL{%}x3>J$DAvh~KmN+;vAm_1j44YZa%ug!h^pLLP zJ38+Q^C`-WoyB%ex8_T8w@;0`=7gg-E`c?SC)k;^wR|4i6P9bM*!Qw=ULy{+kDA%B z9CaNw;g{_e9lBI8vuwF*{+})^D)b~+bYT6cYhAa3xcB06}s@x=}G% zhN&{_F2h4**i(k-GVCqGJ__Z@fr$rY=IcS`>p|x0LFVg0=IcS`>p|x0!IH0^81@;B z9Dy!_7SOUNV_7;<`-kDlpq!@Teo2xB`z1${22+VdVoI^GoR$*_Igx}YWo-@Wu4@@7 zm+I^8J(saE$?5NNEbd2KoQ@!HxwThUGs zxIwp`1uEEr5C}efZsm`=6Bq8UL%Tq*6huqGXz7J&g8{TV2BPNUC7jw_k|UmbplRYc%~t{KrJGMINVA7K64#D_|8j80 za&Rx7=qwyv{Uvr|99EnZPWt{o8h_{1fmdaqPY5S`nimUbS}AVw^()uftk|U&fSwkn zeKoHf(6nq^&Fcj;Ef%MFm4K!t;?`uIV{w&&4hOK4jcLzevW!66dLjM5SPh|A~ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clb.h.56151511229BBA8B.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clb.h.56151511229BBA8B.idx new file mode 100644 index 0000000000000000000000000000000000000000..1cac6ea0ff75ea2d7a6d76460fedb00e158f9fe9 GIT binary patch literal 53894 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cmpss.h.59945CDA950EB7D6.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cmpss.h.59945CDA950EB7D6.idx new file mode 100644 index 0000000000000000000000000000000000000000..2b0aed6ad9deabee05eda9bae9950f7deee0d24a GIT binary patch literal 35734 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�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 l{CTau;PaJKrZ%O_rX*)Jz3ms*9&{{f?}M+E=? literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cpu.h.F8DE4A1566FF8E5C.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cpu.h.F8DE4A1566FF8E5C.idx new file mode 100644 index 0000000000000000000000000000000000000000..76b8d724d4325278fc6551a12018f7c841c94c2f GIT binary patch literal 1070 zcmb_aPe>F|7=LfwZRd?+lv`BhVZ<;~+?m~U3yFo2HH4+8bqOSx)|t2NquHHp-mIwy z4}u6GMC7H2)==sY2GOBFJcLkWk$CFhp-a&vI+z6gIrOdVOwri~Z{B;~{J!7s_kHi3 z@9XVt@gvk@^o``HlYuP?!Q_t3RxoTTqxA@C+s+}1a$>}xc0tyye36;dmRSJ=3!Le4 z(Y74R87)#CmQ$4eg`_#P4|Dl+i5XPRTDEL}UuN>KC~l{@HgtkJ2KWi*;z-kI#x$*~ zm5sqTEH)it9K34|(!2X$4x=no(5)y+Pq*SQr6;PY>V=F=wV0-=ni_$xV%Th$+9n%R zveDy5kBu1rMD$`QocoVN*LhU!QWaPg$FfYWxSaxt4t>b!&?_=pv@0Bmgw=4eKc%pO zZk7zHxb9I2iipI(=&;2M#7FakLvWd^Q&Sgj&qq2XRJrTQAZ09-@g77l_DKRJf!*Sx z^t<5VoP+{@5QxlTX%^R4AZQCRms@=AocX?7hiY9&yfJ2wLU+I2jlfFpPwXx3Geh)J9Q&Bv$_{@2ZRAH*Z%T+ zQ+SIjaf z^^-Kz>HS|XLAYILuX9P8*J8W&fBMEDJdK5E>~;aUy#xMg&#EaC6XoS6FYexlj7cm^ zV$XK^UdziLXPcMcM@mR}!fr==glu)TN<&DZF>%PXQS-E^VR|gI0=XF>DX zPriXL6PTyew2*$dS$?$+;TbHLXJ72mj5Q~;#rZKT9U{DWD5gvaY<38Kad84w9K4TD}8-^XDj`ZOnqk~0|SHb z#G=%Avv>o8cmqQqsh?7mS(aLqlbNKSW@KS(UXg+%l3Y+)l9`)Yq?Z9Sw=y>gWM)xn zTCq5gZqrd^JAVAxM@BA2Z4PZAuyqjmoJ0^^T$EhQ4WyYE@2^%rIN#s(1_J{CceyVT literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dac.h.37C11C37B22880CC.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dac.h.37C11C37B22880CC.idx new file mode 100644 index 0000000000000000000000000000000000000000..f323a4e119059d046b693a70ade73741eb79c8d6 GIT binary patch literal 13934 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 IQupWo0JABAivR!s literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dcsm.h.CB1085BAF53705B4.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dcsm.h.CB1085BAF53705B4.idx new file mode 100644 index 0000000000000000000000000000000000000000..d6d32c90aaf07cb11df6eeb28addab3d9c79a7f4 GIT binary patch literal 21114 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 Ijamr(1*Z$fbpQYW literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.0B8A578C07DBB270.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.0B8A578C07DBB270.idx new file mode 100644 index 0000000000000000000000000000000000000000..a035adc53f613cc7cb355ec416902a8831772c59 GIT binary patch literal 15466 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 Zc%@&n9UG^wIWU9|XxHB0eJn5-{tIsxe$M~^ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.D0CBA94E9FDF489A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.D0CBA94E9FDF489A.idx new file mode 100644 index 0000000000000000000000000000000000000000..e34a1bc90a9b92c0036c6da5362a27a361c5e098 GIT binary patch literal 15488 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 VdQah{pV_XSz!3_4u4X?t?jQB$46^_L literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.37057073C9A08AAB.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.37057073C9A08AAB.idx new file mode 100644 index 0000000000000000000000000000000000000000..191350203b5be6301cb317f51b59d3d27a09fdd9 GIT binary patch literal 7124 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 XSM$EWch7#|QpfyxmvQqMo#Xxq?{g@x literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.B30C87AC9A848133.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.B30C87AC9A848133.idx new file mode 100644 index 0000000000000000000000000000000000000000..45ad349598ef2efe3505cf87db124a715f8c96ef GIT binary patch literal 7206 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 gIysDNuJKa?dQa))pANoeEcwTcrTc`hYYIRA1R literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dma.h.780BE45E34CDCB6E.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dma.h.780BE45E34CDCB6E.idx new file mode 100644 index 0000000000000000000000000000000000000000..3324a6b87b96622eb15d0d2bdaa7c67cc0ff5e45 GIT binary patch literal 38708 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driver_inclusive_terminology_mapping.h.2717AD4B05C9ECCA.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driver_inclusive_terminology_mapping.h.2717AD4B05C9ECCA.idx new file mode 100644 index 0000000000000000000000000000000000000000..3f595e48938943c4d950f5f707366beeefcc1cde GIT binary patch literal 1450 zcmYk+3rtgI6bJBIg>j%jg+?A72xGJ;(%vdooMM5NG%2NE4*Ian=x4lcho{NaWIJMXn+_as zcx)0o?s>$$Z)HC(WA*)wLB?i7p5J;FA~-ReScnxq&O%YPmp;n>cI$Zi&W%7C|t*Kf0g2Jy*9YQLJ$%T z--dv2NFzkngFcC^o@<@1nx5y2kZYiZtX*Jl?k-qAnS;y)u9&UX1|FaAQatfp*v(--Vvh>aD+%jZ4*fUu^J>onb zE0gU;PKIRCyg7kCFgm-p3Rw(dvZdDWS7?JlTa8=>WvT2U-A#YCMGeYokO3fv<;wAe z`ARvz7C9QC$x$taBVL~hMAjoKK}il)G}EiCIA3By)`C{RE^_~JUS@Ej&5T?Jb!2D{ za|;qmkFK&HbAUs$)ysu1Ue9KVJ;-Zd4SB0R84F8KhO>OgI?$1JuFYBAJ9Iy*6*(1B zNjooiR_B^6iN}!TASXk6OEB?7DF0qNasxDwfWwcjzueqi*@3J81!-r&y~X=;zqlJ& z00L4SQ9b;XYDWDEaty?ffbC}$7jqVF1(12bBS&@O$6t-{Mf3o2BQ%nL*UYNcr?{iT z$n{W9)=uKl`sA+Qr^p)6kk?1rcgM8ccK8x<6hw*GqdIxw`Rv!ujDCq65Ah^P-@6;W z8TzAj1epOQi>-e9pX}8S1ECt{0ehVvuIri4n?a6)I5Mq`Hb{bkJ>R(v)H4^{; literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.145F05FD2B7B5404.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.145F05FD2B7B5404.idx new file mode 100644 index 0000000000000000000000000000000000000000..324ba48083990c052b7caaa7dfbc91da43fd7c6a GIT binary patch literal 3118 zcmb`K$!^;)5Qb@IbDZ5toIOtBvrYM_;D6^y#+kL4% zMSJWE^j(Tlu${?WGk~NIqV!{CI0KFDZoA#*>x6W|+p(4@UnGR=`opDGJ*#@iEmE<( zp_F!R=ocrgqd&%ij)wN$87?Ff!leVLIBmau_2ym3Qt49mxqJ74hVnrPNkgk1q>WYY z#o(z{s%WPj1i@EsC40?+fCVr886Kxmt~d^#+~J`>5OEVH(zv*g;0c0A%rQg|k}I@v z4#5|bp@^hPOIutiD6mvHy9#Y?^VR4m#Mahh6BQ%-fWEw!(~;-RU; zm$l7IiXdeW!qcMX5W@255fMUr`XzEXl3LM{Pl0`Q>jt^_q$XrwJNQAo}8MMG0(|a;eM7p zz!JI07p8VN2SOT;ST40be*5*O{GK%r$_tB2%PW=D>e~9o*7ifb+k)F3N>*MM7qXMp>FOMqp-J-~CoI^ZSXD&P^IAH3&wH3vc#0BeBT hfNOxKfK9*(;0E9_;3nWPV7_%T%l`vrwlfDp{sY6VR%ieK literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.65EB2857F01F4A36.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.65EB2857F01F4A36.idx new file mode 100644 index 0000000000000000000000000000000000000000..4a00138748b7e5e789c3a4ff118d2fcdb94d67ea GIT binary patch literal 3108 zcmb`JOK%!65P%JN5%MMpc|bxEa^g^LsnkcLo{%Et)>f)|skAa)FKcDJxb_mDf2zNt zJ@yauzf`pao9TULq+LGk!Y7YCBj(e?{e63zkU{h?QzB=pgpfmb+1$uh-GPr-rs9rL zI=G{stuU5;pK&@Jn@6h|7a`|1PlRN&|Mu0JcM*-mljMR%Mm`CX%HfOTe?u)^H1YrrPKWTt5UD@YCS(iF2abEd9sGv9~B4iid^{@i#RQS zkPcumgSsazc)9_23%Cb(0eB3!23Q3=0=xul0$x93wbJ|W_2=*E`>=abU0GdQ->7ZY zx3+io_756|N5{?6v-4K_;<9sfebc?&C7aJbBxitb+%Dp#076y(w*dD6cL5uKZNM&I X4R8l=9q=5`AKfzi^uLUQ0topBfjd&F literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.F78186796B611663.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.F78186796B611663.idx new file mode 100644 index 0000000000000000000000000000000000000000..6d5f4cc2b8f6417ac3f5c4530728d61243c6c51f GIT binary patch literal 3114 zcmb`K$!^;)5Qb@IbDZ5toIOtLoO~!%7w8h8hr)n?+|m?9F9isiqHH3f#gcMt_oez2 z?XfS=cPUE2RwsAO0FpkC!jGBZ3^aPU>-CzOgmlBZsg@~UCWP$!%cWK|s~$3oR4i{P zrQKWl*-7i@_o<+h#6CL1g=9jwbSM?4owu*vybIYq`_y~*KtuVYgruQWPtwM!|6=%D zC{?uE34-7Yx01bPLBN8S{tmCxD3hCp&sKOS5JcR}i8L-QB=`tHB<2_*2+0-NIEUbi z8Ka1#N=sW@DdY$x6AGshT#^0p06|70RLs07nHq_B?0kQ+R9dY@Nt_I3Omkz@2*Fh; zxG5g6)G9(yF%yI{l;0#mL{ZG$uy{xVqmtq(LyM9b)j?=9UypP+VOnZmgT+HrBVX2b zY*GX%gAkq;eTNX1PmhQY+S50A*6YQSvk+pj9B?r!uIGe85D6oMhIaYN=RimUFrP&I${DP#0p0-a0A2td0=2RE30dj_3Fmv*3Rx;ZU5k~etdFzc7Ac$xVmn(ZnlXZx^rvhK*$o{2H-B>Hee0# b9Iypg0o(#y1v~}Jj&5PuKfuEFav8{QLG2p%b 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 G^Zx)Y16OPS literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/empty_driverlib_main.c.6F76583ADBF50123.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/empty_driverlib_main.c.6F76583ADBF50123.idx new file mode 100644 index 0000000000000000000000000000000000000000..39824ae9f9da665da7d6b1ebd8f1108b58135f54 GIT binary patch literal 764 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⁣sOi&N_2+R#_=oNu&y%ki4SQRj%eGjGcFz7HoD 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3109B13531C2F3DC.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3109B13531C2F3DC.idx new file mode 100644 index 0000000000000000000000000000000000000000..c633aeab95e647ce1cb8f9717766c96666e457e7 GIT binary patch literal 1778 zcmbtTPi)&{6#v@VYny!Tk}M_vXziw5)oy9*xa-;_tXf(%Tc&hOOOZfTYk7{_8sa32 z-O>WnCJhNrz-eN;O&c2$Lpva$Ng%WX6GDJ?*#T+N4ij)Fl@LNOxbd9o)hR+;u#(T; z@4ffE@AuyO`Aj~S+uTFQbSb}X>bA-dLiWMmvg<~q6*kV}5suZ=x@rnlQ(sn)^;g&J?G!g_(r#Z&t`dh6Y|wrI%F8R)C|jP08M<=`OqT!(<44{~0q(v~(W+YoxSl znj54MY#EiEjbf{3%lbBSE;1^H?II{faV{lGMp;jbqBxxvU$FGLCBC+=oTmMR{U${76YG=_ZcCAI&ZVWl~PZHRECER9LdTePdyvL$L&vj#Nl zqHT<5%l3#SOOm9>W64x1DJ2VYMbW5e<<*idnyS5$Tp_j&-E}B#@1QNqWvHcUDNcvh zszwPEvSFV60>p7(bo1Sxwls#44nn9m;Ei(8Kr~7^nbsCB+rqJl?r%R)AH4TGN7^BP z-^&LZOG8<(oc{8+t5WP|lOvtrW&^CySkQf<`;BjsH=bOf#0Ty{I>9JuQ@G1~LcGd@XzG>Cua=y#a=@ee5WfK&dz8O=3eB%Jpy(B1(OXFNBDp zzC*qoB1-*?zsctp{aN%eG}s>;Z$g>iEFwxnOlapErC}!Agd$9&2}PM`6XL`CL7WRi z`7!>ui{ks^}aNR zl9>$Qbz42x?_79r?K%sp0v)+Qj&fWS1g*HpnX-$VDI?1N5PO_oh~IJ=335g=Z4BQ< z&hQc841lKd(V>}AnUOiHp}_q$JM_!>yO1{|g{Ix0$av(Wi(yo7vV6BkS=%oHw8S!H~;_u literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3D42EC1E511A716C.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3D42EC1E511A716C.idx new file mode 100644 index 0000000000000000000000000000000000000000..6caa1d468256c5c393690ddcae06bbda13c8ad5e GIT binary patch literal 1798 zcmb_bL2TP(6#kRgYn%M;k}M@{LTfkas&-3b$6ePhVb#*AVVTk~Eky!Vt>rmxYlxdH zc1sIPn=~Xi0jG)WHVrl;hBzRhNg%WX6GDJ?*#T+N4ij(~l@LNOxFDWWy*fpR6ISy3 z|K5B5`@i?z=hMYP;jcY}Ojn8^eB|k2B@zd}$^n{F@c>kfDKBGT9~7vK8Q{Y*Vr~>$=PC+%Oq}-+#so6D?bW|2nCx zndT;G23yAJ&PK7-GgW;XIu{wMhV3FKMsY4BOGZ`CilR836`!^Ah9$ndp@}cm8ZTOP zRnrwsv+Nb!P(^uSbo@v~v31~GE}YJbrQ%fcjV#mJ|Cno~HJ5FOKtqJ8C0Mzm#nM3W^+Qsl98CX<%ZrMa?btZLP@iY}U}y^>xbP38{S?H#mgxeE2w zEXC>Cdd;YSYBtR?pMziyj6Qnn$1RPaq@55N2nS+ZEF6oG4#w*VupW+0b$#=(diU*T zIMN0I{9ZoNT$*Zw<e>DI%7>Kf1-C$juI7Sn@q_PG1hTXb+HU=u6foKDP>w zzgYsFKQj3HAMJgYdOeip266|`d^Laa@zD$3zA!`Ces&Z~pfnHt z58_-H%8&6+yC|_gF^+9zXf~KlU>6yhOXrRu@*MgtG|2^$&>M#$_U7=}t)5Ts-;lt} z6CO0N{k(Ad;>NAXdl@kI2mANo1wVYH`>(VeEr2-@Omw3e*?9fCv_ff;Np@h+{l5C; z$IqQw^ij$ZHq$ZBYeRTfr)oU!M3UuTKIm&TS1hnEJXUZ;eri`fgef&XjA#uZLB*+=f zv^jhiIm1VUGXR>-M~7xgWk%+(h7$MZ?9k8WZb9Ct6rFa1dd7QBxF|jxe+tpf_=R__ zM_&KdY2=eR9t*}de4frnjL{9fsychCp;<|I`{)F{eecqPn{RlzPSS~CgmCWmZ{r=z Av;Y7A literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.7769E057D87727EE.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.7769E057D87727EE.idx new file mode 100644 index 0000000000000000000000000000000000000000..4105e7051d208e1709229b218e45a182c2c39c98 GIT binary patch literal 1762 zcmbVLPi)&%7=LN(wMm}4Buhz~(ArJAs@>Yyao4p=ShcKbw@mGrNRdEQYk7{_8sa94 z-O>WnCJhNrz-eN;O&c2$Lpva$Ng%WX6GDJ?*#R+WhY2{0N(dns-1uIquTBx-fR#MI z-}m?T{qb{!sj2UG5i(IKtlOrmbA*sR@ORvr6=;GBdxFxDs$SD=sbZT;y0%iWr8#9# zty=SvtyimNNpdSpBB=}gQ~BboRxF&-u$On0@mBFznD1~WSx zhyLMHoXAg44od$fg*c?Y_q9xRQFmMoIBHvz+>NT~u{%3J`r-GVHUq@S7T~`|N~^ZL zLF&eiwX%KDT>W&}+=48TwPLv*f?_n5lq_0hGb_vTL{@&@F>8+e>bfDnQmMV{RCUAD z48w7kO-q;6vEk7}B^f!TjsNYr-010AGNe$I5rw^Fw^AuPvQe?CK&vLZ){wE}4jHPV zD4IHw&ScU`dV01fTPsF+wPeb+?k=a7iEBbP8MUn&v|*_X+$)a8INpzfiH$a(TxLOswMMiF~+@XTh%rw?u@AQp)TJF)e=bmzkQ?eY5= z5O;^W_h5n_zcPcDn-5QcI2BH{qZrvV1$XQUr9E6v0F54WRWChx;naekQl9XUhAEIx z1bYOWCvz_%XXX9r%E1rrEW0f#y5PP o>?20&npxJ_-KiN)54#BLs6T!>M(^Ce`0(aiO+qVaMKK|N19Sesv;Y7A literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.68CDEA8E023F06F3.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.68CDEA8E023F06F3.idx new file mode 100644 index 0000000000000000000000000000000000000000..c5c540f574a301a6b5fc5514b69ed996136acb38 GIT binary patch literal 1272 zcmb_aK}^$77=9hw=+-`98;P+UP{f!`*}4r7Sj0F83ri+3Y$hfIn%WhpZfnz)2^yjY zPagDOVxpc1A!!&j7jl_#A)gw~jtaw>eC}8xJcTH9*__wQ++-x)9sjK`@<&Z>B$XZQ=Kh8v z9uPWwC7zrS4O2iKg{mcUQIqTLmck%}-hbwVft1XkuLA5eNj0j0p_HqEMXr<;v%acJ z)iJaw!4d~EN>NVoJU^1;&l<9B@Rt`P{*tO+G&E6?1xYf@Iav|;#6VB~U_mft&FCDcs7e9dkj2vZRdhLy_H5nyuq`=hKmtHheu{yNpJ9N< z=^!W<0bR?f@!g?oj&=%o0f4R+SC>5ikA1gL!saX4d#`aQO@l_1z;bNJ9xMi6Gpx63 zcX!X7nWg}R65K8BPJ5^`@Q>HV{MSEi(H2AxxCZ>N!`0yjo`wd{>_!qmmuHN3MBS~! zQ*~*3Ks7K(1q0Z~W`CvcbN{yh;f0WdoqIU|Z^Y@XZlG4nuuQbp2FQll6PU>fgIur| zuZZ5SzLSvZa(H2Y3 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.7DC4267892CAA0F9.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.7DC4267892CAA0F9.idx new file mode 100644 index 0000000000000000000000000000000000000000..086618035a1642ed42faf6c711b9ecf39364594e GIT binary patch literal 1236 zcmbVKPiWIn7=P*7E=}^b{uu~Kw`ESG)wOB6&27br+t{#Bhu8_i*g{ORE!s38$?B#I zJ$Uk<2SHFzV+<7!;?09s5kc@e9Ec3(VGM@ioL#gGm$%*icTR4Q?cjGB0m{Rb|rr+jQvrQ8yU)ucJY5h z5f6wQx|&SSNR}-kk7C7=y=W+PcS}(aLGM3vqCie(&{qQGG+DPQfu$BJfkUnqRlB~c zOVu&dl<0_q8MUCK1wj}|3+F7ww1g`QvT#{9FIk2pE21o0_MDSO#@XKNfl-w3)sLuPfc7qW=O1N z^<$4-P9uQ;8Q`!$>F&>+7Z27P*hl(mu<|T&bNy?(Os8^_VlFc-PNqh(W8z3=GIul{nno0cVl5aYekvU6jr~>_{-Y*0n#zv#@_$1S z4+tK*5=+iXrX?beV%3thq$>?~%OMa%?>}=wKu%`RD1%CxteMroR7=&sCRaQABiYHE zpqAvqLS7L}E3cNU$UG=(Y98H&rQ-QDbPzPeav|e71zUdZsm&M0hiMYH#y9!9cE=gP7Y;3X&b0hHO@P*Mk252L!hr**6{F0?`6~ E0b^Y^I{*Lx literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.37AD27353E0A9129.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.37AD27353E0A9129.idx new file mode 100644 index 0000000000000000000000000000000000000000..b57372d015d1fc9fe72dfbad6f471096a04e8368 GIT binary patch literal 1646 zcmcgr-EZ4e6u;@m(zu@6(I%+?q0=(X{iJn$y~FFYWg_ydp-F9;zd-g!jhZAd%}UME1}VaIl_9ibt3!jg}DK7YS+?z#P5 zw`-pxq+|7t$4t;ULdXiff$*L0X7ML_6zEXb3|%T%0Aj>|vtt3a;|k`37m7(J>JW^) z(6wO5z@)CrETAHe4d{5{I{XlPOm8X*Opd#8rUAEL;yFAjB0Qkb?<9_a0E7?CC?AWA zJl9HK<5*5zbYm@`+=2=9De`810G=J=CA1WKD!?>Zl3&~eRd_h0S9MGidwBW3 z7U}UQ_IY4+_&ZK!L5P3L>T!&q+~X%>FAUDs>#|{x42zhCjqee$Zx6RPv0tYS%Kd25 z2<{X!bY1Tl`rQC`O+P(0^>;o0UNE618<=K*x5A-%`}+2^U2A~XL=5)3{abpnj04|n zj;4zUN5`CYYo`@`b>Vq#pqt)!f;he|oQ8QQ8fLrIY7N>u&8@9wtGRcuuRGjyLyPHS zDn?PkX!7JJ+3|iS+Tl#=hnyUFjzxl#@$g%`#PI1WyHB24Z)-%&6HQT+rC5-K=!O&W z=T|q>N6jzpYveq-^Gbd>7Ses~z1x>QSu1_K7#TEmMpa`$3UP8yoB#E~Z+lml-~3D^ z7cii>QiNEL!u;&aih=>P{!dTdDCB-t$qN`zS*<`UNa5UEZn=N~zr6g>y@i9Fry5yA z28+t#QY<6`pV`5OxvY;_CE*_vAVk$lT4^O^q1B4D7bT?ZZC*)wN>kRfwbd+TV}0Y2 zOi{J!dUZ;>s9ju@zR%mOuitwA`w!+2vs`-VtXjlivsBNta<#lUrR|h=r6z}oEku)) zW>qV$7q4V|D(jUi5>r}pN;1~7oJT)w*WRi9_zjwK3%NB}NoJur8niUa2_tSaUTIdf zvR0lN-Nx08U0LCJl7g!t9LkJg3b^^mhcIL?>wBwKhaNt4t34YrGf<@h73466kt29U_N-E7>A+` z!O#m`3kD2K>blGVD&pLLj>fLT_rXVaQ&C`i*o~0}ybWW|;ZYIc0fl}iIoK0`^r0Ey zvB=PKt%Nqt<m=7EP2Zfc^Ej zBOK~F$5{0xItDbrhCCh<>^ldHgBgm3XWOxev_;!zcS6R^qyMwduB10$7w<-Tkcz28 zi0y$B!1ZICOBbalsf|r*kT&uU>14fncf**tnm6VB-K#_OZriY34=>41Rm9=VG>l~T z&i~gUJs#!0jI0hX@?;UD_%~FKV+Q3OKN@*qaI#+K4TEG{#58Pt4v2kiu)&G_4t3Dp zh&GMjPBBB*^^T#x7vQex$A_l=k>}qI#?)kcrWxQ@;ZVJOdGpe?r6()6=bO#pBvd#$ zX0}^ft>~=_&vOIa^hRT>?(4#7nERq(wp*>%UVE##vC(WbcXn^+4maJF@F_yIp%`09=ACr_;pG@|B-rYOonY{*>nT@&*6gDdKz z=C^k=avG2GN`5gm^7zun*Uo*pQu<;(3TWz-s>X&CVsK8I{r$`zI~Nz<|5_zyFrm0q zgxHY6?DW)X}!rme(h|t@5_?maLTalF{3d7N$Wmrxad86^lu&R}{^2F%Y zF0O6M3YQy?cdq~W_^&AxmoJ{qAeDS2^@z`08XX0`8Izw)bj$^V{v?so3E z=bU@q>+nGX2i`hYQTn9~x-Tmn4KYPg>cD@IXkNy!+u;}d*Sf_6U3%wdWJkMo9TN?v zM)NZJh9cqLwz*tE`(TR)y7nHJ8H%Kj=^M(vdq{p(N;of=0>A!ym5^aKiQ&+k@!`Ci za?--VT>9<1F&>(qmHTg0#<6$l0b@@KXND$xTT>2oWI`l0^X`5VQZvJm?_6noC?gt) zhN9oCioGJ?)Kq&x_%u1qe*-6~ap@8g&R5Xk1aO7^Uyd{{FDEY<`k!BM$d{=SP0tHQ z(sMG?zC#=KctdGvP~*Gsx5?8&(NG1}xgZJ2;jBspSuT@h8Kvju@!8?LNP0$YaC}}U zH#eMzoN=ODd!sU}eX!CU@h_0d94e9GZ{ly$`q2!T?VGruT%=#C~d3qpJ4?1 zWri}cg3=I3PxhvZ~qH>+}5+Wr8u91i92NeiPG zMuMpO^CL8CnRvbhdtBKe1x^KN(uJ7Qd|iIRX<`TT>le%mkIRTeL49>}7SC>!t83zA zL)49E4$L=nv19NO%8;`+fmwwz=Yme z=6fXw1_NxG{M;yN*Kt+2v8(TX$j?sA$;%6;Mnft8nI`$v0#(^RBZ9LM38ESw5spNI zS>XNr{}mf&KDcedk1QcR89CX(RP+s7!(_Dy=H}%@L8t)z|2tg+vi~DJw4-1*T_28e zlgrsnXpIMR@}t4@jB)9~9^HC(>l&huik4)Pn)ApPe4u06hRnrS4YAv&zlZ zZQzNp*@~OVAb-*!?_y0)`Ck&h~B{Z0lc85VivD&@&j$gpdrJFdR3iphq`*^qf=w zJ|p@dD|_T3vLYWBmCqs{0BCTiM(bH6&mUVTT=AFxi$dY*;Qv*j;GL|tLg5aO3VWujUN!ZCb6|ob=&Ih*&O);1zP{rRdwxWT%PZ-sE&29Ey?ifh%bPC>5*f6=TnBd$tdH+@{$8#jzMZSvo|H%9+6n(_i|6je z54d=8L)C5ZDufDBbMmv%_M_|E@4w;bR!_D)FWYRDn3}}ohch`V^dH6l$DcKO(}g0z zkP#FqDarQLRNsuKeZ~*UPRmFQMRVZNSJFv+2aQM$hO*NH*6)S^{caqCAjE=rg>Z0u zdN?m^`ydsD>Ugi!#z7E6;HsOF8Ssd$(iOYB4cM(K+ID2pk>yrlVlg&gIKcr}3w!=$ z?P4brIA%pKE1Z>+H=zTWj2L_C$Ri5e-HVx#c1A!Bk3R4e1jo>{Yh5PjBVy;=n7O1L z%_El-+2JO~_9r4JV2V@+IdNG`F7xw0azY2f_j$^gj4-~NE3;rZKmdANAq$r z<=j8VN~cVI%KZEGEW%2-Rh7w4d}5it)Gb6hVDv`ZU{%y{8Q*c}!9EcD4oAXK`&|UI zW(}U#8UnKwET>3jIGhXjD}6-HYbZ4p^336qEHjh8X%NiMwdWRJWw4E5o_`w3kLF~B zqF^;=W==q3N{;KfYum9jr+LvjSk>4mSTzXB1CNvtT&!Y-51z<8#RV;II|UaFcewAn zw-Qw!%8cY7BfkFG{H+V%5Su`_46yGx1W$W-MzD1x92TAc)E?!$fY7>)O%CQ_7~Xt{ zhB7iEZQ9$z4vU16)DT<(+qVudk$K^<;V1+Uv%;xx9h?!#;;!I$XGZ%K#!9HUl(Q|w#FD)Wk3r&Fi zm<=u)Bt+zef!jU#8IWFIvCGv;5Qc|CX?(YE)o5!dp)+mOUDZNC$A#S-EJkepY{b4X z2RJ2+Yl5i`b_awGqM#DwpGWiZLG|wp0=ldFeLqsz;wg^TeA<52e8L} z!jn((&6O$oc7*&e5)V74qQKj?2SGgiFo}3vcE(t6gtMc;t9Y-_x3+UlLlH1~VNYNe z`-!jw+&S6y7U3vF_D-!%-lC(5>=Vp(PcTqmzdbFfohosL9NmLoBEYr4nTxslH}o5P zV=&eJ;sCbnjzl=2fm?vzI}5Cd8WuPFN|JE21H!!K|nir%Ljp^ zwER@KA3{MxvY4;biCf+9wrEZkL@nS=3Q%;g{W|d3z*t86AVep4gwUzm>E;nbaS(an zK1{IL_8U49;u{!t!Txi%Z8!uLpuwErh~YO0R}9+89-A>P-*&mgaH_A|*oNZx(A}_6 zAik85C0`0xsnp0X>sJ(>%)t8YkPGFD3&M*&- z4hLOL+s0iOJY#rycm%M%wA?;a`DvOGj*bt9v*8T_bhEGO(yMdF;HY!}uuBkV%7a%7 zc+bN3p)#>!c*67KVh01UV{kYccQ-(!Vq>YE$8RO~!QyKglIE!@gU9&*0?E!dv>v<# zV$o?L*EooW0OlbZ!Ok6ebno7+d-dI{cHEC{VSYq=hnlQtaAH(G1Tk=kbik_}g05rG zK3ltX>Clafe+on`#5pV}Z`&wsEfPr~dd5Gkf~(`++nM39aJr{wj1^`d^`;9R@~E4k z6ZeMmqPE(|0h2go0-PR#s=67sBk(;8+l;s0DUIajfa-xU+8PN@D}2!g&q2(rA83E) zXk0i7MzEbflWf0o1Hp6qe!(e57sXu;G4*gBe98hB4z(FiH4%BL_zEj5LxuRz_W`Or zwgh`T-@a}FyFt8GlpBiRi$yS7eB^dybtn&b@Nb8}%s_+iSa{ zJ(ye=Rdl}AgHj>INu6`>C$P|$AF6Ew-URXtmqhr<7=G|qf6;~!qhMFExIdK2p4?%V~2_TDdNd@&wQCqq8g2t#Tzk%C_?H z0OJ0feX3#T#FpYqzcf)L{>Y`)#SeK${)5`};-1KLX|JHhSHO|&5*)?95r=+QWr5jRiW_G#f*V-;joRG# zz@LO&%E_(xoP23fqoT#*6u_6XE-?e;B2qZ6KH8t(;tkpZ7(`zVf{~AtYmbz_pHmrC z8vlq)Kg`(>6$JzfSOGuEuchV8{tw-e0!}QzNQevoTaGPkW=JZ3t;aQxLd7kzJZ!nv|`H7fm68Cr7zNHNYMh(%?NL-(;Huz~D0@XJZTYffF=m*c1;Uh{N#c|d zK_!V-(-TBLG9vxNhh^=+frElT^o46xH;5b6T^SK^r7Dxc*VG_bnFUPx#WHvVZ~J)b z52-8SZ^*{L3tYj8`zoS{U)k7e58c6>A6Ee`+NHSL?sv#z@W|Z$7{iT~;M#~LaH-q{ zya_ih_KH}P7`?!;OL)p~6$!?wy@Vs^YpXFFM|`P@6Sghd2Kl)oAS4+hk0po+3}a{m z!4)1n^d@Bp1e0;ADan{i=gwwRK-ja>QXtSP=eQ{@`4P2Ka&j`2)ZQ(w8_?%E-haFE zVz*Q*u(yi~cJGInj!x}82pFfpfA=b5Gcv=yJ9X;RuXm?tMyGyVJ9q9p3L;fwdW`AZ zc}(Xn@Uv4|9;DjkWoD#w8r$`%ZawcylaSQh{Eq40mq}VUC4b!aXEPSh!SBx|BRjQI z`uH(b%MIQ*fzO6kS?8i~U`Hx&OHGY*?cBX{CwO*>g7ic>!Bs>qEN~vIZHLrx(GID& zzGJ#}@7SeF$IcxGk4WwWqs`1u3wMe{(@@~5nkU?t089EfuySusMjCusdqP%9OG{DS zeQ?;Xdp26(F_n81rPQ<7<6Z1YqNk!O$`D2IlzRNX`F!tf(Z5~ejaSAZ-NPRCu%`h% zk#1P-3J($%Kh|p9pa;@{Fck?O^RUM}HR*|j8Cje#|LwngdUca2Ko~~CLJuoMLjFX; z#U4Sq`R|2SJaqdkf4q{8luvlr6P{Z1M9LS5QjNTJ--8{8s+RJU2T4EhC?9z0(o@lE zd6bttEA4)6o4M@zF+J8bv6MMB>2X6jZX}j^_*2mv=+|xVylj)sI58o4cm9%~spKNl z0*|)wXl@mAl*!+%w+NOM2-q^yl2UW2R3DyumB6~#?Le5 zJgZ;o;ZH@c7Z^ySLpvTV9@8?Vjit=6NuLcU&jwnSdiWE$_FC`ZGdgg(Rovy-qn%A9 z6Wh=C=0h*>C-!kL@8js*i7Z*Yy_=;xfHVhu$^jqDC4brzL=DgQ+<2>J)^?zbAmw~b znXfgZr=mA9n-k@8*ZkMO-;et0N=x}K=%W3v)U(G@_ER-lweh!7%vK)xmk)?;HF0fvjsR<%L+Y zXD#KdRSW5cQnTat$KUbApaa)g%0znx%QU4-t5fRXPn^LkX$JSV`fpFq!=b*G@|;cj z7E|70Am;q3=ym-Ai0ea-AL-q4>0JXXWvWfOBcSXEz!LH&a_yY8%od+xTZTN)Y}XCf z$19_8L=hH&X~ds6?4_PeK5q4$!}q7p{CH@*G7hO8Vh@2Z;!mVn;t{(mEA&Kzvf1je zc;z;vx}Dt~$A2Q#@Vhyy;v1gXUUF<$vZXw3cWtq$EHnWeLCvy>v6>25>WjimgEqEYe^TYi3Rilt1kNefh^K!pkCPvqK>x*9l;I7mPK&$M_Y z1-n}0VMV9~_!EbJYc?PLtslRwwYjBcmZdym^PHt9CWl@M~A z<6(0=z>z<(m$!&sj{emZg&SrMzTZ+FM8df~Wv(xQp01{Qmc4&*aOaT^TFNwgJgZe@ zwF+B;KXE)=vwvqx+KoH^-1K;hmIapbs7?8>?SBb7~S{ui5fqjWGS<4 z%H@`_+=4mcPeo6Pzm`UH?#^C&F3flqNN3ulXFbYU5A>8jk*T9o<6pk!t22*%G$~%W z6UVg3!xnj9qwyyWe&juTiH5v2>(`y1KRYE}xdRDb@URz@n^T+g>RnhEufYFbM5!l_<$=WEPh_`*c3Hch|MiKbzkhj# zrA)F1b2OkF4FDm3BEv3X*Iv;L9+=xk+L0$+r_?j{NuqtCCoOJyODCVcQl9w{=`1s$QAUGNa{!b=#@6d zQu2@ndOE{`4)Uj>2WvK^c3=JL4g13PuP=^Qeub1#7KM$2Katxop;nT*&7R-&xkF1W zrPv$>%T`&+vo`4kL%CoyD)sOu4&-Vgy>sBOXIm@@ zueOw@ZPHi$%Bz0ZjQokx`wKc}6I-PA+VSgK)>=v-pK-r()ZY|l+G zuE!r(7q5VUQtEl!!yZSAfIo3icL{@F{`gsae%||;^`?@IgmXRKxu^>G6A5qTbNR)K zxl5jE@ym^t@}%8%kzXmoZt|z1*Y;jR-JIO^^TLMj-utSlFbLi*{Mc0-JP~rtH#SG5J%`8(Y`Y z3SF1-#%JqWUJ0l0BAaxfS6S$Vy~v-6USD;Lk>6i2YGcB&&-PhL6o)=hQzmL4N&JZi zeKTTuWLmHJ`+Huw-%{q=Ov`npT!;4gQ_-8$xPeGJZoMg?^G9ReHI*!6I>Y0gfvSK% zaZU&EIcp0`=9(v?-nl0WgR=tnHOJaFRJn4C8bS;};q^lQKJwZB=Z zhd*(mdeB5=^giX?7k~CpyfOw`AIHYQGT~2bd4#Yu)aTnbytd`>a!YyG=6BXq&YHlF zKapSedzRaJb@)U7^?Al4HypE+5}WdZSGnK?j{K?U3Cx+y<&Bm;+2l>naZ9-uTb`{e zvvsi6_!D`yq~YAt^=F$dG+2DfQYIkfIzw59_9uTLWhp zKGC3g{zTFaH1NAV{NsT!_h0zjQs&yE`@G6N>?waLdL5tB(`&c9GXATie*dtPXKd1` zUS+BmI>4WJ1UPzKfpA--SGSnA;4>T-K^%rwsppItcgAez%qlnsmi4gJh5+&)JW!Xr z52C6OBQt84KUyR=6rw9QH-UYZGLl` zKS&BaXX)4DUpqRoHiI!t_0^r~YbFh9ny=wB-_ImqvcK+Rzf3X3-*}3@4N>%X^1plJ z9XnVT=WdNRVU5=*8Pan|^1+TTCSpmMw^^CDC)K%g)ExHayRRgcV9^JjdLMYMa3&gU zj=E<(O&p5^g|)#{Z&OENFB|f&qrxO4? z*8A$M_gz6^1{8nvu|N8B0)S$>FK)Z9o&+55)jr^BNP-Ae%6+UHn8qaYysyrAUn7!C zpeSIhfawGP(}^r@BC96>Gg-}1`*qrf08H_lQ~Wgv03K8Q)>MCj1WfbSnC7qR0$NS;ca(tX zesj9Njsz6>YZv(&N}IdH&r1B33rH++ZT}K~?-GAsqJWMq_G^p%H3)!?z3Q+1s=pyA z2%vb~uf6WCK>$$f^y@qQwIrb2A6M?L=U9Gd>@_>;Z%Y91IO#V}`fCyZJTCa-F8J#? zM?9YD&A;}yBLJ#Q3Ye1uH3@(!&jjM03Dk4qBN!5C^=zOc0Z?ULz?>JTNdQz?5r|t6 zsOMN*Xk`6tWuOxQP^BzjmIZ1O09AGb5_bfGj<*k^4X~X7ivXyyH&AD9Advv5ax~E3 zXrQU%YCudWz>Wtj0-(z2K*H%j0|KDR!)n~aYCXprhW(;8EKr*f09B@{)>O3?0Z?U{ zT4S18R|1OExFWTl_iMEz;Di=;LaXPPXlRwy|3ph7 z0GOWBtaDl|0)Xi`t=l>6Y6&RNTNLQ+$=8J{({wgX*9m|sv-MW9^^Rm*0!6XTigld; zpjf3RuF`{!IgLQuReDzfpvrokt=Dw|pvq3Y!A`xY6Rkm@-A=t50Z?U+&i3d!0Z^q} zPb}Aijvs(P+j70D1bnKqPj!m`;Bii8=X9L_;4#@qoNNTiF$Id52AgT<1OUa;hVisf z+XXay+Gr*LB}QTiytpKySHR;XgS}+v1OSh9MuT-mQ!=uFVynTn8ae?$vCS~H8MP%~ zw~@Hp2vVR6svI!b0YfJMsvIGE_Nbuv3Ok093hPG`?W8Am17& zCYfxKsS^McPnvO0n)Muy5uL;aPnk^#fGTrLbBnxoB zsIteZwa04U1h)}rvBzpJ0Y|NxN3BFBGzj*oRr{>fkOI@~3Qj*cAimVLayM)BHftTo z%FX)gj#(*>4{wY{?qN^jVUJ@~FP_u&`U{WuYJ#4~%O3M(Ph+Y>GKD4Ll0p=H`q`XE zPX6~>NnYSKO;4Dnx1u@#6zd7aF`()F8y5UMZb1-9k9g}I@j49yQ0{G5?rl$X>DI#w z?TM=nQ3RwHylpRduOT~=EHLcaO#9Y@n2>RTCE{{J6w#@SCE_kal>Fsa+aJ2UOY62i zXs5_ZDzY304uE-9<9U|jg8{J4N?d2PqxKrE2%S&fv8AmaN?tM&UNTxz2>@G-gsm>% zfRS*(1)MSxPPu?dX2K-X;qh9t!OtFiBh()Iyv<{7^E4su8{R+q$lvGG?tlw=)N38} zI!my;@YeXIwmy$Ze&^TXFI(v~$n^o>ke40u8swA!@Q9B+ z;xlNW0VwgY5}!f-0{~lnY^%>8?*M=geCz|D5Y7Mq7kuo3&mdDDfFj0{B?5#Em2XkC^Nc)1Wf~fH@YMV;Q8r09b3W zwU$BJigc1kcP`$_r!_!^d{GfMY&(%mqBc*dt8lQNmb>3)sxqW*2aT zu_G>^(9a6}GLOeJ_LwFEFKX;X7jQsh2V6j*&I)z8N{P-&T)+mMZEyj5b+*?9e6F+4 zUBEL2d&ZENE;HCN7w~(7{oVzb^(u?>`_x@T5PdmO9s|kY<&!%9gM5} zmVKE@YnuM@uhVa9{!o7u%)No;djs961c1|l7N-L}2>3_S&Hau%H@QEG*?K);z3v=Z zzx*?6G)MiyW^!C@cUw z>Hx6Z%a*%<_q^;q7f|411wOe-v5ytIfXzO(*#*4sWAD3wFMaGw7ciT#*-U1-nz7X` z;2>iMUBEkxz2gGDWb8{9aFMZ#E?~Z&&G*Z#Z1b~iF5rZpop1pY18ibIt}-{k=DL8@ z0k+x&>4)YwKBuvcSyUBGFLopu3}bv9X-o1Le#c`l$#XJszn4V}H=0zTH+$1b4I zV15llWUx&x;BAAw?E+33?4%1QFj;{qw=&CQvs}P3lPz-rubJ#M z7jVdAhg`rHCi}t#JZ-V3ExDCfEcQwapyUYLmUd2r*n98l^P3L1GkQI$hplS6t*)KD zO>Mp{wzGG?w&r5Wz~+OH#RiYL!PAiTFXdEViJeLz3Mh*LaZI5g`X0rnPfi^$au_yR z>aAPqZ9ydftoAls9gAR}Kf5+*$Bh?I8@^i}1P&R^A{=O_(I7J7fS(A$ZuH2~gX9o}NyNyh?kp0zvA zx{;Lxz(lS6MD0qlk^q>mb(pVpCo2hnU0T~+T351?0GMpFoosX^g9d;-R*yZ_FUZ93 z$NzQl(t@npaE=zRgayoTY5>^85;nyEvT$&`B27dL`1jj}tjW3|@pdd(=P}oL8qiFT zsf8sXUqlp9qzg+#dWa~QKB@5P->e#zhO@UvPuLSXA1G%8@2frw^C?nVL4=YIB;;2h#3(@egNf-iw{SXg0iPUP!DoWJGB`#pAnz&VUEC673TunS41Ny&{_T-J-N8E=qaL}l8(2(Wx zl+pH-(VyBSC&pe!JO74Cn%*(8&)1>m4`5%%p|_hmd_)pix=CnF^XLWG}LI1bZ^|u|#C)h!VOE zYX&7EDMyq5``OH#&63E~0$?>WSFoAdM}atZ+`)6FtHiJU?J-q6iA^d!<$0DP>QAL~iv6ar9an1x1?q(he& z<`N@`4gjFoWSE(@Aro0!LX>(;*FQTk;?XI% z^I!L9uX`N#5V$^X#XWC1fhqvjS)JBd*NCbLWqTo4k>VwaXxg!a=XOyYO6S57JBv#c z{4)I)Uu-d+cnr7Ba{uf5w?xT{e=FLXJkgqk+@|{zru$n{ z`!q#Zhi7zA2_FK7(gy%=U!3#-0NfWReEA7)wM#peV`u<-IBG zo3>no+)DgSOZ<+{Psb0|5t)Ia4kZO*iO2*LB_DK}{@k+i?d$CEcpFXkI&tExOy8Cs zi+;9Vg?0{k;tqLgiz;XZo$ct?$UM{Po;091KjW$&wX2zb2ggH?N8 zgRFWenPWDZ6H|dV9KE~NLoJgx;9RxS+QrkTNdX})avwzzr9EP#+0J&1^>c>RX@=F8 zq={~UkcG&16r?Mo9}f9s)jOL}cO7PR53{D!tPS)$%$%T1=DT@+AMnz!?P%yN@zq`8 zb0iReKlXy5J0#>(xIaTP~!ybvWO3^SGCRie}C`HM!*7}HbcR%_U3^DT9 zx71f2`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6 z`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6`<4J6 z`zC;NH?FowgcU`59~>VaT6|^~Zj^I+!nxQr*qLRm_HTLe>)m+8w9{<7)0A(Nj+l*) zxPX6}&HiaRs;b_j!;UX2-SlP;sLPYfs3!pMa|H@N_E);K@`Hz>}#YfTv1H08f>Y0GUN+{zU4}Fp5E=r)i?SZ)M zE(iIofb~|OiR3Yt2ja?I9`k1b>$5-;@@mN3#CAn)yx>lbI+lo3cu_)G@K|CezYCna zJ;X(_yD0f++VlH5E*WtYHRdF78LFH};WyP^dXZ0{~04grzayPf6oLb;`|C z$Yfri(Yyd;x$}Qyi({8WQobk|8o#A1r^$%ZSZBXhd%xzK4Wl=opYqRBWv8*>-}!6) z&R>_f0kGR&b9W5bziN2xI}Y?ci%cd38chl~DbSP{h7EsWr}`6Dq43IO1B_h{fRHEEybXP@czbJu*pSH}Wt>$Fo0q}}tz7ordxvImF!8iQ<$UnM3 z$svz=$Ww!Q0>BxMdd3Az@v2k2GDV43EpY*Fd)2pHz*k=ND;H4YQ;U2uk99tEoeS9S zQ}?@ob3XN)3wVmDPcfOt3Z|}b0ehLc*9Dwo>NyuM$FI)u%RDyv)r~Ho+^?3qfD3;0 zf(v*ipgt3jd8`PiD_p?#fV$lUln2yu7x1vEKCH?-id4181(d34sS9{VRo`&|1)5r* z$vmFd)aPBm8cki}0{)_@e{lgPH1&iFcvx2-)@7!%baj>scv)9pb^)*J>gz7xh^`)S z0goE$qlV0MfuSyN0c#C)tqXX=P~UI?#|-tD3;4=Vzj6Ujn(C9L+{z24`hpACY^s}G zzyVV|-~!H=>KPaCgrz=V$xMG|slST>@CHq02sck8FEs)$ttmTo1xHN&4%Kq;9P zXgZ{%HfDueVmEk#XNTJy2u<)r=Wt{}1K?%hP<@~wQB6XaG?!9XkZ{9{JmuS^Nlb3>1OxQ}uLrv#bGcQ9 zoTghr(HEE-@cAQWgX-KfK>=pS#w3G~QIP0qIq*#N1r})@$9KGyV7U%}0!s{q4*GN$ zjJ*IwGy+iEPd1V`u1Sm($191E;y5HR(y90&G4>g_p+h4vUB&~aMi7fAn!pN4iwwVT zzvBo{;mlL=FXX?J6ss)g_e7$WCm6KC^;WFWZ$+E^UXTO755+BNf!M`CK`#|T%UR8y zh^L9DDJu{qNXTFmQ0EVX8Z3|3>yJkLzCs(Dsvm6Nv6?^;VXyNV1Kvj7{g4tzzo-Q* zPsDF|>gz!ZAgvUurV-lLw}hxx@OGF28Mr-r(v;0UIwVy?X?gvet!skc&N!Wzw zVw@`Cv$4iJbNo1ixt?GPs&J&AV%3KuO*oBNbyU=u7%%{W=0maE)W~k?D5Wl zJtQM6U}NxmV4a~7hU7i^AsrK97Znh?#VMyoDK4-)A)gfu!;%yJiTGnJk&rbp9P-2O3(42{7hX)lO-%uq zHHtzo?41LK3yozOBHg^mk=sRrc&bM4uq;`{#f=;!XpaZW1b+OLLDmS1;C($!XPW5 z2GE*~p1GjGLklcF(c+vpguKAs0cUkWtw5CkQ=6V3$V$iqiz;jr$c=|>S%7LiW;MCH zEvy14QKwE}np>=q5F*edU?K{`!k2VJg+rut- zAOb;Cm;$Z{FehEprc({D31SsQ58)07;=%}f=6V7_PaX8zU1n$9*E)`DZALb32`t9i!q$_MYO3xs?apTS~wYzmG=O9b4_LdJ;1BV#bi=(rpH5RTr*w>aXj$1oHC;O?MpZ;ph~ zWd*NHnux_Fjm`_{gX%L-Z%%b48so0k0JZvXFc_YPp0Lkf9|*y!G2RDHk90{Fkh-S{ zrUVWpjtZPY7&*^0*d}unbTdfUwaSU$Y{DP#!8!s<5&?%K0uD_C9ESdWXY$u7$Uc8% zTuRxBcK0=tVq#20SYI<~;>ZRhYMh@%6h4vR!t@#1A+WLW{sQ+DSgf`H)e5ngp_ZmP z@UfUjz}h*rXu~ObLIvXyTA4)rpg&P{0U4&OQiNXuItzRdKllL99hkvDsJR8QkI;2X z44<%F40D<=6njeGNK(z=2b&G;p`jm!3{D2>U7siBA&q29IE6%p=dJ|=H8ZO#YNyte7f8804z8Y7RW+@;K=^C|e^NOOdO8rQoOnaUl$y?? z!5n8Mr`s#^C`By%<@kepqFl_75uE)JGm5-IGz`tkO2&lln!P`hr4#G+q)fQuz$oRs^V%eHoAPyDn;tvi zK_z$rjQh@%*Y1$gM!x~M0)rJEHP0xw9~!9ke^jyezroes#BLX!eJtSPX<&Hj+( zi+HdW!VGG^!RLk82waI6phGUIGG_V0koO6NA<0OOFbPdhT_6~ULE4a@^Q;ies`Veh)fXFclKlU5EoP2pI@L*trCUt0-QlJYAKNRCQ4Fe~k#OcL-B;7Jh9s6)TABXb(* zk|9EDY9}fPGhhJAavXRb!IB&>M0UVJH3PJ=`vfb1r^F<^0h#I`v-{3te%#g}L!rC4 zlhkH75kb8Kbue0LdlI=Bwx(dBL1c~Fv_yPN);RIbpCj~wGYq{CCX96~0;zM*q@(<8m;Gt%12Qapisa ztp8K~?-UkrDrQV- zVBvUv3+_?bt|N#Q98yE=Szn@x_W{_=7L>L)C!lj3$`RQ>R`8Jf!o+Rn=?9x#n0`68 za91RRDzhsCc)KuJqS(O}T%B

%g7v-1T*Vu><2@py1&Ro8D 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_spi.h.51B150874501A7D3.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_spi.h.51B150874501A7D3.idx new file mode 100644 index 0000000000000000000000000000000000000000..7f845eab09a31db148affe4bac7de1bb5bb33ff4 GIT binary patch literal 1450 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 F{{sacQdIx| literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_types.h.3EE2C317F1D1EBC4.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_types.h.3EE2C317F1D1EBC4.idx new file mode 100644 index 0000000000000000000000000000000000000000..b3823bb7cb804207eab3ddcc2cf6df7fec289ffc GIT binary patch literal 1118 zcmb`F?@Lor7{||b&TiXkYB2)?Pv8&G@~#=WmMxiPE_~5uW?8WA-MwQcw%vK}(QRS9 z5Tzdw_JiqjD{W#e$op2uTo1EUDEN%UU*6iRx7-O@*|}sE(pYOy+5gD@0ea+Fg)AAvY}Dt1D77 zaiJd`sbq+$v0uZ3W!GHf+>!d3zzc(K%fKxRdR)>Dc3XJUFMGtOMM~uzgH{ zzAsle?$Wvr#%2nz zfqcDZeFc5Caa~<>*;-$mn>+!yimft=?w{OVq})rL0vu+;#kzWE@8S4wUuhTM0frr5 z41L#&#pkUNRr{^Cn96ZxK54eSGF%G%@(#!k5%q;@;*gS^C nefG@sA^Kq%u*#~&*+`LMeD*|D39D9Eb4*jSzDfJ2>O$x*Gff2F literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_upp.h.536226D452BC0CC1.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_upp.h.536226D452BC0CC1.idx new file mode 100644 index 0000000000000000000000000000000000000000..a12b28badce93cfad551e124f1f173848c09875a GIT binary patch literal 3108 zcmYk82~>?~AHeVP8uiykTBevuV=|WH-l^OcZCX`)MY7X!-Ds~HNrq^*RHNcBrliss ztzwKqH#%Rq%vVYc(L|OKy23OgzUKSCGpFbI?m2bO`Td^v|2+TYea>Cx>F)lShCtx5 z(K8`Zx+Ulnfk2>xe{ox6p-b`m?@vf*gw$3j6uQ_7w}c8^%ta#6${?9EKpY?v1&F@J z|H6&3(0HjVA~aYSVs33=m9X*uNNAKqxOrQ^)|i-in=$hC$Y4IIOd1lGt}YNvcZ)hb zzH^iiHBv>OiWvU0r$8`M&BFd+j^20_IUMA0pN@&P32|%9ei&9k;Sc@>V_5NWPQ~r= zLO^T_w)$gOnI$M){7z*8Vj0M2^q2d>O}3@q%Z~?m z91OuU{+{mC(Ob(}CLxZ7Xqv72zwBGD>iB9SF6W?}qZypiITD-kyObAC2|OkA2_v^( zM;%|JOhIvwz(H2g*CYCo=7}-JC=L-g#KcaO_&*#XW`2QUKFsI)|MzDw?b^An<4HVT z0W0W1-_ABs-<5uI7UFsW^(@SHKkEGZRfF$b6!u_GJ8)lhS#GrGPab=KhwfPPI8URA zm(LEHAy6 z>UnicY4k#236``2sl(l~HplN@j5r8_XenI1Kbe?+Mb58LLz+!TwT=fX_f9;jrbygi|jn>y8H~b_%*IU5e8xO z<$h%LPSdVh7J%3t+-W0==d9Ntexp2I2`g!tr@OYVNPW6881ZESms#}Lna}kNlLQhJ z`2_Nrc;!_gFt&{1g_3}hl_7Lnn7dc?U>J%;u!wHl`2Lr`_WF)+#9|OrY-bnZv$kVX z6yoCqjNT=SE>Q50}cz|jfypUBmYQ&;lh8i8vp)LhLy z#ZHrQOHfo0s9>9)nG|D}uwiN`iVFlTFfnYg*0ITXlou}GLaUnAKhRmz7k(149oSLa zF=4r_fvD^h;&KAzEX-S_v);xYqjD4_1WH&AMi0azQ>)fipl}37+6DQN7iS!7)>R>H zC(zFB-6#)TkDq!%Yf)qn$Y80dJ(9n#yRzvl3ONBe+d3%ASXa8Kl^2y9RI(~v$(d19 zIsEx~6xjr_*%Rh7JI?)}T+fR<0(nemz}v}cHVwR}CQ!}9y%M=e%{Y&rQ7nh$^vaYM zi3A@r6+HF^Z<<`=)jE}Z8Mzk`4-yz;IXoUTbnvR0bp=HlfixzHy(c$LBaTfdA|aAq zfMHaqD7K(2Pe9O+Sy$*Ia?O4Q% z1_BLCh?ffw$&4L;LD5E_jrBqHEasB2%0LT>IEbT{NK=t?U(d3-HpJl&PI14_L-UUA zx^~2c1PWREyW%o^xBD#UKvBU#1#3?H{)6Jyl*yea?i0ArPV_SC@CH?d=3Nvw2;5*b zy0fMCL9mJUJrqL(hL~{rZF5ic_M^PWC6LQPsao26`NUw57j*>cm{8L`vY|L}P8SLb zu%LZ=BD;eqnFHmiMWqIAG@lKn7zJ!?Q7vH6zK%gS!#KK=ZgANcJZQ=gHl$$ z#1~~ArFWIQFa^^|V?Sq_Z$A!BzdC6MaT*6{Y%(N6rdrkt*Ec8vA&^c|jC1+Wjn@2k xh+`p^9`s=6$?g@P_d8-Q@S<0nOd1iy?-VDK#Nm%}0Y?OR+Q+{6ta7|S@ITb3osR$j literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xbar.h.2EAA26D1296240AA.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xbar.h.2EAA26D1296240AA.idx new file mode 100644 index 0000000000000000000000000000000000000000..0bbdb7ede859ee6136c3d457caee7ab8f54a1366 GIT binary patch literal 4552 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/i2c.h.7C76D219DDFBE67A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/i2c.h.7C76D219DDFBE67A.idx new file mode 100644 index 0000000000000000000000000000000000000000..399f563db24adffb5e41b09b3d9767c978f62692 GIT binary patch literal 45338 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 z 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 BFkAot literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ipc.h.0D3D6CDE1416C56D.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ipc.h.0D3D6CDE1416C56D.idx new file mode 100644 index 0000000000000000000000000000000000000000..8db1a155e5969d106a71cbd00ebb19c705483b13 GIT binary patch literal 31546 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.145BDE08646F4A0A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.145BDE08646F4A0A.idx new file mode 100644 index 0000000000000000000000000000000000000000..55718774d8489720f4c51877e4ccc6eb62127b1d GIT binary patch literal 4506 zcmb`Kdu&tJ8NlzCT$lLx#7UgQ%?&Zm!;d^n?1ThJ3LycSgr=-XpejzX7{{?=C&BjY zYbcMZKps>{SISmZtlMB>FjiWv4JII!rwEV{x=m_TRH_z=VBNZP)l??PAMLi|nB#M( z_UA17+P{0g^PTT?zH{Barm^uS8G^8?cg^#g+_F;?1R;}r!g9zLN+LgEuVTaYirTOz zaMC8~AQA6Im=I@~;e{S#* zec!tmS5+doYS)mDhkP~*F6W@j;o9mNbcY3xZ_r(9wOUuzTAvNOLt*Q-=Uvt~Fgx_wS-<XR3`Ds48Kqq4fZqN3bZ{`C5FR-fNB80mFe zH#uc*xmO5=0xowr?C=D9j$Wti6vA%V5s#bCb29>}DkB@Pynyas&fDzbwp! zx5w!k=nDlRe&W6}JP^N0g69l5dINrUoIQiiKF7le5AzWp@cDhR!x>W^s}P^R-|c!R z<_mN434|hkzt7(n7u*ye^8%qbgk@()7B&Zby+U~FrkMzb7in|O&U)|vR>nda5!rw@Eh7#7rII2Y&U&t2&7S6_d1 zc-e*NA7del3@0m+HL7k!w?2Hw22yEQsIa0Uw!5l||WX)1@pk;XJM?DC~4KaJeRLN*bY zfYb@dQEg4#8h0{t9&s|{_Jo&_6ij5JsV~cJE0Qrn5?YW@je-S1Q^HgfDhMTrrZ5RT zk~)lbg18g1=%kO96n^?(eK1qR$X;x>C9;AdxsgIDgwZf)hhYKZ5m+z+iM879tm~T{ z{`cd6QHi<4MwjmNrM&-2+Q(87M(={~E?^pcjLw2^mT}{1`x}k_jOK!fCc!)j)igAP z`<1pM<@XASbsou6#H@=#TNFB}7)Dn?x(Y>!vO_bVn*lRrZL$BmBhPt_#J)0fSvj?@ zan_r3s$D1{Q8h0%ucEgx>X-UWY^`aKrolvYjorIec&7hsNj65g4Y_L*b%yd%^0GL} z&$BQxh=z2g-Y6P5GKnUR%%Yhit7zqDnYfIj<>GRV>cl#ZTJ$Yti4B5Us#@w9*+qLg zb8Z5J3BW9nQAmkG7UL6;a)Re`kbe#=G#Hrd?W%K7&-fyU7a^VT6o^xdpB)=c_6R3S zNkyCl-AOR8g)V~aA}pa3N7J8ws&?{UWeSWs7IoAxd%G&TmNJTzN2*v+4uN$Dsu_=h zb`NBPp`auO1jic>Ns~{?ow75MPgAJwFIMdt4DMWHeZHMI1OKA4@SQf!oopUvjxL};maGJ51( z!e}$zoTw>`_CU%W$f0)9Q;P&Mc4X0r1x&qLYVM71Cren&mPG&g@NkQE=sV?3MB1jl z#KZzwsxRfJOkc*4MQ`D#N#Dd#v%Z-ld%oRFy}&4M_xg>3U>NEv!s2^eK(XV0f?0i!})VG;9t zgKh(NsQGjK`E+GW9tflf(90b<{z7{i=;`J@&y>a(f6C55WpLF!1f= z1DV@*%#eXm(2YW(kD+(cFC3}5Gea`jC3SIe>wc!&POZb_=&zrFr)Zp_m(cItTX+9` zGRd&mz@@)W>f_RX38YIb{WkCL6X8Q}ot!=c(twfa-l5x3LhZ!pIOvW;33VT%^RVDN zl+u+kx(2#yP(pdVH2e1JH{Q8vCC_jO<rRy;+8MT!1I z{4pDTqkMn#S)W;!@r9BEoQK;Z~WfWQ&Pl9@qmp=*WlRTe? zwDX{&WrEQ~D7Xk###2x*#q%XVmslgf=rWLZqA_4}1<0G@X+YCFUj_2G%#F{0dIs{? zdNWWl11lI`1NAjFPW>XgJpPx3?(?H9tJ+@dEWJZ^nkHXkpsfZYt)$hl8XgDTI26!m z_xgykl-X)v8$=p;$%lSXo+uOIS9r-J{ZPi;1^!DwNQ{No?_5%6W6n}->gU;BmaL5%div3WS$p8QV literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.473FB5CABF6EB2AC.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.473FB5CABF6EB2AC.idx new file mode 100644 index 0000000000000000000000000000000000000000..8388b330788662f7ae3e47d009e216732c568a06 GIT binary patch literal 4472 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 D*D10L literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.51696F63CFB19E46.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.51696F63CFB19E46.idx new file mode 100644 index 0000000000000000000000000000000000000000..8d2fa758cd7293eb92661b63470cd5e4ea2d0800 GIT binary patch literal 4204 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.DA60C8E49C152C9C.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.DA60C8E49C152C9C.idx new file mode 100644 index 0000000000000000000000000000000000000000..a43713055792dabe81628d8bd52c4b154a434b56 GIT binary patch literal 4408 zcmb_feQ;D)6+fH2ExXCxw{Mqx+)b#2G~XY)OTH-KGf5kXASAmfOp@Bo%kE3EWwV>^ zdjS&4Xj`PU)k?J@tqL<(hNG(QxVE)uq?OxugkEhj$ zQPE&N_tgI%tf``EcZ=mVo=B+%I>(dKGsYg1XuX+8%@`(wVep@tOeJThQZsr5t~wJn z>N`83ZsBt1vvAl{Ax1YX@+r)UUk}mFKKvcW-yIN5CCB3v5H-??NHRW^c}r_*0%EG6 zMxv>iq+z|rlQC@<#8OEOV#c^3+#@k9xnPu>nX*P^fE*`AIc_GIj3*~xe9T%ApJKi7 zctYz81Oh#sfqQfFxTo8r34vsBTPZaW&9#XX}cUv52ARMkL%D>I!V? z>kjvJg#wBAn0W^NDBQA8lea7so}_uw{+l8i@c?eCCDEm8h|mhbP_8-H&jD|xSsAsZO~M=Bn}J~BHsw#^Q3ytv?(A2eRF%W$Uze3i1QSQv0v9p=3imFGVhoL($L zCDH+JpiCH|2QG&v=J)=$R0f80y|=zx7@{i=I)g|3*D7U@k?v7?%7h`hq%L{m=(fpf z8A_0D^fvm0A-Z>dGVf#v>Sa)n9xNNI6^7`?ubr)Y`Tkex3!w>sSIJdn!hlm`ZsYcQ z9^ack4nJv-VF}Lf_w;jNX#PHB*XKHae7#YI0;GrC!^Of7ebM>X3x6Kz?Utbm=~hoG z7l!CFHTyTRi>|w5_zcopJX^RhM2~cR9Qg3DQ+F|F04OcC7Z>p{`&bb;?KbFiVsfW{ z`{Y+o`d-^m2<@1CwWoTCFuCl%`Mv(yXC6HglA#b6Xz(_a3quR6yk7luy7}9~h0u!g zgLy%hFuD1E`}If9t{HxPM20$?zgk&cDh$nk;e!nacRaCNWzd2NzG}0-YV+_p`N4AI_w2RpjfSEpsT z9qG-U&0H9wk9{(~sL(!Y$WVi{-|H_IhUo8VPfZRSd~^qcAg1SG9?n&!a&dl*i}3t9 ze){jP%-c(L7D52`zcp`bu`s#)r)pw5S6+K!w+zL&K$Ex0Ck!p{?sFSU9=YNCk_@#- z4=F>X!VrD+qpQ!YK7HnE44QHMe0#o^-)Fzi3(ov}>u^q0$>)w#pW82k2j_>%Lbbxs z{HE`Gq4rAu*PmigkMooEq>o4KQD5%+zj&f;&M`6jbRn$3{O`@X*C9+U|BZF09(r(O z!_h)$M2DK!VtavKfgM( zc=v;E%CHRSc2B!c7@`YaQcfRjyNt98>29UFOc76g-Rx~%Dh$z(*2eYVqFjHq6BDhim=&C2_D_{ zjP$!d{)pQcuXa=`)H_Dvj<=q4|G|f_*WoQ9Z|b@j#B8|)Q@2IfY_$YamqplYu>@0h zEiSOSY6fS#UaD6pO~xCf28B8mgniV=U#{H6Cp%%b+Knf^y zB8<06tqOHt#@nPeg$kANcBx&V!ee~1v{|7(!}u0yi$ZOg@qVdaAq8N3z%}5bl4CsN z3i;>)Gahz@ebmetA9M}+=u8-&g;|y@7Cu)o*OYCXe6DS7J&kB3JVjGz=oCp~5H7+))`b(1hK-Ys>z>7p~W<#1T+IvSHgTv?aZJ+cLiZnGYO`y zg|MlW1k>$7*wjdZsaGLvY9qlUi&!(JCKAl}urw@Fv!R{hTvHdxiAoA#Qx6HIZ-JW= z0+_++@X*`TKJumxj+sue%;z&+B9$yi_ipL# v1tU$;vZJ(?P|c`%8vhtIU$WN-AbV(#$FILx`q*E5w{Oia_mx5R*Z}?qNfS_0 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.E973DD7529BD6449.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.E973DD7529BD6449.idx new file mode 100644 index 0000000000000000000000000000000000000000..9444e35db71bebbe1cc4d2bbf2b61abbc0fd3772 GIT binary patch literal 4220 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.C04FFCBFA24491DA.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.C04FFCBFA24491DA.idx new file mode 100644 index 0000000000000000000000000000000000000000..467ae7cce859de7d04be3159fe8cf252546c7afa GIT binary patch literal 256 zcmWIYbaVT`z`)>~;#rZKT9U{DWD5gvaY<2TIFJT|w9K4TD}8-^XDj{C;?$yI{i=#& z{qp>x?BasNTy)XYSEBMW15%ar(%)Z&u(V7DMgeIHLJFrAZ`RGe0n7@wS< zmzJ5XmjN`tGB*iic2R0taSV_a Mv~;#rZKT9U{DWD5gvaY<2TIFJT|w9K4TD}8-^XDj{C;?$yI{i=#& z{qp>x?BasNTy)XYSEBMW15%ar(%)Z&u(V7DMgeIHM!U^mAg{hZ9C;IGjcG>!h|1cZvQm@+{qt6VHOS+0hn-6YEB}EU0jr0%nhWO Q7&D&Nm-9wwH83y$0GGl*wEzGB literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_test_c2000.c.65A029E46C9A85C9.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_test_c2000.c.65A029E46C9A85C9.idx new file mode 100644 index 0000000000000000000000000000000000000000..bbf7a92219eb7b0609f78623dc42ccac00c55f3a GIT binary patch literal 218 zcmWIYbaT7Jz`)>~;#rZKT9U{DWD5gvaY<2T6Oaajw9K4TD}8-^XDj{C;?$yI{i=#& z{qp>x?BasNTy)XYSEBMW15%M|^b%%tM9qC~w62J$qq;Jba7E~u{emq2qM6Mndz#ilKt#w9WsoJ3;-b(JbwTH literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.c.B6CA10369432859E.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.c.B6CA10369432859E.idx new file mode 100644 index 0000000000000000000000000000000000000000..37f247150021b57b064da6a3fe3d1fddf7010e7b GIT binary patch literal 4928 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 LgA2kioALQy^ND5R literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.h.058FEEA52F352324.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.h.058FEEA52F352324.idx new file mode 100644 index 0000000000000000000000000000000000000000..3db630e306eb604af7c9c0f929198bb5bcb9d333 GIT binary patch literal 1542 zcmb_c%WD%s7@uvMnoYKC`W}(sic#CNx+du}r#>JO5S7O2!Na=UOp?_ko9<5Eh*A`L zXlt=WD1wRyE$Gcdp{-s7{{zK~;Gqu-f;SNl;$)jmX4Bp@Y}oldzHh$$G0Z?X6#8QW zpg$TOPa!Oo0RU>rU&or_%Yy9B!GD`y-FondzZ~Xw?@aIBo7-Am*;!xQesXv7?c(pAgQYInkC@*%? zV%%EjJ6j}LOMO0CmXnrEeRND-A{N!sL3v~3^Nfj_K@)k3Qg7uC4&1`;%es|6C}z55 zU&2;#FI<`{gN9=I zX{OMLVfQ-Z+;({6ePCGaU>q!CXJC#6kAJnid-eIH%5bb3xb5Z`uivyy+T#;TgmxZw z9yK>#jxJnixmNzd$*~;dj+r#aR=^4hRlzC>xuA?^{}2o z4X}Yijj%C~PM(;VJ9V{hgG^otEAx|^qmopN*v#+OP*TdSbxqcflXnTbdVQ_m_4DbM O5{Df)OdA09!tyW5SoVPc literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/linkage.h.EFAF2659D07C2D82.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/linkage.h.EFAF2659D07C2D82.idx new file mode 100644 index 0000000000000000000000000000000000000000..4b44b6a43cd0e911389986899f80b095b59c27d2 GIT binary patch literal 328 zcmWIYbaQiHWMFVk@vO*AElFfyU|>`p#DRC7Jrk$;Czn zrUoEdza&3Dr&vEZKeqs=qzEXho19*vn`~rYU=VL)s%L1ZXQ1a360Dz@mz-0YlB%DR znU|fIo~oAtw4pLL31oUvYFhC^Abm08(}w%ECk8NbG3s*YihwN!5+(D@bIkhZ1p|eh zIh^@m!cS(JM1B9+6b%%1;c$Tqi>F-k;J0GU2MViks0qMSZz?@|LFd@#BA~DlhY{TD z{%hxhgmmxC0SX&)7)!!b|5C0!ctZc{ZlJIwhov-380gZRL=dOAD7ly$NHa0!%X*w; Ko^)v&0|NkSF;5Zz literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.84541DECAA7D5656.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.84541DECAA7D5656.idx new file mode 100644 index 0000000000000000000000000000000000000000..577ad8efe8c79f8a258fb9e32a5a878b48f6c793 GIT binary patch literal 1586 zcmbtTU1$?o6h4Wq(@e)Wb=un0F3yAFG{tl#DM1awib84Ex`?j&;6t5GChe?ACd^E1 zS`q&$>0&L_fZxlMVloy)}tbd~M-P?EJ=C0HD(5X2#~Oj(mSzDcnJ3dOY*n$+@TFnd8?`f!T{U zQDM4bCiOT@VGCW3jpinXtjzQyl7;3~2mGNft$&+j80~7*RP=6>ZHXLQ!>&3I2t}fr zWU>*%-nQYbe9-&9a49SAzuaqBOk4btznPdqQ7Nv)2Vz>%V9}J5vgr+l;A`s6xN0tN zZBND*cubJ|&?7>RALLL3z55}eMwO5t2%AH~PD9ZRVK5~N{hGedNJz5MEz5@4r>K$; zSl708eOQQU{RyO1YhO9gR0Wh55QCz%3Z|w-4MEmo3B;`nrs|V>O`jYPMX@^&Z1wwF z#n!H0b_i-*jwZv35R=S4i_lUV_G@YwQhpfl!|cPu`E&OdT$AD*1!ExA^DnyUy^R;n zg+JYFss<8(u69<}*alnx^#BgKGW53h@4?+KMK>%VfF|4oZ5ybv{}gz!YfGYKTjkGg zs6%0rBq`hAu!kGk_v_J3M<|Ps=4v_4HsD%Z;auiM^jF_+occIMOt^uv=t+XI4aPrv z`!e_8$c9&Ls6}BH>7s0d!^{-l)ZjdnaYHoq02JzO{);HiJ zJSxO%&8ft@f>=?;%X2)BnJBuMXfAe#hlv!mCRrkABpS;Je7t}O@Y$$yYq}V+&iAgX u-nj^U4PFJFm6)|+#SdLaF{U*r$b8m0$ZKP~bTYxXj-`8aT literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.9E9F47540CAE52AD.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.9E9F47540CAE52AD.idx new file mode 100644 index 0000000000000000000000000000000000000000..fa3474042dc7585b52147c00f0e2fd1833bfe683 GIT binary patch literal 1594 zcmbtTVQ3R~6n}}W*Idtd_1dnf9lH;n*GSX5qy$|U%vmVyR;AQAKa3HtmrHw^ zrWL7fm2|9@y29qVDO%KuxDO(1L)X<4L*20th&DhlHNuK6di!Wb-Y@9zKJ z`~BW~zxPjnPghr9EkI|aCmmNzsR{rX^cbeDK60WD>qoNLiBsA6AF`7_EiFtHj?Ct+ zpUYjH%l>kaWVa_JU5c|&w)iWB^4Di_r^lBTW^$96!jBW>Orw}t$YgS7{w&O$$WLY1 z*6vYnIYq`~6PI$o&*2nbM`Q=Pa_|-bsI}$A>E*MN|G%#^o*=t0ll}hq@;@`#W9LzW zx!*3M#&pF@=?R>|7N?w^%Fm8lnVD-O3$2?D`9rdoOJDN8CZsl+Oe36dWML>Tac9EzgnAVk%e5)uTVGbHRW6x|R;)3PwE=?9FYBr9QAHq0SK zm4v{yj;$X@!hPZ0UHzX4F>N@BBx@h4#G9&s(gR{pwBCZLX)!~PwRjSh&;?WV$%Cd( z4v3-{4g}l%{&umw_siXanvi3uh$6%#bI2mJM2CZ#8iBMQM*Oh!*O9`>KUUqA(p5$G zek4Bd23`5V=3h@no?ULK1rmU+b=KC|23!D*01mo3bbs*m=-%6+8`cp(6K;aG4b<5G z7`XM-7s)Ms)w|r#fWjn6QntZi4>x{b|F=7iQWhc2)pML}z_qr@xxtO-&pzBf|8$y| zbpvJ5lLTcOjK6XJcK*rHPwu#(9)(?`i?R(4GxK~)lXEQVhFTP^A!{hx;PB$-pZ4y& z*YKRO95ll)oNd5Wy~e?;N7Z#DYCLn4Rair=OusT4P&Bid36@xBZZj9e6JcEt#1f^5 zKoAe%ag`zbhx|tvg0-q5S2QYBX(3uFAwhmChETMZ@Vf9xIClKSmGJ032T40>9Cf%R z4kNdvFm_)Eh<|@QcJn(2MK?4yG-Eeb9CcyIjolR8L^M@&;aTsgs~Dq>XKt_ROa1CY^>nrIiAN%6x~X+mZrnYM2cFQEE6;n&6NZ`Ucdyn zHk#bpE{1ILJ?QOz@!+KsEs$W=VK+r{1XnugN=&jMhAtZ)ptqC$rfsqF)!nhjNZFFM G0B-@8q}p)+ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.CD2C4B20615A82E7.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.CD2C4B20615A82E7.idx new file mode 100644 index 0000000000000000000000000000000000000000..061838baf249e8c52d5cc915153723dd2d3a744e GIT binary patch literal 1596 zcmbtTQEby@5Wa*KH?B$Dx$T_=-WbEUJ3 zh1)j@-z?>?d_nX3(~7Ai`8Z#`Dxu=-g~BJ(Yby(d*<9(vnQEq0&Mf6}g-^dLEnO_m z<@m0FNq;p(C1f*S7QR{{DS_VD0e<7)F9UFE>#OtY*JuBKUs*Cieq|y5{)P2B3;FY( z;RXxWZsNvF4Q0#}N#V;=&d(JWr|rz#_cRY(J5L8AL&o?K#j^VK1k%hX;&;c-bn`n; zha&NWp&&kPImcddRL}UI3zxO?{>|OZ6WYp~`k#qe992?AY9eW5EFNz;qauGK0{^5Q zOzCKoYdDkI!y?{S(c-ra8EGUBlirwaa7V%Y9bTUq@;qzY(iUiIA!QD$Od5|2y3^_mM(w0>4T|! ztzbPu#N72F(k|_i=FN6sk|2&akznQU>rljs|Q~l zdi~edKN#D=avUc(20Zm!TwD{bZfbGsv8$@W7J6g)joE-gfN+i=z<}( zC}jkO_$Z&J3K3rtcMu5Cs*c{!s8Xeq>a2x?#k~Z=uzt$#At&klg(qJ}C*O9_tgFG* zOlp!acH0UQ_vaz`hqtDFde6nMt!=Fx#7z{(UD$FHH^a75?KNHantaVQV>F8#DKl{Q z;l<*mW2>0At);D|p|DkoD*D0aj$RqI9kbh9VASNs0@W$HJq IY(-muXVtIU<^TWy literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.5E5ABC5F2D248B1F.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.5E5ABC5F2D248B1F.idx new file mode 100644 index 0000000000000000000000000000000000000000..23a72151626e2a98fd7d98791864a3263c336328 GIT binary patch literal 806 zcmWIYbaRtqW?*nm@vO*AElFfyU|Hb>+3sP>4z4l78UDP zRV3?|=NDxc7bGU9#wRBimt>@7Ch8km7@J$B#0SI&y9GJwI|qas#=H4A27BliR~9Fy zrRyiW54D+jtn*85mftSgkn0 z1UQmGL{Vy5@eUxpZ^r63ue@Yf8F^S;SzLu-+CKGP1BF9bLiu2ZOw`dm5@h|#6DaJ!;=m6R=B)SVTov@N0Vo{K z63z<~hS7{%C@wuejelvHAKz}E>O_u2QJAWt)SN_+tBQ+~i`_vCCJ+Gz%&hZ6-)*pE f)?38N!pz9T#sEz8FaS&EKt3BxjDZ1^6`%kB<4W(R literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.A351196A44ADCDD8.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.A351196A44ADCDD8.idx new file mode 100644 index 0000000000000000000000000000000000000000..48f836941e495866b32425046798b5774bbebb5e GIT binary patch literal 824 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx new file mode 100644 index 0000000000000000000000000000000000000000..5ed40df6cfc788e88c333c16caeeb4b5ecf4ab69 GIT binary patch literal 115374 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 HQ&Rdr3A(pq literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map_legacy.h.88A2DC44F63B02AD.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map_legacy.h.88A2DC44F63B02AD.idx new file mode 100644 index 0000000000000000000000000000000000000000..02517314ccdf521da4a7daac01e9970f9bc07335 GIT binary patch literal 752 zcmWIYbaQ*b#K7R3;#rZKT9U}Zz`!63#Kk2=ne%`&7^G$9q+03g>pNTNmt^WY8yOfF zgeMlI#+$_(7{nVG0!jUpqRg_?qMXbm{WK#BWAlm>B$0y5y!hP20=*0d>KGKClbW8G zTnRL1adKdZ4g2hqesNkZJLq!B!LQ?*Iz>aQMJgt6vbjnm^lgH&EDt!vQXAQ1{TD zecOU_Kw&!$JGgLk;o?nh`-;y4g>5)&;KEZmh5d!6Yy$~fa9F^FeL0@_&WSd>4ipaH z2!IP8_ch6##(nx0P&kGo2JXuT+t+Zn$QOJD3cGN)z*Rr|g*d6= literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sci.h.E64A437F6118C151.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sci.h.E64A437F6118C151.idx new file mode 100644 index 0000000000000000000000000000000000000000..c15825c4e7e5a6575910d7ec8d287bbd5fd95768 GIT binary patch literal 47856 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 F|3AOx@f837 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sdfm.h.32C80F3732C73C66.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sdfm.h.32C80F3732C73C66.idx new file mode 100644 index 0000000000000000000000000000000000000000..a581f2372b2061a0afc72a96401b04d0fa8115be GIT binary patch literal 32954 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.5893E44B82B216C6.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.5893E44B82B216C6.idx new file mode 100644 index 0000000000000000000000000000000000000000..ba78bb9d4757ae7734965f19f2de3b3a8c70eb2b GIT binary patch literal 2460 zcmbtWeQXp}5Pw&;AG>|~TH3wq-SxB|^lAZN1+>!h+M_MK_6m1t4)6mim+kIeyY2Ok z?k)w4Q89+_ks?MUkk&wAkOVOL2VzvBF^Wn;M8!lB5{WT>L=%ZXib_m;yUpxD;y=Yr zIyY~A^XAQ)`MpV#v1oKZi%_Q$+d8V65`z$`q<@B~Yi|@##rm4&qiEkcL(8s}1~MvI z8;f@(A4tX4B#|77AvqJ51|L;rlWKiKlA+pqTFa;*Q4~8v;yOds4e_b1vbZIuj~JUI zSxw2ZVGgO9BraXP?BNzg?Ce{&Bo$rVzNSYswi$AIP#nlfy0Ul(%`(uMXtG^2(z=vN zFI)P5whwOBQiiO_xzSN0rRdtYs%Nx;*+*2=aZOgmnV-Age)kE`0-CCx(&gD7p2=<5 zBpJr+H(Cu?WU7X_SVn1G9kVH+WlcmQ_R)wb3qv`FIl0@IvneBGO`w#$$g|3dy9C+o z)v}s7qnVO1lF~P4DQmZl4!q(*=tfB?8C%dH@W_J@VOf^gVusBKeR<+M4t34<@u-Z# z0WMHs3xID;{&;=gg9n>1nnU5CxkJ^(>%Hsi5$kfHa>i9$_}RN>uKf1x4xPZjw(zKs!hX(QX$yeaXM1)XPk#R#MpYDUE^H>Y0Ql_FryhFoy~aH} za#Og9tMb|c;0p)Jj;0gjeT=*mmI|c`TL7GT22&M!K3d-k}3#?9*3U`M7Apz+{!MDgfbrJ^k^H>6b;n ziy`C8xBwg(^iLjCZk!Czy980N49X9%i?jIyB{=`}R87aq(~Ao*Szfg~2xd$|-cTc~ zrd;=5Pspv!^rUP>whlr8>1dV~q}UZK~iVR&Be&DNf>E}Bk@yX8J`x_Ip7MDvj+ z6}xq6jxZ6&8)!`vus98|F^LJWdmtqI z(u-Tn1}9(eg^}UsJGRr1W~JExce;A^a@o(#KUrp#QEQ+fyILpSymG2}CpF8A?3@HI zgC<}-3y6(LREXBY!6&bFe)0L<$w|6bVU&9zWcL%D7at$oe}op*3JK;z%D%+H4Mne) zW8y&`7M=$tRj7)E^DyxuFAMC(#D{z=JOxbr$j?G)FsVk>EOZK!01B|cE{3!$Xo*0Y z3<)=eoARp_!iu{5s$FPzF2s9E5^Oh%Xy9%_q8hRHaq$NUp7 z^|Q~sMayE53Tg*+pzX3o37CP#bGSRE2PR=}xB*h3t!y-x!f{YK+8k@FKqO4MgsxiH za&$w%@BPPPAJHtVM+8nVc3kX#jvE@%nl<2!NsrLuFn(m?-UGKHC%&U06HLOH1^-;V z)=+==wJX%z#!|_Pg8T4346c{y`?8vV=I4Bx6tiSo6fI{WI={58!1aE rw#3YbK|zRf)H!5)s%h%nAO0Q1C8b<3=2=wYfT%RD@_Cj1F9zSgN$09V literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.EA6DA4E99BE72265.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.EA6DA4E99BE72265.idx new file mode 100644 index 0000000000000000000000000000000000000000..3e4b39e7dc3f4ac022522e2178772770db69035b GIT binary patch literal 2612 zcmbtWYitx%6uwiY?VahJmbSCo-R(*rY?nd{BM*xf+h)7$wuQEoWf$Zjo9XOqyX>}0 zXBKElqtXx}kRnDUU@?#wBmojltRyP&5yeMBM8!lB5{WTBB1RIxq7oDDOmk)-@eepj z&)##sbI&>VywXrdFj&tc52zWLMF^GBKRu%*KFFa5#BKIF6|svq#bE3sc)4P zHL56jre96S(xOKfFMTW~`FkP@qrpz!ns!Ma(Uo|g)SH&I*n)m^pN7^1Lq185Yx4Yz zs%I7`4}3owU%cplxR3U2OGI@gp`-@}^k_^=Y*)2ZqWAtS#?bPE?04$W&71yqI*<~Xj7#S<4PEK=Cc+wCR+`19FCQ{0h#UkM0y1+FBO zG{w{3F8$-YOGlT=f&*f}2}%S9Z9!L-3s;4`SuRo=nV;npn{t#NpVjGj95tdQ@Ko`3IQc z&HjQMT=@EEMeFjj3vvi3%F~Kd47B6r|nfjaEN>c;%HCi%S1*V`WX`Dt!f;Pdc z#no08AD_MAc2j#%fQHj-Yn}s2mrmXuZ#e#B7ZtB(*O$VpCjP8@@AT!9X)5LrhoJ;D zz30jPl6@K#2ic&d4Q)>YFnS(r6Wk;AJOn1;mp`rbOYu!anjxnWUj0awI z{rr`ppBsKMfE1gmfTHYe8h`!jWW%#myoKFj`GVP@AsB-L)(P$syQ;zU($VE}UUt}D zqIW&W!^1$Gx$ghsvjY)#%v^h%ihZoF7>u;7_g{LV@5SS^2u1*) zeI$0UyKZCNYsCcHk)4BiBDf5daS$EB4&>lq90+zICkL}bunW03NF~ALsGNh!66{89 z4*HSB&GVXDARZR`s(qd;=lA++vs|0lR+Z)2#da$hEM6(Dtjl8SYS&pd2_7yOwmO;M z5q3m?x)8jR-Dz>_T;tDg;+}egCdp_?$UCH#mcv+7Af}lt^;LpTNFD76V_ks~Ov()Y zo()B?-{H63X>^Nsj9COxLB6R&V|jrsf;+`d%i)QQIlpf@)$t(>c6wGp4b~gO{pVVv zMva{Y+61o>S6PFV+Sb8Hv^9p+>mcwl)U*IDaaQJc_aXa VP(k*{Wsf9#w5Aau`adFk{{raY(+U6p literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.h.8E824D412DF67181.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.h.8E824D412DF67181.idx new file mode 100644 index 0000000000000000000000000000000000000000..68683dca7a3cb62e2f0e9a6de7bfbbca82017247 GIT binary patch literal 312 zcmWIYbaOLcWMFVk@vO*AElFfyU|Qb`c)Ol`sMjW*~JBk$*J+l$;BlZshNrTMi$2AmMQwhX+?>;C8@EMhCnF;R8xtcl z>-lN?OVj-LcJnZ>LgX2kSy)+w5DJP?(~4bzQZSPkIUy!MRX-|_KBeg1If0RjnURB0 o6e`L9GZv^CY#dCyC^aV$#4avMF6IW(Ow6JlF-`%(e!UC~0Nvh1Gynhq literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.c.98B4DD83BE82CAB5.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.c.98B4DD83BE82CAB5.idx new file mode 100644 index 0000000000000000000000000000000000000000..e6d161357a308199ae8478712e1b170145efc7b4 GIT binary patch literal 13212 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 X`SUmKxpLF83#rRm)~_S$0tWdPRGPoX literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.3247C948FFD8A47A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.3247C948FFD8A47A.idx new file mode 100644 index 0000000000000000000000000000000000000000..178f81c75e0b997b517b56acb1b8e57eb8d7ea4a GIT binary patch literal 7442 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 ViTvm9-f{7!Rp(L{v}{;U{sl4F*G>Qc literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.3CF6F5243B443559.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.c.3CF6F5243B443559.idx new file mode 100644 index 0000000000000000000000000000000000000000..b481eee8547390264f76104f588f8184b912af5e GIT binary patch literal 14352 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 mAW2ezSph$aBE} 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 cFT3{3K?V7Fxl$fh$aBE} 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED1AE54E7A18FAD.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED1AE54E7A18FAD.idx new file mode 100644 index 0000000000000000000000000000000000000000..7b9d968889374758064285a8638814bc70ccdd8a GIT binary patch literal 2880 zcmb_ePi)&%7Xssd{(s>5fFjR~w_ z!vLn;E=BqtXfw{j<1pK%h$PdVoyb&WfLcs`$yJ%!=C2Dl>@&m2LC~hX50zR+ac}|a9 z?-h7d2Oy8-8q|W|fNo1}n+*fRH5&#t>h%T;?d*;wUVJ%x~QMK(8|4VRC2LG-vb|QMYnMk*#<8BAKyBvVhzc)$GvdW zIw=Rsl&EBUIL@B3V_61~X&Dttt}Q!wP%AluS~4DwE6L%ZL}DmDv~VUbV^cF+9m&Me zX&2MO*^?Vx}+igzs3)O4;6qG$xG& zq+`;tfOK3s9*`!bNnc8z{qexHn_KY^buMLk>#6$Lhq`K6*YS^Tzwzs6|HyJUDjt=N z`c9(axHKM+PDm#L(u6b-kfx+5U%Gtf=})%5+Oj&LVou8Wa8#UsY<|Gw=fca^C+_Ur zJ|F59dn3J%co}-zG(%2X9ZyHLe+mEb!+TWwaOAMBef{It^V469Y*V-=($nKPSxCKw zSAYNP7KQsFeUEzZv)|lU-udv)pDBDWa`1o$pL+Ai+ZQi?`4@!`MGige!8S5fwkEbl m#@HgtZnbN#w-AJVjb*pL>=57iVCT{cx8B|C+_yK{E&L6Ww2(yr literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED519BC40C71C6D.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED519BC40C71C6D.idx new file mode 100644 index 0000000000000000000000000000000000000000..e0bc3d17b88a3aac78a14fa52589e804100ef236 GIT binary patch literal 2868 zcmbtWO>7%Q6kdn8I9a!q0$Nd^$)k;cfRpu4tasi0 zaT1~yRpI~=J%B_d)JqRYk;n;hL~!HK3#tT_5JkOIf&)khAw+=#%#6M3F|`AtD|vU` zH}7x0d2c*Rb2BqBQ4n(a+(sF>YNsFw50IbZ+W1C<4CvDhFBWW!ijcF+A})D0a==|h zke^waP);w;LD|wh0}-`~YO7^%G^`X<2LVjdx2o&J!U3yTvf;5kT#!e-zMh_k>; zwct65W~>3s*yx;xOl{M5@!aHcKGtjrg)see~ZVN8%S5MsbfubEn6uX zYKbsQ->wC9904xE!t@k@N+kmUTeQE)*y)Bn9%QNo5+Vi(7#xRbCP55TbJJbLW(kl% zN?{5+R4bs6=Cl{%B$pV?iR#ge8w&vJK%z}T7Aa199g}z!mDF9lWw^HdRaL{QEuBVh z6QX@i&^G#0PSI9j(ZZ&SY|1*5t-`BFbAuEshUF?&#l=>=@TeX#hzhK)sxIp}+9t4$ z4FjllyA;VjkYb#L$6>b3B9c@iw?H)-J-+0bweEJ1ja36yEyo4TDwiD=wh_%lNGF;W z6cA{tLAD4;eist)I8mjQQ?acIS!mHSHM*Q&iF@%NJlVgM$g+cFCY1!HdVZjWdW5)C zQgMUx<$MhKx02Za_fHIlry985{|rCI@I<=ihwFGYJKV5p+1^Yk-Q6 zR~%CsZMdMd-Q1T=ej{Mq&Ca+uenp06Vq-dH$jxMaq z$8$Ky(Jcqow=iVrQE&CA%-3{OY0*RK`SuRYHi_MqYzg;-m>_f|I7CsX)4N=jqROzTUPvqGC?U1#ncHe{6oh=jYZf&I~LA?i<%i*IANzcKt9OYVwo literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.1AEF57FD49B949EB.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.1AEF57FD49B949EB.idx new file mode 100644 index 0000000000000000000000000000000000000000..1764d493441f1cf69636b1c3838652eb2449007f GIT binary patch literal 2460 zcmbtWeQXp}5Pw&;AG>|~3hmzY?s`gFdbJc~1+=#3wMSce?G^6Q9N-63F5BI`cIox5 z-CYV8qhbsZND(6vNNXT5NCFuB12HPm7_CY|M8!lB5{WT>L=%ZXib_m;yUpxD;y=Yr zIyY~A^XAQ)`MpV#v1oKZi%_Q$+cu(_5`z$`pnry`Yi|@##rhf+qiElHL(8s{1~MvI z7mIf#?@z_nCXpP9AvqJ51|LynlWKiKlA+pqTFa;*Q4~8v;(9~X4e`lsvbZ&;4;!PB ztfpkyFo#r45|=lxc&J4YJNwozOGVeTuk8_y?S`Bl6bEvWt}Gowa}2aLnrs)1v@WI6 zE0+JC?Sosilp$+!Ze+wrDY`bU>KScd?hzGrT$5FC_UF#G-+2PGfTpUabb0QFXL4Id zCBvBeM!Nx~YM4u9l-AWTn-W^qL^NU_jhM19lyjJqyM;NU87XT5rR+tXRaV?($d0aM zHFH)oC1W_HZ^=^DZXX$V#f8xIl2S6(*dg%9gAid^me^vJ%?N#Y;v5cjE%x!KjKTpf zP;Lu=Z%+PrZQlb28!(zj;h_aXRmB^;8)^~ja-sQ*tGMv9ch6k@?b{zhJSw6NRa}+Z z7O?-9?aH=|o33uoWH^r0JG2Z>^h$O{#lGFDcn@pL~H@@^i!uEeDS^dJv?$# zxRR^%+5+J72g;776Xbo2ycCuSrE*&UoO<}}+QWL?86GX5aBzMwU<-gRjnyh??L37A z3VS$@#})veT~s#19@_mCkKpN(YFtgzoc(qfpA=mjnpi?}e)~NNc0y-3Mx6uHT)xzokg!}dM$2(_U7X2=U zj5Ff`aAeRwc~H52GC=PVM8PsBKfo@|<`0zM+}BeJJ64@uT7XG&WpfbBn1sBcdRR@l z?!A_fTbt-f+45`+gaXphEG@=?HzvJ8uT#VDqTU;=J!M@qofdb?J>YcV*o}#%BTvMs zImsj|;7*f&F8ScZ#bY^YW)WKg4G0cQ<2~iOb!v_<5yu;7O%t#<4Y4ta39-8%B>d8g zTg(P0U-0?i&Chl0pdrl)vkvZbW%^Rt&rLsBW|dJFLPK`7PP}>fRMQL8EHkom61)tW zfb}dOHYQOaS_=oCywdr_=X)n7>0X6V?uL-vk9S^pY;gY(T2w0}m=7uY5=%A~y*?ik z5Av|^JTR$5l`Ncxi5GcUU^gZ{CYwt)J6yzMm>K4wwwPp?jI(;wKk-sO z`}AA1EEcJtc2Eb}E^Cy48E8C@yKQ=46847cAQjrmdUH7(2c@IUvBnBS!lX;+s)j8` zHx~Tfe?0aP&BA&_-~?mG#s25Gp&_kV1KybQ2t5wthd1p#a5Hk^I~p>?o=HB6oT!@sk*q?9YhJc~F7L?wB(G_Ue`mHsaV-@oP#s&xPW literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CBB96F09F9A0FC32.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CBB96F09F9A0FC32.idx new file mode 100644 index 0000000000000000000000000000000000000000..ca0632057a752e2b30415e00c06f15084faca7e0 GIT binary patch literal 2402 zcmb_eeQXnD7=Jsiqu2NCHo9xqb=9#s#sJxsF*dAr1Ij+Stgvk02SZAGcOA#Nb=)0e z5Tjy@ie!jU31k>Z3}P4w{(%^kXo!OTLBxoOBqS1IL?ekLKtLfTK6m7~vVRvZ>2vQr zzvp@0=i~RjX>Yu}eH~9oOpcEYDMpGTgp|ThH#GHV0W8d?ZXQ_^Pqg)hlkvV@B1Pix z8zoXUks5efkqlV%Y)a{hwa%znB_fJqEF!Me6-^g+j7j3QoHnSBq$DLNNxHE~QBz{W z(#6eB$jP2$UwiLzG1jwoQL?>zd0(ffZ`Y;FfSAsuG`W5gnO;0AsGiYM$;{%0{~^l2 zRyC6>fam!VOQ8R^pPjyP{pVjJ9#RN!g}cIM355UHE|2wZ zxVgsasAml^Q^+~{m9VlJnv$l5)?Ihgb83n!Pn^?B`X4-vqi z%v~0+1o~gtS9~P1s^|+w`~YusZuBzV$$Rtu$tORlKBU#0_K*@V5KF|6CD8x!mTEbp zUH}-5IQ6^zeoG*{Q~##$;(u+CB*#KI^Vj7EalnqTzgtnsZ#3j>!9QDTdSmK6O@?q=Bls; zBo?&CWEG~#Xk3WfJ$&l1uDj9B;x_0*v#)tB8eKekcf9HF^9fM*a6P4%)5PBkzMQ;t zGzV&)@Gh))PWmj{?R`@Nbqm*GTO)NL0h6~Fo6%08^AQY*Z|JzmUNkD7^XlN{S61wV zkfWueHCWS)vzLp1Z@Olx6;7$d4(y7KpSW_e=?ze)xwO3#avu^fiI1@vZ4=t6apNY} z+gYYztC@Y;P{Q$_uuWAm;klR$&cbr9nZxsK0EO4Vd%BF6RHo$dsi*!FZ{5C zQ9tqXcq$kzBV|0M!DxU4c;q~z<)oa)1Hx#K1bOTjqZOor#{n`LA|W2x&e7)i&8?U{ zMj>7059kkB|qggKN!Im>R#0}YB&jiQc zUeCYyF|@_x8nzVs08=#Y5LDx_n&F;uX)qcIL~1Y-ZbszEiQ9YTlA_`wZ(_T6ut`~`dyT%s03{(IwQP4%G< zu7EnqMZKv0s;jj-@ssZks3Tm&k7^tu>}1|r`JLK@cAMHnQ?e-&(ltr%Fc)r9Jb2&_ f54~^bq1(# literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CC8FF5B2CC920A3D.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CC8FF5B2CC920A3D.idx new file mode 100644 index 0000000000000000000000000000000000000000..296a0985ccdf381d8507d22672e8f0043658c0b0 GIT binary patch literal 3726 zcmb_deNa@_6~7nW0&lsy7hyp_K6Y0`)VRA4ECW{+tXS+EccQl*yrRXmlVP zQ>_5SJkeEkb);qUR#gdg$-O}z>1yj}?sQ3QTRMrSt_}Xf#1rh01K;#{qVTo3PgZ^U zw_geR>YPreyUw{)^+ix{24$2;%8g{_KunQTkKzdr45*Sfq73^Y;QGVp4u*FO%BuP>Ds&gMG&?+BK9dP0i^?IY zIH8~_T6Qp@^XjE(cZPisf0YinAhi2 zqh2Mf`4;gF=|rz!$g8BCN0d;MER+turHD_B1*0l~z-)%V==DnmZT5d6)$x4 z=s@q`Btrf&KE>*qSLK3SpMU4zk56V>&7>fSaF@}=b%Jo{nUx$aDq&loo9hJO>9U0vZh898 zQ#3QfXfS3bOqACD)_x>Xa>_({idF%pAV^j)^P-<;BM0Y@Hz7 zG_`u;0oFBVBKZIp8H=)Xf-s5r{OUeP%+On}G?+f$okAIp39(|#%HON)|CsF>%mQ}3 zsXiO)2IEVzwSt4eB07(E0E2&lq;3u3QYlNt&@=b*{->soq5fb$&8<-@XN>37(YYd_rUrr z1ux=j?7lSPqON1yZ}Bg~U@{)a4#YzXNwUSt64-FrursmRL$mkL2lh@=>oi>%uVX$# zZ8NkC*DupYZg285R6&|<(#)IGhS9;cha_t~kA5;9u|(npa#{T7{SUfZnjn`otR@R% zQ@{N2*@jl$4D6olo|Py&bA0wd)zNJoz#bJwv(RLmAdp0DeBf@z8`d_sP^A_|>lwNn z!#Z|v&FS%Xj)y@PCp-RY9HDHDcGqe~(y}#kW zFE3A4{Q!WARJcgv=V74=#znIYnl86~CE5z%C~SBnv1-g~EW;H}LGVKxfoLM*Axp@P z_D}q#a%Wm#^hK!dYEqqovW&ZlI|T=2RoeJ%!`zLZf{lBrWiO5AZsL~v;vZia8v|gP z3e&U*z1sMMd*<7L7mq>#&3lEwVei3BYr0cjTf%q&DG+fCGG0guMYNdlB2pycm}0z` z6pJ|17`GCuh&f{1MrXTcEkXbL|9$S&tX)t433S!5It!*0Z$T>l-`fw|DTb>r zam1iyFg~ODdtNwnf5Z6upmJCkE=4c@bL-O*`;nht2DV@DXCgar^@{1x%)TqYZZI|E zqXC!3c7C>@-gXU|=Oh(QQZpLN_<5Rko@V0u&Br&icl<5;F38J*oP%ny!ogDQ7EV|i zwuIx8CgKaq8lpx#s-%4^(a8K0zuO2&M;=M$$@j!>RDaRioXRqcX48^%!r~x_hn$f3 KP$k5e*zi9w8$OQ! literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.038257A9D02586F7.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.038257A9D02586F7.idx new file mode 100644 index 0000000000000000000000000000000000000000..2d1d4092e59917dc7dbc845239bd05aba2cbd82c GIT binary patch literal 644 zcmbu7-%0{O6o=2K)9#8G7(tIvHx89h+LeimLWC$@uj}k=4*rWd)20#BZO~=(26@pd z^bp}AbXRZDuB&-(2Zs6h&EXq{GtIhf-zNYnUVSnY+D!q#PPkAj`AkBHYX1OuDF9y% zM2Rt0DX}&Rh3sy^+3i^M@!I9W;T&~ONS7U*9-kCFr{T2hW|>tQ?L)`DD7R`1r^x*) z)*ZXb%l9_)c_NTpuz35oMae*@f$VN9LSMO#7O3-l!w0PmJy@_DNgb1RvG1sx5d>rD z0ZxbA^Kcy2L+$Ck`Sq9q6JV=A3t7XYW)>_$Ae|rv{e0bi^Dna>8L+~J4(;R&i(0vL zgAzVgL(|W9wKbdDXC!S9lk7&bj%sxQv0`zY!b%&)3*9mXB?fN9s5r6+qEED}p1VQ=oBAH}nIgaTyxw7!*K4EE43t}ISYOV>}zPb^B&%OKxKA5SN+(K(q( z#c4%}lo*wgT9%odst=*4VNg+KS!xl`VU(B!@)S4(^^(aCB!nTrkOt*|kbGdaFl7M7 zDhL}Jf%yzzWtn-IB@k9gVsUnSQE47SS$<{;Lvdwp(sE$t`da-fu1eC?ga?%Ggv^A@ zWWfXjCmR!|2sfh;D`&k&=c=HG4Ll5D3=D#ytf72DoUELD44f=13=%v*1zL62mRQVM zvxtX56lj8&keCdZVBlnD<^Y>;ej5MMG(W!GJPhJM6P7WuE@KoD;$r0zLYQ%VcGXvV z8^xDA3|v4nc!hao!2|;*DRD@Xr^E4wD#IsQ4FJHI@FT3bw4HRbNUblv_UpUBE1Bql4S0{5?wBa0(9%qSiqM+rxH1kZ`Z2}#aL!U--13s6Q*NI*hu zff>up1qnW=FprQIx0fiwTz?^d85pl5CdcNjw&5}+9w7%72PEqp#2jQ{ieRA+v<@8R zP;+5H0rV>Qb`c)Ol`sMjW*~JBk$*J+l$;BlZshNrTMi$2AmMQwhX+??gC8@f$iXNIRSdU)krQGt mR2*h3P#A0+OnFgiP9lh1T$EhQ4WyZvMLlAi0)+i~85jUbh(!+o literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/spi.h.3FDB82D9CF0119F5.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/spi.h.3FDB82D9CF0119F5.idx new file mode 100644 index 0000000000000000000000000000000000000000..2054914be7447a75dea0a7f61c59a621eb1e3344 GIT binary patch literal 51042 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 W4w_iXA?a@@GX8xk{r!pg_x}USVS&K_ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdarg.h.A61B4A3DD19995EB.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdarg.h.A61B4A3DD19995EB.idx new file mode 100644 index 0000000000000000000000000000000000000000..3cad95b97d9e766ce80d7bbc86df037177311d1b GIT binary patch literal 588 zcmWIYbaQiIVqkDi@vO*AElFfyU|t^h+}Jlaq^$ z3``9`w0=o`eonD|a(-?BP)QL`RyR4lL^s*Uz`!8h$W+hJP|rZmCnQ)uGcP%(G$mC( zz9cg~IX^EgGhHu(ipCa~q$Czm*~rRbpld4&Qj38uElZ5g$t*5mD6Y&+QUnIbFXOc-VzP#9zvO!)nph956Yva5i?(Hzlm z)$3kss;bR3u4Uw5vf{83glWF??rK-<)61`bsx3Jz;fC;jvfjVy#F2MEVKojlxJ!ys ma}q)J6c;5ID}xx!AOZ}Sm;@D87R+C{_5~9oGXpG*0Hpw9KbsN& literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdbool.h.6D5F9834DD64C05A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdbool.h.6D5F9834DD64C05A.idx new file mode 100644 index 0000000000000000000000000000000000000000..0aa054320b63bccfeed3700336df9085720bff69 GIT binary patch literal 422 zcmWIYbaR`>$iU#7;#rZKT9U}Zz`!63#Kk2=nHzvK7^G$9q+03g>pNTNmt^WECl?zT zm>Pg+{gV9roMQdt{M-Vdk|Ln2ZgP5wZnBYqfkC{Hsh**so`IfENU(lpUUE)pN~(T* zNoIU8vxA@L!R0j}}!Kz_Khhhq>zAT2W|)k3Q)b3&)~@=-!C>H#+cJ5WKmNVq(h zfGJ>PWhhEbD_#kVIaa$C{_sgF7#X?P)Hu}m!EOW+YN0|5^P-NcGxD$*a~Si$grD@* zr7b&uR0Aj+!V@9}6aLZr=6kk~r7i~#n-+r>T$qPVn?W0ir^BFw#M5QaMdC#>L?iKH z7-EokSqxc7yaI*-IB(PH4!Z-(zncPGZ^dCH0dvod+49fVpPpm^6n5cok%S4uVupze z5+hJ?9yWUpdvO!nBV0EsqeM6^m~iy}WAX>;P2x*}+XRa=pfD)LU`E2C3MdSUCzvoS zf`B%GVh1M7!{*81DFM?1izJ|4Pz=Eo3Euws()AbH6QFPyN0=;37#L$Yi6BmKQF5_3 XkY-|g*FAN{W}7{%!02R!D`NlvJtNGR literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.2B221F242309F99E.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.2B221F242309F99E.idx new file mode 100644 index 0000000000000000000000000000000000000000..3fcd16e59a36a23adde00748b536f2becf0f232c GIT binary patch literal 2470 zcmcJR{ZE@!6vuB_p?5rG@-q4o3GAho@Yd&PX=`6LK)dliCNh|BS;tC&h5}1lGMSq? zhBG4?RD6MHNI(;1W`fb_BuivjVvIkD$y_i~=Q1TKniw}k3F^7Gp6BTwfH&#ko^wC< z+|$eX-t_*O%F6MLg!tNO9_aiaj@U6YOFzc1DcL<>NnvCzzo0xWECZ-4o@Gy4Q` z2LJ_z0uwh1ka8^d!j=Vli$FF3P;4wVbE5!DbT+eppt4gSn*k7wVm>ztaK3%??~9c= zA%Ua<;50Z*+$exoH$Qx7dQ(IoIsmLjYd$v$aCPIaw|Yi@dQ~8q0Cf#?CS7%gUQ6d?Kd z*r?{s?#~4x08pwg-NuaqWM%&{HThb`vOqEb@EAR2ZWQ3)lRLf`e{6nDU=N|jWpJ6e zQGf_YDgz$M$?TD}=E(t-N~`fwuO7cWwu>q?-X^?D2>IsPLHgCM3#kyUrL}N&d|>ZD zm^BWDYd^Y~J}B+YfZQJH(PPoy-nRVk_`{joAuLhJfSa+uAPH+OOj5NnT|V7+qyWN= zv{62C<=Le_x-#7*DO$}=vJ?K7@uAg}k+KADH`$%wRgtO$ubNaRc=e=S_U8V&a_Ehz zy$-0*O05R$nc)Lt>ct_`-B3y$t&>Z6@pQ)A(r``<&~ED1V}GC=fM#023O}$7UeWl5 z_5fW(i}ZNWs12Z*Fpx$?K$yt^!`Du|Fu!$1+7C&JX|W!u{g<}hcxWp35ePe}Q-@+e z)j$#^8BBu95N1NbFn(JIGkIY6!y9iu@#ET1Kjbc;1v;$vevxN%7%7a`fxvlg4L&_EDc4#;$`f6CBcK`k(LeyN4$riGwT;Jek$_F2eXN=vg*adnr6T2`A!FG5(Pq5*I2oL)2V zz}4ByNm@;XsltLu!1Gn?K`*cMzPBa@{`?g7+NoWK{fw!h0H$Q5S3a>7F0^c00NO$= zdMxv->7C`x?v|SnE~JHeY@&`VRl|X&URq=YXe;2^h!61W73JtXUDq(<`|ady*z2M$ z9limmJ1Bs?6iDMTgxULmVG;?3TbUD$1fo@JqGl#Ol5s*viZb0GPm?t2m9(5Y%cZ&G Oq?F_hYJ$JMfcO_!QD>_F literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.C8EE9E4CF97EC8C9.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.C8EE9E4CF97EC8C9.idx new file mode 100644 index 0000000000000000000000000000000000000000..f0cbb12ca9a5cbf66afc613bedef6f3e3bdd3ff4 GIT binary patch literal 550 zcmWIYbaRtqVqkDi@vO*AElFfyU|0|e4Cb5gDJ_4S>t^h+}Jlaq^$ z3``9`w0=o`eonD|a(-?BP)QL`RyR4lL^s*Uz`!8h$W+hJP|rZmCnQ)uGcP%(G$mC( zzPKbMGq1$NKre%urj}&JC+Fv-Wu{ZrScqGxYh-1yKHS*i%G@MS@D`<}6-NQ-AH8qB zXA4>CvhXl#GH8l{q(Fd&S&KmniKoq=jl^qaVQ6N7^Aj1)Ew|ssZN|vOtjeJ(1Tg?) rLrx-yU0ei=Ga${xtn=Z+JqG2kOPQG%Sr}mP43q)IKNJ8{1q=WH@!^Wd literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdio.h.57070E279D9CC442.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdio.h.57070E279D9CC442.idx new file mode 100644 index 0000000000000000000000000000000000000000..e7bae5a66d69086480cc9a2cd5fedf918f30cc97 GIT binary patch literal 14234 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 SP1&=jM4k$1=gQ8_A^!(Eu+WqM literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/string.h.9E28FAFBAB9F1BE8.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/string.h.9E28FAFBAB9F1BE8.idx new file mode 100644 index 0000000000000000000000000000000000000000..bb862779d4f1d0adeaee01f14768e26477b71f37 GIT binary patch literal 4784 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 Po!dIMc0SViMCbnpBp~oE literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/upp.h.BCE80B45D7E726CE.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/upp.h.BCE80B45D7E726CE.idx new file mode 100644 index 0000000000000000000000000000000000000000..277b9d0700f2753c06435eecfb13c1bb9f0b6108 GIT binary patch literal 49892 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 E0%nN?eEN+NJ0|}z4u;~E)Z%! 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 DRSn!* literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/compile_commands.json b/28379d_P_SFRA/CPU1_FLASH/.clangd/compile_commands.json new file mode 100644 index 0000000..456e1d0 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/.clangd/compile_commands.json @@ -0,0 +1,42 @@ +[ + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg/board.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/F2837xD_CodeStartBranch.asm" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/main.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/sfra_test.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_f32.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.c" + } +] diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d.map b/28379d_P_SFRA/CPU1_FLASH/28379d.map new file mode 100644 index 0000000..bf7754d --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/28379d.map @@ -0,0 +1,783 @@ +****************************************************************************** + TMS320C2000 Linker PC v25.11.0 +****************************************************************************** +>> Linked Tue May 19 14:32:29 2026 + +OUTPUT FILE NAME: <28379d.out> +ENTRY POINT SYMBOL: "code_start" address: 00080000 + + +MEMORY CONFIGURATION + + name origin length used unused attr fill +---------------------- -------- --------- -------- -------- ---- -------- +PAGE 0: + RAMM0 00000123 000002dd 00000000 000002dd RWIX + RAMLS0 00008000 00000800 00000128 000006d8 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 00000000 00000800 RWIX + RAMGS14 0001a000 00001000 00000000 00001000 RWIX + RAMGS15 0001b000 00000ff8 00000000 00000ff8 RWIX + BEGIN 00080000 00000002 00000002 00000000 RWIX + FLASHA 00080002 00001ffe 00000000 00001ffe RWIX + FLASHB 00082000 00002000 00001b63 0000049d RWIX + FLASHC 00084000 00002000 00000000 00002000 RWIX + FLASHD 00086000 00002000 00000128 00001ed8 RWIX + FLASHE 00088000 00008000 00000000 00008000 RWIX + FLASHF 00090000 00008000 0000046f 00007b91 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 00000022 000000ff RWIX + RAMM1 00000400 000003f8 00000100 000002f8 RWIX + RAMLS5 0000a800 00000800 000006d5 0000012b 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 + CPU2TOCPU1RAM 0003f800 00000400 00000000 00000400 RWIX + CPU1TOCPU2RAM 0003fc00 00000400 00000000 00000400 RWIX + + +SECTION ALLOCATION MAP + + output attributes/ +section page origin length input sections +-------- ---- ---------- ---------- ---------------- +codestart +* 0 00080000 00000002 + 00080000 00000002 F2837xD_CodeStartBranch.obj (codestart) + +.cinit 0 00083b40 00000028 + 00083b40 0000000d (.cinit..data.load) [load image, compression = lzss] + 00083b4d 00000001 --HOLE-- [fill = 0] + 00083b4e 00000006 (__TI_handler_table) + 00083b54 00000004 (.cinit..bss.load) [load image, compression = zero_init] + 00083b58 00000004 (.cinit.SFRA_F32_Data.load) [load image, compression = zero_init] + 00083b5c 0000000c (__TI_cinit_table) + +.stack 1 00000400 00000100 UNINITIALIZED + 00000400 00000100 --HOLE-- + +.reset 0 003fffc0 00000000 DSECT + +.init_array +* 0 00082000 00000000 UNINITIALIZED + +.bss 1 0000a800 000006c2 UNINITIALIZED + 0000a800 000000c8 sfra_test.obj (.bss:clMagVect) + 0000a8c8 000000c8 sfra_test.obj (.bss:clPhaseVect) + 0000a990 000000c8 sfra_test.obj (.bss:freqVect) + 0000aa58 000000c8 sfra_test.obj (.bss:olMagVect) + 0000ab20 000000c8 sfra_test.obj (.bss:olPhaseVect) + 0000abe8 000000c8 sfra_test.obj (.bss:plantMagVect) + 0000acb0 000000c8 sfra_test.obj (.bss:plantPhaseVect) + 0000ad78 00000006 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdPacket) + 0000ad7e 00000002 --HOLE-- + 0000ad80 0000002a sfra_test.obj (.bss) + 0000adaa 00000016 --HOLE-- + 0000adc0 00000022 sfra_gui_scicomms_driverlib.obj (.bss) + 0000ade2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_arrayGetList) + 0000ae02 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdDispatcher) + 0000ae22 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_dataSetList) + 0000ae42 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varGetList) + 0000ae62 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetBtnList) + 0000ae82 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetSldrList) + 0000aea2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetTxtList) + +.data 1 0000aec2 00000013 UNINITIALIZED + 0000aec2 00000006 device.obj (.data) + 0000aec8 00000006 rts2800_fpu32_eabi.lib : exit.c.obj (.data) + 0000aece 00000002 : _lock.c.obj (.data:_lock) + 0000aed0 00000002 : _lock.c.obj (.data:_unlock) + 0000aed2 00000002 sfra_test.obj (.data) + 0000aed4 00000001 rts2800_fpu32_eabi.lib : errno.c.obj (.data) + +.const 0 00090000 0000046f + 00090000 000000c2 driverlib_eabi.lib : sysctl.obj (.const:.string) + 000900c2 000000bf : flash.obj (.const:.string) + 00090181 00000001 --HOLE-- [fill = 0] + 00090182 000000bc : gpio.obj (.const:.string) + 0009023e 000000bb : sci.obj (.const:.string) + 000902f9 00000001 --HOLE-- [fill = 0] + 000902fa 0000007b sfra_gui_scicomms_driverlib.obj (.const:.string) + 00090375 00000001 --HOLE-- [fill = 0] + 00090376 00000062 driverlib_eabi.lib : cputimer.obj (.const:.string) + 000903d8 00000042 board.obj (.const:.string) + 0009041a 00000042 sfra_test.obj (.const:.string) + 0009045c 00000013 device.obj (.const:.string) + +.TI.ramfunc +* 0 00086000 00000128 RUN ADDR = 00008000 + 00086000 00000043 driverlib_eabi.lib : flash.obj (.TI.ramfunc:Flash_initModule) + 00086043 0000002c : flash.obj (.TI.ramfunc:Flash_setBankPowerMode) + 0008606f 00000024 : flash.obj (.TI.ramfunc:Flash_setWaitstates) + 00086093 0000001d : flash.obj (.TI.ramfunc:Flash_setPumpPowerMode) + 000860b0 00000018 : flash.obj (.TI.ramfunc:Flash_disableCache) + 000860c8 00000018 : flash.obj (.TI.ramfunc:Flash_disablePrefetch) + 000860e0 00000017 : flash.obj (.TI.ramfunc:Flash_enableCache) + 000860f7 00000017 : flash.obj (.TI.ramfunc:Flash_enablePrefetch) + 0008610e 00000016 : flash.obj (.TI.ramfunc:Flash_enableECC) + 00086124 00000004 : sysctl.obj (.TI.ramfunc) + +GETBUFFER +* 0 0003f800 00000000 DSECT + +GETWRITEIDX +* 0 0003f800 00000000 DSECT + +PUTREADIDX +* 0 0003f800 00000000 DSECT + +.text 0 00082000 00001b3b + 00082000 0000052e sfra_gui_scicomms_driverlib.obj (.text) + 0008252e 000003fe device.obj (.text) + 0008292c 00000209 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_setClock) + 00082b35 000001fa sfra_f32_tmu_eabi.lib : sfra_f32_tmu_background.obj (.text) + 00082d2f 000001c2 : sfra_f32_tmu_config_reset.obj (.text) + 00082ef1 00000142 sfra_test.obj (.text) + 00083033 0000012b rts2800_fpu32_eabi.lib : e_logf.c.obj (.text) + 0008315e 000000e3 board.obj (.text) + 00083241 00000090 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_selectXTAL) + 000832d1 00000088 rts2800_fpu32_eabi.lib : fs_div28.asm.obj (.text) + 00083359 00000068 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getDeviceParametric) + 000833c1 00000067 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_collect.obj (.text) + 00083428 00000062 rts2800_fpu32_eabi.lib : s_tanf.c.obj (.text) + 0008348a 00000052 driverlib_eabi.lib : gpio.obj (.text:GPIO_setPadConfig) + 000834dc 00000051 : sysctl.obj (.text:SysCtl_getClock) + 0008352d 00000048 : sysctl.obj (.text:SysCtl_selectOscSource) + 00083575 00000046 sfra_test.obj (.text:retain) + 000835bb 00000045 driverlib_eabi.lib : sci.obj (.text:SCI_clearInterruptStatus) + 00083600 00000044 : sci.obj (.text:SCI_enableInterrupt) + 00083644 0000003e : sci.obj (.text:SCI_setConfig) + 00083682 0000003d : interrupt.obj (.text:Interrupt_initModule) + 000836bf 00000037 : gpio.obj (.text:GPIO_setControllerCore) + 000836f6 00000037 : gpio.obj (.text:GPIO_setPinConfig) + 0008372d 00000037 : gpio.obj (.text:GPIO_setQualificationMode) + 00083764 00000037 : interrupt.obj (.text:Interrupt_enable) + 0008379b 00000031 : gpio.obj (.text:GPIO_setDirectionMode) + 000837cc 0000002e rts2800_fpu32_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss) + 000837fa 0000002b : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit) + 00083825 00000029 : exit.c.obj (.text) + 0008384e 00000028 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_selectClockSource) + 00083876 00000026 : flash.obj (.text:Flash_setBankPowerUpDelay) + 0008389c 00000026 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_inject.obj (.text) + 000838c2 00000020 rts2800_fpu32_eabi.lib : memcpy.c.obj (.text) + 000838e2 0000001f driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_getTimerOverflowStatus) + 00083901 0000001e : interrupt.obj (.text:Interrupt_initVectorTable) + 0008391f 0000001b : sci.obj (.text:SCI_isBaseValid) + 0008393a 0000001a : sysctl.obj (.text:CPUTimer_startTimer) + 00083954 0000001a : sysctl.obj (.text:SysCtl_getLowSpeedClock) + 0008396e 00000018 : sci.obj (.text:SCI_disableModule) + 00083986 00000018 : sci.obj (.text:SCI_performSoftwareReset) + 0008399e 00000017 : cputimer.obj (.text:CPUTimer_isBaseValid) + 000839b5 00000017 : sysctl.obj (.text:CPUTimer_isBaseValid) + 000839cc 00000017 rts2800_fpu32_eabi.lib : boot28.asm.obj (.text) + 000839e3 00000016 driverlib_eabi.lib : interrupt.obj (.text:Interrupt_defaultHandler) + 000839f9 00000014 : sysctl.obj (.text:CPUTimer_stopTimer) + 00083a0d 00000013 : cputimer.obj (.text:CPUTimer_setEmulationMode) + 00083a20 00000013 : sci.obj (.text:SCI_enableModule) + 00083a33 00000012 : sysctl.obj (.text:CPUTimer_clearOverflowFlag) + 00083a45 00000012 : sysctl.obj (.text:CPUTimer_disableInterrupt) + 00083a57 00000012 main.obj (.text) + 00083a69 00000012 rts2800_fpu32_eabi.lib : args_main.c.obj (.text) + 00083a7b 00000011 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_setPeriod) + 00083a8c 00000010 : flash.obj (.text:Flash_isCtrlBaseValid) + 00083a9c 00000010 : flash.obj (.text:Flash_isECCBaseValid) + 00083aac 0000000f : sysctl.obj (.text:SysCtl_pollCpuTimer) + 00083abb 0000000e : gpio.obj (.text:GPIO_isPinValid) + 00083ac9 0000000d : interrupt.obj (.text:Interrupt_disableGlobal) + 00083ad6 0000000d : interrupt.obj (.text:Interrupt_enableGlobal) + 00083ae3 0000000b : sysctl.obj (.text:SysCtl_isMCDClockFailureDetected) + 00083aee 0000000a : interrupt.obj (.text:Interrupt_illegalOperationHandler) + 00083af8 0000000a : interrupt.obj (.text:Interrupt_nmiHandler) + 00083b02 00000009 : sysctl.obj (.text:SysCtl_serviceWatchdog) + 00083b0b 00000009 rts2800_fpu32_eabi.lib : _lock.c.obj (.text) + 00083b14 00000008 F2837xD_CodeStartBranch.obj (.text) + 00083b1c 00000008 rts2800_fpu32_eabi.lib : copy_decompress_none.c.obj (.text:decompress:none) + 00083b24 00000007 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_resetMCD) + 00083b2b 00000007 rts2800_fpu32_eabi.lib : memset.c.obj (.text) + 00083b32 00000006 : copy_zero_init.c.obj (.text:decompress:ZI) + 00083b38 00000002 : pre_init.c.obj (.text) + 00083b3a 00000001 : startup.c.obj (.text) + +SFRA_F32_Data +* 1 00000002 00000022 UNINITIALIZED + 00000002 00000022 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_config_reset.obj (SFRA_F32_Data) + +MODULE SUMMARY + + Module code ro data rw data + ------ ---- ------- ------- + .\ + sfra_test.obj 392 66 1444 + main.obj 18 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 410 66 1444 + + .\SFRA\ + sfra_gui_scicomms_driverlib.obj 1326 123 264 + +--+---------------------------------+------+---------+---------+ + Total: 1326 123 264 + + .\device\ + device.obj 1022 19 6 + F2837xD_CodeStartBranch.obj 10 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1032 19 6 + + .\syscfg\ + board.obj 227 66 0 + +--+---------------------------------+------+---------+---------+ + Total: 227 66 0 + + ../SFRA/sfra_f32_tmu_eabi.lib + sfra_f32_tmu_background.obj 506 0 0 + sfra_f32_tmu_config_reset.obj 450 0 34 + sfra_f32_tmu_collect.obj 103 0 0 + sfra_f32_tmu_inject.obj 38 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1097 0 34 + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_eabi.lib + sysctl.obj 1191 194 0 + flash.obj 654 191 0 + gpio.obj 310 188 0 + sci.obj 293 187 0 + interrupt.obj 214 0 0 + cputimer.obj 42 98 0 + +--+---------------------------------+------+---------+---------+ + Total: 2704 858 0 + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\rts2800_fpu32_eabi.lib + e_logf.c.obj 299 0 0 + fs_div28.asm.obj 136 0 0 + s_tanf.c.obj 98 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 + memset.c.obj 7 0 0 + copy_zero_init.c.obj 6 0 0 + pre_init.c.obj 2 0 0 + errno.c.obj 0 0 1 + startup.c.obj 1 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 769 0 11 + + Stack: 0 0 256 + Linker Generated: 0 39 0 + +--+---------------------------------+------+---------+---------+ + Grand Total: 7565 1171 2015 + + +LINKER GENERATED COPY TABLES + +__TI_cinit_table @ 00083b5c records: 3, size/record: 4, table size: 12 + .data: load addr=00083b40, load size=0000000d bytes, run addr=0000aec2, run size=00000013 bytes, compression=lzss + .bss: load addr=00083b54, load size=00000004 bytes, run addr=0000a800, run size=000006c2 bytes, compression=zero_init + SFRA_F32_Data: load addr=00083b58, load size=00000004 bytes, run addr=00000002, run size=00000022 bytes, compression=zero_init + + +LINKER GENERATED HANDLER TABLE + +__TI_handler_table @ 00083b4e records: 3, size/record: 2, table size: 6 + index: 0, handler: __TI_zero_init + index: 1, handler: __TI_decompress_lzss + index: 2, handler: __TI_decompress_none + + +GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE + +address data page name +-------- ---------------- ---- +00000002 0 (00000000) _SFRA_F32_state +00000003 0 (00000000) _SFRA_F32_stateSlew +00000004 0 (00000000) _SFRA_F32_rSinSum +00000006 0 (00000000) _SFRA_F32_rCosSum +00000008 0 (00000000) _SFRA_F32_uSinSum +0000000a 0 (00000000) _SFRA_F32_uCosSum +0000000c 0 (00000000) _SFRA_F32_ySinSum +0000000e 0 (00000000) _SFRA_F32_yCosSum +00000010 0 (00000000) _SFRA_F32_pointerStart +00000012 0 (00000000) _SFRA_F32_reference +00000014 0 (00000000) _SFRA_F32_amplitude +00000016 0 (00000000) _SFRA_F32_scalar +00000018 0 (00000000) _SFRA_F32_step +0000001a 0 (00000000) _SFRA_F32_pointer +0000001c 0 (00000000) _SFRA_F32_preCount +0000001e 0 (00000000) _SFRA_F32_count +00000020 0 (00000000) _SFRA_F32_windowSamples +00000022 0 (00000000) _SFRA_F32_angle + +00000400 10 (00000400) __stack + +0000a800 2a0 (0000a800) clMagVect + +0000a8c8 2a3 (0000a8c0) clPhaseVect + +0000a990 2a6 (0000a980) freqVect + +0000aa58 2a9 (0000aa40) olMagVect + +0000ab20 2ac (0000ab00) olPhaseVect + +0000abe8 2af (0000abc0) plantMagVect + +0000acb0 2b2 (0000ac80) plantPhaseVect + +0000ad78 2b5 (0000ad40) SFRA_GUI_cmdPacket + +0000ad80 2b6 (0000ad80) lowPass_test +0000ad8a 2b6 (0000ad80) sfra1 + +0000adc0 2b7 (0000adc0) SFRA_GUI_commsOKflg +0000adc1 2b7 (0000adc0) SFRA_GUI_serialCommsTimer +0000adc2 2b7 (0000adc0) SFRA_GUI_lowByteFlag +0000adc3 2b7 (0000adc0) SFRA_GUI_sendTaskPtr +0000adc4 2b7 (0000adc0) SFRA_GUI_rxChar +0000adc5 2b7 (0000adc0) SFRA_GUI_rxWord +0000adc6 2b7 (0000adc0) SFRA_GUI_taskDoneFlag +0000adc7 2b7 (0000adc0) SFRA_GUI_numWords +0000adc8 2b7 (0000adc0) SFRA_GUI_wordsLeftToGet +0000adc9 2b7 (0000adc0) SFRA_GUI_dataOut16 +0000adca 2b7 (0000adc0) SFRA_GUI_rcvTskPtrShdw +0000adcb 2b7 (0000adc0) SFRA_GUI_delayer +0000adcc 2b7 (0000adc0) SFRA_GUI_memGetPtr +0000adcd 2b7 (0000adc0) SFRA_GUI_memGetAmount +0000adce 2b7 (0000adc0) SFRA_GUI_memSetPtr +0000adcf 2b7 (0000adc0) SFRA_GUI_led_flag +0000add0 2b7 (0000adc0) SFRA_GUI_led_gpio +0000add1 2b7 (0000adc0) SFRA_GUI_sweep_start +0000add2 2b7 (0000adc0) SFRA_GUI_rcvTaskPointer +0000add4 2b7 (0000adc0) SFRA_GUI_sci_base_addr +0000add6 2b7 (0000adc0) SFRA_GUI_dataOut32 +0000add8 2b7 (0000adc0) SFRA_GUI_memDataPtr16 +0000adda 2b7 (0000adc0) SFRA_GUI_memDataPtr32 +0000addc 2b7 (0000adc0) SFRA_GUI_memGetAddress +0000adde 2b7 (0000adc0) SFRA_GUI_memSetValue +0000ade0 2b7 (0000adc0) SFRA_GUI_temp +0000ade2 2b7 (0000adc0) SFRA_GUI_arrayGetList + +0000ae02 2b8 (0000ae00) SFRA_GUI_cmdDispatcher +0000ae22 2b8 (0000ae00) SFRA_GUI_dataSetList + +0000ae42 2b9 (0000ae40) SFRA_GUI_varGetList +0000ae62 2b9 (0000ae40) SFRA_GUI_varSetBtnList + +0000ae82 2ba (0000ae80) SFRA_GUI_varSetSldrList +0000aea2 2ba (0000ae80) SFRA_GUI_varSetTxtList + +0000aec2 2bb (0000aec0) Example_Result +0000aec4 2bb (0000aec0) Example_PassCount +0000aec6 2bb (0000aec0) Example_Fail +0000aec8 2bb (0000aec0) __TI_enable_exit_profile_output +0000aeca 2bb (0000aec0) __TI_cleanup_ptr +0000aecc 2bb (0000aec0) __TI_dtors_ptr +0000aece 2bb (0000aec0) _lock +0000aed0 2bb (0000aec0) _unlock +0000aed4 2bb (0000aec0) errno + + +GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name + +page address name +---- ------- ---- +0 000831e9 Board_init +0 00083825 C$$EXIT +0 000831fa CPUTIMER_init +0 00083a0d CPUTimer_setEmulationMode +0 000827a0 Device_bootCPU2 +0 0008276f Device_configureTMXAnalogTrim +0 0008261d Device_enableAllPeripherals +0 00082759 Device_enableUnbondedGPIOPullups +0 0008273c Device_enableUnbondedGPIOPullupsFor100Pin +0 00082729 Device_enableUnbondedGPIOPullupsFor176Pin +0 000825c8 Device_init +0 00082708 Device_initGPIO +1 0000aec6 Example_Fail +1 0000aec4 Example_PassCount +1 0000aec2 Example_Result +0 0008292b Example_done +0 00082926 Example_setResultFail +0 00082921 Example_setResultPass +0 00008000 Flash_initModule +0 0008321d GPIO_init +0 000836bf GPIO_setControllerCore +0 0008379b GPIO_setDirectionMode +0 0008348a GPIO_setPadConfig +0 000836f6 GPIO_setPinConfig +0 0008372d GPIO_setQualificationMode +0 00083234 INTERRUPT_init +0 000839e3 Interrupt_defaultHandler +0 00083764 Interrupt_enable +0 00083aee Interrupt_illegalOperationHandler +0 00083682 Interrupt_initModule +0 00083901 Interrupt_initVectorTable +0 00083af8 Interrupt_nmiHandler +0 00083220 LED_Blue_init +0 000831f4 PinMux_init +0 00086128 RamfuncsLoadEnd +abs 00000128 RamfuncsLoadSize +0 00086000 RamfuncsLoadStart +0 00008128 RamfuncsRunEnd +abs 00000128 RamfuncsRunSize +0 00008000 RamfuncsRunStart +0 000835bb SCI_clearInterruptStatus +0 00083600 SCI_enableInterrupt +0 00083644 SCI_setConfig +0 00082e93 SFRA_F32_config +0 00082e69 SFRA_F32_initFreqArrayWithLogSteps +0 00082e40 SFRA_F32_reset +0 00082d37 SFRA_F32_resetFreqRespArray +0 00082b35 SFRA_F32_runBackgroundTask +0 00082d2f SFRA_F32_updateInjectionAmplitude +1 0000ade2 SFRA_GUI_arrayGetList +1 0000ae02 SFRA_GUI_cmdDispatcher +0 00082350 SFRA_GUI_cmdInterpreter +1 0000ad78 SFRA_GUI_cmdPacket +1 0000adc0 SFRA_GUI_commsOKflg +0 00082143 SFRA_GUI_config +1 0000adc9 SFRA_GUI_dataOut16 +1 0000add6 SFRA_GUI_dataOut32 +1 0000ae22 SFRA_GUI_dataSetList +1 0000adcb SFRA_GUI_delayer +0 000822ab SFRA_GUI_echoCmdByte +0 0008231f SFRA_GUI_echoDataByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000823e2 SFRA_GUI_getArray +0 00082269 SFRA_GUI_getCmdByte +0 000823e5 SFRA_GUI_getData +0 000822ff SFRA_GUI_getDataByte +0 000822c5 SFRA_GUI_getSizeByte +0 000823df SFRA_GUI_getVariable +1 0000adcf SFRA_GUI_led_flag +1 0000add0 SFRA_GUI_led_gpio +0 00082370 SFRA_GUI_lifePulseTsk +1 0000adc2 SFRA_GUI_lowByteFlag +1 0000add8 SFRA_GUI_memDataPtr16 +1 0000adda SFRA_GUI_memDataPtr32 +1 0000addc SFRA_GUI_memGetAddress +1 0000adcd SFRA_GUI_memGetAmount +1 0000adcc SFRA_GUI_memGetPtr +1 0000adce SFRA_GUI_memSetPtr +1 0000adde SFRA_GUI_memSetValue +1 0000adc7 SFRA_GUI_numWords +0 00082332 SFRA_GUI_packWord +1 0000add2 SFRA_GUI_rcvTaskPointer +1 0000adca SFRA_GUI_rcvTskPtrShdw +0 00082255 SFRA_GUI_runSerialHostComms +1 0000adc4 SFRA_GUI_rxChar +1 0000adc5 SFRA_GUI_rxWord +1 0000add4 SFRA_GUI_sci_base_addr +0 00082448 SFRA_GUI_sendData +1 0000adc3 SFRA_GUI_sendTaskPtr +1 0000adc1 SFRA_GUI_serialCommsTimer +0 000823b9 SFRA_GUI_setButton +0 00082414 SFRA_GUI_setData32 +0 000823cc SFRA_GUI_setSlider +0 000823a6 SFRA_GUI_setText +0 00082443 SFRA_GUI_spareTsk08 +1 0000add1 SFRA_GUI_sweep_start +1 0000adc6 SFRA_GUI_taskDoneFlag +1 0000ade0 SFRA_GUI_temp +1 0000ae42 SFRA_GUI_varGetList +1 0000ae62 SFRA_GUI_varSetBtnList +1 0000ae82 SFRA_GUI_varSetSldrList +1 0000aea2 SFRA_GUI_varSetTxtList +1 0000adc8 SFRA_GUI_wordsLeftToGet +0 00008124 SysCtl_delay +0 000834dc SysCtl_getClock +0 00083359 SysCtl_getDeviceParametric +0 00083954 SysCtl_getLowSpeedClock +0 0008352d SysCtl_selectOscSource +0 00083241 SysCtl_selectXTAL +0 0008292c SysCtl_setClock +0 00083575 TIMER0_ISR +1 00000014 _SFRA_F32_amplitude +1 00000022 _SFRA_F32_angle +1 0000001e _SFRA_F32_count +1 0000001a _SFRA_F32_pointer +1 00000010 _SFRA_F32_pointerStart +1 0000001c _SFRA_F32_preCount +1 00000006 _SFRA_F32_rCosSum +1 00000004 _SFRA_F32_rSinSum +1 00000012 _SFRA_F32_reference +1 00000016 _SFRA_F32_scalar +1 00000002 _SFRA_F32_state +1 00000003 _SFRA_F32_stateSlew +1 00000018 _SFRA_F32_step +1 0000000a _SFRA_F32_uCosSum +1 00000008 _SFRA_F32_uSinSum +1 00000020 _SFRA_F32_windowSamples +1 0000000e _SFRA_F32_yCosSum +1 0000000c _SFRA_F32_ySinSum +0 000833c1 __SFRA_F32_collect +0 0008389c __SFRA_F32_inject +0 00083b5c __TI_CINIT_Base +0 00083b68 __TI_CINIT_Limit +0 00083b68 __TI_CINIT_Warm +0 00083b4e __TI_Handler_Table_Base +0 00083b54 __TI_Handler_Table_Limit +1 00000500 __TI_STACK_END +abs 00000100 __TI_STACK_SIZE +0 000837fa __TI_auto_init_nobinit_nopinit +1 0000aeca __TI_cleanup_ptr +0 000837cc __TI_decompress_lzss +0 00083b1c __TI_decompress_none +1 0000aecc __TI_dtors_ptr +1 0000aec8 __TI_enable_exit_profile_output +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +0 00083b32 __TI_zero_init +0 000832d1 __c28xabi_divf +abs ffffffff __c_args__ +0 0008291a __error__ +1 00000400 __stack +0 00083a69 _args_main +0 000839cc _c_int00 +1 0000aece _lock +0 00083b13 _nop +0 00083b0f _register_lock +0 00083b0b _register_unlock +0 00083b3a _system_post_cinit +0 00083b38 _system_pre_init +1 0000aed0 _unlock +0 00083825 abort +1 0000a800 clMagVect +1 0000a8c8 clPhaseVect +0 00080000 code_start +1 0000aed4 errno +0 00083827 exit +1 0000a990 freqVect +0 00083033 logf +1 0000ad80 lowPass_test +0 00083a57 main +0 000838c2 memcpy +0 00083b2b memset +0 000831fd myCPUTIMER0_init +1 0000aa58 olMagVect +1 0000ab20 olPhaseVect +1 0000abe8 plantMagVect +1 0000acb0 plantPhaseVect +1 0000ad8a sfra1 +0 00082fb0 sfra_init +0 00083026 sfra_task_run +0 00083428 tanf + + +GLOBAL SYMBOLS: SORTED BY Symbol Address + +page address name +---- ------- ---- +0 00008000 Flash_initModule +0 00008000 RamfuncsRunStart +0 00008124 SysCtl_delay +0 00008128 RamfuncsRunEnd +0 00080000 code_start +0 00082143 SFRA_GUI_config +0 00082255 SFRA_GUI_runSerialHostComms +0 00082269 SFRA_GUI_getCmdByte +0 000822ab SFRA_GUI_echoCmdByte +0 000822c5 SFRA_GUI_getSizeByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000822ff SFRA_GUI_getDataByte +0 0008231f SFRA_GUI_echoDataByte +0 00082332 SFRA_GUI_packWord +0 00082350 SFRA_GUI_cmdInterpreter +0 00082370 SFRA_GUI_lifePulseTsk +0 000823a6 SFRA_GUI_setText +0 000823b9 SFRA_GUI_setButton +0 000823cc SFRA_GUI_setSlider +0 000823df SFRA_GUI_getVariable +0 000823e2 SFRA_GUI_getArray +0 000823e5 SFRA_GUI_getData +0 00082414 SFRA_GUI_setData32 +0 00082443 SFRA_GUI_spareTsk08 +0 00082448 SFRA_GUI_sendData +0 000825c8 Device_init +0 0008261d Device_enableAllPeripherals +0 00082708 Device_initGPIO +0 00082729 Device_enableUnbondedGPIOPullupsFor176Pin +0 0008273c Device_enableUnbondedGPIOPullupsFor100Pin +0 00082759 Device_enableUnbondedGPIOPullups +0 0008276f Device_configureTMXAnalogTrim +0 000827a0 Device_bootCPU2 +0 0008291a __error__ +0 00082921 Example_setResultPass +0 00082926 Example_setResultFail +0 0008292b Example_done +0 0008292c SysCtl_setClock +0 00082b35 SFRA_F32_runBackgroundTask +0 00082d2f SFRA_F32_updateInjectionAmplitude +0 00082d37 SFRA_F32_resetFreqRespArray +0 00082e40 SFRA_F32_reset +0 00082e69 SFRA_F32_initFreqArrayWithLogSteps +0 00082e93 SFRA_F32_config +0 00082fb0 sfra_init +0 00083026 sfra_task_run +0 00083033 logf +0 000831e9 Board_init +0 000831f4 PinMux_init +0 000831fa CPUTIMER_init +0 000831fd myCPUTIMER0_init +0 0008321d GPIO_init +0 00083220 LED_Blue_init +0 00083234 INTERRUPT_init +0 00083241 SysCtl_selectXTAL +0 000832d1 __c28xabi_divf +0 00083359 SysCtl_getDeviceParametric +0 000833c1 __SFRA_F32_collect +0 00083428 tanf +0 0008348a GPIO_setPadConfig +0 000834dc SysCtl_getClock +0 0008352d SysCtl_selectOscSource +0 00083575 TIMER0_ISR +0 000835bb SCI_clearInterruptStatus +0 00083600 SCI_enableInterrupt +0 00083644 SCI_setConfig +0 00083682 Interrupt_initModule +0 000836bf GPIO_setControllerCore +0 000836f6 GPIO_setPinConfig +0 0008372d GPIO_setQualificationMode +0 00083764 Interrupt_enable +0 0008379b GPIO_setDirectionMode +0 000837cc __TI_decompress_lzss +0 000837fa __TI_auto_init_nobinit_nopinit +0 00083825 C$$EXIT +0 00083825 abort +0 00083827 exit +0 0008389c __SFRA_F32_inject +0 000838c2 memcpy +0 00083901 Interrupt_initVectorTable +0 00083954 SysCtl_getLowSpeedClock +0 000839cc _c_int00 +0 000839e3 Interrupt_defaultHandler +0 00083a0d CPUTimer_setEmulationMode +0 00083a57 main +0 00083a69 _args_main +0 00083aee Interrupt_illegalOperationHandler +0 00083af8 Interrupt_nmiHandler +0 00083b0b _register_unlock +0 00083b0f _register_lock +0 00083b13 _nop +0 00083b1c __TI_decompress_none +0 00083b2b memset +0 00083b32 __TI_zero_init +0 00083b38 _system_pre_init +0 00083b3a _system_post_cinit +0 00083b4e __TI_Handler_Table_Base +0 00083b54 __TI_Handler_Table_Limit +0 00083b5c __TI_CINIT_Base +0 00083b68 __TI_CINIT_Limit +0 00083b68 __TI_CINIT_Warm +0 00086000 RamfuncsLoadStart +0 00086128 RamfuncsLoadEnd +1 00000002 _SFRA_F32_state +1 00000003 _SFRA_F32_stateSlew +1 00000004 _SFRA_F32_rSinSum +1 00000006 _SFRA_F32_rCosSum +1 00000008 _SFRA_F32_uSinSum +1 0000000a _SFRA_F32_uCosSum +1 0000000c _SFRA_F32_ySinSum +1 0000000e _SFRA_F32_yCosSum +1 00000010 _SFRA_F32_pointerStart +1 00000012 _SFRA_F32_reference +1 00000014 _SFRA_F32_amplitude +1 00000016 _SFRA_F32_scalar +1 00000018 _SFRA_F32_step +1 0000001a _SFRA_F32_pointer +1 0000001c _SFRA_F32_preCount +1 0000001e _SFRA_F32_count +1 00000020 _SFRA_F32_windowSamples +1 00000022 _SFRA_F32_angle +1 00000400 __stack +1 00000500 __TI_STACK_END +1 0000a800 clMagVect +1 0000a8c8 clPhaseVect +1 0000a990 freqVect +1 0000aa58 olMagVect +1 0000ab20 olPhaseVect +1 0000abe8 plantMagVect +1 0000acb0 plantPhaseVect +1 0000ad78 SFRA_GUI_cmdPacket +1 0000ad80 lowPass_test +1 0000ad8a sfra1 +1 0000adc0 SFRA_GUI_commsOKflg +1 0000adc1 SFRA_GUI_serialCommsTimer +1 0000adc2 SFRA_GUI_lowByteFlag +1 0000adc3 SFRA_GUI_sendTaskPtr +1 0000adc4 SFRA_GUI_rxChar +1 0000adc5 SFRA_GUI_rxWord +1 0000adc6 SFRA_GUI_taskDoneFlag +1 0000adc7 SFRA_GUI_numWords +1 0000adc8 SFRA_GUI_wordsLeftToGet +1 0000adc9 SFRA_GUI_dataOut16 +1 0000adca SFRA_GUI_rcvTskPtrShdw +1 0000adcb SFRA_GUI_delayer +1 0000adcc SFRA_GUI_memGetPtr +1 0000adcd SFRA_GUI_memGetAmount +1 0000adce SFRA_GUI_memSetPtr +1 0000adcf SFRA_GUI_led_flag +1 0000add0 SFRA_GUI_led_gpio +1 0000add1 SFRA_GUI_sweep_start +1 0000add2 SFRA_GUI_rcvTaskPointer +1 0000add4 SFRA_GUI_sci_base_addr +1 0000add6 SFRA_GUI_dataOut32 +1 0000add8 SFRA_GUI_memDataPtr16 +1 0000adda SFRA_GUI_memDataPtr32 +1 0000addc SFRA_GUI_memGetAddress +1 0000adde SFRA_GUI_memSetValue +1 0000ade0 SFRA_GUI_temp +1 0000ade2 SFRA_GUI_arrayGetList +1 0000ae02 SFRA_GUI_cmdDispatcher +1 0000ae22 SFRA_GUI_dataSetList +1 0000ae42 SFRA_GUI_varGetList +1 0000ae62 SFRA_GUI_varSetBtnList +1 0000ae82 SFRA_GUI_varSetSldrList +1 0000aea2 SFRA_GUI_varSetTxtList +1 0000aec2 Example_Result +1 0000aec4 Example_PassCount +1 0000aec6 Example_Fail +1 0000aec8 __TI_enable_exit_profile_output +1 0000aeca __TI_cleanup_ptr +1 0000aecc __TI_dtors_ptr +1 0000aece _lock +1 0000aed0 _unlock +1 0000aed4 errno +abs 00000100 __TI_STACK_SIZE +abs 00000128 RamfuncsLoadSize +abs 00000128 RamfuncsRunSize +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +abs ffffffff __c_args__ + +[182 symbols] diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d.out b/28379d_P_SFRA/CPU1_FLASH/28379d.out new file mode 100644 index 0000000000000000000000000000000000000000..461985e0f55be3787968e41636eff5cba93d8895 GIT binary patch literal 120388 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

O}Mr{^XNiMfqe4g}!`PJ`E<%rv#Z2(;zQW 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 Dw$D7D literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.map b/28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.map new file mode 100644 index 0000000..0f7700d --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.map @@ -0,0 +1,729 @@ +****************************************************************************** + TMS320C2000 Linker PC v25.11.0 +****************************************************************************** +>> Linked Thu Jun 4 00:14:01 2026 + +OUTPUT FILE NAME: <28379d_P_SFRA.out> +ENTRY POINT SYMBOL: "code_start" address: 00080000 + + +MEMORY CONFIGURATION + + name origin length used unused attr fill +---------------------- -------- --------- -------- -------- ---- -------- +PAGE 0: + RAMM0 00000123 000002dd 00000000 000002dd RWIX + RAMLS0 00008000 00000800 00000128 000006d8 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 00000000 00000800 RWIX + RAMGS14 0001a000 00001000 00000000 00001000 RWIX + RAMGS15 0001b000 00000ff8 00000000 00000ff8 RWIX + BEGIN 00080000 00000002 00000002 00000000 RWIX + FLASHA 00080002 00001ffe 00000000 00001ffe RWIX + FLASHB 00082000 00002000 00001ddf 00000221 RWIX + FLASHC 00084000 00002000 00000020 00001fe0 RWIX + FLASHD 00086000 00002000 00000128 00001ed8 RWIX + FLASHE 00088000 00008000 00000000 00008000 RWIX + FLASHF 00090000 00008000 000004ad 00007b53 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 00000701 000000ff 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 + CPU2TOCPU1RAM 0003f800 00000400 00000000 00000400 RWIX + CPU1TOCPU2RAM 0003fc00 00000400 00000000 00000400 RWIX + + +SECTION ALLOCATION MAP + + output attributes/ +section page origin length input sections +-------- ---- ---------- ---------- ---------------- +codestart +* 0 00080000 00000002 + 00080000 00000002 F2837xD_CodeStartBranch.obj (codestart) + +.cinit 0 00084000 00000020 + 00084000 0000000e (.cinit..data.load) [load image, compression = lzss] + 0008400e 00000006 (__TI_handler_table) + 00084014 00000004 (.cinit..bss.load) [load image, compression = zero_init] + 00084018 00000008 (__TI_cinit_table) + +.stack 1 00000400 00000100 UNINITIALIZED + 00000400 00000100 --HOLE-- + +.reset 0 003fffc0 00000000 DSECT + +.init_array +* 0 00082000 00000000 UNINITIALIZED + +.bss 1 0000a836 000006cc UNINITIALIZED + 0000a836 000000c8 sfra_test.obj (.bss:clMagVect) + 0000a8fe 000000c8 sfra_test.obj (.bss:clPhaseVect) + 0000a9c6 000000c8 sfra_test.obj (.bss:freqVect) + 0000aa8e 000000c8 sfra_test.obj (.bss:olMagVect) + 0000ab56 000000c8 sfra_test.obj (.bss:olPhaseVect) + 0000ac1e 000000c8 sfra_test.obj (.bss:plantMagVect) + 0000ace6 000000c8 sfra_test.obj (.bss:plantPhaseVect) + 0000adae 00000006 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdPacket) + 0000adb4 0000000c --HOLE-- + 0000adc0 0000002a sfra_test.obj (.bss) + 0000adea 00000016 --HOLE-- + 0000ae00 00000022 sfra_gui_scicomms_driverlib.obj (.bss) + 0000ae22 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_arrayGetList) + 0000ae42 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdDispatcher) + 0000ae62 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_dataSetList) + 0000ae82 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varGetList) + 0000aea2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetBtnList) + 0000aec2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetSldrList) + 0000aee2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetTxtList) + +.data 1 0000a800 00000035 UNINITIALIZED + 0000a800 00000022 sfra_f32.obj (.data) + 0000a822 00000006 device.obj (.data) + 0000a828 00000006 rts2800_fpu32_eabi.lib : exit.c.obj (.data) + 0000a82e 00000002 : _lock.c.obj (.data:_lock) + 0000a830 00000002 : _lock.c.obj (.data:_unlock) + 0000a832 00000002 sfra_test.obj (.data) + 0000a834 00000001 rts2800_fpu32_eabi.lib : errno.c.obj (.data) + +.const 0 00090000 000004ad + 00090000 000000c2 driverlib_eabi.lib : sysctl.obj (.const:.string) + 000900c2 000000bf : flash.obj (.const:.string) + 00090181 00000001 --HOLE-- [fill = 0] + 00090182 000000bc : gpio.obj (.const:.string) + 0009023e 000000bb : sci.obj (.const:.string) + 000902f9 00000001 --HOLE-- [fill = 0] + 000902fa 0000007f board.obj (.const:.string) + 00090379 00000001 --HOLE-- [fill = 0] + 0009037a 0000007b sfra_gui_scicomms_driverlib.obj (.const:.string) + 000903f5 00000001 --HOLE-- [fill = 0] + 000903f6 00000062 driverlib_eabi.lib : cputimer.obj (.const:.string) + 00090458 00000042 sfra_test.obj (.const:.string) + 0009049a 00000013 device.obj (.const:.string) + +.TI.ramfunc +* 0 00086000 00000128 RUN ADDR = 00008000 + 00086000 00000043 driverlib_eabi.lib : flash.obj (.TI.ramfunc:Flash_initModule) + 00086043 0000002c : flash.obj (.TI.ramfunc:Flash_setBankPowerMode) + 0008606f 00000024 : flash.obj (.TI.ramfunc:Flash_setWaitstates) + 00086093 0000001d : flash.obj (.TI.ramfunc:Flash_setPumpPowerMode) + 000860b0 00000018 : flash.obj (.TI.ramfunc:Flash_disableCache) + 000860c8 00000018 : flash.obj (.TI.ramfunc:Flash_disablePrefetch) + 000860e0 00000017 : flash.obj (.TI.ramfunc:Flash_enableCache) + 000860f7 00000017 : flash.obj (.TI.ramfunc:Flash_enablePrefetch) + 0008610e 00000016 : flash.obj (.TI.ramfunc:Flash_enableECC) + 00086124 00000004 : sysctl.obj (.TI.ramfunc) + +GETBUFFER +* 0 0003f800 00000000 DSECT + +GETWRITEIDX +* 0 0003f800 00000000 DSECT + +PUTREADIDX +* 0 0003f800 00000000 DSECT + +.text 0 00082000 00001ddf + 00082000 0000058e sfra_f32.obj (.text) + 0008258e 0000052e sfra_gui_scicomms_driverlib.obj (.text) + 00082abc 000003fc device.obj (.text) + 00082eb8 0000020c board.obj (.text) + 000830c4 00000209 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_setClock) + 000832cd 00000143 sfra_test.obj (.text) + 00083410 000000d8 rts2800_fpu32_eabi.lib : e_log10f.c.obj (.text) + 000834e8 00000090 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_selectXTAL) + 00083578 00000088 rts2800_fpu32_eabi.lib : fs_div28.asm.obj (.text) + 00083600 00000068 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getDeviceParametric) + 00083668 00000062 rts2800_fpu32_eabi.lib : s_tanf.c.obj (.text) + 000836ca 00000058 : s_ceilf.c.obj (.text) + 00083722 00000052 driverlib_eabi.lib : gpio.obj (.text:GPIO_setPadConfig) + 00083774 00000051 : sysctl.obj (.text:SysCtl_getClock) + 000837c5 00000048 : sysctl.obj (.text:SysCtl_selectOscSource) + 0008380d 00000046 sfra_test.obj (.text:retain) + 00083853 00000045 driverlib_eabi.lib : sci.obj (.text:SCI_clearInterruptStatus) + 00083898 00000044 : sci.obj (.text:SCI_enableInterrupt) + 000838dc 0000003e : sci.obj (.text:SCI_setConfig) + 0008391a 0000003d : interrupt.obj (.text:Interrupt_initModule) + 00083957 00000037 : gpio.obj (.text:GPIO_setControllerCore) + 0008398e 00000037 : gpio.obj (.text:GPIO_setPinConfig) + 000839c5 00000037 : gpio.obj (.text:GPIO_setQualificationMode) + 000839fc 00000037 : interrupt.obj (.text:Interrupt_enable) + 00083a33 00000031 : gpio.obj (.text:GPIO_setDirectionMode) + 00083a64 0000002e rts2800_fpu32_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss) + 00083a92 0000002b : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit) + 00083abd 00000029 : exit.c.obj (.text) + 00083ae6 00000028 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_selectClockSource) + 00083b0e 00000026 : flash.obj (.text:Flash_setBankPowerUpDelay) + 00083b34 00000020 rts2800_fpu32_eabi.lib : memcpy.c.obj (.text) + 00083b54 0000001f driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_getTimerOverflowStatus) + 00083b73 0000001e : interrupt.obj (.text:Interrupt_initVectorTable) + 00083b91 0000001c sfra_test.obj (.text:__relaxed_atan2f) + 00083bad 0000001b driverlib_eabi.lib : sci.obj (.text:SCI_isBaseValid) + 00083bc8 0000001a : sysctl.obj (.text:CPUTimer_startTimer) + 00083be2 0000001a : sysctl.obj (.text:SysCtl_getLowSpeedClock) + 00083bfc 00000018 : sci.obj (.text:SCI_disableModule) + 00083c14 00000018 : sci.obj (.text:SCI_performSoftwareReset) + 00083c2c 00000017 : cputimer.obj (.text:CPUTimer_isBaseValid) + 00083c43 00000017 : sysctl.obj (.text:CPUTimer_isBaseValid) + 00083c5a 00000017 rts2800_fpu32_eabi.lib : boot28.asm.obj (.text) + 00083c71 00000016 driverlib_eabi.lib : interrupt.obj (.text:Interrupt_defaultHandler) + 00083c87 00000014 : sysctl.obj (.text:CPUTimer_stopTimer) + 00083c9b 00000013 : cputimer.obj (.text:CPUTimer_setEmulationMode) + 00083cae 00000013 : sci.obj (.text:SCI_enableModule) + 00083cc1 00000012 : sysctl.obj (.text:CPUTimer_clearOverflowFlag) + 00083cd3 00000012 : sysctl.obj (.text:CPUTimer_disableInterrupt) + 00083ce5 00000012 main.obj (.text) + 00083cf7 00000012 rts2800_fpu32_eabi.lib : args_main.c.obj (.text) + 00083d09 00000011 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_setPeriod) + 00083d1a 00000010 : flash.obj (.text:Flash_isCtrlBaseValid) + 00083d2a 00000010 : flash.obj (.text:Flash_isECCBaseValid) + 00083d3a 0000000f : sysctl.obj (.text:SysCtl_pollCpuTimer) + 00083d49 0000000e : gpio.obj (.text:GPIO_isPinValid) + 00083d57 0000000d : interrupt.obj (.text:Interrupt_disableGlobal) + 00083d64 0000000d : interrupt.obj (.text:Interrupt_enableGlobal) + 00083d71 0000000b : sysctl.obj (.text:SysCtl_isMCDClockFailureDetected) + 00083d7c 0000000b sfra_test.obj (.text:__relaxed_cosf) + 00083d87 0000000b sfra_test.obj (.text:__relaxed_sinf) + 00083d92 0000000a driverlib_eabi.lib : interrupt.obj (.text:Interrupt_illegalOperationHandler) + 00083d9c 0000000a : interrupt.obj (.text:Interrupt_nmiHandler) + 00083da6 00000009 : sysctl.obj (.text:SysCtl_serviceWatchdog) + 00083daf 00000009 rts2800_fpu32_eabi.lib : _lock.c.obj (.text) + 00083db8 00000008 F2837xD_CodeStartBranch.obj (.text) + 00083dc0 00000008 rts2800_fpu32_eabi.lib : copy_decompress_none.c.obj (.text:decompress:none) + 00083dc8 00000007 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_resetMCD) + 00083dcf 00000007 rts2800_fpu32_eabi.lib : memset.c.obj (.text) + 00083dd6 00000006 : copy_zero_init.c.obj (.text:decompress:ZI) + 00083ddc 00000002 : pre_init.c.obj (.text) + 00083dde 00000001 : startup.c.obj (.text) + +MODULE SUMMARY + + Module code ro data rw data + ------ ---- ------- ------- + .\ + sfra_test.obj 443 66 1444 + main.obj 18 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 461 66 1444 + + .\SFRA\ + sfra_gui_scicomms_driverlib.obj 1326 123 264 + sfra_f32.obj 1422 0 34 + +--+---------------------------------+------+---------+---------+ + Total: 2748 123 298 + + .\device\ + device.obj 1020 19 6 + F2837xD_CodeStartBranch.obj 10 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1030 19 6 + + .\syscfg\ + board.obj 524 127 0 + +--+---------------------------------+------+---------+---------+ + Total: 524 127 0 + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_eabi.lib + sysctl.obj 1191 194 0 + flash.obj 654 191 0 + gpio.obj 310 188 0 + sci.obj 293 187 0 + interrupt.obj 214 0 0 + cputimer.obj 42 98 0 + +--+---------------------------------+------+---------+---------+ + Total: 2704 858 0 + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\rts2800_fpu32_eabi.lib + e_log10f.c.obj 216 0 0 + fs_div28.asm.obj 136 0 0 + s_tanf.c.obj 98 0 0 + s_ceilf.c.obj 88 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 + memset.c.obj 7 0 0 + copy_zero_init.c.obj 6 0 0 + pre_init.c.obj 2 0 0 + errno.c.obj 0 0 1 + startup.c.obj 1 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 774 0 11 + + Stack: 0 0 256 + Linker Generated: 0 32 0 + +--+---------------------------------+------+---------+---------+ + Grand Total: 8241 1225 2015 + + +LINKER GENERATED COPY TABLES + +__TI_cinit_table @ 00084018 records: 2, size/record: 4, table size: 8 + .data: load addr=00084000, load size=0000000e bytes, run addr=0000a800, run size=00000035 bytes, compression=lzss + .bss: load addr=00084014, load size=00000004 bytes, run addr=0000a836, run size=000006cc bytes, compression=zero_init + + +LINKER GENERATED HANDLER TABLE + +__TI_handler_table @ 0008400e records: 3, size/record: 2, table size: 6 + index: 0, handler: __TI_zero_init + index: 1, handler: __TI_decompress_lzss + index: 2, handler: __TI_decompress_none + + +GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE + +address data page name +-------- ---------------- ---- +00000400 10 (00000400) __stack + +0000a822 2a0 (0000a800) Example_Result +0000a824 2a0 (0000a800) Example_PassCount +0000a826 2a0 (0000a800) Example_Fail +0000a828 2a0 (0000a800) __TI_enable_exit_profile_output +0000a82a 2a0 (0000a800) __TI_cleanup_ptr +0000a82c 2a0 (0000a800) __TI_dtors_ptr +0000a82e 2a0 (0000a800) _lock +0000a830 2a0 (0000a800) _unlock +0000a834 2a0 (0000a800) errno +0000a836 2a0 (0000a800) clMagVect + +0000a8fe 2a3 (0000a8c0) clPhaseVect + +0000a9c6 2a7 (0000a9c0) freqVect + +0000aa8e 2aa (0000aa80) olMagVect + +0000ab56 2ad (0000ab40) olPhaseVect + +0000ac1e 2b0 (0000ac00) plantMagVect + +0000ace6 2b3 (0000acc0) plantPhaseVect + +0000adae 2b6 (0000ad80) SFRA_GUI_cmdPacket + +0000adc0 2b7 (0000adc0) lowPass_test +0000adca 2b7 (0000adc0) ti_sfra + +0000ae00 2b8 (0000ae00) SFRA_GUI_commsOKflg +0000ae01 2b8 (0000ae00) SFRA_GUI_serialCommsTimer +0000ae02 2b8 (0000ae00) SFRA_GUI_lowByteFlag +0000ae03 2b8 (0000ae00) SFRA_GUI_sendTaskPtr +0000ae04 2b8 (0000ae00) SFRA_GUI_rxChar +0000ae05 2b8 (0000ae00) SFRA_GUI_rxWord +0000ae06 2b8 (0000ae00) SFRA_GUI_taskDoneFlag +0000ae07 2b8 (0000ae00) SFRA_GUI_numWords +0000ae08 2b8 (0000ae00) SFRA_GUI_wordsLeftToGet +0000ae09 2b8 (0000ae00) SFRA_GUI_dataOut16 +0000ae0a 2b8 (0000ae00) SFRA_GUI_rcvTskPtrShdw +0000ae0b 2b8 (0000ae00) SFRA_GUI_delayer +0000ae0c 2b8 (0000ae00) SFRA_GUI_memGetPtr +0000ae0d 2b8 (0000ae00) SFRA_GUI_memGetAmount +0000ae0e 2b8 (0000ae00) SFRA_GUI_memSetPtr +0000ae0f 2b8 (0000ae00) SFRA_GUI_led_flag +0000ae10 2b8 (0000ae00) SFRA_GUI_led_gpio +0000ae11 2b8 (0000ae00) SFRA_GUI_sweep_start +0000ae12 2b8 (0000ae00) SFRA_GUI_rcvTaskPointer +0000ae14 2b8 (0000ae00) SFRA_GUI_sci_base_addr +0000ae16 2b8 (0000ae00) SFRA_GUI_dataOut32 +0000ae18 2b8 (0000ae00) SFRA_GUI_memDataPtr16 +0000ae1a 2b8 (0000ae00) SFRA_GUI_memDataPtr32 +0000ae1c 2b8 (0000ae00) SFRA_GUI_memGetAddress +0000ae1e 2b8 (0000ae00) SFRA_GUI_memSetValue +0000ae20 2b8 (0000ae00) SFRA_GUI_temp +0000ae22 2b8 (0000ae00) SFRA_GUI_arrayGetList + +0000ae42 2b9 (0000ae40) SFRA_GUI_cmdDispatcher +0000ae62 2b9 (0000ae40) SFRA_GUI_dataSetList + +0000ae82 2ba (0000ae80) SFRA_GUI_varGetList +0000aea2 2ba (0000ae80) SFRA_GUI_varSetBtnList + +0000aec2 2bb (0000aec0) SFRA_GUI_varSetSldrList +0000aee2 2bb (0000aec0) SFRA_GUI_varSetTxtList + + +GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name + +page address name +---- ------- ---- +0 00083012 Board_init +0 00083abd C$$EXIT +0 00083043 CPUTIMER_init +0 00083c9b CPUTimer_setEmulationMode +0 00082d2c Device_bootCPU2 +0 00082cfb Device_configureTMXAnalogTrim +0 00082ba9 Device_enableAllPeripherals +0 00082ce5 Device_enableUnbondedGPIOPullups +0 00082cc8 Device_enableUnbondedGPIOPullupsFor100Pin +0 00082cb5 Device_enableUnbondedGPIOPullupsFor176Pin +0 00082b56 Device_init +0 00082c94 Device_initGPIO +1 0000a826 Example_Fail +1 0000a824 Example_PassCount +1 0000a822 Example_Result +0 00082eb7 Example_done +0 00082eb2 Example_setResultFail +0 00082ead Example_setResultPass +0 00008000 Flash_initModule +0 00083066 GPIO_init +0 00083957 GPIO_setControllerCore +0 00083a33 GPIO_setDirectionMode +0 00083722 GPIO_setPadConfig +0 0008398e GPIO_setPinConfig +0 000839c5 GPIO_setQualificationMode +0 0008307d INTERRUPT_init +0 00083c71 Interrupt_defaultHandler +0 000839fc Interrupt_enable +0 00083d92 Interrupt_illegalOperationHandler +0 0008391a Interrupt_initModule +0 00083b73 Interrupt_initVectorTable +0 00083d9c Interrupt_nmiHandler +0 00083069 LED_Blue_init +0 0008301f PinMux_init +0 00086128 RamfuncsLoadEnd +abs 00000128 RamfuncsLoadSize +0 00086000 RamfuncsLoadStart +0 00008128 RamfuncsRunEnd +abs 00000128 RamfuncsRunSize +0 00008000 RamfuncsRunStart +0 00083853 SCI_clearInterruptStatus +0 00083898 SCI_enableInterrupt +0 0008308a SCI_init +0 000838dc SCI_setConfig +0 00082153 SFRA_F32_config +0 000821da SFRA_F32_initFreqArrayWithLogSteps +0 0008210f SFRA_F32_reset +0 0008221e SFRA_F32_resetFreqRespArray +0 00082340 SFRA_F32_runBackgroundTask +0 00082292 SFRA_F32_updateInjectionAmplitude +1 0000ae22 SFRA_GUI_arrayGetList +1 0000ae42 SFRA_GUI_cmdDispatcher +0 000828de SFRA_GUI_cmdInterpreter +1 0000adae SFRA_GUI_cmdPacket +1 0000ae00 SFRA_GUI_commsOKflg +0 000826d1 SFRA_GUI_config +1 0000ae09 SFRA_GUI_dataOut16 +1 0000ae16 SFRA_GUI_dataOut32 +1 0000ae62 SFRA_GUI_dataSetList +1 0000ae0b SFRA_GUI_delayer +0 00082839 SFRA_GUI_echoCmdByte +0 000828ad SFRA_GUI_echoDataByte +0 00082873 SFRA_GUI_echoSizeByte +0 00082970 SFRA_GUI_getArray +0 000827f7 SFRA_GUI_getCmdByte +0 00082973 SFRA_GUI_getData +0 0008288d SFRA_GUI_getDataByte +0 00082853 SFRA_GUI_getSizeByte +0 0008296d SFRA_GUI_getVariable +1 0000ae0f SFRA_GUI_led_flag +1 0000ae10 SFRA_GUI_led_gpio +0 000828fe SFRA_GUI_lifePulseTsk +1 0000ae02 SFRA_GUI_lowByteFlag +1 0000ae18 SFRA_GUI_memDataPtr16 +1 0000ae1a SFRA_GUI_memDataPtr32 +1 0000ae1c SFRA_GUI_memGetAddress +1 0000ae0d SFRA_GUI_memGetAmount +1 0000ae0c SFRA_GUI_memGetPtr +1 0000ae0e SFRA_GUI_memSetPtr +1 0000ae1e SFRA_GUI_memSetValue +1 0000ae07 SFRA_GUI_numWords +0 000828c0 SFRA_GUI_packWord +1 0000ae12 SFRA_GUI_rcvTaskPointer +1 0000ae0a SFRA_GUI_rcvTskPtrShdw +0 000827e3 SFRA_GUI_runSerialHostComms +1 0000ae04 SFRA_GUI_rxChar +1 0000ae05 SFRA_GUI_rxWord +1 0000ae14 SFRA_GUI_sci_base_addr +0 000829d6 SFRA_GUI_sendData +1 0000ae03 SFRA_GUI_sendTaskPtr +1 0000ae01 SFRA_GUI_serialCommsTimer +0 00082947 SFRA_GUI_setButton +0 000829a2 SFRA_GUI_setData32 +0 0008295a SFRA_GUI_setSlider +0 00082934 SFRA_GUI_setText +0 000829d1 SFRA_GUI_spareTsk08 +1 0000ae11 SFRA_GUI_sweep_start +1 0000ae06 SFRA_GUI_taskDoneFlag +1 0000ae20 SFRA_GUI_temp +1 0000ae82 SFRA_GUI_varGetList +1 0000aea2 SFRA_GUI_varSetBtnList +1 0000aec2 SFRA_GUI_varSetSldrList +1 0000aee2 SFRA_GUI_varSetTxtList +1 0000ae08 SFRA_GUI_wordsLeftToGet +0 00008124 SysCtl_delay +0 00083774 SysCtl_getClock +0 00083600 SysCtl_getDeviceParametric +0 00083be2 SysCtl_getLowSpeedClock +0 000837c5 SysCtl_selectOscSource +0 000834e8 SysCtl_selectXTAL +0 000830c4 SysCtl_setClock +0 0008380d TIMER0_ISR +0 000822d0 __SFRA_F32_collect +0 000822a3 __SFRA_F32_inject +0 00084018 __TI_CINIT_Base +0 00084020 __TI_CINIT_Limit +0 00084020 __TI_CINIT_Warm +0 0008400e __TI_Handler_Table_Base +0 00084014 __TI_Handler_Table_Limit +1 00000500 __TI_STACK_END +abs 00000100 __TI_STACK_SIZE +0 00083a92 __TI_auto_init_nobinit_nopinit +1 0000a82a __TI_cleanup_ptr +0 00083a64 __TI_decompress_lzss +0 00083dc0 __TI_decompress_none +1 0000a82c __TI_dtors_ptr +1 0000a828 __TI_enable_exit_profile_output +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +0 00083dd6 __TI_zero_init +0 00083578 __c28xabi_divf +abs ffffffff __c_args__ +0 00082ea6 __error__ +0 00083b91 __relaxed_atan2f +0 00083d7c __relaxed_cosf +0 00083d87 __relaxed_sinf +1 00000400 __stack +0 00083cf7 _args_main +0 00083c5a _c_int00 +1 0000a82e _lock +0 00083db7 _nop +0 00083db3 _register_lock +0 00083daf _register_unlock +0 00083dde _system_post_cinit +0 00083ddc _system_pre_init +1 0000a830 _unlock +0 00083abd abort +0 000836ca ceilf +1 0000a836 clMagVect +1 0000a8fe clPhaseVect +0 00080000 code_start +1 0000a834 errno +0 00083abf exit +1 0000a9c6 freqVect +0 00083410 log10f +1 0000adc0 lowPass_test +0 00083ce5 main +0 00083b34 memcpy +0 00083dcf memset +0 00083046 myCPUTIMER0_init +0 0008308d mySCI0_init +1 0000aa8e olMagVect +1 0000ab56 olPhaseVect +1 0000ac1e plantMagVect +1 0000ace6 plantPhaseVect +0 0008338c sfra_init +0 00083402 sfra_task_run +0 00083668 tanf +1 0000adca ti_sfra + + +GLOBAL SYMBOLS: SORTED BY Symbol Address + +page address name +---- ------- ---- +0 00008000 Flash_initModule +0 00008000 RamfuncsRunStart +0 00008124 SysCtl_delay +0 00008128 RamfuncsRunEnd +0 00080000 code_start +0 0008210f SFRA_F32_reset +0 00082153 SFRA_F32_config +0 000821da SFRA_F32_initFreqArrayWithLogSteps +0 0008221e SFRA_F32_resetFreqRespArray +0 00082292 SFRA_F32_updateInjectionAmplitude +0 000822a3 __SFRA_F32_inject +0 000822d0 __SFRA_F32_collect +0 00082340 SFRA_F32_runBackgroundTask +0 000826d1 SFRA_GUI_config +0 000827e3 SFRA_GUI_runSerialHostComms +0 000827f7 SFRA_GUI_getCmdByte +0 00082839 SFRA_GUI_echoCmdByte +0 00082853 SFRA_GUI_getSizeByte +0 00082873 SFRA_GUI_echoSizeByte +0 0008288d SFRA_GUI_getDataByte +0 000828ad SFRA_GUI_echoDataByte +0 000828c0 SFRA_GUI_packWord +0 000828de SFRA_GUI_cmdInterpreter +0 000828fe SFRA_GUI_lifePulseTsk +0 00082934 SFRA_GUI_setText +0 00082947 SFRA_GUI_setButton +0 0008295a SFRA_GUI_setSlider +0 0008296d SFRA_GUI_getVariable +0 00082970 SFRA_GUI_getArray +0 00082973 SFRA_GUI_getData +0 000829a2 SFRA_GUI_setData32 +0 000829d1 SFRA_GUI_spareTsk08 +0 000829d6 SFRA_GUI_sendData +0 00082b56 Device_init +0 00082ba9 Device_enableAllPeripherals +0 00082c94 Device_initGPIO +0 00082cb5 Device_enableUnbondedGPIOPullupsFor176Pin +0 00082cc8 Device_enableUnbondedGPIOPullupsFor100Pin +0 00082ce5 Device_enableUnbondedGPIOPullups +0 00082cfb Device_configureTMXAnalogTrim +0 00082d2c Device_bootCPU2 +0 00082ea6 __error__ +0 00082ead Example_setResultPass +0 00082eb2 Example_setResultFail +0 00082eb7 Example_done +0 00083012 Board_init +0 0008301f PinMux_init +0 00083043 CPUTIMER_init +0 00083046 myCPUTIMER0_init +0 00083066 GPIO_init +0 00083069 LED_Blue_init +0 0008307d INTERRUPT_init +0 0008308a SCI_init +0 0008308d mySCI0_init +0 000830c4 SysCtl_setClock +0 0008338c sfra_init +0 00083402 sfra_task_run +0 00083410 log10f +0 000834e8 SysCtl_selectXTAL +0 00083578 __c28xabi_divf +0 00083600 SysCtl_getDeviceParametric +0 00083668 tanf +0 000836ca ceilf +0 00083722 GPIO_setPadConfig +0 00083774 SysCtl_getClock +0 000837c5 SysCtl_selectOscSource +0 0008380d TIMER0_ISR +0 00083853 SCI_clearInterruptStatus +0 00083898 SCI_enableInterrupt +0 000838dc SCI_setConfig +0 0008391a Interrupt_initModule +0 00083957 GPIO_setControllerCore +0 0008398e GPIO_setPinConfig +0 000839c5 GPIO_setQualificationMode +0 000839fc Interrupt_enable +0 00083a33 GPIO_setDirectionMode +0 00083a64 __TI_decompress_lzss +0 00083a92 __TI_auto_init_nobinit_nopinit +0 00083abd C$$EXIT +0 00083abd abort +0 00083abf exit +0 00083b34 memcpy +0 00083b73 Interrupt_initVectorTable +0 00083b91 __relaxed_atan2f +0 00083be2 SysCtl_getLowSpeedClock +0 00083c5a _c_int00 +0 00083c71 Interrupt_defaultHandler +0 00083c9b CPUTimer_setEmulationMode +0 00083ce5 main +0 00083cf7 _args_main +0 00083d7c __relaxed_cosf +0 00083d87 __relaxed_sinf +0 00083d92 Interrupt_illegalOperationHandler +0 00083d9c Interrupt_nmiHandler +0 00083daf _register_unlock +0 00083db3 _register_lock +0 00083db7 _nop +0 00083dc0 __TI_decompress_none +0 00083dcf memset +0 00083dd6 __TI_zero_init +0 00083ddc _system_pre_init +0 00083dde _system_post_cinit +0 0008400e __TI_Handler_Table_Base +0 00084014 __TI_Handler_Table_Limit +0 00084018 __TI_CINIT_Base +0 00084020 __TI_CINIT_Limit +0 00084020 __TI_CINIT_Warm +0 00086000 RamfuncsLoadStart +0 00086128 RamfuncsLoadEnd +1 00000400 __stack +1 00000500 __TI_STACK_END +1 0000a822 Example_Result +1 0000a824 Example_PassCount +1 0000a826 Example_Fail +1 0000a828 __TI_enable_exit_profile_output +1 0000a82a __TI_cleanup_ptr +1 0000a82c __TI_dtors_ptr +1 0000a82e _lock +1 0000a830 _unlock +1 0000a834 errno +1 0000a836 clMagVect +1 0000a8fe clPhaseVect +1 0000a9c6 freqVect +1 0000aa8e olMagVect +1 0000ab56 olPhaseVect +1 0000ac1e plantMagVect +1 0000ace6 plantPhaseVect +1 0000adae SFRA_GUI_cmdPacket +1 0000adc0 lowPass_test +1 0000adca ti_sfra +1 0000ae00 SFRA_GUI_commsOKflg +1 0000ae01 SFRA_GUI_serialCommsTimer +1 0000ae02 SFRA_GUI_lowByteFlag +1 0000ae03 SFRA_GUI_sendTaskPtr +1 0000ae04 SFRA_GUI_rxChar +1 0000ae05 SFRA_GUI_rxWord +1 0000ae06 SFRA_GUI_taskDoneFlag +1 0000ae07 SFRA_GUI_numWords +1 0000ae08 SFRA_GUI_wordsLeftToGet +1 0000ae09 SFRA_GUI_dataOut16 +1 0000ae0a SFRA_GUI_rcvTskPtrShdw +1 0000ae0b SFRA_GUI_delayer +1 0000ae0c SFRA_GUI_memGetPtr +1 0000ae0d SFRA_GUI_memGetAmount +1 0000ae0e SFRA_GUI_memSetPtr +1 0000ae0f SFRA_GUI_led_flag +1 0000ae10 SFRA_GUI_led_gpio +1 0000ae11 SFRA_GUI_sweep_start +1 0000ae12 SFRA_GUI_rcvTaskPointer +1 0000ae14 SFRA_GUI_sci_base_addr +1 0000ae16 SFRA_GUI_dataOut32 +1 0000ae18 SFRA_GUI_memDataPtr16 +1 0000ae1a SFRA_GUI_memDataPtr32 +1 0000ae1c SFRA_GUI_memGetAddress +1 0000ae1e SFRA_GUI_memSetValue +1 0000ae20 SFRA_GUI_temp +1 0000ae22 SFRA_GUI_arrayGetList +1 0000ae42 SFRA_GUI_cmdDispatcher +1 0000ae62 SFRA_GUI_dataSetList +1 0000ae82 SFRA_GUI_varGetList +1 0000aea2 SFRA_GUI_varSetBtnList +1 0000aec2 SFRA_GUI_varSetSldrList +1 0000aee2 SFRA_GUI_varSetTxtList +abs 00000100 __TI_STACK_SIZE +abs 00000128 RamfuncsLoadSize +abs 00000128 RamfuncsRunSize +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +abs ffffffff __c_args__ + +[170 symbols] diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.out b/28379d_P_SFRA/CPU1_FLASH/28379d_P_SFRA.out new file mode 100644 index 0000000000000000000000000000000000000000..969dccc561c2e4bbc75050fea83bc8a65c7f2045 GIT binary patch literal 193772 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 z%0D6y>KX`jKbzkp&O8F$%D-^!ciy3ad|Y{+D@*THL2a~Dl!l?Bg7}sal>QMeV-Gyc z%DvdKa3RBfa_<38^Ok-m%}bx*DBv3`;N4b!6>d3K;hMAjhVgGl{*ACOzWDn#H1jPd zMgu(-TV|QmN;8F4IvBrgw>0xkmswgIX(t6)%E7z*GR<3sL=49-o6@J?wO3exVLAMo zRaL6%d{%((@vzJyD=@Ll3I{rOwt_cV;g_v$X9Z7;EVaUA!4pqkY6XHTPG4^IddUia zc#{=4UZ+5et`e-{I<$G<

VXa$F@ z2%b1_YVgEk1`V=0@al5cfmVl2Rxr5o0f{>evU*Lix`D$ATq++MXt8(|qIiY)Wy5#% z7tele0>~^K-xPt;@gd{x)9}p3UVB z-$-Qn(i?AzMDdkzBateyEhiR#GcvxFTPwxCOOcwi$x2X!kWq+Vl=e%X#)cC!>Ea(` zmh=FrS_gKs3Tmx>^Q?jiR(PTn{M_n|S@}R~_c2y@ifn`yd;dTrC>uS)6AhX(cROc# z{I<;LSnA7Sx0rr|NPh%=*$cjh4mB6&U~rIdx4?SRV=|=eS~DNl=0m|3jhT2lCwDii zZ=h2bJccsI>Kt4Z=wOCSNZ{jZ0~VYXgpp5+g@UU+RCLv*kIcsliufj=zGP zJ$h<7=w47C_$);)$a|fO9j}#UQr_>bh&p2dkMbh(Mx;dm!jjlYi#?U z6-718G7qcoG)ZT*0`z2yT0I9178)pp7@bSswg?@Cz@PBGbLg1GR_~EksLtwxUmOAL zP$yHOLdHIsORSu6+C^>+?=hZqeX7ipt`(p^P|GZ~EL#nta&!-h4H7+w-bpPJnwjUC zEeerzqO`AFFQ0j@JH`}svjTJtiq@n@tI%Fn@8EG?4YfL~oMVNGq}0OmCE7`)=j++D z^wgzisuD=T*S>wutT~gkD?>k)sLX4@E*2J1oezR;wRS(`+mHz5AW~$s1KluAG+STU z4F0FjT+f4cx#@9GEC_a}ixG)a-rk%3{*LtYpBU9fhuF{PksUcuTahN96!-tG=<%|e|<7kND$+UgRWM)!C19*l^m&&lEjqm8 z@Q`J0YGnSpJa^xYJTvVl@jxb>zjaq>;9os{OXHy{3Pq=1c`AOvn%Vv`w3J3E(xBI_ zT}k62q(Qe^dphM0C_Ns% zT4j<`#-mrOIZnJpU=|{({OHPRm_ut?uBS;aR=o8r`@KGp0+Id6H0ijivrVJLx1;@e zI(WB*4Do7W`e0$&Qw!Eub3#)JR-YO=&4RMKApG+VQwmm`owFf#Nc z+kdsw{)|W8Pt%-uYXT^m=o`}LocMLPMY)X>uHpMsG@oVT{|f;M@R+pzWwkuzf$qfS}_M zB~$38xlBdT=y}AQ6IMHO0^`x?NTzv)H2NIz>u8lG{f!hNZ&~g&La!HJPfMb4aIu4vuv@UB^}+jZQf@er(!_98KgUjh;7D z+Z>HB6;4MRg?5~!S~y*5Wa6g>jZFOXm7)5xL`#S6F}RvxnU-kbbcT^B9Xh=jYx7gb zsdCbpMW*!W#v)TV9av-vr|Sx+Nl~6+Eq(f}$P`Ye74&Y(^2arPdZow|PWKZSdV+tt z#!uf9|FFXY_@gyru&JYA@Bx2!{&DR&()fJ8D{HGAStE@P_bZzMWA{)>6Wf$DKHab8 zUG76M4Tkf{{{8K;LOE9}xh9Q|^E1Abu_j0UNaMr&u8rH|*tn$eQGUvWEt>%vmZ}_l za{oP>7Qi1WoKN2OwZo(MSB3L|dw<_D4?bwGbkVWkSM}lJ_5N|H(&A(FBkeqn!@nGd zOp6cEuQpYAn}SW+I3%49taq^EVfLD?w=17m_sam|@NxA_;e1vdS;@A+zpast^E;ue zu;EXNQ2KmxH6KyZ_-jZa$r30xdZ>&MsJgr(wK`h_>cgKqsD)$=iE(5gBSXDMYlhL zG#?AVsR{9BT%D-oafe|J~;7qs3U zdraG#ZcwZ@of9?Q*OZ>kYj>S}MmaNP`zs)mj#I znAkIDO&Xse4PG6^)S%i!?9a3&jY$|_yy3}nGFvu}ZEc&bLmIq@$x}4j?uc=Xua~1s z3-a|K(%?Nwm_afP{Hw=rsXas3DB(56BUJo?6#+JeCynjQE99GnGAyUgICYoeZ(~ZEb69u>eWIT zg%C1c0NWK=t6*f@H>q~&vN}-dugiAYcN*etK^nXs^a9h6^Y&@xjDi#Hh8?ix-r%%? zF z!QrM^5X@odguID)2U_(x>nG=&HrYCTa^Crqv2+Rf81fG3ZL{Pl7R%2vyU@=P_Otl2 z>Cg;=lS$42PEB%8Kgl#$<})WlRd*!nW}d;n4cvu7?eaubP&-__8=c3>2Vu(@q1_Nm zk{D+72h7Vm7<}RVjM*^1I}Ad|o|cN8BcPL5?t!2pzbR(d-3MT?p0^GeGas0 z-1t{oLX+1#6omR8S~6qP`Fq!L^q4bAq|E@C#!lKC;H2aBuwP}S&m=j17XMU}t2)k} z8k}y+^K@H!U)kN~_Ek{zRmj^{mbb6MZYOn+-IAlat{1f zo-+z@nw{eapCiO+a_$J9!{V3oG;67O8F$i1vviznoMEs-wvH{%uz@y6(??T8UMt8} zLb_fG`Sp^eWIgPa^$s+ga=ZecE0t46SMKwqa_ZzYnDV8r>MRFE7d0rl`gIkRk7JMq z&ajQU?&kS4P}LCHA*Pn)sbx8V4tK5L9gvbtsxD1V($n!vN}4F8$%&Ij>*T~^6XVP| z;1dqj@ve1jaWdPEl9Qb+tz&5{BiUT7?*Th%5WScuMWK@vg?uFnon29AxnnR*XMGc20RS$W8Xh_mv@kSR@%;_pK*ngw%wRM8;k8mr?_pI zO1iXrw?0FjwfT;f%#&t@9UOh-pf3!D>lVIubf{Fa5!GwHW*95_=98y6+HQ2HwLrjY zuLfOvH6-m-OIoC1Ws!FHernktt+}1E=Dedqo&#ma{%O0MGK{z#oSnWcy)MU$vpJ|) zCOf3?(u8>@)H#;+{>}THNoD(Kv{qkbbt&J{CP6a``BvAVjq`D~6L(OCTU(zrVf&%y zlP>t*vl{J?4#@M1+4jt+*7iAcvC~S<9%GhTNzbdbvb;krl|kM64J>Eq@A6TuUms?v z(NHI+gIe2YtrdnH%F9_xXjA03zQrt;_P#A<>?wDY^J$*4K|Ae&4XQOPCI4rWb6R8c zd?#k}4i?$zqVIDdossC>O?Qgyu0Miu{SlIVZ>hcyyM6C!2lq_LJu~K_@$AXHMF&HM zyy{b5_U&k7r+r&Hz;q3`J(+Vda9U#*7H4kbcvi&TwP|xD^ID2-pEP$@iN|Q$&qkZg z)R1dQNvrctucT;apZt>tSV2o%&azKB^}|ogfA|?zP1}KopS%<%kE?O=$>Y!5o(P4$ z@wR(jUywS@~zHO_Ljvt6e8l-Eqf1t=wE^17uQHZ30{%Q2GabW^IUmYZis z`LffD=@LP$(W*_eUDM0%){NLkb!JnqU90KH^vh4*;zc#toz6Acow$RnnKm?Ym6-We zM|!(^HS|vOfII7F9*3@;|8^%m&wlTAGr{JyQ%F2VG`p~LUdiZDBZ^0j7%`%7=IFxW zqT(S#3X9_vv8q^o;r!yl6{E%sA31XPh~aZfOAy|$Dp6BaohlquKDcn?gb8DZjT$j> zd|_#9DgIp^Pc+06(NwJB$9#Tlw;hv%h4nQ}khoF9#||HvRe}34 zqn#eB?XT&6)N(&+?H^~mA7}3$t)Bm{thiUO%HqSLbf(M?9rAWUz$5q<&*>Y=(XMi; zs~qSmXSvETu5yB_9NsGDw#t#Ma$2h#)GBAR%JHmnGOHZQDhIO4S*&sns~o{9$FIuC zt8(h9oVbe0;D-;x28^F#>q*v6IcW9L*MUval>=5U{R2GiD(T9(s+YbLeh4I8IZjpd zQv4AxJ}6XlIz=tUV?xRSs&aO!9Gfa9rpjTda!#rok*aiMy}rcry)xf?IO>?8i1@b_ z-+*!X{)$ego*S|MuN-(PXPwG1r*gun9BwM-n#z%;a+;|eWGZKvD$6}lr+_hOmdcM# zE{7vO<NK_6Hl>1aTGWcg2q4-7fJ&RZv)&w1$| zoU7=cf=+#@J~DpM1&aRYI_WgdOK-SP(YJw~9{=iJDEiin@!$NVqAN#k-t>37#G%7^ z1D&*~k1XFgmnpijPC8)o(g$6s=*qd8mp<$&MOTi~y!30fD7tcr=B0Q2t)eT3XI}d6 zuTym8%*;zK-KyxyQJI&1#Z8K?oRE3xm*1l3%E_3Iew(5zCt_au);knkISKR9|9qFC zE5~16`s4Q~x^n2{rQh~@MOTixy!89;Q*`Bo%S&&3K+%F+T2Txx51%Fd?<-EyDe;)5;4v8S;n8{1;`?{hl zr%PUX{hNxe94dL~_xwZAm9r!-y~qD5x^jf%rEhvq(Up@UFa4>1DY|lEAqA4OLVhrIMYpDVg@Cgi0r`9jf^qaZK+hOZP|IRWz0Klnz`m4hEI{UXz}`$swC z@zTG*yH8~QDQ7!gdMc#oeA86Ae!taHbiO$1bQKx@O8xv$Skaa99mOK)vvU+(IoI*h zPs~+x73Wz<8{iqSHyuV1y~BG>VUN zZort*Q}NN+OfJHda~b7KM)Avf58GYwD`zoY`YF8>T{(mC(&zP2bmix@jD@h<9C|VpZxB>tEF{Sdj-}?u5;gG(qYtcTPjDhuQXZ{EI=#bi&{sU$ zQ?NViFj=N~@ruUUn6a{hWR!t3X3sd>z%oR{O~jJ1)Pg1v_J4X5f&~lb zm&%|VI3N;D%WO*k>Q({T=}}fVmgTyVZmk~#s*BdtlOlXn1&jdBFEM(IKOiJk6G>Jk zqQ)Ee8+D!^O(r9$STaR!;leIpbcd6`cY(;>P#djJ&5KqY87r48eGv$mLZ0vIEc2@= zkBUi-j1R%|rp*+u)f0hdBP8+?ytBRI&@-j*Fnj>16v{KCa6Oi3Duwb|Zwm18g*-On zpV#d?Dig8eoFdA4aIsx$%E1*uU)M&PVil2OO?@Te;I#wzV#SOVcREvfJSmy>6--=q zpPiOc6t5c`CE4zkX%%9%g(1Mv%zltv{4630l!_*oM-q+oMlITSuI!!}HMNkx$ZU51 zTntxl@B%Qup$}qRHJsxa#;Ir`C5LyTe;muX`T6j3DN@YM(o<2G+-dAzokqvS3sCY2;Qd@8h36&kv}q7)*)<}%hp z1OmpL;~^}l#tR4$5oRug1}tAew)ycIp~Uw<%Q-YOVO{d@Ln~{mj8Z*3i9U|j7LzK4 zfUlr-VkOIKB4rrDk!VFl!gxt1K}$?sg&wGlRvEjYOm3W*EbaVM!dRda5>3#~3FD{U zuto7ig>jo6MrofGua`-GtW)Y6>&Tuo_J?RY8Lni|+*oC*G(Ho`y;i58Q=*4Arbdo6 zuFMcTdX#vDj*}AJKuN(v$q``>B{^(bmx4G)=@d3P+B}sgsjgUQT%?mKpg2}xj`*`4 zh?G!DHckk`P0t#^Q_#$@WYU-XR3R@JM2LUB!HeE_#C> z416$NI2kWM%D_0SCfN{8l~<#o_>s(8r(|GW5lx`FrA?{1n0qzmKTd6yd1|WOVcs86 z0>^cMf2mPE;DixgaE-&mWBVb~e(=@giDxZ#pA4pUl`86a?KV=5J| zH*WO>m%vO$;(OBQQw2p0j*LPh!YVW_@e!of$D55k?5vh?z8;7i83;x3g(tWH_9x0b zV!Tm-na;^F34JLN8Rr;*Ntlq*ihovxrQ%gpwK0Snzkw|%3_s1-pJ5w=9-G?2@<1}u zcAhSl02RjLPAD^-vLaej%i10muNM~f)jd?C5_C;0jlLd6qfE3k5v@jLG;04DM!QfoVJg)PMN!qKepxn(|oDj8Wr9k87G1;YlJ2l1NQOUCOJ6 zN0W6E$B&#iVN8GU94q2g#s@Ab8Kb#~ zra<3l2~$P};u|n{tkDzlFb879wPxD(09l6$R-SM~{j4b0^t#5{C~a9R(ILI~$cc_8 z9=*Xo6G_AROIBlbUz|$Rx?2zAmBrxc2aBQePA@L@vdWp32O*6fR+M2;v?c|E11nLc zY1;-o5;@DyIW=03URxPUIHeto2myoVBg_2E^Be0Lyv(w=JS;iT!)$kKB32ngFNi|O zR^YkGK^|7s&pIzvK)~P`3J0g#3NqQ^D6Afl<^aLRvy^cjK08g9v7cb%p~`R%qf8J@ zE0U8P%cGT*9xk+~(@qN;rqMhV{QHVj&$$e5FoMzH7L#iudxM62GIO4|m`HX8`d)Dr?HU zk}CV2XEW#e_>pKT!PQoxIG&J=FAKqgnnQie&|+F4WTIExWElTN)eptjT@}mrpII9( zi`KHhhBP*Ldh=x(v)!v2w-mq2ah8*ZB6ySbb;1xN9x!;U(<_a&B32p2lrk$?U%}ls zehv`qJmvX1tsFIIhN@`o;SF3%W1#EtWQlnC^JZGS`nnpORdx;!f^yPI#KLoPC7vi1 zHWiB`rS1Ov;I})CU$!H;Y-!{95T$K8O2N5a-^U=AOpK>QeKjtbj3&CWk9ks4ZZ8@GORcM@I z!^L5=?IyBIdE^1p`)Hh5Y#=qMBxvS169<_`;~Ow|+SCzgYs@vtdBxMj+{1Yhv+p#R z+~wjrIHL3u(Rc{8&6@|7sj(Ddg07T3kD?0f#G9RShKU4uDmB^9>e+P_`wC23N*9l* z4)#Z|yU%GGvKvyB^4MyIpWofcCZp^Zo?p#QXLR<&+$4FDH7AYJ*#sx!D0~A3kF-kt zj4*n|B<$N&W-QqxJm_lj$Fk>nS_UQY#zeVPShD0i`Qi+u^<@JTTX939+{j_l{qPMK zJOfL5IZ+&GZ@64M3F~Qj(xV^?tAt!~2=P4ZHcS#)uCkCvl}?#UHd`!tE_R4FPsw+9 zvRtc*RFga;o9AUl0lkJ1la?*TBQsyc!7WY1`O!qQE|yBvl#}1+jW2d;zrpJOAil2v z!KxfNqLMW62Bd(&1GET;kVvCER#Pi!FzpbLhi8qTy#$0UTS@98NIW+?2qX+vBT^0n zJT+nj{#2X8JT~hD@?S}gl#d$U6fLX4LS=Y@MuEse zN0O^>*iaY2a#))BR3WX5=>I}^JMK}FukLgDq`G+<^B|sgvHE{WaS~-znfvLT@5>&pQG^&7}L6% z#wlPG?Z)zQ)YmsQL>jmw27)M01tyH72s%IoNrf4SHK9fgiFjoVR#5TAR70a)F`nja zL=0|5k<+LEh?c>cX9?^cKNj0G{{(sp--sjLFs@O&c|A-6<3Q4+#Sa8g##bH!zJnBB z1Y)y_ts&=xi$66VI}13 z(Xmq}lclr86wgNkgv_wn(d-oHY@)|}9}zG)M}!6q)4m3#Fpi2y3CT!7yk(a)Q=cFR zeF5(KhHZ)m=>BXIaT8l{See}hJz zu~^_-@f$Qc8B#e&rXb$jCk0gD&c=!IPn*Asah3;nHDJ#>pCH~61w-5U1X2566Rnd$ zLA>$pM){}s4dU%qcYAP817?Zy3F1wD)EdTT(6aahai~Te;No6lNV>SU@e%19QTPOL zNs;5o*hWO$M{K(au@-nwV?WV>;s^A-jB)(a?&cugwnqb0eS$dtEAik$W2p!C6~|yM ze?OziL*Lgp)r0#R=Xvk|;}Q?v&$!Nm2O7U4E>!Y0$ap}bhXVip<}qMi3+5*f7-ak% znAd|9{s{O54Sx>&vWC9_<~3r)Ps{pU4et%i>&1#rL+%?5PX^|-V?{3kF3|8#fO#ER z(RqwFP{RpeUQ<@|(}5>wcq1^cFDv>bz(;BLO5kHO%taEfIV=9VftP9ceqdgIR`jQU zPtfoSz`Pc%=`7d|JCr(z`TyF=n3FFykAV=RpbxI@ook>87Bcx3c8r`q~s+Cc{xMl4}#w#-vOU| z2l@$le+6;)2?BfMJ+QBLyaWop@*nWYe_(*1bJpP}2)buH1bpKmFwnTj&YS#{|Lc92 z^8OL7^YFv*!20r9IX|o~>&FY{63hBMr1Z62KbnG)F6;Ls`dH%3^{Yghk}m64Eg|xg z^}Al9vwqtgx~$(IC;frOt-kvF0eI9FIi;9^j>eyXc}<-kHQsq$UEw!De^bNn0l%%` z4}p2DUGaxe_fIv<@yhG&ik=U8R}J?7<~4Xl9|+9r@CsA@jtY6@O_i7J&-se=;U|dt zaK5|mIst((-yyxduXXXE!2i&21bE{$F1;T3$ltp7MBuSb`W=joz+Y?lQs9TLcKNRZ z=3@o?uzdFe^DzR2p9kh+0}8(n%@{6;u;^m*oU9+ z;XqiWC-uh|AFlS{U;6OlK72$6Z+g%8@FLkgD8J0FFLwI*QJ5E`6sG>_iawNhU!l)R zeOT$7AoLsgUHvEVHpqmEPkW)tDUZ~De?pj~_ZRx^Lm%G58UK<#)rXh)FgNz}^zQQE z*L}F7Qy-arwGTh+!~LE5NdAvBO#8()x6qzazm+-tZR>BRe)|c1Ug*P-u)z8r(w!MxUU;cmc>Yq%Hi z!TY-P*$4P18r~1MLc_y=S8MnH;L|mHAn;Qfo(lXo4bKLCRm1avKi2Rf;63}h5vw==&sX}AZ{<71VI zpX<*84RgKON5foS?x|s}C->2C5z^!1nJPW5Cx>a6>&Gz~=6Z3gh7U#j2^wAi%*Q-c zdey))H5>;%Qo}2N7iste;A1rWQ{Zw9p9Nf@;d6njH2e!-K3=NwzYTbWhJOdl$4(Xf zFTfi$Ok0qTqbm9bz?W#4>u)}$s_37Bev5{={^sMWivBg|f7USd@z8-To%(pJhN+LQ z)-d()T^go7{=0@b)?U*v_3;N9rataG$jy)Xcn=LzACJ{A_3;7?Qy*7rnEE)OVd~?v zHB5c{D-Ba0U#ns2<9jtsef+qFsek{bVe039X_)%>Qw>uef2CpSPHC9>_!JFOA8*z$_3`Bzwvg2o8qNp4Uc)_s|ES@;fS=SbRl%zo9tQj$4dcln zBNvYYD|zD5va^P#0}s{kJm9e!UI;u_!^Z+I)o={BLc?{yt2EpQe71&90KP`Urvl%m z;SIodYnbc#)!P0M_ml3>F!xuK{^oqf^}KPts4nKO4#ovY?|N;0e;x2tjs8dA*EReW z@UJv%Vk_Z(4et$nvWCY2_tWqK;4%$!eXh!{*5|xI&X1a3d5>4e7f$wK-pJ)g@$=HH zj$beKV&0t9>AWASW8Q()F(1rVSgg14oQ%YBeqZOqfAZlTUA_EEe0Ylwf9S)Lc<6zT zS|6|X;U|4K?(9!U`{HAaDH&hd7sH+MN&8|Qbf~0D`(ld^Kk37t`LJy+p?os_EXatS zUV{%`bN|!be~|0_(=kS6`m%lZ%U4*o&oT|4=d0hv zz;w6359@aeFx@UF{1;%lUr_ihV7g&Y_)B2AV^Em(XTFAMe|FXI9;gf5HYon#z;xfB zFzwNm8m9fZNyD^1FV`^b&5wt=@o8Uvu3_4jGl#i!+L!Y+O#5=FhG|b;pkdmR?`W9z zWFPJPhW2EkhG{>J&@k=CBQ#9=ah--~KW@}8?Zpc;OndPP4bxt{Qp27GKhALpCR zzWrm>ziPeIZ;N1ue0CJ)7m8o$ciuSWN69a54J%CfeMpm6;xB#pZ_a+H)Nf6W{7U`y zM@Jt@{q~MSm-61#S&zx}Qx4i(<}dY2$XS0${jvphmUJoqH)!(C^%L*XOZq@#nw=Lh z$2ZUW=)Qv=wSGEC!<6628m4^yM#F6HPqg`bKGIj|vAvfA)BOiO#GFqRziRJ?PZngS zy?L#cAGSZ+_a#2vD6rHQE1dmjiF*_ZGWhNFs?$DlfAs|omms}OPJG$^S37js{&0US zKAbP8-y3}GAJ^#AM|`M>pCHbgh?_Lb_TR^uFQq=3qv5lB{c#~M-J$TK`lG*w*&hQn zd>#1d9!2r9e-6+v^~X33-w*!yI>CR$H5#TqIaR~YfxlS8)GtS9_+Ox(r(x=w z%QPHYw0AhWIf5-k?9K(W#G~(J)`~zD>i_Pyf{L6wtS7nEL7-4VQvW_bL1^ zKkBbNG+aTteLlnXratSVVd}H~8m2z$v`!=^(xX1xO~ce@duy2E<9_kbJNIYhd1^lz zrT7r9MgFS4IX*T6tNtYBlQ(fYy&%f}EU@Yi;?ICp`xEzpEUWe=o&>Dgmv{-VYER-d zz^eU-e+jJGi}-e8?fmL_U_&bp$Fr)R8qd>C0}nn*fAT83j(J~Q$GnxUeL_#z*^!-rq+;m%7>rw;V*o6kkfuL{z4yK=fl_f@H0OA zl@IUhw6{#3E+Axk4>UfeezQMnf0^#F_~HD(`S%D7bG|LrFz4Gt;0{IcbACNq!<=8E z8s>a4Y@Ewa`*)UxY5yLsVcNe(Ynb-$QVnyzbeV>^UwWK|xnKF$32uJ4!e>-ynDf=i z+Wf@*nr#~H0DjdToS*grrh71ch$jHk9hkyL0Mq@K!p8yA-Iu}}f$82$Va_Kie>I=* zu^CC1_Z|3vjE=9_;>CQ}MW^#&79I0>6@{tq#|&0j>ifU=aD0C+y>N&Z-|NFmhI;8= zX_)$Wt|RYK|84T&XMDJqBfpY=u@7ISVcNIP_Eq^y`?iyFU&+>gKKxf7p43Cdm;6`x zaMzwLo%Zom^cg=&pVew~>NEE|$ks>BeviaQ`EZjDU*yAgXjteQZTu2n=EHyX;g5Z| zzf*sy5023ARgh2hp+2|?nC|BIQTBPQhN&OwG)(=_py59vKHbr&_|z8>4O3q%)iCu% zxrRA@Pu136JYQI^;n$G{*Wg^&0*JxSyta<-Ntx0OviizOvil0OUHb4OUHaZOUL)$=VI!Q*M=!9^~c)bUfie1i=X!4 z6(hX#ZX><;S|2`kl$YLlw2P@<-qiE~aeqhNrT(b!;VXUk10Npmj0YK?&a?PY_n98l zF!hi61Orn4Jgeyg?(g++?z2h#67}I*efTRM9`D?Dlkt;2{Gf)ZpMLApPs5%4XZ!qF z(+4hnTKjXvS`0#K?Kg;-)K75W3 z|3Sn5#duO5>NlQ$)14$gO26H&Vd}SsG|cmFx|dY^)OUAj7;g?U=w4FMsqb<$I?q$- zUQ*F%{}gJN_Rrh)eMy#w_Rsqorv3A&hN<7K&@lDe^%|yryHmr|Zx3pi`t1n~_d@w! z(lGBQMKsL&NhfHS_mkFXnD>*;(lGBQ{anMew+{B*x4u}z`yhYSAJm^?fK_`F&(+$O zxB^(UC-Eu3bkE5T@rA&2$Eom*z;wTBGl*@oPSO`Z$+PeVOBo52^3w z`tT+ne#VD;Ir`4F*L?Ug4O3tKqQA;t>dSC#^N%!hkP@p1K|4dd`)Xe~ipb`@W+ z6rr^iYf({4i(LWJr3M7r6t!y!%Ll;-YAafe)g_dbE)@Iy?%)3H^E>-aO8)IyJ!{R} z^Vz?B_SyS)&e>=0efQnpp9OzPeRgi}mvBqOZ;$u`5#Jy2(}uP0&+@VUJC5gp%gu6g z^&gna%LYdN_8Vq>_%6fzE|ts8YW!zl=kl`3uD@uQ_2G8I^*El(&1!tM2ft}}73^GY zR_$ybK4X}_r{Qw5YUg>zx!kPUIbQoZ!`I>bTy9qF?)xLd z9G@LC%<J8S&mJ+%@Ae-z{P*Bvh93mK!Ti4CtKfRW zkAaJZzX2XL{3Q7OhB+VkLxwpY`8LCxkNgS4oR56SFy|kC$uQ?1A2rPRxT`s71{&e zj$zK%y1+2!Yb`O%`C3a2bG}yIFz0JsZJ6`5)*0q}tu2N*U+Y@KoUio`!sNpGJ87&CZPa|GeZFuD8~oY;U{>*7}ot5&9-tKa%-o4-dV6Csn&w;hRA2ejwuQZ^_zUi1_wvvi8ENEFX*bgR8UlE7xZEcM*Si zUDkemN0#5*nX>EuhxU!MKkGyPS-2GOJrVyb;^m<~Eyqtqd?@0R5nmnJuX6msh#!mi ztP8a~5`SaFcSU?W;w7Pd>&t7H?d>DWG<|7rf5xL4@dk|#3v(OjCYQd$B#!xyd&at z{*J`IE3zMs_$kBe&&&(Ylk{I&BOZ_VBM~2o_*W6XF+6XQ{>F%>BmQ{APefc7o<~V< zdBlAY?~nMC5pzX9@wcS+lHsr6eW@G!U(dr|m;3iC+i&b&H5q3AX{BNIpRP8{{?dBG z>>q75%>K|bhB=>+@(|qke&%>G7rhad`9~A$mF4}D&cBuUM)yYb%lEI)_)@>T_$Fof z{`a})c`Cm-wY%}h=>AzA>bIqdewV=`)L+k-_8R^5JHzzXS*E>8f4$By{k7OI{dJ*X z`fG_{`ipWI+|*xO2S`}_wQ++(*!}p8VZNUhhx%2%-c;}6z9ThPYlruEPK zdSw}(SbVm!%zxv`r`-7aq3_Oef9*H^p}*c^nEraqFw0B%4@pn%53X$_Eam;FDIeP_ zJsX|bm7nFk{uRo*#gvETWuHaTm+_dd8awZgLR8+eDetpUd4CQbH~oK>hjJy7{<6eH z5BKAl?*8WjO=6ewO_}oW{rHfU;{#W39y77725Hahkm8QSP`)QS7 z-cK71^Z9$LVLpF-hFKoU!En>(i;G!Va_H_a-fxc?=Kc1!(fzjjN{uhi*B(=T z-ftJ9&&N%luWuMT@3*@m|2$^=(;NAN`KMfsq$ke{*W(hF{Qtz{m-(-Mt24XuF#ji_ z{ELHDJm?=*JTK8f=GBa{EPMfvCW)xBo?iQ`vaGQ11%DYwH-uMZaz z6PEIIn)0xG|7e)yTOQhrQvZEE%ny+A?KS!5_4&`Jd_OgImhY*kd~?J5Xle5PsC<73 zrW}yuSFR7&G_(1C+T@q{U%tti!}WP@l>gV~)Gqn|i>1nPeYVX}milbYGG%%GPDc5E zi^>1}QT~sDDObcz{mzy=>H>8{tp{F{lD1H z8DjgF?Y$wB{~tv8XMI6AC2rcj88OWIV$3k>i;7{^7kdr!ef=kf`M&;u;TLdzJ)ioE zYtC`g`PKhq{6l{gyPY{)@3TVxMef(X%d1`d^;_c)`pf^^5y#8*e%s|5U#@o{^4ABA zzvla~e;%Rjnu%!@zE6)DrvE-9*+qKdzmY5Sc=6wk$bW~8 z|9Jmh5bDpR$->B=^ao|QxX~XM!rox~aVfabFyE(K^-to<_kCRH&oTwRlg^aeZF69nEt1%nfOcUUoLDYEcMrX-lW*H{k+pK{d0a8ACTwqsuqne_t$4l z`FKCQW1iaOemZ-(vfNMiN98|k%C~Bk@;zzF!{_lkhFLz!vT@V;=9a|>bS&k&)s%<# z$D4bc*_D^&8;Hs$R;DNAd#}kq%lFSw`F>*TyuROx%6H6^Z(~$GX0188|G9J|H?1!_ zOn#aFDZ~8|)yJ3oUVfEB9544HfAhsnpYI-H=l%Ag$zN}jznu}&-;}wN^yGfxa+bp4 z@7qoOnBQ+2roTV>3jV&)&#>c|AC6?y~$^Qa; zf3O$43~6v%fcEyEk_S`!os55wR@%=??v3IfCf}UekAfGk*5k20D0qose%EaIB=}ro z=Um704PVZ&Rg=GVvhS}gs5>*+2>v}b=79O{k9Z{FKaTh|u*#k%hI{5{#%CD2_FxI59>f||KuBUbze6SF| z&%OYxvg))`3*zN_Q+p1q^5(R!0&~4JJ$@5dWzcEg3jX?i_zn;LWBP9gbA2~l7RP(Q zT;ENP-v{P;YiGmG+#p%HyAz)R#|$+ z|5xxlbG{#fRmPt7{{pLgJ^5_3?Nr8|d=XgX>&Xq^g(kgqV3o6{eH&P1@5y7}`6m7? z;5mlx06zlO^4|wm*?S)UHSk;${}}iT!_R|<%<*&aE?WXt|FCU(zTvCDKQ{3>_vm6{ zzYcsZSnuaC@HvKW0>9eu9pJTK%|FLNrm&vInYbUA|0CcHV0O#MPk>P({sY$~$HAY& z@2h{|cv*51{89X#`V!A`@h-az^@WsYe)2l-Kj8Prd<8JQE5Xb0d+B$gek891Z$ocDZSP0Q>-0%kwOlzlY{4 ziuM!WdUL*)!T*BzY+}>C3_JXNt{%UZhJ$!VI6HnH3Rd}c#vcc(+&lRuu*$=e?*OY@ zJNdIHGreJo7u=;iN-MNJS^J#=ww}$4X)I5upIAb)YF;Wp08d{7YNU6}! znl%JPaoXBylz;U@tQ6f}7Id zpfm0a&CW2ZN|3X+IJ=jt32Nic)apzb=^HQcvQG?aOVwT&OBptt8-&>oAH0D z5ba`!qnq0!$>}a?jMS=7yJtS57oLWs(%e!@1TAlmkv-M=c6KZ6?E-?5x4Yk0M9ST9 zpi}CO1Myr^nOlM(J_6~(Jl(?2bZ&Vwzv1drG3I@K;(UZOS0 zN3(pi$cJ2n7I*c#Tg2fl?atOJ$+yar*(#~DN-C|AN~@&ODyg(eDy@=AtEAENu?mEv`Z@O zl1jUz(k`jA%i-;kSi7XsE~&IjD(#X=4*EOvYpzk!$u&wsxkgDT*Vrsqa-<5a`{7Ys zwegu^X?k>Tc^Z!nE^aJl=Q!0}749yuvOF6YyOE(QSIiH?)N6z~r2Zy+)J_zZi zqSH0u9jV52)|Qo&p3SBT(zDruV04XfgBNnn8ZvUwSrc0X{r;f;MV>aN+R$nTcnEBod`N!)ZfqRHRc}BKBBqHEYWh*|djOgv3qpXSIiu zJ6FsaCF_>jD3Ob5BgF2ijbU9^YxT#A8*9y}ORaNo=|kCqW78gk_YnIpUJ#Nu+Qxmo z`JMSau4-y(_P1^PrjWC^P@E(ybDFiKvZmSaS{c)<9eR>hwlr%@WlE9brrkR?@9n*@ z%e3;u9bRrUs3mGW;=@_@Hc3?t<#I<-Q8!8b+$7a=Q=9ienocHp$ysXjSIVCxwi;*0 zrbx>)HlIqnG>&JqN@EjGZna5cyOaxhX@#b1Teg(ChkI-@-rpn6Q3dZ4dF!X@#*!jK zB`tqU8tlDO6FzHKB0UT@nHLyM!{iLX@g_&Eksl1ccY#thPmPqS*Hyy%W2T&y4fWOj zsRcrPgdhbPs_aa61{Kdp+L`br4%ta9XrRodkQoxK)xz}W&!}Fy>meTxiCK6J(n%v9(4H6dhzI{posf zPUzF^QPvYXRF=;d8U|;^leO3NuIcYDuGu=!Q|#K(HIVE=H(_+IxAyeriaR^|dXm1* zfvtU8irdz7Z|zKawsrQc@9x>2Y~9k~_j-Es5^-#-I6OY(4;PtFoKU4au}j5H)D;60GRQeYuE9z7FkVO?j9Y-0EUUMeQd0 z!`0vGr^|oTSDu+#Gd(?cAhltjde`Vk$}9z=x@g-+E4#ZVNBS$}shKp2OAePXq(AD; zZ9|5sM?YLK$5bcQVr+e6da^oE8h{VQv|(#k5gpbIzMB|2zSF~d8L1bwNCkqfAsiiI z_nt*vlMUz4N6)5RW4@Op5Y$McV*DB3vHGw=j%EEZ57uN^Uyy2YF`?pU{mr`b~cCqCX zVxZKxa%;wMP0ewcA%PH=`C#>x%^mv|aD{bR3EWey*dTwNQVDmSxia35*%bZZ(Iu}v zGxNh!XOEtO53;334hQ&ELnz41zH)iWS7T{lxzay2TC!JYY;;$-w>mac92v{`jGT9`}?vczCopgcnM25PnaCC0_&kE8U~0*+PQ2L`ZMjAnMjQFmsE_rOX6X z@St}hETX|MIbAGfT5sO5W?~R6y@Bb`akZW@`Sp|2xwclkJ45Ov z3Y%*gd4_fFam{#WmV7dy#zrO-n)}FScGwD6Y-YE6)B5h7ju+JS{ne6=7HCLzY(YcQ z0RRm__t1_Pgzi=`>Q<))USXfHG|=>((?D^j8DHR`wj-TJJykEAO_W)?r8K~E$i92e zhMsdsQU^O-9k0N;%?*b34)S|ad^2V`wV`+6do9wbN&6K(7-?jC6d}6rw50K*6C>S; z#C0VSb|Vrr?M5dm_#UFj2Mgbgqp_DS>>nH&Wd~vx8^LJyrsC}Q(vGe}w1KW7djSs7 zR3Bn61?E$8XzxqxsAXRh=vwOQ>gzjqpaU~FG>Nt}+wDGHWpa9^IE9y?J2NlDM0F|+ zkPBSo0Yx@X@nt+)sQCU+RPUv+uiEyh*uCr9rRci>M&%w3z{Qn5K}o&a}ib}HvU!v`NuT$_|;6{ApUNc zoAhE54F7EUw_O99TO(#(vJ-Rj`Dc$mu>ocV@Q)jg=TF@5;m+^u_X7BbZ4drpJLl}G zPV-%_N$u`{)A*-l*Fbn#r^EdTVpmza1D|9(|XOn03Sy3EIO=f(c7>07gDdd&#a{LydBAN{7AX0_eK zqb*KP&)a#L@wV7_{=B@Ny6Jfb5TJQgoBh=DUXMWT%W?A(-fO(Sbkj735up2Ov!9yY z%xT8E=``cL|1{&>d7AP5>NMkh8u3^rcb^`_y^Q;r&!ukai!UNT_tj=U)h}N@&3H#o zGv1Rn-buY%(=+RNkDq3|pPgpB=MhiS4#LyvX@iYFc@Ob^Xd?JswehEJx}W%Uj%;kT zU1sB@M}(*vug%6=prIjJIC2wAr*qx-`y-nQpWky^Yty?SiudxnF)#C?^hn*~?}c=q zsVw{W8ObmG?}x~0rDP$&&E43uP%A^Dvg!e_&XyT?;CA( z$;+G+>^HUX_eQ!;)8lLFk_Dz-QyYI*rTdI`tf$V+&E`Hgwej~<+;`8>lDY0x$oHde z8t+l;;4Yrh@bmFQTzT(mh + + TMS320C2000 Linker PC v25.11.0.LTS + Copyright (c) 1996-2018 Texas Instruments Incorporated + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\bin\lnk2000.exe -lC:\\Users\\zxc\\AppData\\Local\\Temp\\{B72F5FB4-6995-44A4-96A1-DC5CC5919818} + 0x6a2052c9 + 0x0 + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\28379d_P_SFRA.out + + code_start +

0x80000
+ + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\syscfg\ + object + board.obj + board.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\syscfg\ + object + c2000ware_libraries.obj + c2000ware_libraries.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\ + object + main.obj + main.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\ + object + sfra_test.obj + sfra_test.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\SFRA\ + object + sfra_f32.obj + sfra_f32.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\SFRA\ + object + sfra_gui_scicomms_driverlib.obj + sfra_gui_scicomms_driverlib.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\device\ + object + F2837xD_CodeStartBranch.obj + F2837xD_CodeStartBranch.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\.\device\ + object + device.obj + device.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_P_SFRA\CPU1_FLASH\ + object + <internal> + <internal> + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + cputimer.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + flash.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + gpio.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + interrupt.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sci.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sysctl.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + e_log10f.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_ceilf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_tanf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + boot28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_cmp28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memcpy.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + pre_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + autoinit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_zero_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_none.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_lzss.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + exit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + _lock.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + args_main.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memset.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + errno.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + cpy_tbl.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + startup.c.obj + + + + + .cinit..data.load + 0x84000 + true + 0x84000 + 0xe + 0x1 + + + __TI_handler_table + 0x8400e + true + 0x8400e + 0x6 + 0x2 + + + .cinit..bss.load + 0x84014 + true + 0x84014 + 0x4 + 0x2 + + + __TI_cinit_table + 0x84018 + true + 0x84018 + 0x8 + 0x2 + + + .text + 0x82000 + true + true + 0x82000 + 0x58e + 0x1 + + + + .text + 0x8258e + true + true + 0x8258e + 0x52e + 0x1 + + + + .text + 0x82abc + true + true + 0x82abc + 0x3fc + 0x1 + + + + .text + 0x82eb8 + true + true + 0x82eb8 + 0x20c + 0x1 + + + + .text:SysCtl_setClock + 0x830c4 + true + true + 0x830c4 + 0x209 + 0x1 + + + + .text + 0x832cd + true + true + 0x832cd + 0x143 + 0x1 + + + + .text + 0x83410 + true + true + 0x83410 + 0xd8 + 0x1 + + + + .text:SysCtl_selectXTAL + 0x834e8 + true + true + 0x834e8 + 0x90 + 0x1 + + + + .text + 0x83578 + true + true + 0x83578 + 0x88 + 0x1 + + + + .text:SysCtl_getDeviceParametric + 0x83600 + true + true + 0x83600 + 0x68 + 0x1 + + + + .text + 0x83668 + true + true + 0x83668 + 0x62 + 0x1 + + + + .text + 0x836ca + true + true + 0x836ca + 0x58 + 0x1 + + + + .text:GPIO_setPadConfig + 0x83722 + true + true + 0x83722 + 0x52 + 0x1 + + + + .text:SysCtl_getClock + 0x83774 + true + true + 0x83774 + 0x51 + 0x1 + + + + .text:SysCtl_selectOscSource + 0x837c5 + true + true + 0x837c5 + 0x48 + 0x1 + + + + .text:retain + 0x8380d + true + true + 0x8380d + 0x46 + 0x1 + + + + .text:SCI_clearInterruptStatus + 0x83853 + true + true + 0x83853 + 0x45 + 0x1 + + + + .text:SCI_enableInterrupt + 0x83898 + true + true + 0x83898 + 0x44 + 0x1 + + + + .text:SCI_setConfig + 0x838dc + true + true + 0x838dc + 0x3e + 0x1 + + + + .text:Interrupt_initModule + 0x8391a + true + true + 0x8391a + 0x3d + 0x1 + + + + .text:GPIO_setControllerCore + 0x83957 + true + true + 0x83957 + 0x37 + 0x1 + + + + .text:GPIO_setPinConfig + 0x8398e + true + true + 0x8398e + 0x37 + 0x1 + + + + .text:GPIO_setQualificationMode + 0x839c5 + true + true + 0x839c5 + 0x37 + 0x1 + + + + .text:Interrupt_enable + 0x839fc + true + true + 0x839fc + 0x37 + 0x1 + + + + .text:GPIO_setDirectionMode + 0x83a33 + true + true + 0x83a33 + 0x31 + 0x1 + + + + .text:decompress:lzss + 0x83a64 + true + true + 0x83a64 + 0x2e + 0x1 + + + + .text:__TI_auto_init_nobinit_nopinit + 0x83a92 + true + true + 0x83a92 + 0x2b + 0x1 + + + + .text + 0x83abd + true + true + 0x83abd + 0x29 + 0x1 + + + + .text:CPUTimer_selectClockSource + 0x83ae6 + true + true + 0x83ae6 + 0x28 + 0x1 + + + + .text:Flash_setBankPowerUpDelay + 0x83b0e + true + true + 0x83b0e + 0x26 + 0x1 + + + + .text + 0x83b34 + true + true + 0x83b34 + 0x20 + 0x1 + + + + .text:CPUTimer_getTimerOverflowStatus + 0x83b54 + true + true + 0x83b54 + 0x1f + 0x1 + + + + .text:Interrupt_initVectorTable + 0x83b73 + true + true + 0x83b73 + 0x1e + 0x1 + + + + .text:__relaxed_atan2f + 0x83b91 + true + true + 0x83b91 + 0x1c + 0x1 + + + + .text:SCI_isBaseValid + 0x83bad + true + true + 0x83bad + 0x1b + 0x1 + + + + .text:CPUTimer_startTimer + 0x83bc8 + true + true + 0x83bc8 + 0x1a + 0x1 + + + + .text:SysCtl_getLowSpeedClock + 0x83be2 + true + true + 0x83be2 + 0x1a + 0x1 + + + + .text:SCI_disableModule + 0x83bfc + true + true + 0x83bfc + 0x18 + 0x1 + + + + .text:SCI_performSoftwareReset + 0x83c14 + true + true + 0x83c14 + 0x18 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x83c2c + true + true + 0x83c2c + 0x17 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x83c43 + true + true + 0x83c43 + 0x17 + 0x1 + + + + .text + 0x83c5a + true + true + 0x83c5a + 0x17 + 0x1 + + + + .text:Interrupt_defaultHandler + 0x83c71 + true + true + 0x83c71 + 0x16 + 0x1 + + + + .text:CPUTimer_stopTimer + 0x83c87 + true + true + 0x83c87 + 0x14 + 0x1 + + + + .text:CPUTimer_setEmulationMode + 0x83c9b + true + true + 0x83c9b + 0x13 + 0x1 + + + + .text:SCI_enableModule + 0x83cae + true + true + 0x83cae + 0x13 + 0x1 + + + + .text:CPUTimer_clearOverflowFlag + 0x83cc1 + true + true + 0x83cc1 + 0x12 + 0x1 + + + + .text:CPUTimer_disableInterrupt + 0x83cd3 + true + true + 0x83cd3 + 0x12 + 0x1 + + + + .text + 0x83ce5 + true + true + 0x83ce5 + 0x12 + 0x1 + + + + .text + 0x83cf7 + true + true + 0x83cf7 + 0x12 + 0x1 + + + + .text:CPUTimer_setPeriod + 0x83d09 + true + true + 0x83d09 + 0x11 + 0x1 + + + + .text:Flash_isCtrlBaseValid + 0x83d1a + true + true + 0x83d1a + 0x10 + 0x1 + + + + .text:Flash_isECCBaseValid + 0x83d2a + true + true + 0x83d2a + 0x10 + 0x1 + + + + .text:SysCtl_pollCpuTimer + 0x83d3a + true + true + 0x83d3a + 0xf + 0x1 + + + + .text:GPIO_isPinValid + 0x83d49 + true + true + 0x83d49 + 0xe + 0x1 + + + + .text:Interrupt_disableGlobal + 0x83d57 + true + true + 0x83d57 + 0xd + 0x1 + + + + .text:Interrupt_enableGlobal + 0x83d64 + true + true + 0x83d64 + 0xd + 0x1 + + + + .text:SysCtl_isMCDClockFailureDetected + 0x83d71 + true + true + 0x83d71 + 0xb + 0x1 + + + + .text:__relaxed_cosf + 0x83d7c + true + true + 0x83d7c + 0xb + 0x1 + + + + .text:__relaxed_sinf + 0x83d87 + true + true + 0x83d87 + 0xb + 0x1 + + + + .text:Interrupt_illegalOperationHandler + 0x83d92 + true + true + 0x83d92 + 0xa + 0x1 + + + + .text:Interrupt_nmiHandler + 0x83d9c + true + true + 0x83d9c + 0xa + 0x1 + + + + .text:SysCtl_serviceWatchdog + 0x83da6 + true + true + 0x83da6 + 0x9 + 0x1 + + + + .text + 0x83daf + true + true + 0x83daf + 0x9 + 0x1 + + + + .text + 0x83db8 + true + true + 0x83db8 + 0x8 + 0x1 + + + + .text:decompress:none + 0x83dc0 + true + true + 0x83dc0 + 0x8 + 0x1 + + + + .text:SysCtl_resetMCD + 0x83dc8 + true + true + 0x83dc8 + 0x7 + 0x1 + + + + .text + 0x83dcf + true + true + 0x83dcf + 0x7 + 0x1 + + + + .text:decompress:ZI + 0x83dd6 + true + true + 0x83dd6 + 0x6 + 0x1 + + + + .text + 0x83ddc + true + true + 0x83ddc + 0x2 + 0x1 + + + + .text + 0x83dde + true + true + 0x83dde + 0x1 + 0x1 + + + + codestart + 0x80000 + true + true + 0x80000 + 0x2 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x2 + + + .bss + true + true + 0xadc0 + 0x2a + 0x2 + + + + .bss:plantMagVect + true + true + 0xac1e + 0xc8 + 0x2 + + + + .bss:plantPhaseVect + true + true + 0xace6 + 0xc8 + 0x2 + + + + .bss:olMagVect + true + true + 0xaa8e + 0xc8 + 0x2 + + + + .bss:olPhaseVect + true + true + 0xab56 + 0xc8 + 0x2 + + + + .bss:clMagVect + true + true + 0xa836 + 0xc8 + 0x2 + + + + .bss:clPhaseVect + true + true + 0xa8fe + 0xc8 + 0x2 + + + + .bss:freqVect + true + true + 0xa9c6 + 0xc8 + 0x2 + + + + .bss + true + true + 0xae00 + 0x22 + 0x2 + + + + .bss:SFRA_GUI_cmdPacket + true + true + 0xadae + 0x6 + 0x1 + + + + .bss:SFRA_GUI_cmdDispatcher + true + true + 0xae42 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetTxtList + true + true + 0xaee2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetBtnList + true + true + 0xaea2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetSldrList + true + true + 0xaec2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varGetList + true + true + 0xae82 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_arrayGetList + true + true + 0xae22 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_dataSetList + true + true + 0xae62 + 0x20 + 0x2 + + + + .data + 0xa832 + true + 0xa832 + 0x2 + 0x2 + + + + .data + 0xa800 + true + 0xa800 + 0x22 + 0x2 + + + + .data + 0xa822 + true + 0xa822 + 0x6 + 0x2 + + + + .data + 0xa828 + true + 0xa828 + 0x6 + 0x2 + + + + .data:_lock + 0xa82e + true + 0xa82e + 0x2 + 0x2 + + + + .data:_unlock + 0xa830 + true + 0xa830 + 0x2 + 0x2 + + + + .data + 0xa834 + true + 0xa834 + 0x1 + 0x1 + + + + .const:.string + 0x90000 + true + 0x90000 + 0xc2 + 0x2 + + + + .const:.string + 0x900c2 + true + 0x900c2 + 0xbf + 0x2 + + + + .const:.string + 0x90182 + true + 0x90182 + 0xbc + 0x2 + + + + .const:.string + 0x9023e + true + 0x9023e + 0xbb + 0x2 + + + + .const:.string + 0x902fa + true + 0x902fa + 0x7f + 0x2 + + + + .const:.string + 0x9037a + true + 0x9037a + 0x7b + 0x2 + + + + .const:.string + 0x903f6 + true + 0x903f6 + 0x62 + 0x2 + + + + .const:.string + 0x90458 + true + 0x90458 + 0x42 + 0x2 + + + + .const:.string + 0x9049a + true + 0x9049a + 0x13 + 0x2 + + + + .TI.ramfunc:Flash_initModule + 0x86000 + true + true + 0x8000 + 0x43 + 0x1 + + + + .TI.ramfunc:Flash_setBankPowerMode + 0x86043 + true + true + 0x8043 + 0x2c + 0x1 + + + + .TI.ramfunc:Flash_setWaitstates + 0x8606f + true + true + 0x806f + 0x24 + 0x1 + + + + .TI.ramfunc:Flash_setPumpPowerMode + 0x86093 + true + true + 0x8093 + 0x1d + 0x1 + + + + .TI.ramfunc:Flash_disableCache + 0x860b0 + true + true + 0x80b0 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_disablePrefetch + 0x860c8 + true + true + 0x80c8 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_enableCache + 0x860e0 + true + true + 0x80e0 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enablePrefetch + 0x860f7 + true + true + 0x80f7 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enableECC + 0x8610e + true + true + 0x810e + 0x16 + 0x1 + + + + .TI.ramfunc + 0x86124 + true + true + 0x8124 + 0x4 + 0x1 + + + + .debug_types + 0x0 + 0x0 + 0x767 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x767 + 0x767 + 0x520 + 0x0 + + + + .debug_types + 0xc87 + 0xc87 + 0x2a7 + 0x0 + + + + .debug_types + 0xf2e + 0xf2e + 0x29b + 0x0 + + + + .debug_types + 0x11c9 + 0x11c9 + 0xdc7 + 0x0 + + + + .debug_types + 0x1f90 + 0x1f90 + 0x6e + 0x0 + + + + .debug_types + 0x1ffe + 0x1ffe + 0x1d7 + 0x0 + + + + .debug_types + 0x21d5 + 0x21d5 + 0x2c4 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2499 + 0x2499 + 0x425 + 0x0 + + + + .debug_types + 0x28be + 0x28be + 0x21d + 0x0 + + + + .debug_types + 0x2adb + 0x2adb + 0x8d + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2b68 + 0x2b68 + 0x142 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2caa + 0x2caa + 0x470 + 0x0 + + + + .debug_types + 0x311a + 0x311a + 0x194 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x32ae + 0x32ae + 0x191 + 0x0 + + + + .debug_types + 0x343f + 0x343f + 0xbf + 0x0 + + + + .debug_types + 0x34fe + 0x34fe + 0x2f + 0x0 + + + + .debug_types + 0x352d + 0x352d + 0xe1 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_info + 0x0 + 0x0 + 0x1384 + 0x0 + + + + .debug_info + 0x1384 + 0x1384 + 0x17e + 0x0 + + + + .debug_info + 0x1502 + 0x1502 + 0x110 + 0x0 + + + + .debug_info + 0x1612 + 0x1612 + 0xee + 0x0 + + + + .debug_info + 0x1700 + 0x1700 + 0xf2 + 0x0 + + + + .debug_info + 0x17f2 + 0x17f2 + 0xe8 + 0x0 + + + + .debug_info + 0x18da + 0x18da + 0xec + 0x0 + + + + .debug_info + 0x19c6 + 0x19c6 + 0xe8 + 0x0 + + + + .debug_info + 0x1aae + 0x1aae + 0xec + 0x0 + + + + .debug_info + 0x1b9a + 0x1b9a + 0xe6 + 0x0 + + + + .debug_info + 0x1c80 + 0x1c80 + 0x170 + 0x0 + + + + .debug_info + 0x1df0 + 0x1df0 + 0x170 + 0x0 + + + + .debug_info + 0x1f60 + 0x1f60 + 0x190 + 0x0 + + + + .debug_info + 0x20f0 + 0x20f0 + 0x70c + 0x0 + + + + .debug_info + 0x27fc + 0x27fc + 0x1bf + 0x0 + + + + .debug_info + 0x29bb + 0x29bb + 0xe6 + 0x0 + + + + .debug_info + 0x2aa1 + 0x2aa1 + 0xe18 + 0x0 + + + + .debug_info + 0x38b9 + 0x38b9 + 0x6cd + 0x0 + + + + .debug_info + 0x3f86 + 0x3f86 + 0x111 + 0x0 + + + + .debug_info + 0x4097 + 0x4097 + 0x119 + 0x0 + + + + .debug_info + 0x41b0 + 0x41b0 + 0x119 + 0x0 + + + + .debug_info + 0x42c9 + 0x42c9 + 0x119 + 0x0 + + + + .debug_info + 0x43e2 + 0x43e2 + 0x11b + 0x0 + + + + .debug_info + 0x44fd + 0x44fd + 0x113 + 0x0 + + + + .debug_info + 0x4610 + 0x4610 + 0x117 + 0x0 + + + + .debug_info + 0x4727 + 0x4727 + 0x115 + 0x0 + + + + .debug_info + 0x483c + 0x483c + 0x1ade + 0x0 + + + + .debug_info + 0x631a + 0x631a + 0x10d + 0x0 + + + + .debug_info + 0x6427 + 0x6427 + 0x10e + 0x0 + + + + .debug_info + 0x6535 + 0x6535 + 0x158 + 0x0 + + + + .debug_info + 0x668d + 0x668d + 0x1c39 + 0x0 + + + + .debug_info + 0x82c6 + 0x82c6 + 0x219 + 0x0 + + + + .debug_info + 0x84df + 0x84df + 0x265 + 0x0 + + + + .debug_info + 0x8744 + 0x8744 + 0x21d + 0x0 + + + + .debug_info + 0x8961 + 0x8961 + 0x219 + 0x0 + + + + .debug_info + 0x8b7a + 0x8b7a + 0x279 + 0x0 + + + + .debug_info + 0x8df3 + 0x8df3 + 0x28f + 0x0 + + + + .debug_info + 0x9082 + 0x9082 + 0x26e + 0x0 + + + + .debug_info + 0x92f0 + 0x92f0 + 0x23f + 0x0 + + + + .debug_info + 0x952f + 0x952f + 0x241 + 0x0 + + + + .debug_info + 0x9770 + 0x9770 + 0x239 + 0x0 + + + + .debug_info + 0x99a9 + 0x99a9 + 0x23b + 0x0 + + + + .debug_info + 0x9be4 + 0x9be4 + 0x232 + 0x0 + + + + .debug_info + 0x9e16 + 0x9e16 + 0x27b + 0x0 + + + + .debug_info + 0xa091 + 0xa091 + 0x397 + 0x0 + + + + .debug_info + 0xa428 + 0xa428 + 0x205 + 0x0 + + + + .debug_info + 0xa62d + 0xa62d + 0x27d + 0x0 + + + + .debug_info + 0xa8aa + 0xa8aa + 0x266 + 0x0 + + + + .debug_info + 0xab10 + 0xab10 + 0x2ae + 0x0 + + + + .debug_info + 0xadbe + 0xadbe + 0x296 + 0x0 + + + + .debug_info + 0xb054 + 0xb054 + 0x24f + 0x0 + + + + .debug_info + 0xb2a3 + 0xb2a3 + 0x1fe + 0x0 + + + + .debug_info + 0xb4a1 + 0xb4a1 + 0x200 + 0x0 + + + + .debug_info + 0xb6a1 + 0xb6a1 + 0x20f + 0x0 + + + + .debug_info + 0xb8b0 + 0xb8b0 + 0x21c + 0x0 + + + + .debug_info + 0xbacc + 0xbacc + 0x202 + 0x0 + + + + .debug_info + 0xbcce + 0xbcce + 0x1e8 + 0x0 + + + + .debug_info + 0xbeb6 + 0xbeb6 + 0x20c + 0x0 + + + + .debug_info + 0xc0c2 + 0xc0c2 + 0x2b3 + 0x0 + + + + .debug_info + 0xc375 + 0xc375 + 0x205 + 0x0 + + + + .debug_info + 0xc57a + 0xc57a + 0x225 + 0x0 + + + + .debug_info + 0xc79f + 0xc79f + 0x227 + 0x0 + + + + .debug_info + 0xc9c6 + 0xc9c6 + 0x235 + 0x0 + + + + .debug_info + 0xcbfb + 0xcbfb + 0x2b5 + 0x0 + + + + .debug_info + 0xceb0 + 0xceb0 + 0x23e + 0x0 + + + + .debug_info + 0xd0ee + 0xd0ee + 0x268 + 0x0 + + + + .debug_info + 0xd356 + 0xd356 + 0x1f2 + 0x0 + + + + .debug_info + 0xd548 + 0xd548 + 0x20e + 0x0 + + + + .debug_info + 0xd756 + 0xd756 + 0x1e4 + 0x0 + + + + .debug_info + 0xd93a + 0xd93a + 0x217 + 0x0 + + + + .debug_info + 0xdb51 + 0xdb51 + 0x244 + 0x0 + + + + .debug_info + 0xdd95 + 0xdd95 + 0x242 + 0x0 + + + + .debug_info + 0xdfd7 + 0xdfd7 + 0x24a + 0x0 + + + + .debug_info + 0xe221 + 0xe221 + 0x24d + 0x0 + + + + .debug_info + 0xe46e + 0xe46e + 0x24e + 0x0 + + + + .debug_info + 0xe6bc + 0xe6bc + 0x258 + 0x0 + + + + .debug_info + 0xe914 + 0xe914 + 0x27c + 0x0 + + + + .debug_info + 0xeb90 + 0xeb90 + 0x241 + 0x0 + + + + .debug_info + 0xedd1 + 0xedd1 + 0x277 + 0x0 + + + + .debug_info + 0xf048 + 0xf048 + 0x519 + 0x0 + + + + .debug_info + 0xf561 + 0xf561 + 0x3ba + 0x0 + + + + .debug_info + 0xf91b + 0xf91b + 0x243 + 0x0 + + + + .debug_info + 0xfb5e + 0xfb5e + 0x251 + 0x0 + + + + .debug_info + 0xfdaf + 0xfdaf + 0x241 + 0x0 + + + + .debug_info + 0xfff0 + 0xfff0 + 0x1a8 + 0x0 + + + + .debug_info + 0x10198 + 0x10198 + 0x163 + 0x0 + + + + .debug_info + 0x102fb + 0x102fb + 0x179 + 0x0 + + + + .debug_info + 0x10474 + 0x10474 + 0x141 + 0x0 + + + + .debug_info + 0x105b5 + 0x105b5 + 0x110 + 0x0 + + + + .debug_info + 0x106c5 + 0x106c5 + 0x184 + 0x0 + + + + .debug_info + 0x10849 + 0x10849 + 0x136 + 0x0 + + + + .debug_info + 0x1097f + 0x1097f + 0x1a8 + 0x0 + + + + .debug_info + 0x10b27 + 0x10b27 + 0x188 + 0x0 + + + + .debug_info + 0x10caf + 0x10caf + 0x1a0 + 0x0 + + + + .debug_info + 0x10e4f + 0x10e4f + 0x1f5 + 0x0 + + + + .debug_info + 0x11044 + 0x11044 + 0x187 + 0x0 + + + + .debug_info + 0x111cb + 0x111cb + 0x192 + 0x0 + + + + .debug_info + 0x1135d + 0x1135d + 0xf0 + 0x0 + + + + .debug_info + 0x1144d + 0x1144d + 0xf4 + 0x0 + + + + .debug_info + 0x11541 + 0x11541 + 0x1ec + 0x0 + + + + .debug_info + 0x1172d + 0x1172d + 0x156 + 0x0 + + + + .debug_info + 0x11883 + 0x11883 + 0x1db + 0x0 + + + + .debug_info + 0x11a5e + 0x11a5e + 0xef + 0x0 + + + + .debug_info + 0x11b4d + 0x11b4d + 0x130 + 0x0 + + + + .debug_info + 0x11c7d + 0x11c7d + 0xad + 0x0 + + + .debug_line + 0x0 + 0x0 + 0x3dc + 0x0 + + + + .debug_line + 0x3dc + 0x3dc + 0xe9 + 0x0 + + + + .debug_line + 0x4c5 + 0x4c5 + 0x50 + 0x0 + + + + .debug_line + 0x515 + 0x515 + 0x21 + 0x0 + + + + .debug_line + 0x536 + 0x536 + 0x33 + 0x0 + + + + .debug_line + 0x569 + 0x569 + 0x33 + 0x0 + + + + .debug_line + 0x59c + 0x59c + 0x33 + 0x0 + + + + .debug_line + 0x5cf + 0x5cf + 0x33 + 0x0 + + + + .debug_line + 0x602 + 0x602 + 0x33 + 0x0 + + + + .debug_line + 0x635 + 0x635 + 0x33 + 0x0 + + + + .debug_line + 0x668 + 0x668 + 0x33 + 0x0 + + + + .debug_line + 0x69b + 0x69b + 0x33 + 0x0 + + + + .debug_line + 0x6ce + 0x6ce + 0x83 + 0x0 + + + + .debug_line + 0x751 + 0x751 + 0x83 + 0x0 + + + + .debug_line + 0x7d4 + 0x7d4 + 0x83 + 0x0 + + + + .debug_line + 0x857 + 0x857 + 0x1ca + 0x0 + + + + .debug_line + 0xa21 + 0xa21 + 0x4c + 0x0 + + + + .debug_line + 0xa6d + 0xa6d + 0xa4 + 0x0 + + + + .debug_line + 0xb11 + 0xb11 + 0x37 + 0x0 + + + + .debug_line + 0xb48 + 0xb48 + 0x308 + 0x0 + + + + .debug_line + 0xe50 + 0xe50 + 0xe6 + 0x0 + + + + .debug_line + 0xf36 + 0xf36 + 0x4a + 0x0 + + + + .debug_line + 0xf80 + 0xf80 + 0x4a + 0x0 + + + + .debug_line + 0xfca + 0xfca + 0x4a + 0x0 + + + + .debug_line + 0x1014 + 0x1014 + 0x4a + 0x0 + + + + .debug_line + 0x105e + 0x105e + 0x4a + 0x0 + + + + .debug_line + 0x10a8 + 0x10a8 + 0x4a + 0x0 + + + + .debug_line + 0x10f2 + 0x10f2 + 0x4a + 0x0 + + + + .debug_line + 0x113c + 0x113c + 0x4a + 0x0 + + + + .debug_line + 0x1186 + 0x1186 + 0x4a + 0x0 + + + + .debug_line + 0x11d0 + 0x11d0 + 0x69f + 0x0 + + + + .debug_line + 0x186f + 0x186f + 0xa4 + 0x0 + + + + .debug_line + 0x1913 + 0x1913 + 0x55 + 0x0 + + + + .debug_line + 0x1968 + 0x1968 + 0x5d + 0x0 + + + + .debug_line + 0x19c5 + 0x19c5 + 0x37 + 0x0 + + + + .debug_line + 0x19fc + 0x19fc + 0x3e1 + 0x0 + + + + .debug_line + 0x1ddd + 0x1ddd + 0xfd + 0x0 + + + + .debug_line + 0x1eda + 0x1eda + 0x9c + 0x0 + + + + .debug_line + 0x1f76 + 0x1f76 + 0x9e + 0x0 + + + + .debug_line + 0x2014 + 0x2014 + 0xe8 + 0x0 + + + + .debug_line + 0x20fc + 0x20fc + 0x99 + 0x0 + + + + .debug_line + 0x2195 + 0x2195 + 0x99 + 0x0 + + + + .debug_line + 0x222e + 0x222e + 0x9d + 0x0 + + + + .debug_line + 0x22cb + 0x22cb + 0x9c + 0x0 + + + + .debug_line + 0x2367 + 0x2367 + 0x9c + 0x0 + + + + .debug_line + 0x2403 + 0x2403 + 0x9c + 0x0 + + + + .debug_line + 0x249f + 0x249f + 0x9c + 0x0 + + + + .debug_line + 0x253b + 0x253b + 0x9c + 0x0 + + + + .debug_line + 0x25d7 + 0x25d7 + 0x9c + 0x0 + + + + .debug_line + 0x2673 + 0x2673 + 0x9c + 0x0 + + + + .debug_line + 0x270f + 0x270f + 0x9d + 0x0 + + + + .debug_line + 0x27ac + 0x27ac + 0xa4 + 0x0 + + + + .debug_line + 0x2850 + 0x2850 + 0xe5 + 0x0 + + + + .debug_line + 0x2935 + 0x2935 + 0x98 + 0x0 + + + + .debug_line + 0x29cd + 0x29cd + 0xa2 + 0x0 + + + + .debug_line + 0x2a6f + 0x2a6f + 0xb1 + 0x0 + + + + .debug_line + 0x2b20 + 0x2b20 + 0x9f + 0x0 + + + + .debug_line + 0x2bbf + 0x2bbf + 0x9f + 0x0 + + + + .debug_line + 0x2c5e + 0x2c5e + 0x9f + 0x0 + + + + .debug_line + 0x2cfd + 0x2cfd + 0xe4 + 0x0 + + + + .debug_line + 0x2de1 + 0x2de1 + 0x9d + 0x0 + + + + .debug_line + 0x2e7e + 0x2e7e + 0x9d + 0x0 + + + + .debug_line + 0x2f1b + 0x2f1b + 0xb8 + 0x0 + + + + .debug_line + 0x2fd3 + 0x2fd3 + 0xa3 + 0x0 + + + + .debug_line + 0x3076 + 0x3076 + 0x9b + 0x0 + + + + .debug_line + 0x3111 + 0x3111 + 0x9b + 0x0 + + + + .debug_line + 0x31ac + 0x31ac + 0xb1 + 0x0 + + + + .debug_line + 0x325d + 0x325d + 0xb1 + 0x0 + + + + .debug_line + 0x330e + 0x330e + 0x21 + 0x0 + + + + .debug_line + 0x332f + 0x332f + 0x97 + 0x0 + + + + .debug_line + 0x33c6 + 0x33c6 + 0x98 + 0x0 + + + + .debug_line + 0x345e + 0x345e + 0x99 + 0x0 + + + + .debug_line + 0x34f7 + 0x34f7 + 0x99 + 0x0 + + + + .debug_line + 0x3590 + 0x3590 + 0x9e + 0x0 + + + + .debug_line + 0x362e + 0x362e + 0xb3 + 0x0 + + + + .debug_line + 0x36e1 + 0x36e1 + 0xa7 + 0x0 + + + + .debug_line + 0x3788 + 0x3788 + 0xe3 + 0x0 + + + + .debug_line + 0x386b + 0x386b + 0x9d + 0x0 + + + + .debug_line + 0x3908 + 0x3908 + 0x9a + 0x0 + + + + .debug_line + 0x39a2 + 0x39a2 + 0x9c + 0x0 + + + + .debug_line + 0x3a3e + 0x3a3e + 0x9c + 0x0 + + + + .debug_line + 0x3ada + 0x3ada + 0x9d + 0x0 + + + + .debug_line + 0x3b77 + 0x3b77 + 0x9d + 0x0 + + + + .debug_line + 0x3c14 + 0x3c14 + 0xa1 + 0x0 + + + + .debug_line + 0x3cb5 + 0x3cb5 + 0xa2 + 0x0 + + + + .debug_line + 0x3d57 + 0x3d57 + 0x9d + 0x0 + + + + .debug_line + 0x3df4 + 0x3df4 + 0x9d + 0x0 + + + + .debug_line + 0x3e91 + 0x3e91 + 0xa7 + 0x0 + + + + .debug_line + 0x3f38 + 0x3f38 + 0xa1 + 0x0 + + + + .debug_line + 0x3fd9 + 0x3fd9 + 0xb4 + 0x0 + + + + .debug_line + 0x408d + 0x408d + 0x19e + 0x0 + + + + .debug_line + 0x422b + 0x422b + 0xd2 + 0x0 + + + + .debug_line + 0x42fd + 0x42fd + 0xbe + 0x0 + + + + .debug_line + 0x43bb + 0x43bb + 0xa1 + 0x0 + + + + .debug_line + 0x445c + 0x445c + 0xc7 + 0x0 + + + + .debug_line + 0x4523 + 0x4523 + 0x14b + 0x0 + + + + .debug_line + 0x466e + 0x466e + 0xb9 + 0x0 + + + + .debug_line + 0x4727 + 0x4727 + 0x21 + 0x0 + + + + .debug_line + 0x4748 + 0x4748 + 0x7e + 0x0 + + + + .debug_line + 0x47c6 + 0x47c6 + 0x21 + 0x0 + + + + .debug_line + 0x47e7 + 0x47e7 + 0x68 + 0x0 + + + + .debug_line + 0x484f + 0x484f + 0x21 + 0x0 + + + + .debug_line + 0x4870 + 0x4870 + 0x4f + 0x0 + + + + .debug_line + 0x48bf + 0x48bf + 0xae + 0x0 + + + + .debug_line + 0x496d + 0x496d + 0x57 + 0x0 + + + + .debug_line + 0x49c4 + 0x49c4 + 0x21 + 0x0 + + + + .debug_line + 0x49e5 + 0x49e5 + 0x3f + 0x0 + + + + .debug_line + 0x4a24 + 0x4a24 + 0x21 + 0x0 + + + + .debug_line + 0x4a45 + 0x4a45 + 0x74 + 0x0 + + + + .debug_line + 0x4ab9 + 0x4ab9 + 0x21 + 0x0 + + + + .debug_line + 0x4ada + 0x4ada + 0x52 + 0x0 + + + + .debug_line + 0x4b2c + 0x4b2c + 0x21 + 0x0 + + + + .debug_line + 0x4b4d + 0x4b4d + 0x57 + 0x0 + + + + .debug_line + 0x4ba4 + 0x4ba4 + 0x21 + 0x0 + + + + .debug_line + 0x4bc5 + 0x4bc5 + 0x9a + 0x0 + + + + .debug_line + 0x4c5f + 0x4c5f + 0x21 + 0x0 + + + + .debug_line + 0x4c80 + 0x4c80 + 0x2b + 0x0 + + + + .debug_line + 0x4cab + 0x4cab + 0x66 + 0x0 + + + + .debug_line + 0x4d11 + 0x4d11 + 0x21 + 0x0 + + + + .debug_line + 0x4d32 + 0x4d32 + 0x2c + 0x0 + + + + .debug_line + 0x4d5e + 0x4d5e + 0x2c + 0x0 + + + + .debug_line + 0x4d8a + 0x4d8a + 0x5f + 0x0 + + + + .debug_line + 0x4de9 + 0x4de9 + 0x21 + 0x0 + + + + .debug_line + 0x4e0a + 0x4e0a + 0x50 + 0x0 + + + + .debug_line + 0x4e5a + 0x4e5a + 0x30 + 0x0 + + + + .debug_line + 0x4e8a + 0x4e8a + 0x99 + 0x0 + + + + .debug_line + 0x4f23 + 0x4f23 + 0x21 + 0x0 + + + + .debug_line + 0x4f44 + 0x4f44 + 0x2c + 0x0 + + + + .debug_line + 0x4f70 + 0x4f70 + 0x21 + 0x0 + + + + .debug_line + 0x4f91 + 0x4f91 + 0x3b + 0x0 + + + + .debug_line + 0x4fcc + 0x4fcc + 0x21 + 0x0 + + + + .debug_frame + 0x0 + 0x0 + 0x2d0 + 0x4 + + + + .debug_frame + 0x2d0 + 0x2d0 + 0x40 + 0x4 + + + + .debug_frame + 0x310 + 0x310 + 0x44 + 0x4 + + + + .debug_frame + 0x354 + 0x354 + 0x44 + 0x4 + + + + .debug_frame + 0x398 + 0x398 + 0x44 + 0x4 + + + + .debug_frame + 0x3dc + 0x3dc + 0x104 + 0x4 + + + + .debug_frame + 0x4e0 + 0x4e0 + 0xb4 + 0x4 + + + + .debug_frame + 0x594 + 0x594 + 0x160 + 0x4 + + + + .debug_frame + 0x6f4 + 0x6f4 + 0x384 + 0x4 + + + + .debug_frame + 0xa78 + 0xa78 + 0x21c + 0x4 + + + + .debug_frame + 0xc94 + 0xc94 + 0x44 + 0x4 + + + + .debug_frame + 0xcd8 + 0xcd8 + 0x44 + 0x4 + + + + .debug_frame + 0xd1c + 0xd1c + 0x44 + 0x4 + + + + .debug_frame + 0xd60 + 0xd60 + 0x44 + 0x4 + + + + .debug_frame + 0xda4 + 0xda4 + 0x44 + 0x4 + + + + .debug_frame + 0xde8 + 0xde8 + 0x44 + 0x4 + + + + .debug_frame + 0xe2c + 0xe2c + 0x44 + 0x4 + + + + .debug_frame + 0xe70 + 0xe70 + 0x44 + 0x4 + + + + .debug_frame + 0xeb4 + 0xeb4 + 0x44 + 0x4 + + + + .debug_frame + 0xef8 + 0xef8 + 0x44 + 0x4 + + + + .debug_frame + 0xf3c + 0xf3c + 0x44 + 0x4 + + + + .debug_frame + 0xf80 + 0xf80 + 0x44 + 0x4 + + + + .debug_frame + 0xfc4 + 0xfc4 + 0x44 + 0x4 + + + + .debug_frame + 0x1008 + 0x1008 + 0x44 + 0x4 + + + + .debug_frame + 0x104c + 0x104c + 0x44 + 0x4 + + + + .debug_frame + 0x1090 + 0x1090 + 0x44 + 0x4 + + + + .debug_frame + 0x10d4 + 0x10d4 + 0x44 + 0x4 + + + + .debug_frame + 0x1118 + 0x1118 + 0x44 + 0x4 + + + + .debug_frame + 0x115c + 0x115c + 0x44 + 0x4 + + + + .debug_frame + 0x11a0 + 0x11a0 + 0x44 + 0x4 + + + + .debug_frame + 0x11e4 + 0x11e4 + 0x40 + 0x4 + + + + .debug_frame + 0x1224 + 0x1224 + 0x40 + 0x4 + + + + .debug_frame + 0x1264 + 0x1264 + 0x40 + 0x4 + + + + .debug_frame + 0x12a4 + 0x12a4 + 0x4c + 0x4 + + + + .debug_frame + 0x12f0 + 0x12f0 + 0x48 + 0x4 + + + + .debug_frame + 0x1338 + 0x1338 + 0x48 + 0x4 + + + + .debug_frame + 0x1380 + 0x1380 + 0x44 + 0x4 + + + + .debug_frame + 0x13c4 + 0x13c4 + 0x44 + 0x4 + + + + .debug_frame + 0x1408 + 0x1408 + 0x44 + 0x4 + + + + .debug_frame + 0x144c + 0x144c + 0x44 + 0x4 + + + + .debug_frame + 0x1490 + 0x1490 + 0x44 + 0x4 + + + + .debug_frame + 0x14d4 + 0x14d4 + 0x44 + 0x4 + + + + .debug_frame + 0x1518 + 0x1518 + 0x44 + 0x4 + + + + .debug_frame + 0x155c + 0x155c + 0x44 + 0x4 + + + + .debug_frame + 0x15a0 + 0x15a0 + 0x44 + 0x4 + + + + .debug_frame + 0x15e4 + 0x15e4 + 0x40 + 0x4 + + + + .debug_frame + 0x1624 + 0x1624 + 0x40 + 0x4 + + + + .debug_frame + 0x1664 + 0x1664 + 0x40 + 0x4 + + + + .debug_frame + 0x16a4 + 0x16a4 + 0x44 + 0x4 + + + + .debug_frame + 0x16e8 + 0x16e8 + 0x44 + 0x4 + + + + .debug_frame + 0x172c + 0x172c + 0x44 + 0x4 + + + + .debug_frame + 0x1770 + 0x1770 + 0x44 + 0x4 + + + + .debug_frame + 0x17b4 + 0x17b4 + 0x44 + 0x4 + + + + .debug_frame + 0x17f8 + 0x17f8 + 0x44 + 0x4 + + + + .debug_frame + 0x183c + 0x183c + 0x44 + 0x4 + + + + .debug_frame + 0x1880 + 0x1880 + 0x44 + 0x4 + + + + .debug_frame + 0x18c4 + 0x18c4 + 0x40 + 0x4 + + + + .debug_frame + 0x1904 + 0x1904 + 0x44 + 0x4 + + + + .debug_frame + 0x1948 + 0x1948 + 0x50 + 0x4 + + + + .debug_frame + 0x1998 + 0x1998 + 0x44 + 0x4 + + + + .debug_frame + 0x19dc + 0x19dc + 0x44 + 0x4 + + + + .debug_frame + 0x1a20 + 0x1a20 + 0x44 + 0x4 + + + + .debug_frame + 0x1a64 + 0x1a64 + 0x44 + 0x4 + + + + .debug_frame + 0x1aa8 + 0x1aa8 + 0x70 + 0x4 + + + + .debug_frame + 0x1b18 + 0x1b18 + 0x44 + 0x4 + + + + .debug_frame + 0x1b5c + 0x1b5c + 0x50 + 0x4 + + + + .debug_frame + 0x1bac + 0x1bac + 0x40 + 0x4 + + + + .debug_frame + 0x1bec + 0x1bec + 0x40 + 0x4 + + + + .debug_frame + 0x1c2c + 0x1c2c + 0x58 + 0x4 + + + + .debug_frame + 0x1c84 + 0x1c84 + 0x40 + 0x4 + + + + .debug_frame + 0x1cc4 + 0x1cc4 + 0x40 + 0x4 + + + + .debug_frame + 0x1d04 + 0x1d04 + 0x40 + 0x4 + + + + .debug_frame + 0x1d44 + 0x1d44 + 0x60 + 0x4 + + + + .debug_frame + 0x1da4 + 0x1da4 + 0x70 + 0x4 + + + + .debug_frame + 0x1e14 + 0x1e14 + 0x40 + 0x4 + + + + .debug_frame + 0x1e54 + 0x1e54 + 0x40 + 0x4 + + + + .debug_frame + 0x1e94 + 0x1e94 + 0x40 + 0x4 + + + + .debug_abbrev + 0x0 + 0x0 + 0xf0 + 0x0 + + + + .debug_abbrev + 0xf0 + 0xf0 + 0x76 + 0x0 + + + + .debug_abbrev + 0x166 + 0x166 + 0x48 + 0x0 + + + + .debug_abbrev + 0x1ae + 0x1ae + 0x1c + 0x0 + + + + .debug_abbrev + 0x1ca + 0x1ca + 0x28 + 0x0 + + + + .debug_abbrev + 0x1f2 + 0x1f2 + 0x28 + 0x0 + + + + .debug_abbrev + 0x21a + 0x21a + 0x28 + 0x0 + + + + .debug_abbrev + 0x242 + 0x242 + 0x28 + 0x0 + + + + .debug_abbrev + 0x26a + 0x26a + 0x28 + 0x0 + + + + .debug_abbrev + 0x292 + 0x292 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2ba + 0x2ba + 0x28 + 0x0 + + + + .debug_abbrev + 0x2e2 + 0x2e2 + 0x28 + 0x0 + + + + .debug_abbrev + 0x30a + 0x30a + 0x5e + 0x0 + + + + .debug_abbrev + 0x368 + 0x368 + 0x5e + 0x0 + + + + .debug_abbrev + 0x3c6 + 0x3c6 + 0x5e + 0x0 + + + + .debug_abbrev + 0x424 + 0x424 + 0xcf + 0x0 + + + + .debug_abbrev + 0x4f3 + 0x4f3 + 0x6f + 0x0 + + + + .debug_abbrev + 0x562 + 0x562 + 0x90 + 0x0 + + + + .debug_abbrev + 0x5f2 + 0x5f2 + 0x26 + 0x0 + + + + .debug_abbrev + 0x618 + 0x618 + 0x101 + 0x0 + + + + .debug_abbrev + 0x719 + 0x719 + 0x67 + 0x0 + + + + .debug_abbrev + 0x780 + 0x780 + 0x28 + 0x0 + + + + .debug_abbrev + 0x7a8 + 0x7a8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x7d0 + 0x7d0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x7f8 + 0x7f8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x820 + 0x820 + 0x28 + 0x0 + + + + .debug_abbrev + 0x848 + 0x848 + 0x28 + 0x0 + + + + .debug_abbrev + 0x870 + 0x870 + 0x28 + 0x0 + + + + .debug_abbrev + 0x898 + 0x898 + 0x28 + 0x0 + + + + .debug_abbrev + 0x8c0 + 0x8c0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x8e8 + 0x8e8 + 0x103 + 0x0 + + + + .debug_abbrev + 0x9eb + 0x9eb + 0xb3 + 0x0 + + + + .debug_abbrev + 0xa9e + 0xa9e + 0x25 + 0x0 + + + + .debug_abbrev + 0xac3 + 0xac3 + 0x25 + 0x0 + + + + .debug_abbrev + 0xae8 + 0xae8 + 0x28 + 0x0 + + + + .debug_abbrev + 0xb10 + 0xb10 + 0xf4 + 0x0 + + + + .debug_abbrev + 0xc04 + 0xc04 + 0xa5 + 0x0 + + + + .debug_abbrev + 0xca9 + 0xca9 + 0x5c + 0x0 + + + + .debug_abbrev + 0xd05 + 0xd05 + 0x6a + 0x0 + + + + .debug_abbrev + 0xd6f + 0xd6f + 0x71 + 0x0 + + + + .debug_abbrev + 0xde0 + 0xde0 + 0x5c + 0x0 + + + + .debug_abbrev + 0xe3c + 0xe3c + 0x5c + 0x0 + + + + .debug_abbrev + 0xe98 + 0xe98 + 0x68 + 0x0 + + + + .debug_abbrev + 0xf00 + 0xf00 + 0x68 + 0x0 + + + + .debug_abbrev + 0xf68 + 0xf68 + 0x68 + 0x0 + + + + .debug_abbrev + 0xfd0 + 0xfd0 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1038 + 0x1038 + 0x68 + 0x0 + + + + .debug_abbrev + 0x10a0 + 0x10a0 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1108 + 0x1108 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1170 + 0x1170 + 0x68 + 0x0 + + + + .debug_abbrev + 0x11d8 + 0x11d8 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1240 + 0x1240 + 0x6a + 0x0 + + + + .debug_abbrev + 0x12aa + 0x12aa + 0x62 + 0x0 + + + + .debug_abbrev + 0x130c + 0x130c + 0x5c + 0x0 + + + + .debug_abbrev + 0x1368 + 0x1368 + 0x6a + 0x0 + + + + .debug_abbrev + 0x13d2 + 0x13d2 + 0x6a + 0x0 + + + + .debug_abbrev + 0x143c + 0x143c + 0x6a + 0x0 + + + + .debug_abbrev + 0x14a6 + 0x14a6 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1510 + 0x1510 + 0x5c + 0x0 + + + + .debug_abbrev + 0x156c + 0x156c + 0x69 + 0x0 + + + + .debug_abbrev + 0x15d5 + 0x15d5 + 0x46 + 0x0 + + + + .debug_abbrev + 0x161b + 0x161b + 0x46 + 0x0 + + + + .debug_abbrev + 0x1661 + 0x1661 + 0x54 + 0x0 + + + + .debug_abbrev + 0x16b5 + 0x16b5 + 0x48 + 0x0 + + + + .debug_abbrev + 0x16fd + 0x16fd + 0x3b + 0x0 + + + + .debug_abbrev + 0x1738 + 0x1738 + 0x3b + 0x0 + + + + .debug_abbrev + 0x1773 + 0x1773 + 0x51 + 0x0 + + + + .debug_abbrev + 0x17c4 + 0x17c4 + 0x6a + 0x0 + + + + .debug_abbrev + 0x182e + 0x182e + 0x44 + 0x0 + + + + .debug_abbrev + 0x1872 + 0x1872 + 0x5c + 0x0 + + + + .debug_abbrev + 0x18ce + 0x18ce + 0x68 + 0x0 + + + + .debug_abbrev + 0x1936 + 0x1936 + 0x68 + 0x0 + + + + .debug_abbrev + 0x199e + 0x199e + 0x68 + 0x0 + + + + .debug_abbrev + 0x1a06 + 0x1a06 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1a70 + 0x1a70 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1ada + 0x1ada + 0x6a + 0x0 + + + + .debug_abbrev + 0x1b44 + 0x1b44 + 0x62 + 0x0 + + + + .debug_abbrev + 0x1ba6 + 0x1ba6 + 0x44 + 0x0 + + + + .debug_abbrev + 0x1bea + 0x1bea + 0x46 + 0x0 + + + + .debug_abbrev + 0x1c30 + 0x1c30 + 0x44 + 0x0 + + + + .debug_abbrev + 0x1c74 + 0x1c74 + 0x5c + 0x0 + + + + .debug_abbrev + 0x1cd0 + 0x1cd0 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1d38 + 0x1d38 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1da0 + 0x1da0 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1e08 + 0x1e08 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1e70 + 0x1e70 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1ed8 + 0x1ed8 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1f42 + 0x1f42 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1faa + 0x1faa + 0x52 + 0x0 + + + + .debug_abbrev + 0x1ffc + 0x1ffc + 0x6c + 0x0 + + + + .debug_abbrev + 0x2068 + 0x2068 + 0x6c + 0x0 + + + + .debug_abbrev + 0x20d4 + 0x20d4 + 0x5f + 0x0 + + + + .debug_abbrev + 0x2133 + 0x2133 + 0x6a + 0x0 + + + + .debug_abbrev + 0x219d + 0x219d + 0x6c + 0x0 + + + + .debug_abbrev + 0x2209 + 0x2209 + 0x5e + 0x0 + + + + .debug_abbrev + 0x2267 + 0x2267 + 0x8f + 0x0 + + + + .debug_abbrev + 0x22f6 + 0x22f6 + 0x6f + 0x0 + + + + .debug_abbrev + 0x2365 + 0x2365 + 0x44 + 0x0 + + + + .debug_abbrev + 0x23a9 + 0x23a9 + 0x61 + 0x0 + + + + .debug_abbrev + 0x240a + 0x240a + 0x44 + 0x0 + + + + .debug_abbrev + 0x244e + 0x244e + 0x6f + 0x0 + + + + .debug_abbrev + 0x24bd + 0x24bd + 0x35 + 0x0 + + + + .debug_abbrev + 0x24f2 + 0x24f2 + 0x3d + 0x0 + + + + .debug_abbrev + 0x252f + 0x252f + 0x3b + 0x0 + + + + .debug_abbrev + 0x256a + 0x256a + 0x61 + 0x0 + + + + .debug_abbrev + 0x25cb + 0x25cb + 0x44 + 0x0 + + + + .debug_abbrev + 0x260f + 0x260f + 0x4b + 0x0 + + + + .debug_abbrev + 0x265a + 0x265a + 0x1c + 0x0 + + + + .debug_abbrev + 0x2676 + 0x2676 + 0x71 + 0x0 + + + + .debug_abbrev + 0x26e7 + 0x26e7 + 0xb3 + 0x0 + + + + .debug_abbrev + 0x279a + 0x279a + 0x6d + 0x0 + + + + .debug_abbrev + 0x2807 + 0x2807 + 0x44 + 0x0 + + + + .debug_abbrev + 0x284b + 0x284b + 0x6d + 0x0 + + + + .debug_abbrev + 0x28b8 + 0x28b8 + 0x44 + 0x0 + + + + .debug_abbrev + 0x28fc + 0x28fc + 0x5f + 0x0 + + + + .debug_abbrev + 0x295b + 0x295b + 0x44 + 0x0 + + + + .debug_abbrev + 0x299f + 0x299f + 0x28 + 0x0 + + + + .debug_abbrev + 0x29c7 + 0x29c7 + 0xa0 + 0x0 + + + + .debug_abbrev + 0x2a67 + 0x2a67 + 0x57 + 0x0 + + + + .debug_abbrev + 0x2abe + 0x2abe + 0x28 + 0x0 + + + + .debug_abbrev + 0x2ae6 + 0x2ae6 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2b0e + 0x2b0e + 0x5f + 0x0 + + + + .debug_abbrev + 0x2b6d + 0x2b6d + 0x3a + 0x0 + + + + .debug_abbrev + 0x2ba7 + 0x2ba7 + 0x64 + 0x0 + + + + .debug_abbrev + 0x2c0b + 0x2c0b + 0x79 + 0x0 + + + + .debug_abbrev + 0x2c84 + 0x2c84 + 0x61 + 0x0 + + + + .debug_abbrev + 0x2ce5 + 0x2ce5 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2d29 + 0x2d29 + 0x26 + 0x0 + + + + .debug_abbrev + 0x2d4f + 0x2d4f + 0x1c + 0x0 + + + + .debug_abbrev + 0x2d6b + 0x2d6b + 0x49 + 0x0 + + + + .debug_abbrev + 0x2db4 + 0x2db4 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2dd0 + 0x2dd0 + 0xf + 0x0 + + + .debug_str + 0x0 + 0x0 + 0x68 + 0x0 + + + + .debug_str + 0x68 + 0x68 + 0x68 + 0x0 + + + + .debug_str + 0xd0 + 0xd0 + 0x68 + 0x0 + + + + .debug_str + 0x138 + 0x138 + 0x68 + 0x0 + + + + .debug_str + 0x1a0 + 0x1a0 + 0x68 + 0x0 + + + + .debug_str + 0x208 + 0x208 + 0x68 + 0x0 + + + + .debug_str + 0x270 + 0x270 + 0x69 + 0x0 + + + + .debug_str + 0x2d9 + 0x2d9 + 0x69 + 0x0 + + + + .debug_str + 0x342 + 0x342 + 0x69 + 0x0 + + + + .debug_str + 0x3ab + 0x3ab + 0x69 + 0x0 + + + + .debug_str + 0x414 + 0x414 + 0x69 + 0x0 + + + + .debug_str + 0x47d + 0x47d + 0x69 + 0x0 + + + + .debug_str + 0x4e6 + 0x4e6 + 0x68 + 0x0 + + + + .debug_str + 0x54e + 0x54e + 0x68 + 0x0 + + + + .debug_str + 0x5b6 + 0x5b6 + 0x68 + 0x0 + + + + .debug_str + 0x61e + 0x61e + 0x68 + 0x0 + + + + .debug_str + 0x686 + 0x686 + 0x68 + 0x0 + + + + .debug_str + 0x6ee + 0x6ee + 0x68 + 0x0 + + + + .debug_str + 0x756 + 0x756 + 0x68 + 0x0 + + + + .debug_str + 0x7be + 0x7be + 0x68 + 0x0 + + + + .debug_str + 0x826 + 0x826 + 0x68 + 0x0 + + + + .debug_str + 0x88e + 0x88e + 0x68 + 0x0 + + + + .debug_str + 0x8f6 + 0x8f6 + 0x68 + 0x0 + + + + .debug_str + 0x95e + 0x95e + 0x68 + 0x0 + + + + .debug_str + 0x9c6 + 0x9c6 + 0x68 + 0x0 + + + + .debug_str + 0xa2e + 0xa2e + 0x68 + 0x0 + + + + .debug_str + 0xa96 + 0xa96 + 0x68 + 0x0 + + + + .debug_aranges + 0x0 + 0x0 + 0xe0 + 0x0 + + + + .debug_aranges + 0xe0 + 0xe0 + 0x20 + 0x0 + + + + .debug_aranges + 0x100 + 0x100 + 0x20 + 0x0 + + + + .debug_aranges + 0x120 + 0x120 + 0x20 + 0x0 + + + + .debug_aranges + 0x140 + 0x140 + 0x20 + 0x0 + + + + .debug_aranges + 0x160 + 0x160 + 0x58 + 0x0 + + + + .debug_aranges + 0x1b8 + 0x1b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x1d8 + 0x1d8 + 0x70 + 0x0 + + + + .debug_aranges + 0x248 + 0x248 + 0x120 + 0x0 + + + + .debug_aranges + 0x368 + 0x368 + 0x20 + 0x0 + + + + .debug_aranges + 0x388 + 0x388 + 0x20 + 0x0 + + + + .debug_aranges + 0x3a8 + 0x3a8 + 0xb0 + 0x0 + + + + .debug_aranges + 0x458 + 0x458 + 0x20 + 0x0 + + + + .debug_aranges + 0x478 + 0x478 + 0x20 + 0x0 + + + + .debug_aranges + 0x498 + 0x498 + 0x20 + 0x0 + + + + .debug_aranges + 0x4b8 + 0x4b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x4d8 + 0x4d8 + 0x20 + 0x0 + + + + .debug_aranges + 0x4f8 + 0x4f8 + 0x20 + 0x0 + + + + .debug_aranges + 0x518 + 0x518 + 0x20 + 0x0 + + + + .debug_aranges + 0x538 + 0x538 + 0x20 + 0x0 + + + + .debug_aranges + 0x558 + 0x558 + 0x20 + 0x0 + + + + .debug_aranges + 0x578 + 0x578 + 0x20 + 0x0 + + + + .debug_aranges + 0x598 + 0x598 + 0x20 + 0x0 + + + + .debug_aranges + 0x5b8 + 0x5b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x5d8 + 0x5d8 + 0x20 + 0x0 + + + + .debug_aranges + 0x5f8 + 0x5f8 + 0x20 + 0x0 + + + + .debug_aranges + 0x618 + 0x618 + 0x20 + 0x0 + + + + .debug_aranges + 0x638 + 0x638 + 0x20 + 0x0 + + + + .debug_aranges + 0x658 + 0x658 + 0x20 + 0x0 + + + + .debug_aranges + 0x678 + 0x678 + 0x20 + 0x0 + + + + .debug_aranges + 0x698 + 0x698 + 0x20 + 0x0 + + + + .debug_aranges + 0x6b8 + 0x6b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x6d8 + 0x6d8 + 0x20 + 0x0 + + + + .debug_aranges + 0x6f8 + 0x6f8 + 0x20 + 0x0 + + + + .debug_aranges + 0x718 + 0x718 + 0x20 + 0x0 + + + + .debug_aranges + 0x738 + 0x738 + 0x20 + 0x0 + + + + .debug_aranges + 0x758 + 0x758 + 0x20 + 0x0 + + + + .debug_aranges + 0x778 + 0x778 + 0x20 + 0x0 + + + + .debug_aranges + 0x798 + 0x798 + 0x20 + 0x0 + + + + .debug_aranges + 0x7b8 + 0x7b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x7d8 + 0x7d8 + 0x20 + 0x0 + + + + .debug_aranges + 0x7f8 + 0x7f8 + 0x20 + 0x0 + + + + .debug_aranges + 0x818 + 0x818 + 0x20 + 0x0 + + + + .debug_aranges + 0x838 + 0x838 + 0x20 + 0x0 + + + + .debug_aranges + 0x858 + 0x858 + 0x20 + 0x0 + + + + .debug_aranges + 0x878 + 0x878 + 0x20 + 0x0 + + + + .debug_aranges + 0x898 + 0x898 + 0x20 + 0x0 + + + + .debug_aranges + 0x8b8 + 0x8b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x8d8 + 0x8d8 + 0x20 + 0x0 + + + + .debug_aranges + 0x8f8 + 0x8f8 + 0x20 + 0x0 + + + + .debug_aranges + 0x918 + 0x918 + 0x20 + 0x0 + + + + .debug_aranges + 0x938 + 0x938 + 0x20 + 0x0 + + + + .debug_aranges + 0x958 + 0x958 + 0x20 + 0x0 + + + + .debug_aranges + 0x978 + 0x978 + 0x20 + 0x0 + + + + .debug_aranges + 0x998 + 0x998 + 0x20 + 0x0 + + + + .debug_aranges + 0x9b8 + 0x9b8 + 0x20 + 0x0 + + + + .debug_aranges + 0x9d8 + 0x9d8 + 0x20 + 0x0 + + + + .debug_aranges + 0x9f8 + 0x9f8 + 0x20 + 0x0 + + + + .debug_aranges + 0xa18 + 0xa18 + 0x20 + 0x0 + + + + .debug_aranges + 0xa38 + 0xa38 + 0x20 + 0x0 + + + + .debug_aranges + 0xa58 + 0xa58 + 0x20 + 0x0 + + + + .debug_aranges + 0xa78 + 0xa78 + 0x20 + 0x0 + + + + .debug_aranges + 0xa98 + 0xa98 + 0x20 + 0x0 + + + + .debug_aranges + 0xab8 + 0xab8 + 0x20 + 0x0 + + + + .debug_aranges + 0xad8 + 0xad8 + 0x20 + 0x0 + + + + .debug_aranges + 0xaf8 + 0xaf8 + 0x20 + 0x0 + + + + .debug_aranges + 0xb18 + 0xb18 + 0x20 + 0x0 + + + + .debug_aranges + 0xb38 + 0xb38 + 0x20 + 0x0 + + + + .debug_aranges + 0xb58 + 0xb58 + 0x20 + 0x0 + + + + .debug_aranges + 0xb78 + 0xb78 + 0x20 + 0x0 + + + + .debug_aranges + 0xb98 + 0xb98 + 0x20 + 0x0 + + + + .debug_aranges + 0xbb8 + 0xbb8 + 0x20 + 0x0 + + + + .debug_aranges + 0xbd8 + 0xbd8 + 0x20 + 0x0 + + + + .debug_aranges + 0xbf8 + 0xbf8 + 0x20 + 0x0 + + + + .debug_aranges + 0xc18 + 0xc18 + 0x20 + 0x0 + + + + .debug_aranges + 0xc38 + 0xc38 + 0x20 + 0x0 + + + + .debug_aranges + 0xc58 + 0xc58 + 0x28 + 0x0 + + + + .debug_aranges + 0xc80 + 0xc80 + 0x30 + 0x0 + + + + .debug_aranges + 0xcb0 + 0xcb0 + 0x20 + 0x0 + + + + .debug_aranges + 0xcd0 + 0xcd0 + 0x20 + 0x0 + + + + .debug_aranges + 0xcf0 + 0xcf0 + 0x20 + 0x0 + + + + .debug_pubnames + 0x0 + 0x0 + 0x228 + 0x0 + + + + .debug_pubnames + 0x228 + 0x228 + 0x1b + 0x0 + + + + .debug_pubnames + 0x243 + 0x243 + 0x2f + 0x0 + + + + .debug_pubnames + 0x272 + 0x272 + 0x23 + 0x0 + + + + .debug_pubnames + 0x295 + 0x295 + 0x25 + 0x0 + + + + .debug_pubnames + 0x2ba + 0x2ba + 0x20 + 0x0 + + + + .debug_pubnames + 0x2da + 0x2da + 0x22 + 0x0 + + + + .debug_pubnames + 0x2fc + 0x2fc + 0x20 + 0x0 + + + + .debug_pubnames + 0x31c + 0x31c + 0x22 + 0x0 + + + + .debug_pubnames + 0x33e + 0x33e + 0x1f + 0x0 + + + + .debug_pubnames + 0x35d + 0x35d + 0x25 + 0x0 + + + + .debug_pubnames + 0x382 + 0x382 + 0x25 + 0x0 + + + + .debug_pubnames + 0x3a7 + 0x3a7 + 0x27 + 0x0 + + + + .debug_pubnames + 0x3ce + 0x3ce + 0xc3 + 0x0 + + + + .debug_pubnames + 0x491 + 0x491 + 0x21 + 0x0 + + + + .debug_pubnames + 0x4b2 + 0x4b2 + 0x1d + 0x0 + + + + .debug_pubnames + 0x4cf + 0x4cf + 0x130 + 0x0 + + + + .debug_pubnames + 0x5ff + 0x5ff + 0x28a + 0x0 + + + + .debug_pubnames + 0x889 + 0x889 + 0x29 + 0x0 + + + + .debug_pubnames + 0x8b2 + 0x8b2 + 0x2d + 0x0 + + + + .debug_pubnames + 0x8df + 0x8df + 0x2d + 0x0 + + + + .debug_pubnames + 0x90c + 0x90c + 0x2d + 0x0 + + + + .debug_pubnames + 0x939 + 0x939 + 0x2e + 0x0 + + + + .debug_pubnames + 0x967 + 0x967 + 0x2a + 0x0 + + + + .debug_pubnames + 0x991 + 0x991 + 0x2c + 0x0 + + + + .debug_pubnames + 0x9bd + 0x9bd + 0x2b + 0x0 + + + + .debug_pubnames + 0x9e8 + 0x9e8 + 0x33e + 0x0 + + + + .debug_pubnames + 0xd26 + 0xd26 + 0x44 + 0x0 + + + + .debug_pubnames + 0xd6a + 0xd6a + 0x45 + 0x0 + + + + .debug_pubnames + 0xdaf + 0xdaf + 0x4c + 0x0 + + + + .debug_pubnames + 0xdfb + 0xdfb + 0x224 + 0x0 + + + + .debug_pubnames + 0x101f + 0x101f + 0x2b + 0x0 + + + + .debug_pubnames + 0x104a + 0x104a + 0x30 + 0x0 + + + + .debug_pubnames + 0x107a + 0x107a + 0x2c + 0x0 + + + + .debug_pubnames + 0x10a6 + 0x10a6 + 0x2b + 0x0 + + + + .debug_pubnames + 0x10d1 + 0x10d1 + 0x2a + 0x0 + + + + .debug_pubnames + 0x10fb + 0x10fb + 0x2d + 0x0 + + + + .debug_pubnames + 0x1128 + 0x1128 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1155 + 0x1155 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1180 + 0x1180 + 0x2c + 0x0 + + + + .debug_pubnames + 0x11ac + 0x11ac + 0x28 + 0x0 + + + + .debug_pubnames + 0x11d4 + 0x11d4 + 0x29 + 0x0 + + + + .debug_pubnames + 0x11fd + 0x11fd + 0x26 + 0x0 + + + + .debug_pubnames + 0x1223 + 0x1223 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1253 + 0x1253 + 0x27 + 0x0 + + + + .debug_pubnames + 0x127a + 0x127a + 0x26 + 0x0 + + + + .debug_pubnames + 0x12a0 + 0x12a0 + 0x2c + 0x0 + + + + .debug_pubnames + 0x12cc + 0x12cc + 0x28 + 0x0 + + + + .debug_pubnames + 0x12f4 + 0x12f4 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1324 + 0x1324 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1351 + 0x1351 + 0x28 + 0x0 + + + + .debug_pubnames + 0x1379 + 0x1379 + 0x2d + 0x0 + + + + .debug_pubnames + 0x13a6 + 0x13a6 + 0x2e + 0x0 + + + + .debug_pubnames + 0x13d4 + 0x13d4 + 0x2b + 0x0 + + + + .debug_pubnames + 0x13ff + 0x13ff + 0x2f + 0x0 + + + + .debug_pubnames + 0x142e + 0x142e + 0x38 + 0x0 + + + + .debug_pubnames + 0x1466 + 0x1466 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1491 + 0x1491 + 0x30 + 0x0 + + + + .debug_pubnames + 0x14c1 + 0x14c1 + 0x27 + 0x0 + + + + .debug_pubnames + 0x14e8 + 0x14e8 + 0x26 + 0x0 + + + + .debug_pubnames + 0x150e + 0x150e + 0x27 + 0x0 + + + + .debug_pubnames + 0x1535 + 0x1535 + 0x28 + 0x0 + + + + .debug_pubnames + 0x155d + 0x155d + 0x2f + 0x0 + + + + .debug_pubnames + 0x158c + 0x158c + 0x24 + 0x0 + + + + .debug_pubnames + 0x15b0 + 0x15b0 + 0x2a + 0x0 + + + + .debug_pubnames + 0x15da + 0x15da + 0x2f + 0x0 + + + + .debug_pubnames + 0x1609 + 0x1609 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1636 + 0x1636 + 0x37 + 0x0 + + + + .debug_pubnames + 0x166d + 0x166d + 0x26 + 0x0 + + + + .debug_pubnames + 0x1693 + 0x1693 + 0x2b + 0x0 + + + + .debug_pubnames + 0x16be + 0x16be + 0x31 + 0x0 + + + + .debug_pubnames + 0x16ef + 0x16ef + 0x30 + 0x0 + + + + .debug_pubnames + 0x171f + 0x171f + 0x29 + 0x0 + + + + .debug_pubnames + 0x1748 + 0x1748 + 0x2a + 0x0 + + + + .debug_pubnames + 0x1772 + 0x1772 + 0x29 + 0x0 + + + + .debug_pubnames + 0x179b + 0x179b + 0x36 + 0x0 + + + + .debug_pubnames + 0x17d1 + 0x17d1 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1802 + 0x1802 + 0x2a + 0x0 + + + + .debug_pubnames + 0x182c + 0x182c + 0x26 + 0x0 + + + + .debug_pubnames + 0x1852 + 0x1852 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1878 + 0x1878 + 0x28 + 0x0 + + + + .debug_pubnames + 0x18a0 + 0x18a0 + 0x2d + 0x0 + + + + .debug_pubnames + 0x18cd + 0x18cd + 0x2e + 0x0 + + + + .debug_pubnames + 0x18fb + 0x18fb + 0x31 + 0x0 + + + + .debug_pubnames + 0x192c + 0x192c + 0x1d + 0x0 + + + + .debug_pubnames + 0x1949 + 0x1949 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1965 + 0x1965 + 0x1b + 0x0 + + + + .debug_pubnames + 0x1980 + 0x1980 + 0x1f + 0x0 + + + + .debug_pubnames + 0x199f + 0x199f + 0x25 + 0x0 + + + + .debug_pubnames + 0x19c4 + 0x19c4 + 0x1d + 0x0 + + + + .debug_pubnames + 0x19e1 + 0x19e1 + 0x27 + 0x0 + + + + .debug_pubnames + 0x1a08 + 0x1a08 + 0x35 + 0x0 + + + + .debug_pubnames + 0x1a3d + 0x1a3d + 0x25 + 0x0 + + + + .debug_pubnames + 0x1a62 + 0x1a62 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1a8d + 0x1a8d + 0x2b + 0x0 + + + + .debug_pubnames + 0x1ab8 + 0x1ab8 + 0x5e + 0x0 + + + + .debug_pubnames + 0x1b16 + 0x1b16 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1b3b + 0x1b3b + 0x1c + 0x0 + + + + .debug_pubnames + 0x1b57 + 0x1b57 + 0x1e + 0x0 + + + + .debug_pubnames + 0x1b75 + 0x1b75 + 0x43 + 0x0 + + + + .debug_pubnames + 0x1bb8 + 0x1bb8 + 0x21 + 0x0 + + + + .debug_pubnames + 0x1bd9 + 0x1bd9 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1bf6 + 0x1bf6 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1c12 + 0x1c12 + 0x29 + 0x0 + + + + + + .cinit + 0x84000 + 0x84000 + 0x20 + + + + + + + + + .text + 0x82000 + 0x82000 + 0x1ddf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .text + + + + + + codestart + 0x80000 + 0x80000 + 0x2 + + + + + + .stack + 0x400 + 0x100 + + + + + + + .switch + 0x0 + 0x0 + + + + + .reset + 0x3fffc0 + 0x0 + + + + + .init_array + 0x0 + 0x0 + + + + + .bss + 0xa836 + 0x6cc + + + + + + + + + + + + + + + + + + + + + + .bss:output + 0x0 + 0x0 + + + + + .bss:cio + 0x0 + 0x0 + + + + + .data + 0xa800 + 0x35 + + + + + + + + + + + + .sysmem + 0x0 + 0x0 + + + + + .const + 0x90000 + 0x90000 + 0x4ad + + + + + + + + + + + + + + Filter_RegsFile + 0x0 + 0x0 + + + + + SHARERAMGS0 + 0x0 + 0x0 + + + + + SHARERAMGS1 + 0x0 + 0x0 + + + + + SHARERAMGS2 + 0x0 + 0x0 + + + + + ramgs0 + 0x0 + 0x0 + + + + + ramgs1 + 0x0 + 0x0 + + + + + .TI.ramfunc + 0x86000 + 0x8000 + 0x128 + + + + + + + + + + + + + + + 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 + 0x360e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_info + 0x0 + 0x0 + 0x11d2a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_line + 0x0 + 0x0 + 0x4fed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_frame + 0x0 + 0x0 + 0x1ed4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_abbrev + 0x0 + 0x0 + 0x2ddf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_str + 0x0 + 0x0 + 0xafe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_aranges + 0x0 + 0x0 + 0xd10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_pubnames + 0x0 + 0x0 + 0x1c3b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SEGMENT_0 + 0x80000 + 0x80000 + 0x2 + 0x5 + + + + + + SEGMENT_1 + 0x82000 + 0x82000 + 0x1ddf + 0x5 + + + + + + SEGMENT_2 + 0x84000 + 0x84000 + 0x20 + 0x4 + + + + + + SEGMENT_3 + 0x86000 + 0x8000 + 0x128 + 0x5 + + + + + + SEGMENT_4 + 0x90000 + 0x90000 + 0x4ad + 0x4 + + + + + + SEGMENT_5 + 0x400 + 0x100 + 0x6 + + + + + + SEGMENT_6 + 0xa800 + 0x35 + 0x6 + + + + + + SEGMENT_7 + 0xa836 + 0x6cc + 0x6 + + + + + + + + RAMM0 + 0x0 + 0x123 + 0x2dd + 0x0 + 0x2dd + RWIX + + + + + RAMLS0 + 0x0 + 0x8000 + 0x800 + 0x128 + 0x6d8 + RWIX + + + 0x8000 + 0x128 + + + + 0x8128 + 0x6d8 + + + + + 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 + 0x0 + 0x800 + RWIX + + + + + RAMGS14 + 0x0 + 0x1a000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS15 + 0x0 + 0x1b000 + 0xff8 + 0x0 + 0xff8 + RWIX + + + + + BEGIN + 0x0 + 0x80000 + 0x2 + 0x2 + 0x0 + RWIX + + + 0x80000 + 0x2 + + + + + + FLASHA + 0x0 + 0x80002 + 0x1ffe + 0x0 + 0x1ffe + RWIX + + + + + FLASHB + 0x0 + 0x82000 + 0x2000 + 0x1ddf + 0x221 + RWIX + + + 0x82000 + 0x1ddf + + + + 0x83ddf + 0x221 + + + + + FLASHC + 0x0 + 0x84000 + 0x2000 + 0x20 + 0x1fe0 + RWIX + + + 0x84000 + 0x20 + + + + 0x84020 + 0x1fe0 + + + + + FLASHD + 0x0 + 0x86000 + 0x2000 + 0x128 + 0x1ed8 + RWIX + + + 0x86000 + 0x128 + + + + 0x86128 + 0x1ed8 + + + + + FLASHE + 0x0 + 0x88000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHF + 0x0 + 0x90000 + 0x8000 + 0x4ad + 0x7b53 + RWIX + + + 0x90000 + 0x4ad + + + + 0x904ad + 0x7b53 + + + + + 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 + 0x701 + 0xff + RWIX + + + 0xa800 + 0x35 + + + + 0xa835 + 0x1 + + + 0xa836 + 0x6cc + + + + 0xaf02 + 0xfe + + + + + 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 + + + + + CPU2TOCPU1RAM + 0x1 + 0x3f800 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CPU1TOCPU2RAM + 0x1 + 0x3fc00 + 0x400 + 0x0 + 0x400 + RWIX + + + + + + + __TI_cinit_table + + .data + 0x84000 + 0xe + 0xa800 + 0x35 + lzss + + + .bss + 0x84014 + 0x4 + 0xa836 + 0x6cc + zero_init + + + + + __TI_handler_table + + 0x0 + __TI_zero_init + + + 0x1 + __TI_decompress_lzss + + + 0x2 + __TI_decompress_none + + + + + RamfuncsLoadStart + 0x86000 + + + RamfuncsLoadSize + 0x128 + + + RamfuncsLoadEnd + 0x86128 + + + RamfuncsRunStart + 0x8000 + + + RamfuncsRunSize + 0x128 + + + RamfuncsRunEnd + 0x8128 + + + __TI_CINIT_Base + 0x84018 + + + __TI_CINIT_Limit + 0x84020 + + + __TI_CINIT_Warm + 0x84020 + + + __TI_Handler_Table_Base + 0x8400e + + + __TI_Handler_Table_Limit + 0x84014 + + + __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 + + + INTERRUPT_init + 0x8307d + + + + PinMux_init + 0x8301f + + + + SCI_init + 0x8308a + + + + Board_init + 0x83012 + + + + GPIO_init + 0x83066 + + + + mySCI0_init + 0x8308d + + + + CPUTIMER_init + 0x83043 + + + + myCPUTIMER0_init + 0x83046 + + + + LED_Blue_init + 0x83069 + + + + main + 0x83ce5 + + + + plantPhaseVect + 0xace6 + + + + __relaxed_sinf + 0x83d87 + + + + clPhaseVect + 0xa8fe + + + + sfra_task_run + 0x83402 + + + + olPhaseVect + 0xab56 + + + + sfra_init + 0x8338c + + + + ti_sfra + 0xadca + + + + lowPass_test + 0xadc0 + + + + plantMagVect + 0xac1e + + + + __relaxed_cosf + 0x83d7c + + + + freqVect + 0xa9c6 + + + + olMagVect + 0xaa8e + + + + __relaxed_atan2f + 0x83b91 + + + + clMagVect + 0xa836 + + + + TIMER0_ISR + 0x8380d + + + + SFRA_F32_updateInjectionAmplitude + 0x82292 + + + + SFRA_F32_resetFreqRespArray + 0x8221e + + + + SFRA_F32_config + 0x82153 + + + + SFRA_F32_initFreqArrayWithLogSteps + 0x821da + + + + SFRA_F32_reset + 0x8210f + + + + __SFRA_F32_inject + 0x822a3 + + + + __SFRA_F32_collect + 0x822d0 + + + + SFRA_F32_runBackgroundTask + 0x82340 + + + + SFRA_GUI_varGetList + 0xae82 + + + + SFRA_GUI_rcvTaskPointer + 0xae12 + + + + SFRA_GUI_cmdInterpreter + 0x828de + + + + SFRA_GUI_commsOKflg + 0xae00 + + + + SFRA_GUI_memDataPtr16 + 0xae18 + + + + SFRA_GUI_getVariable + 0x8296d + + + + SFRA_GUI_runSerialHostComms + 0x827e3 + + + + SFRA_GUI_rxChar + 0xae04 + + + + SFRA_GUI_lowByteFlag + 0xae02 + + + + SFRA_GUI_memDataPtr32 + 0xae1a + + + + SFRA_GUI_varSetBtnList + 0xaea2 + + + + SFRA_GUI_getData + 0x82973 + + + + SFRA_GUI_config + 0x826d1 + + + + SFRA_GUI_led_gpio + 0xae10 + + + + SFRA_GUI_delayer + 0xae0b + + + + SFRA_GUI_sendTaskPtr + 0xae03 + + + + SFRA_GUI_getCmdByte + 0x827f7 + + + + SFRA_GUI_echoCmdByte + 0x82839 + + + + SFRA_GUI_sendData + 0x829d6 + + + + SFRA_GUI_cmdPacket + 0xadae + + + + SFRA_GUI_rxWord + 0xae05 + + + + SFRA_GUI_led_flag + 0xae0f + + + + SFRA_GUI_memGetAmount + 0xae0d + + + + SFRA_GUI_arrayGetList + 0xae22 + + + + SFRA_GUI_echoSizeByte + 0x82873 + + + + SFRA_GUI_setData32 + 0x829a2 + + + + SFRA_GUI_dataOut32 + 0xae16 + + + + SFRA_GUI_memGetAddress + 0xae1c + + + + SFRA_GUI_getDataByte + 0x8288d + + + + SFRA_GUI_dataOut16 + 0xae09 + + + + SFRA_GUI_getSizeByte + 0x82853 + + + + SFRA_GUI_echoDataByte + 0x828ad + + + + SFRA_GUI_packWord + 0x828c0 + + + + SFRA_GUI_setText + 0x82934 + + + + SFRA_GUI_sweep_start + 0xae11 + + + + SFRA_GUI_setSlider + 0x8295a + + + + SFRA_GUI_lifePulseTsk + 0x828fe + + + + SFRA_GUI_rcvTskPtrShdw + 0xae0a + + + + SFRA_GUI_numWords + 0xae07 + + + + SFRA_GUI_varSetSldrList + 0xaec2 + + + + SFRA_GUI_spareTsk08 + 0x829d1 + + + + SFRA_GUI_wordsLeftToGet + 0xae08 + + + + SFRA_GUI_serialCommsTimer + 0xae01 + + + + SFRA_GUI_dataSetList + 0xae62 + + + + SFRA_GUI_temp + 0xae20 + + + + SFRA_GUI_sci_base_addr + 0xae14 + + + + SFRA_GUI_varSetTxtList + 0xaee2 + + + + SFRA_GUI_memSetValue + 0xae1e + + + + SFRA_GUI_memSetPtr + 0xae0e + + + + SFRA_GUI_memGetPtr + 0xae0c + + + + SFRA_GUI_taskDoneFlag + 0xae06 + + + + SFRA_GUI_cmdDispatcher + 0xae42 + + + + SFRA_GUI_getArray + 0x82970 + + + + SFRA_GUI_setButton + 0x82947 + + + + code_start + 0x80000 + + + + Device_enableAllPeripherals + 0x82ba9 + + + + Device_initGPIO + 0x82c94 + + + + Example_Fail + 0xa826 + + + + Example_setResultFail + 0x82eb2 + + + + Device_bootCPU2 + 0x82d2c + + + + Device_init + 0x82b56 + + + + Example_Result + 0xa822 + + + + Device_enableUnbondedGPIOPullups + 0x82ce5 + + + + __error__ + 0x82ea6 + + + + Example_setResultPass + 0x82ead + + + + Device_configureTMXAnalogTrim + 0x82cfb + + + + Device_enableUnbondedGPIOPullupsFor176Pin + 0x82cb5 + + + + Example_done + 0x82eb7 + + + + Example_PassCount + 0xa824 + + + + Device_enableUnbondedGPIOPullupsFor100Pin + 0x82cc8 + + + + CPUTimer_setEmulationMode + 0x83c9b + + + + Flash_initModule + 0x8000 + + + + GPIO_setQualificationMode + 0x839c5 + + + + GPIO_setPadConfig + 0x83722 + + + + GPIO_setDirectionMode + 0x83a33 + + + + GPIO_setPinConfig + 0x8398e + + + + GPIO_setControllerCore + 0x83957 + + + + Interrupt_defaultHandler + 0x83c71 + + + + Interrupt_initModule + 0x8391a + + + + Interrupt_nmiHandler + 0x83d9c + + + + Interrupt_enable + 0x839fc + + + + Interrupt_initVectorTable + 0x83b73 + + + + Interrupt_illegalOperationHandler + 0x83d92 + + + + SCI_clearInterruptStatus + 0x83853 + + + + SCI_setConfig + 0x838dc + + + + SCI_enableInterrupt + 0x83898 + + + + SysCtl_delay + 0x8124 + + + + SysCtl_getDeviceParametric + 0x83600 + + + + SysCtl_selectXTAL + 0x834e8 + + + + SysCtl_selectOscSource + 0x837c5 + + + + SysCtl_getLowSpeedClock + 0x83be2 + + + + SysCtl_setClock + 0x830c4 + + + + SysCtl_getClock + 0x83774 + + + + log10f + 0x83410 + + + + ceilf + 0x836ca + + + + tanf + 0x83668 + + + + _c_int00 + 0x83c5a + + + + __stack + 0x400 + + + + __c28xabi_divf + 0x83578 + + + + memcpy + 0x83b34 + + + + _system_pre_init + 0x83ddc + + + + __TI_auto_init_nobinit_nopinit + 0x83a92 + + + + __TI_zero_init + 0x83dd6 + + + + __TI_decompress_none + 0x83dc0 + + + + __TI_decompress_lzss + 0x83a64 + + + + C$$EXIT + 0x83abd + + + + abort + 0x83abd + + + + exit + 0x83abf + + + + __TI_dtors_ptr + 0xa82c + + + + __TI_cleanup_ptr + 0xa82a + + + + __TI_enable_exit_profile_output + 0xa828 + + + + _nop + 0x83db7 + + + + _lock + 0xa82e + + + + _unlock + 0xa830 + + + + _register_lock + 0x83db3 + + + + _register_unlock + 0x83daf + + + + _args_main + 0x83cf7 + + + + memset + 0x83dcf + + + + errno + 0xa834 + + + + _system_post_cinit + 0x83dde + + + + Link successful + diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d_linkInfo.xml b/28379d_P_SFRA/CPU1_FLASH/28379d_linkInfo.xml new file mode 100644 index 0000000..d7ff5c4 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/28379d_linkInfo.xml @@ -0,0 +1,9226 @@ + + + TMS320C2000 Linker PC v25.11.0.LTS + Copyright (c) 1996-2018 Texas Instruments Incorporated + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\bin\lnk2000.exe -lC:\\Users\\zxc\\AppData\\Local\\Temp\\{D798AD38-CFDB-4682-B572-1D689FD57673} + 0x6a0c03fd + 0x0 + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\28379d.out + + code_start +
0x80000
+
+ + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\syscfg\ + object + board.obj + board.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\syscfg\ + object + c2000ware_libraries.obj + c2000ware_libraries.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\ + object + main.obj + main.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\ + object + sfra_test.obj + sfra_test.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\SFRA\ + object + sfra_gui_scicomms_driverlib.obj + sfra_gui_scicomms_driverlib.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\device\ + object + F2837xD_CodeStartBranch.obj + F2837xD_CodeStartBranch.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\device\ + object + device.obj + device.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\ + object + <internal> + <internal> + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + cputimer.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + flash.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + gpio.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + interrupt.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sci.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sysctl.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_background.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_collect.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_config_reset.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_inject.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + e_logf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_tanf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + boot28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_cmp28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memcpy.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + pre_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + autoinit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_zero_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_none.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_lzss.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + exit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + _lock.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + args_main.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memset.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + errno.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + cpy_tbl.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + startup.c.obj + + + + + .cinit..data.load + 0x83b40 + true + 0x83b40 + 0xd + 0x1 + + + __TI_handler_table + 0x83b4e + true + 0x83b4e + 0x6 + 0x2 + + + .cinit..bss.load + 0x83b54 + true + 0x83b54 + 0x4 + 0x2 + + + .cinit.SFRA_F32_Data.load + 0x83b58 + true + 0x83b58 + 0x4 + 0x2 + + + __TI_cinit_table + 0x83b5c + true + 0x83b5c + 0xc + 0x2 + + + .text + 0x82000 + true + true + 0x82000 + 0x52e + 0x1 + + + + .text + 0x8252e + true + true + 0x8252e + 0x3fe + 0x1 + + + + .text:SysCtl_setClock + 0x8292c + true + true + 0x8292c + 0x209 + 0x1 + + + + .text + 0x82b35 + true + true + 0x82b35 + 0x1fa + 0x1 + + + + .text + 0x82d2f + true + true + 0x82d2f + 0x1c2 + 0x1 + + + + .text + 0x82ef1 + true + true + 0x82ef1 + 0x142 + 0x1 + + + + .text + 0x83033 + true + true + 0x83033 + 0x12b + 0x1 + + + + .text + 0x8315e + true + true + 0x8315e + 0xe3 + 0x1 + + + + .text:SysCtl_selectXTAL + 0x83241 + true + true + 0x83241 + 0x90 + 0x1 + + + + .text + 0x832d1 + true + true + 0x832d1 + 0x88 + 0x1 + + + + .text:SysCtl_getDeviceParametric + 0x83359 + true + true + 0x83359 + 0x68 + 0x1 + + + + .text + 0x833c1 + true + true + 0x833c1 + 0x67 + 0x1 + + + + .text + 0x83428 + true + true + 0x83428 + 0x62 + 0x1 + + + + .text:GPIO_setPadConfig + 0x8348a + true + true + 0x8348a + 0x52 + 0x1 + + + + .text:SysCtl_getClock + 0x834dc + true + true + 0x834dc + 0x51 + 0x1 + + + + .text:SysCtl_selectOscSource + 0x8352d + true + true + 0x8352d + 0x48 + 0x1 + + + + .text:retain + 0x83575 + true + true + 0x83575 + 0x46 + 0x1 + + + + .text:SCI_clearInterruptStatus + 0x835bb + true + true + 0x835bb + 0x45 + 0x1 + + + + .text:SCI_enableInterrupt + 0x83600 + true + true + 0x83600 + 0x44 + 0x1 + + + + .text:SCI_setConfig + 0x83644 + true + true + 0x83644 + 0x3e + 0x1 + + + + .text:Interrupt_initModule + 0x83682 + true + true + 0x83682 + 0x3d + 0x1 + + + + .text:GPIO_setControllerCore + 0x836bf + true + true + 0x836bf + 0x37 + 0x1 + + + + .text:GPIO_setPinConfig + 0x836f6 + true + true + 0x836f6 + 0x37 + 0x1 + + + + .text:GPIO_setQualificationMode + 0x8372d + true + true + 0x8372d + 0x37 + 0x1 + + + + .text:Interrupt_enable + 0x83764 + true + true + 0x83764 + 0x37 + 0x1 + + + + .text:GPIO_setDirectionMode + 0x8379b + true + true + 0x8379b + 0x31 + 0x1 + + + + .text:decompress:lzss + 0x837cc + true + true + 0x837cc + 0x2e + 0x1 + + + + .text:__TI_auto_init_nobinit_nopinit + 0x837fa + true + true + 0x837fa + 0x2b + 0x1 + + + + .text + 0x83825 + true + true + 0x83825 + 0x29 + 0x1 + + + + .text:CPUTimer_selectClockSource + 0x8384e + true + true + 0x8384e + 0x28 + 0x1 + + + + .text:Flash_setBankPowerUpDelay + 0x83876 + true + true + 0x83876 + 0x26 + 0x1 + + + + .text + 0x8389c + true + true + 0x8389c + 0x26 + 0x1 + + + + .text + 0x838c2 + true + true + 0x838c2 + 0x20 + 0x1 + + + + .text:CPUTimer_getTimerOverflowStatus + 0x838e2 + true + true + 0x838e2 + 0x1f + 0x1 + + + + .text:Interrupt_initVectorTable + 0x83901 + true + true + 0x83901 + 0x1e + 0x1 + + + + .text:SCI_isBaseValid + 0x8391f + true + true + 0x8391f + 0x1b + 0x1 + + + + .text:CPUTimer_startTimer + 0x8393a + true + true + 0x8393a + 0x1a + 0x1 + + + + .text:SysCtl_getLowSpeedClock + 0x83954 + true + true + 0x83954 + 0x1a + 0x1 + + + + .text:SCI_disableModule + 0x8396e + true + true + 0x8396e + 0x18 + 0x1 + + + + .text:SCI_performSoftwareReset + 0x83986 + true + true + 0x83986 + 0x18 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x8399e + true + true + 0x8399e + 0x17 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x839b5 + true + true + 0x839b5 + 0x17 + 0x1 + + + + .text + 0x839cc + true + true + 0x839cc + 0x17 + 0x1 + + + + .text:Interrupt_defaultHandler + 0x839e3 + true + true + 0x839e3 + 0x16 + 0x1 + + + + .text:CPUTimer_stopTimer + 0x839f9 + true + true + 0x839f9 + 0x14 + 0x1 + + + + .text:CPUTimer_setEmulationMode + 0x83a0d + true + true + 0x83a0d + 0x13 + 0x1 + + + + .text:SCI_enableModule + 0x83a20 + true + true + 0x83a20 + 0x13 + 0x1 + + + + .text:CPUTimer_clearOverflowFlag + 0x83a33 + true + true + 0x83a33 + 0x12 + 0x1 + + + + .text:CPUTimer_disableInterrupt + 0x83a45 + true + true + 0x83a45 + 0x12 + 0x1 + + + + .text + 0x83a57 + true + true + 0x83a57 + 0x12 + 0x1 + + + + .text + 0x83a69 + true + true + 0x83a69 + 0x12 + 0x1 + + + + .text:CPUTimer_setPeriod + 0x83a7b + true + true + 0x83a7b + 0x11 + 0x1 + + + + .text:Flash_isCtrlBaseValid + 0x83a8c + true + true + 0x83a8c + 0x10 + 0x1 + + + + .text:Flash_isECCBaseValid + 0x83a9c + true + true + 0x83a9c + 0x10 + 0x1 + + + + .text:SysCtl_pollCpuTimer + 0x83aac + true + true + 0x83aac + 0xf + 0x1 + + + + .text:GPIO_isPinValid + 0x83abb + true + true + 0x83abb + 0xe + 0x1 + + + + .text:Interrupt_disableGlobal + 0x83ac9 + true + true + 0x83ac9 + 0xd + 0x1 + + + + .text:Interrupt_enableGlobal + 0x83ad6 + true + true + 0x83ad6 + 0xd + 0x1 + + + + .text:SysCtl_isMCDClockFailureDetected + 0x83ae3 + true + true + 0x83ae3 + 0xb + 0x1 + + + + .text:Interrupt_illegalOperationHandler + 0x83aee + true + true + 0x83aee + 0xa + 0x1 + + + + .text:Interrupt_nmiHandler + 0x83af8 + true + true + 0x83af8 + 0xa + 0x1 + + + + .text:SysCtl_serviceWatchdog + 0x83b02 + true + true + 0x83b02 + 0x9 + 0x1 + + + + .text + 0x83b0b + true + true + 0x83b0b + 0x9 + 0x1 + + + + .text + 0x83b14 + true + true + 0x83b14 + 0x8 + 0x1 + + + + .text:decompress:none + 0x83b1c + true + true + 0x83b1c + 0x8 + 0x1 + + + + .text:SysCtl_resetMCD + 0x83b24 + true + true + 0x83b24 + 0x7 + 0x1 + + + + .text + 0x83b2b + true + true + 0x83b2b + 0x7 + 0x1 + + + + .text:decompress:ZI + 0x83b32 + true + true + 0x83b32 + 0x6 + 0x1 + + + + .text + 0x83b38 + true + true + 0x83b38 + 0x2 + 0x1 + + + + .text + 0x83b3a + true + true + 0x83b3a + 0x1 + 0x1 + + + + codestart + 0x80000 + true + true + 0x80000 + 0x2 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x2 + + + .bss + true + true + 0xad80 + 0x2a + 0x2 + + + + .bss:plantMagVect + true + true + 0xabe8 + 0xc8 + 0x2 + + + + .bss:plantPhaseVect + true + true + 0xacb0 + 0xc8 + 0x2 + + + + .bss:olMagVect + true + true + 0xaa58 + 0xc8 + 0x2 + + + + .bss:olPhaseVect + true + true + 0xab20 + 0xc8 + 0x2 + + + + .bss:clMagVect + true + true + 0xa800 + 0xc8 + 0x2 + + + + .bss:clPhaseVect + true + true + 0xa8c8 + 0xc8 + 0x2 + + + + .bss:freqVect + true + true + 0xa990 + 0xc8 + 0x2 + + + + .bss + true + true + 0xadc0 + 0x22 + 0x2 + + + + .bss:SFRA_GUI_cmdPacket + true + true + 0xad78 + 0x6 + 0x1 + + + + .bss:SFRA_GUI_cmdDispatcher + true + true + 0xae02 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetTxtList + true + true + 0xaea2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetBtnList + true + true + 0xae62 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetSldrList + true + true + 0xae82 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varGetList + true + true + 0xae42 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_arrayGetList + true + true + 0xade2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_dataSetList + true + true + 0xae22 + 0x20 + 0x2 + + + + .data + 0xaed2 + true + 0xaed2 + 0x2 + 0x2 + + + + .data + 0xaec2 + true + 0xaec2 + 0x6 + 0x2 + + + + .data + 0xaec8 + true + 0xaec8 + 0x6 + 0x2 + + + + .data:_lock + 0xaece + true + 0xaece + 0x2 + 0x2 + + + + .data:_unlock + 0xaed0 + true + 0xaed0 + 0x2 + 0x2 + + + + .data + 0xaed4 + true + 0xaed4 + 0x1 + 0x1 + + + + .const:.string + 0x90000 + true + 0x90000 + 0xc2 + 0x2 + + + + .const:.string + 0x900c2 + true + 0x900c2 + 0xbf + 0x2 + + + + .const:.string + 0x90182 + true + 0x90182 + 0xbc + 0x2 + + + + .const:.string + 0x9023e + true + 0x9023e + 0xbb + 0x2 + + + + .const:.string + 0x902fa + true + 0x902fa + 0x7b + 0x2 + + + + .const:.string + 0x90376 + true + 0x90376 + 0x62 + 0x2 + + + + .const:.string + 0x903d8 + true + 0x903d8 + 0x42 + 0x2 + + + + .const:.string + 0x9041a + true + 0x9041a + 0x42 + 0x2 + + + + .const:.string + 0x9045c + true + 0x9045c + 0x13 + 0x2 + + + + .TI.ramfunc:Flash_initModule + 0x86000 + true + true + 0x8000 + 0x43 + 0x1 + + + + .TI.ramfunc:Flash_setBankPowerMode + 0x86043 + true + true + 0x8043 + 0x2c + 0x1 + + + + .TI.ramfunc:Flash_setWaitstates + 0x8606f + true + true + 0x806f + 0x24 + 0x1 + + + + .TI.ramfunc:Flash_setPumpPowerMode + 0x86093 + true + true + 0x8093 + 0x1d + 0x1 + + + + .TI.ramfunc:Flash_disableCache + 0x860b0 + true + true + 0x80b0 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_disablePrefetch + 0x860c8 + true + true + 0x80c8 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_enableCache + 0x860e0 + true + true + 0x80e0 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enablePrefetch + 0x860f7 + true + true + 0x80f7 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enableECC + 0x8610e + true + true + 0x810e + 0x16 + 0x1 + + + + .TI.ramfunc + 0x86124 + true + true + 0x8124 + 0x4 + 0x1 + + + + .debug_types + 0x0 + 0x0 + 0x767 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x767 + 0x767 + 0x520 + 0x0 + + + + .debug_types + 0xc87 + 0xc87 + 0x29b + 0x0 + + + + .debug_types + 0xf22 + 0xf22 + 0xdc7 + 0x0 + + + + .debug_types + 0x1ce9 + 0x1ce9 + 0x6e + 0x0 + + + + .debug_types + 0x1d57 + 0x1d57 + 0x1d7 + 0x0 + + + + .debug_types + 0x1f2e + 0x1f2e + 0x2c4 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x21f2 + 0x21f2 + 0x425 + 0x0 + + + + .debug_types + 0x2617 + 0x2617 + 0x21d + 0x0 + + + + .debug_types + 0x2834 + 0x2834 + 0x8d + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x28c1 + 0x28c1 + 0x142 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2a03 + 0x2a03 + 0x470 + 0x0 + + + + .debug_types + 0x2e73 + 0x2e73 + 0x194 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x3007 + 0x3007 + 0x191 + 0x0 + + + + .debug_types + 0x3198 + 0x3198 + 0xbf + 0x0 + + + + .debug_types + 0x3257 + 0x3257 + 0x2f + 0x0 + + + + .debug_types + 0x3286 + 0x3286 + 0xe1 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_info + 0x0 + 0x0 + 0xaa5 + 0x0 + + + + .debug_info + 0xaa5 + 0xaa5 + 0x177 + 0x0 + + + + .debug_info + 0xc1c + 0xc1c + 0x105 + 0x0 + + + + .debug_info + 0xd21 + 0xd21 + 0xe7 + 0x0 + + + + .debug_info + 0xe08 + 0xe08 + 0xeb + 0x0 + + + + .debug_info + 0xef3 + 0xef3 + 0xe1 + 0x0 + + + + .debug_info + 0xfd4 + 0xfd4 + 0xe5 + 0x0 + + + + .debug_info + 0x10b9 + 0x10b9 + 0xe1 + 0x0 + + + + .debug_info + 0x119a + 0x119a + 0xe5 + 0x0 + + + + .debug_info + 0x127f + 0x127f + 0xdf + 0x0 + + + + .debug_info + 0x135e + 0x135e + 0x705 + 0x0 + + + + .debug_info + 0x1a63 + 0x1a63 + 0x1b8 + 0x0 + + + + .debug_info + 0x1c1b + 0x1c1b + 0x6c6 + 0x0 + + + + .debug_info + 0x22e1 + 0x22e1 + 0x10a + 0x0 + + + + .debug_info + 0x23eb + 0x23eb + 0x112 + 0x0 + + + + .debug_info + 0x24fd + 0x24fd + 0x112 + 0x0 + + + + .debug_info + 0x260f + 0x260f + 0x112 + 0x0 + + + + .debug_info + 0x2721 + 0x2721 + 0x114 + 0x0 + + + + .debug_info + 0x2835 + 0x2835 + 0x10c + 0x0 + + + + .debug_info + 0x2941 + 0x2941 + 0x110 + 0x0 + + + + .debug_info + 0x2a51 + 0x2a51 + 0x10e + 0x0 + + + + .debug_info + 0x2b5f + 0x2b5f + 0x1ad7 + 0x0 + + + + .debug_info + 0x4636 + 0x4636 + 0x106 + 0x0 + + + + .debug_info + 0x473c + 0x473c + 0x107 + 0x0 + + + + .debug_info + 0x4843 + 0x4843 + 0x151 + 0x0 + + + + .debug_info + 0x4994 + 0x4994 + 0x1c32 + 0x0 + + + + .debug_info + 0x65c6 + 0x65c6 + 0x219 + 0x0 + + + + .debug_info + 0x67df + 0x67df + 0x265 + 0x0 + + + + .debug_info + 0x6a44 + 0x6a44 + 0x21d + 0x0 + + + + .debug_info + 0x6c61 + 0x6c61 + 0x219 + 0x0 + + + + .debug_info + 0x6e7a + 0x6e7a + 0x279 + 0x0 + + + + .debug_info + 0x70f3 + 0x70f3 + 0x28f + 0x0 + + + + .debug_info + 0x7382 + 0x7382 + 0x26e + 0x0 + + + + .debug_info + 0x75f0 + 0x75f0 + 0x23f + 0x0 + + + + .debug_info + 0x782f + 0x782f + 0x241 + 0x0 + + + + .debug_info + 0x7a70 + 0x7a70 + 0x239 + 0x0 + + + + .debug_info + 0x7ca9 + 0x7ca9 + 0x23b + 0x0 + + + + .debug_info + 0x7ee4 + 0x7ee4 + 0x232 + 0x0 + + + + .debug_info + 0x8116 + 0x8116 + 0x27b + 0x0 + + + + .debug_info + 0x8391 + 0x8391 + 0x397 + 0x0 + + + + .debug_info + 0x8728 + 0x8728 + 0x205 + 0x0 + + + + .debug_info + 0x892d + 0x892d + 0x27d + 0x0 + + + + .debug_info + 0x8baa + 0x8baa + 0x266 + 0x0 + + + + .debug_info + 0x8e10 + 0x8e10 + 0x2ae + 0x0 + + + + .debug_info + 0x90be + 0x90be + 0x296 + 0x0 + + + + .debug_info + 0x9354 + 0x9354 + 0x24f + 0x0 + + + + .debug_info + 0x95a3 + 0x95a3 + 0x1fe + 0x0 + + + + .debug_info + 0x97a1 + 0x97a1 + 0x200 + 0x0 + + + + .debug_info + 0x99a1 + 0x99a1 + 0x20f + 0x0 + + + + .debug_info + 0x9bb0 + 0x9bb0 + 0x21c + 0x0 + + + + .debug_info + 0x9dcc + 0x9dcc + 0x202 + 0x0 + + + + .debug_info + 0x9fce + 0x9fce + 0x1e8 + 0x0 + + + + .debug_info + 0xa1b6 + 0xa1b6 + 0x20c + 0x0 + + + + .debug_info + 0xa3c2 + 0xa3c2 + 0x2b3 + 0x0 + + + + .debug_info + 0xa675 + 0xa675 + 0x205 + 0x0 + + + + .debug_info + 0xa87a + 0xa87a + 0x225 + 0x0 + + + + .debug_info + 0xaa9f + 0xaa9f + 0x227 + 0x0 + + + + .debug_info + 0xacc6 + 0xacc6 + 0x235 + 0x0 + + + + .debug_info + 0xaefb + 0xaefb + 0x2b5 + 0x0 + + + + .debug_info + 0xb1b0 + 0xb1b0 + 0x23e + 0x0 + + + + .debug_info + 0xb3ee + 0xb3ee + 0x268 + 0x0 + + + + .debug_info + 0xb656 + 0xb656 + 0x1f2 + 0x0 + + + + .debug_info + 0xb848 + 0xb848 + 0x20e + 0x0 + + + + .debug_info + 0xba56 + 0xba56 + 0x1e4 + 0x0 + + + + .debug_info + 0xbc3a + 0xbc3a + 0x217 + 0x0 + + + + .debug_info + 0xbe51 + 0xbe51 + 0x244 + 0x0 + + + + .debug_info + 0xc095 + 0xc095 + 0x242 + 0x0 + + + + .debug_info + 0xc2d7 + 0xc2d7 + 0x24a + 0x0 + + + + .debug_info + 0xc521 + 0xc521 + 0x24d + 0x0 + + + + .debug_info + 0xc76e + 0xc76e + 0x24e + 0x0 + + + + .debug_info + 0xc9bc + 0xc9bc + 0x258 + 0x0 + + + + .debug_info + 0xcc14 + 0xcc14 + 0x27c + 0x0 + + + + .debug_info + 0xce90 + 0xce90 + 0x241 + 0x0 + + + + .debug_info + 0xd0d1 + 0xd0d1 + 0x277 + 0x0 + + + + .debug_info + 0xd348 + 0xd348 + 0x519 + 0x0 + + + + .debug_info + 0xd861 + 0xd861 + 0x3ba + 0x0 + + + + .debug_info + 0xdc1b + 0xdc1b + 0x243 + 0x0 + + + + .debug_info + 0xde5e + 0xde5e + 0x251 + 0x0 + + + + .debug_info + 0xe0af + 0xe0af + 0x241 + 0x0 + + + + .debug_info + 0xe2f0 + 0xe2f0 + 0x1d8 + 0x0 + + + + .debug_info + 0xe4c8 + 0xe4c8 + 0x179 + 0x0 + + + + .debug_info + 0xe641 + 0xe641 + 0x141 + 0x0 + + + + .debug_info + 0xe782 + 0xe782 + 0x110 + 0x0 + + + + .debug_info + 0xe892 + 0xe892 + 0x184 + 0x0 + + + + .debug_info + 0xea16 + 0xea16 + 0x136 + 0x0 + + + + .debug_info + 0xeb4c + 0xeb4c + 0x1a8 + 0x0 + + + + .debug_info + 0xecf4 + 0xecf4 + 0x188 + 0x0 + + + + .debug_info + 0xee7c + 0xee7c + 0x1a0 + 0x0 + + + + .debug_info + 0xf01c + 0xf01c + 0x1f5 + 0x0 + + + + .debug_info + 0xf211 + 0xf211 + 0x187 + 0x0 + + + + .debug_info + 0xf398 + 0xf398 + 0x192 + 0x0 + + + + .debug_info + 0xf52a + 0xf52a + 0xf0 + 0x0 + + + + .debug_info + 0xf61a + 0xf61a + 0xf4 + 0x0 + + + + .debug_info + 0xf70e + 0xf70e + 0x1ec + 0x0 + + + + .debug_info + 0xf8fa + 0xf8fa + 0x156 + 0x0 + + + + .debug_info + 0xfa50 + 0xfa50 + 0x1db + 0x0 + + + + .debug_info + 0xfc2b + 0xfc2b + 0xef + 0x0 + + + + .debug_info + 0xfd1a + 0xfd1a + 0x130 + 0x0 + + + + .debug_info + 0xfe4a + 0xfe4a + 0xa6 + 0x0 + + + .debug_line + 0x0 + 0x0 + 0x254 + 0x0 + + + + .debug_line + 0x254 + 0x254 + 0xe9 + 0x0 + + + + .debug_line + 0x33d + 0x33d + 0x50 + 0x0 + + + + .debug_line + 0x38d + 0x38d + 0x21 + 0x0 + + + + .debug_line + 0x3ae + 0x3ae + 0x33 + 0x0 + + + + .debug_line + 0x3e1 + 0x3e1 + 0x33 + 0x0 + + + + .debug_line + 0x414 + 0x414 + 0x33 + 0x0 + + + + .debug_line + 0x447 + 0x447 + 0x33 + 0x0 + + + + .debug_line + 0x47a + 0x47a + 0x33 + 0x0 + + + + .debug_line + 0x4ad + 0x4ad + 0x33 + 0x0 + + + + .debug_line + 0x4e0 + 0x4e0 + 0x33 + 0x0 + + + + .debug_line + 0x513 + 0x513 + 0x33 + 0x0 + + + + .debug_line + 0x546 + 0x546 + 0x1ca + 0x0 + + + + .debug_line + 0x710 + 0x710 + 0x4c + 0x0 + + + + .debug_line + 0x75c + 0x75c + 0x9d + 0x0 + + + + .debug_line + 0x7f9 + 0x7f9 + 0x4a + 0x0 + + + + .debug_line + 0x843 + 0x843 + 0x4a + 0x0 + + + + .debug_line + 0x88d + 0x88d + 0x4a + 0x0 + + + + .debug_line + 0x8d7 + 0x8d7 + 0x4a + 0x0 + + + + .debug_line + 0x921 + 0x921 + 0x4a + 0x0 + + + + .debug_line + 0x96b + 0x96b + 0x4a + 0x0 + + + + .debug_line + 0x9b5 + 0x9b5 + 0x4a + 0x0 + + + + .debug_line + 0x9ff + 0x9ff + 0x4a + 0x0 + + + + .debug_line + 0xa49 + 0xa49 + 0x4a + 0x0 + + + + .debug_line + 0xa93 + 0xa93 + 0x69f + 0x0 + + + + .debug_line + 0x1132 + 0x1132 + 0xa4 + 0x0 + + + + .debug_line + 0x11d6 + 0x11d6 + 0x55 + 0x0 + + + + .debug_line + 0x122b + 0x122b + 0x5d + 0x0 + + + + .debug_line + 0x1288 + 0x1288 + 0x37 + 0x0 + + + + .debug_line + 0x12bf + 0x12bf + 0x3e1 + 0x0 + + + + .debug_line + 0x16a0 + 0x16a0 + 0xfd + 0x0 + + + + .debug_line + 0x179d + 0x179d + 0x9c + 0x0 + + + + .debug_line + 0x1839 + 0x1839 + 0x9e + 0x0 + + + + .debug_line + 0x18d7 + 0x18d7 + 0xe8 + 0x0 + + + + .debug_line + 0x19bf + 0x19bf + 0x99 + 0x0 + + + + .debug_line + 0x1a58 + 0x1a58 + 0x99 + 0x0 + + + + .debug_line + 0x1af1 + 0x1af1 + 0x9d + 0x0 + + + + .debug_line + 0x1b8e + 0x1b8e + 0x9c + 0x0 + + + + .debug_line + 0x1c2a + 0x1c2a + 0x9c + 0x0 + + + + .debug_line + 0x1cc6 + 0x1cc6 + 0x9c + 0x0 + + + + .debug_line + 0x1d62 + 0x1d62 + 0x9c + 0x0 + + + + .debug_line + 0x1dfe + 0x1dfe + 0x9c + 0x0 + + + + .debug_line + 0x1e9a + 0x1e9a + 0x9c + 0x0 + + + + .debug_line + 0x1f36 + 0x1f36 + 0x9c + 0x0 + + + + .debug_line + 0x1fd2 + 0x1fd2 + 0x9d + 0x0 + + + + .debug_line + 0x206f + 0x206f + 0xa4 + 0x0 + + + + .debug_line + 0x2113 + 0x2113 + 0xe5 + 0x0 + + + + .debug_line + 0x21f8 + 0x21f8 + 0x98 + 0x0 + + + + .debug_line + 0x2290 + 0x2290 + 0xa2 + 0x0 + + + + .debug_line + 0x2332 + 0x2332 + 0xb1 + 0x0 + + + + .debug_line + 0x23e3 + 0x23e3 + 0x9f + 0x0 + + + + .debug_line + 0x2482 + 0x2482 + 0x9f + 0x0 + + + + .debug_line + 0x2521 + 0x2521 + 0x9f + 0x0 + + + + .debug_line + 0x25c0 + 0x25c0 + 0xe4 + 0x0 + + + + .debug_line + 0x26a4 + 0x26a4 + 0x9d + 0x0 + + + + .debug_line + 0x2741 + 0x2741 + 0x9d + 0x0 + + + + .debug_line + 0x27de + 0x27de + 0xb8 + 0x0 + + + + .debug_line + 0x2896 + 0x2896 + 0xa3 + 0x0 + + + + .debug_line + 0x2939 + 0x2939 + 0x9b + 0x0 + + + + .debug_line + 0x29d4 + 0x29d4 + 0x9b + 0x0 + + + + .debug_line + 0x2a6f + 0x2a6f + 0xb1 + 0x0 + + + + .debug_line + 0x2b20 + 0x2b20 + 0xb1 + 0x0 + + + + .debug_line + 0x2bd1 + 0x2bd1 + 0x21 + 0x0 + + + + .debug_line + 0x2bf2 + 0x2bf2 + 0x97 + 0x0 + + + + .debug_line + 0x2c89 + 0x2c89 + 0x98 + 0x0 + + + + .debug_line + 0x2d21 + 0x2d21 + 0x99 + 0x0 + + + + .debug_line + 0x2dba + 0x2dba + 0x99 + 0x0 + + + + .debug_line + 0x2e53 + 0x2e53 + 0x9e + 0x0 + + + + .debug_line + 0x2ef1 + 0x2ef1 + 0xb3 + 0x0 + + + + .debug_line + 0x2fa4 + 0x2fa4 + 0xa7 + 0x0 + + + + .debug_line + 0x304b + 0x304b + 0xe3 + 0x0 + + + + .debug_line + 0x312e + 0x312e + 0x9d + 0x0 + + + + .debug_line + 0x31cb + 0x31cb + 0x9a + 0x0 + + + + .debug_line + 0x3265 + 0x3265 + 0x9c + 0x0 + + + + .debug_line + 0x3301 + 0x3301 + 0x9c + 0x0 + + + + .debug_line + 0x339d + 0x339d + 0x9d + 0x0 + + + + .debug_line + 0x343a + 0x343a + 0x9d + 0x0 + + + + .debug_line + 0x34d7 + 0x34d7 + 0xa1 + 0x0 + + + + .debug_line + 0x3578 + 0x3578 + 0xa2 + 0x0 + + + + .debug_line + 0x361a + 0x361a + 0x9d + 0x0 + + + + .debug_line + 0x36b7 + 0x36b7 + 0x9d + 0x0 + + + + .debug_line + 0x3754 + 0x3754 + 0xa7 + 0x0 + + + + .debug_line + 0x37fb + 0x37fb + 0xa1 + 0x0 + + + + .debug_line + 0x389c + 0x389c + 0xb4 + 0x0 + + + + .debug_line + 0x3950 + 0x3950 + 0x19e + 0x0 + + + + .debug_line + 0x3aee + 0x3aee + 0xd2 + 0x0 + + + + .debug_line + 0x3bc0 + 0x3bc0 + 0xbe + 0x0 + + + + .debug_line + 0x3c7e + 0x3c7e + 0xa1 + 0x0 + + + + .debug_line + 0x3d1f + 0x3d1f + 0xc7 + 0x0 + + + + .debug_line + 0x3de6 + 0x3de6 + 0x14b + 0x0 + + + + .debug_line + 0x3f31 + 0x3f31 + 0xd5 + 0x0 + + + + .debug_line + 0x4006 + 0x4006 + 0x21 + 0x0 + + + + .debug_line + 0x4027 + 0x4027 + 0x68 + 0x0 + + + + .debug_line + 0x408f + 0x408f + 0x21 + 0x0 + + + + .debug_line + 0x40b0 + 0x40b0 + 0x4f + 0x0 + + + + .debug_line + 0x40ff + 0x40ff + 0xae + 0x0 + + + + .debug_line + 0x41ad + 0x41ad + 0x57 + 0x0 + + + + .debug_line + 0x4204 + 0x4204 + 0x21 + 0x0 + + + + .debug_line + 0x4225 + 0x4225 + 0x3f + 0x0 + + + + .debug_line + 0x4264 + 0x4264 + 0x21 + 0x0 + + + + .debug_line + 0x4285 + 0x4285 + 0x74 + 0x0 + + + + .debug_line + 0x42f9 + 0x42f9 + 0x21 + 0x0 + + + + .debug_line + 0x431a + 0x431a + 0x52 + 0x0 + + + + .debug_line + 0x436c + 0x436c + 0x21 + 0x0 + + + + .debug_line + 0x438d + 0x438d + 0x57 + 0x0 + + + + .debug_line + 0x43e4 + 0x43e4 + 0x21 + 0x0 + + + + .debug_line + 0x4405 + 0x4405 + 0x9a + 0x0 + + + + .debug_line + 0x449f + 0x449f + 0x21 + 0x0 + + + + .debug_line + 0x44c0 + 0x44c0 + 0x2b + 0x0 + + + + .debug_line + 0x44eb + 0x44eb + 0x66 + 0x0 + + + + .debug_line + 0x4551 + 0x4551 + 0x21 + 0x0 + + + + .debug_line + 0x4572 + 0x4572 + 0x2c + 0x0 + + + + .debug_line + 0x459e + 0x459e + 0x2c + 0x0 + + + + .debug_line + 0x45ca + 0x45ca + 0x5f + 0x0 + + + + .debug_line + 0x4629 + 0x4629 + 0x21 + 0x0 + + + + .debug_line + 0x464a + 0x464a + 0x50 + 0x0 + + + + .debug_line + 0x469a + 0x469a + 0x30 + 0x0 + + + + .debug_line + 0x46ca + 0x46ca + 0x99 + 0x0 + + + + .debug_line + 0x4763 + 0x4763 + 0x21 + 0x0 + + + + .debug_line + 0x4784 + 0x4784 + 0x2c + 0x0 + + + + .debug_line + 0x47b0 + 0x47b0 + 0x21 + 0x0 + + + + .debug_line + 0x47d1 + 0x47d1 + 0x3b + 0x0 + + + + .debug_line + 0x480c + 0x480c + 0x21 + 0x0 + + + + .debug_frame + 0x0 + 0x0 + 0x19c + 0x4 + + + + .debug_frame + 0x19c + 0x19c + 0x40 + 0x4 + + + + .debug_frame + 0x1dc + 0x1dc + 0x104 + 0x4 + + + + .debug_frame + 0x2e0 + 0x2e0 + 0xb4 + 0x4 + + + + .debug_frame + 0x394 + 0x394 + 0x384 + 0x4 + + + + .debug_frame + 0x718 + 0x718 + 0x21c + 0x4 + + + + .debug_frame + 0x934 + 0x934 + 0x44 + 0x4 + + + + .debug_frame + 0x978 + 0x978 + 0x44 + 0x4 + + + + .debug_frame + 0x9bc + 0x9bc + 0x44 + 0x4 + + + + .debug_frame + 0xa00 + 0xa00 + 0x44 + 0x4 + + + + .debug_frame + 0xa44 + 0xa44 + 0x44 + 0x4 + + + + .debug_frame + 0xa88 + 0xa88 + 0x44 + 0x4 + + + + .debug_frame + 0xacc + 0xacc + 0x44 + 0x4 + + + + .debug_frame + 0xb10 + 0xb10 + 0x44 + 0x4 + + + + .debug_frame + 0xb54 + 0xb54 + 0x44 + 0x4 + + + + .debug_frame + 0xb98 + 0xb98 + 0x44 + 0x4 + + + + .debug_frame + 0xbdc + 0xbdc + 0x44 + 0x4 + + + + .debug_frame + 0xc20 + 0xc20 + 0x44 + 0x4 + + + + .debug_frame + 0xc64 + 0xc64 + 0x44 + 0x4 + + + + .debug_frame + 0xca8 + 0xca8 + 0x44 + 0x4 + + + + .debug_frame + 0xcec + 0xcec + 0x44 + 0x4 + + + + .debug_frame + 0xd30 + 0xd30 + 0x44 + 0x4 + + + + .debug_frame + 0xd74 + 0xd74 + 0x44 + 0x4 + + + + .debug_frame + 0xdb8 + 0xdb8 + 0x44 + 0x4 + + + + .debug_frame + 0xdfc + 0xdfc + 0x44 + 0x4 + + + + .debug_frame + 0xe40 + 0xe40 + 0x44 + 0x4 + + + + .debug_frame + 0xe84 + 0xe84 + 0x40 + 0x4 + + + + .debug_frame + 0xec4 + 0xec4 + 0x40 + 0x4 + + + + .debug_frame + 0xf04 + 0xf04 + 0x40 + 0x4 + + + + .debug_frame + 0xf44 + 0xf44 + 0x4c + 0x4 + + + + .debug_frame + 0xf90 + 0xf90 + 0x48 + 0x4 + + + + .debug_frame + 0xfd8 + 0xfd8 + 0x48 + 0x4 + + + + .debug_frame + 0x1020 + 0x1020 + 0x44 + 0x4 + + + + .debug_frame + 0x1064 + 0x1064 + 0x44 + 0x4 + + + + .debug_frame + 0x10a8 + 0x10a8 + 0x44 + 0x4 + + + + .debug_frame + 0x10ec + 0x10ec + 0x44 + 0x4 + + + + .debug_frame + 0x1130 + 0x1130 + 0x44 + 0x4 + + + + .debug_frame + 0x1174 + 0x1174 + 0x44 + 0x4 + + + + .debug_frame + 0x11b8 + 0x11b8 + 0x44 + 0x4 + + + + .debug_frame + 0x11fc + 0x11fc + 0x44 + 0x4 + + + + .debug_frame + 0x1240 + 0x1240 + 0x44 + 0x4 + + + + .debug_frame + 0x1284 + 0x1284 + 0x40 + 0x4 + + + + .debug_frame + 0x12c4 + 0x12c4 + 0x40 + 0x4 + + + + .debug_frame + 0x1304 + 0x1304 + 0x40 + 0x4 + + + + .debug_frame + 0x1344 + 0x1344 + 0x44 + 0x4 + + + + .debug_frame + 0x1388 + 0x1388 + 0x44 + 0x4 + + + + .debug_frame + 0x13cc + 0x13cc + 0x44 + 0x4 + + + + .debug_frame + 0x1410 + 0x1410 + 0x44 + 0x4 + + + + .debug_frame + 0x1454 + 0x1454 + 0x44 + 0x4 + + + + .debug_frame + 0x1498 + 0x1498 + 0x44 + 0x4 + + + + .debug_frame + 0x14dc + 0x14dc + 0x44 + 0x4 + + + + .debug_frame + 0x1520 + 0x1520 + 0x44 + 0x4 + + + + .debug_frame + 0x1564 + 0x1564 + 0x40 + 0x4 + + + + .debug_frame + 0x15a4 + 0x15a4 + 0x44 + 0x4 + + + + .debug_frame + 0x15e8 + 0x15e8 + 0x50 + 0x4 + + + + .debug_frame + 0x1638 + 0x1638 + 0x44 + 0x4 + + + + .debug_frame + 0x167c + 0x167c + 0x44 + 0x4 + + + + .debug_frame + 0x16c0 + 0x16c0 + 0x44 + 0x4 + + + + .debug_frame + 0x1704 + 0x1704 + 0x44 + 0x4 + + + + .debug_frame + 0x1748 + 0x1748 + 0x80 + 0x4 + + + + .debug_frame + 0x17c8 + 0x17c8 + 0x50 + 0x4 + + + + .debug_frame + 0x1818 + 0x1818 + 0x40 + 0x4 + + + + .debug_frame + 0x1858 + 0x1858 + 0x40 + 0x4 + + + + .debug_frame + 0x1898 + 0x1898 + 0x58 + 0x4 + + + + .debug_frame + 0x18f0 + 0x18f0 + 0x40 + 0x4 + + + + .debug_frame + 0x1930 + 0x1930 + 0x40 + 0x4 + + + + .debug_frame + 0x1970 + 0x1970 + 0x40 + 0x4 + + + + .debug_frame + 0x19b0 + 0x19b0 + 0x60 + 0x4 + + + + .debug_frame + 0x1a10 + 0x1a10 + 0x70 + 0x4 + + + + .debug_frame + 0x1a80 + 0x1a80 + 0x40 + 0x4 + + + + .debug_frame + 0x1ac0 + 0x1ac0 + 0x40 + 0x4 + + + + .debug_frame + 0x1b00 + 0x1b00 + 0x40 + 0x4 + + + + .debug_abbrev + 0x0 + 0x0 + 0xf0 + 0x0 + + + + .debug_abbrev + 0xf0 + 0xf0 + 0x76 + 0x0 + + + + .debug_abbrev + 0x166 + 0x166 + 0x48 + 0x0 + + + + .debug_abbrev + 0x1ae + 0x1ae + 0x1c + 0x0 + + + + .debug_abbrev + 0x1ca + 0x1ca + 0x28 + 0x0 + + + + .debug_abbrev + 0x1f2 + 0x1f2 + 0x28 + 0x0 + + + + .debug_abbrev + 0x21a + 0x21a + 0x28 + 0x0 + + + + .debug_abbrev + 0x242 + 0x242 + 0x28 + 0x0 + + + + .debug_abbrev + 0x26a + 0x26a + 0x28 + 0x0 + + + + .debug_abbrev + 0x292 + 0x292 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2ba + 0x2ba + 0x28 + 0x0 + + + + .debug_abbrev + 0x2e2 + 0x2e2 + 0x28 + 0x0 + + + + .debug_abbrev + 0x30a + 0x30a + 0xcf + 0x0 + + + + .debug_abbrev + 0x3d9 + 0x3d9 + 0x6f + 0x0 + + + + .debug_abbrev + 0x448 + 0x448 + 0x90 + 0x0 + + + + .debug_abbrev + 0x4d8 + 0x4d8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x500 + 0x500 + 0x28 + 0x0 + + + + .debug_abbrev + 0x528 + 0x528 + 0x28 + 0x0 + + + + .debug_abbrev + 0x550 + 0x550 + 0x28 + 0x0 + + + + .debug_abbrev + 0x578 + 0x578 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5a0 + 0x5a0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5c8 + 0x5c8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5f0 + 0x5f0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x618 + 0x618 + 0x28 + 0x0 + + + + .debug_abbrev + 0x640 + 0x640 + 0x103 + 0x0 + + + + .debug_abbrev + 0x743 + 0x743 + 0xb3 + 0x0 + + + + .debug_abbrev + 0x7f6 + 0x7f6 + 0x25 + 0x0 + + + + .debug_abbrev + 0x81b + 0x81b + 0x25 + 0x0 + + + + .debug_abbrev + 0x840 + 0x840 + 0x28 + 0x0 + + + + .debug_abbrev + 0x868 + 0x868 + 0xf4 + 0x0 + + + + .debug_abbrev + 0x95c + 0x95c + 0xa5 + 0x0 + + + + .debug_abbrev + 0xa01 + 0xa01 + 0x5c + 0x0 + + + + .debug_abbrev + 0xa5d + 0xa5d + 0x6a + 0x0 + + + + .debug_abbrev + 0xac7 + 0xac7 + 0x71 + 0x0 + + + + .debug_abbrev + 0xb38 + 0xb38 + 0x5c + 0x0 + + + + .debug_abbrev + 0xb94 + 0xb94 + 0x5c + 0x0 + + + + .debug_abbrev + 0xbf0 + 0xbf0 + 0x68 + 0x0 + + + + .debug_abbrev + 0xc58 + 0xc58 + 0x68 + 0x0 + + + + .debug_abbrev + 0xcc0 + 0xcc0 + 0x68 + 0x0 + + + + .debug_abbrev + 0xd28 + 0xd28 + 0x68 + 0x0 + + + + .debug_abbrev + 0xd90 + 0xd90 + 0x68 + 0x0 + + + + .debug_abbrev + 0xdf8 + 0xdf8 + 0x68 + 0x0 + + + + .debug_abbrev + 0xe60 + 0xe60 + 0x68 + 0x0 + + + + .debug_abbrev + 0xec8 + 0xec8 + 0x68 + 0x0 + + + + .debug_abbrev + 0xf30 + 0xf30 + 0x68 + 0x0 + + + + .debug_abbrev + 0xf98 + 0xf98 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1002 + 0x1002 + 0x62 + 0x0 + + + + .debug_abbrev + 0x1064 + 0x1064 + 0x5c + 0x0 + + + + .debug_abbrev + 0x10c0 + 0x10c0 + 0x6a + 0x0 + + + + .debug_abbrev + 0x112a + 0x112a + 0x6a + 0x0 + + + + .debug_abbrev + 0x1194 + 0x1194 + 0x6a + 0x0 + + + + .debug_abbrev + 0x11fe + 0x11fe + 0x6a + 0x0 + + + + .debug_abbrev + 0x1268 + 0x1268 + 0x5c + 0x0 + + + + .debug_abbrev + 0x12c4 + 0x12c4 + 0x69 + 0x0 + + + + .debug_abbrev + 0x132d + 0x132d + 0x46 + 0x0 + + + + .debug_abbrev + 0x1373 + 0x1373 + 0x46 + 0x0 + + + + .debug_abbrev + 0x13b9 + 0x13b9 + 0x54 + 0x0 + + + + .debug_abbrev + 0x140d + 0x140d + 0x48 + 0x0 + + + + .debug_abbrev + 0x1455 + 0x1455 + 0x3b + 0x0 + + + + .debug_abbrev + 0x1490 + 0x1490 + 0x3b + 0x0 + + + + .debug_abbrev + 0x14cb + 0x14cb + 0x51 + 0x0 + + + + .debug_abbrev + 0x151c + 0x151c + 0x6a + 0x0 + + + + .debug_abbrev + 0x1586 + 0x1586 + 0x44 + 0x0 + + + + .debug_abbrev + 0x15ca + 0x15ca + 0x5c + 0x0 + + + + .debug_abbrev + 0x1626 + 0x1626 + 0x68 + 0x0 + + + + .debug_abbrev + 0x168e + 0x168e + 0x68 + 0x0 + + + + .debug_abbrev + 0x16f6 + 0x16f6 + 0x68 + 0x0 + + + + .debug_abbrev + 0x175e + 0x175e + 0x6a + 0x0 + + + + .debug_abbrev + 0x17c8 + 0x17c8 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1832 + 0x1832 + 0x6a + 0x0 + + + + .debug_abbrev + 0x189c + 0x189c + 0x62 + 0x0 + + + + .debug_abbrev + 0x18fe + 0x18fe + 0x44 + 0x0 + + + + .debug_abbrev + 0x1942 + 0x1942 + 0x46 + 0x0 + + + + .debug_abbrev + 0x1988 + 0x1988 + 0x44 + 0x0 + + + + .debug_abbrev + 0x19cc + 0x19cc + 0x5c + 0x0 + + + + .debug_abbrev + 0x1a28 + 0x1a28 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1a90 + 0x1a90 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1af8 + 0x1af8 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1b60 + 0x1b60 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1bc8 + 0x1bc8 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1c30 + 0x1c30 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1c9a + 0x1c9a + 0x68 + 0x0 + + + + .debug_abbrev + 0x1d02 + 0x1d02 + 0x52 + 0x0 + + + + .debug_abbrev + 0x1d54 + 0x1d54 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1dc0 + 0x1dc0 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1e2c + 0x1e2c + 0x5f + 0x0 + + + + .debug_abbrev + 0x1e8b + 0x1e8b + 0x6a + 0x0 + + + + .debug_abbrev + 0x1ef5 + 0x1ef5 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1f61 + 0x1f61 + 0x5e + 0x0 + + + + .debug_abbrev + 0x1fbf + 0x1fbf + 0x8f + 0x0 + + + + .debug_abbrev + 0x204e + 0x204e + 0x6f + 0x0 + + + + .debug_abbrev + 0x20bd + 0x20bd + 0x44 + 0x0 + + + + .debug_abbrev + 0x2101 + 0x2101 + 0x6f + 0x0 + + + + .debug_abbrev + 0x2170 + 0x2170 + 0x35 + 0x0 + + + + .debug_abbrev + 0x21a5 + 0x21a5 + 0x3d + 0x0 + + + + .debug_abbrev + 0x21e2 + 0x21e2 + 0x3b + 0x0 + + + + .debug_abbrev + 0x221d + 0x221d + 0x61 + 0x0 + + + + .debug_abbrev + 0x227e + 0x227e + 0x44 + 0x0 + + + + .debug_abbrev + 0x22c2 + 0x22c2 + 0x4b + 0x0 + + + + .debug_abbrev + 0x230d + 0x230d + 0x1c + 0x0 + + + + .debug_abbrev + 0x2329 + 0x2329 + 0x71 + 0x0 + + + + .debug_abbrev + 0x239a + 0x239a + 0xb3 + 0x0 + + + + .debug_abbrev + 0x244d + 0x244d + 0x6d + 0x0 + + + + .debug_abbrev + 0x24ba + 0x24ba + 0x44 + 0x0 + + + + .debug_abbrev + 0x24fe + 0x24fe + 0x6d + 0x0 + + + + .debug_abbrev + 0x256b + 0x256b + 0x44 + 0x0 + + + + .debug_abbrev + 0x25af + 0x25af + 0x5f + 0x0 + + + + .debug_abbrev + 0x260e + 0x260e + 0x44 + 0x0 + + + + .debug_abbrev + 0x2652 + 0x2652 + 0x28 + 0x0 + + + + .debug_abbrev + 0x267a + 0x267a + 0xa0 + 0x0 + + + + .debug_abbrev + 0x271a + 0x271a + 0x57 + 0x0 + + + + .debug_abbrev + 0x2771 + 0x2771 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2799 + 0x2799 + 0x28 + 0x0 + + + + .debug_abbrev + 0x27c1 + 0x27c1 + 0x5f + 0x0 + + + + .debug_abbrev + 0x2820 + 0x2820 + 0x3a + 0x0 + + + + .debug_abbrev + 0x285a + 0x285a + 0x64 + 0x0 + + + + .debug_abbrev + 0x28be + 0x28be + 0x79 + 0x0 + + + + .debug_abbrev + 0x2937 + 0x2937 + 0x61 + 0x0 + + + + .debug_abbrev + 0x2998 + 0x2998 + 0x44 + 0x0 + + + + .debug_abbrev + 0x29dc + 0x29dc + 0x26 + 0x0 + + + + .debug_abbrev + 0x2a02 + 0x2a02 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2a1e + 0x2a1e + 0x49 + 0x0 + + + + .debug_abbrev + 0x2a67 + 0x2a67 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2a83 + 0x2a83 + 0xf + 0x0 + + + .debug_str + 0x0 + 0x0 + 0x68 + 0x0 + + + + .debug_str + 0x68 + 0x68 + 0x68 + 0x0 + + + + .debug_str + 0xd0 + 0xd0 + 0x68 + 0x0 + + + + .debug_str + 0x138 + 0x138 + 0x68 + 0x0 + + + + .debug_str + 0x1a0 + 0x1a0 + 0x68 + 0x0 + + + + .debug_str + 0x208 + 0x208 + 0x69 + 0x0 + + + + .debug_str + 0x271 + 0x271 + 0x69 + 0x0 + + + + .debug_str + 0x2da + 0x2da + 0x69 + 0x0 + + + + .debug_str + 0x343 + 0x343 + 0x69 + 0x0 + + + + .debug_str + 0x3ac + 0x3ac + 0x69 + 0x0 + + + + .debug_str + 0x415 + 0x415 + 0x69 + 0x0 + + + + .debug_str + 0x47e + 0x47e + 0x68 + 0x0 + + + + .debug_str + 0x4e6 + 0x4e6 + 0x68 + 0x0 + + + + .debug_str + 0x54e + 0x54e + 0x68 + 0x0 + + + + .debug_str + 0x5b6 + 0x5b6 + 0x68 + 0x0 + + + + .debug_str + 0x61e + 0x61e + 0x68 + 0x0 + + + + .debug_str + 0x686 + 0x686 + 0x68 + 0x0 + + + + .debug_str + 0x6ee + 0x6ee + 0x68 + 0x0 + + + + .debug_str + 0x756 + 0x756 + 0x68 + 0x0 + + + + .debug_str + 0x7be + 0x7be + 0x68 + 0x0 + + + + .debug_str + 0x826 + 0x826 + 0x68 + 0x0 + + + + .debug_str + 0x88e + 0x88e + 0x68 + 0x0 + + + + .debug_str + 0x8f6 + 0x8f6 + 0x68 + 0x0 + + + + .debug_str + 0x95e + 0x95e + 0x68 + 0x0 + + + + .debug_str + 0x9c6 + 0x9c6 + 0x68 + 0x0 + + + + .debug_aranges + 0x0 + 0x0 + 0x88 + 0x0 + + + + .debug_aranges + 0x88 + 0x88 + 0x20 + 0x0 + + + + .debug_aranges + 0xa8 + 0xa8 + 0x58 + 0x0 + + + + .debug_aranges + 0x100 + 0x100 + 0x20 + 0x0 + + + + .debug_aranges + 0x120 + 0x120 + 0x120 + 0x0 + + + + .debug_aranges + 0x240 + 0x240 + 0x20 + 0x0 + + + + .debug_aranges + 0x260 + 0x260 + 0x20 + 0x0 + + + + .debug_aranges + 0x280 + 0x280 + 0xb0 + 0x0 + + + + .debug_aranges + 0x330 + 0x330 + 0x20 + 0x0 + + + + .debug_aranges + 0x350 + 0x350 + 0x20 + 0x0 + + + + .debug_aranges + 0x370 + 0x370 + 0x20 + 0x0 + + + + .debug_aranges + 0x390 + 0x390 + 0x20 + 0x0 + + + + .debug_aranges + 0x3b0 + 0x3b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x3d0 + 0x3d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x3f0 + 0x3f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x410 + 0x410 + 0x20 + 0x0 + + + + .debug_aranges + 0x430 + 0x430 + 0x20 + 0x0 + + + + .debug_aranges + 0x450 + 0x450 + 0x20 + 0x0 + + + + .debug_aranges + 0x470 + 0x470 + 0x20 + 0x0 + + + + .debug_aranges + 0x490 + 0x490 + 0x20 + 0x0 + + + + .debug_aranges + 0x4b0 + 0x4b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x4d0 + 0x4d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x4f0 + 0x4f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x510 + 0x510 + 0x20 + 0x0 + + + + .debug_aranges + 0x530 + 0x530 + 0x20 + 0x0 + + + + .debug_aranges + 0x550 + 0x550 + 0x20 + 0x0 + + + + .debug_aranges + 0x570 + 0x570 + 0x20 + 0x0 + + + + .debug_aranges + 0x590 + 0x590 + 0x20 + 0x0 + + + + .debug_aranges + 0x5b0 + 0x5b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5d0 + 0x5d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5f0 + 0x5f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x610 + 0x610 + 0x20 + 0x0 + + + + .debug_aranges + 0x630 + 0x630 + 0x20 + 0x0 + + + + .debug_aranges + 0x650 + 0x650 + 0x20 + 0x0 + + + + .debug_aranges + 0x670 + 0x670 + 0x20 + 0x0 + + + + .debug_aranges + 0x690 + 0x690 + 0x20 + 0x0 + + + + .debug_aranges + 0x6b0 + 0x6b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6d0 + 0x6d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6f0 + 0x6f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x710 + 0x710 + 0x20 + 0x0 + + + + .debug_aranges + 0x730 + 0x730 + 0x20 + 0x0 + + + + .debug_aranges + 0x750 + 0x750 + 0x20 + 0x0 + + + + .debug_aranges + 0x770 + 0x770 + 0x20 + 0x0 + + + + .debug_aranges + 0x790 + 0x790 + 0x20 + 0x0 + + + + .debug_aranges + 0x7b0 + 0x7b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7d0 + 0x7d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7f0 + 0x7f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x810 + 0x810 + 0x20 + 0x0 + + + + .debug_aranges + 0x830 + 0x830 + 0x20 + 0x0 + + + + .debug_aranges + 0x850 + 0x850 + 0x20 + 0x0 + + + + .debug_aranges + 0x870 + 0x870 + 0x20 + 0x0 + + + + .debug_aranges + 0x890 + 0x890 + 0x20 + 0x0 + + + + .debug_aranges + 0x8b0 + 0x8b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8d0 + 0x8d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8f0 + 0x8f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x910 + 0x910 + 0x20 + 0x0 + + + + .debug_aranges + 0x930 + 0x930 + 0x20 + 0x0 + + + + .debug_aranges + 0x950 + 0x950 + 0x20 + 0x0 + + + + .debug_aranges + 0x970 + 0x970 + 0x20 + 0x0 + + + + .debug_aranges + 0x990 + 0x990 + 0x20 + 0x0 + + + + .debug_aranges + 0x9b0 + 0x9b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9d0 + 0x9d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9f0 + 0x9f0 + 0x20 + 0x0 + + + + .debug_aranges + 0xa10 + 0xa10 + 0x20 + 0x0 + + + + .debug_aranges + 0xa30 + 0xa30 + 0x20 + 0x0 + + + + .debug_aranges + 0xa50 + 0xa50 + 0x20 + 0x0 + + + + .debug_aranges + 0xa70 + 0xa70 + 0x20 + 0x0 + + + + .debug_aranges + 0xa90 + 0xa90 + 0x20 + 0x0 + + + + .debug_aranges + 0xab0 + 0xab0 + 0x20 + 0x0 + + + + .debug_aranges + 0xad0 + 0xad0 + 0x20 + 0x0 + + + + .debug_aranges + 0xaf0 + 0xaf0 + 0x20 + 0x0 + + + + .debug_aranges + 0xb10 + 0xb10 + 0x28 + 0x0 + + + + .debug_aranges + 0xb38 + 0xb38 + 0x30 + 0x0 + + + + .debug_aranges + 0xb68 + 0xb68 + 0x20 + 0x0 + + + + .debug_aranges + 0xb88 + 0xb88 + 0x20 + 0x0 + + + + .debug_aranges + 0xba8 + 0xba8 + 0x20 + 0x0 + + + + .debug_pubnames + 0x0 + 0x0 + 0x140 + 0x0 + + + + .debug_pubnames + 0x140 + 0x140 + 0x1b + 0x0 + + + + .debug_pubnames + 0x15b + 0x15b + 0x2d + 0x0 + + + + .debug_pubnames + 0x188 + 0x188 + 0x23 + 0x0 + + + + .debug_pubnames + 0x1ab + 0x1ab + 0x25 + 0x0 + + + + .debug_pubnames + 0x1d0 + 0x1d0 + 0x20 + 0x0 + + + + .debug_pubnames + 0x1f0 + 0x1f0 + 0x22 + 0x0 + + + + .debug_pubnames + 0x212 + 0x212 + 0x20 + 0x0 + + + + .debug_pubnames + 0x232 + 0x232 + 0x22 + 0x0 + + + + .debug_pubnames + 0x254 + 0x254 + 0x1f + 0x0 + + + + .debug_pubnames + 0x273 + 0x273 + 0xc3 + 0x0 + + + + .debug_pubnames + 0x336 + 0x336 + 0x21 + 0x0 + + + + .debug_pubnames + 0x357 + 0x357 + 0x28a + 0x0 + + + + .debug_pubnames + 0x5e1 + 0x5e1 + 0x29 + 0x0 + + + + .debug_pubnames + 0x60a + 0x60a + 0x2d + 0x0 + + + + .debug_pubnames + 0x637 + 0x637 + 0x2d + 0x0 + + + + .debug_pubnames + 0x664 + 0x664 + 0x2d + 0x0 + + + + .debug_pubnames + 0x691 + 0x691 + 0x2e + 0x0 + + + + .debug_pubnames + 0x6bf + 0x6bf + 0x2a + 0x0 + + + + .debug_pubnames + 0x6e9 + 0x6e9 + 0x2c + 0x0 + + + + .debug_pubnames + 0x715 + 0x715 + 0x2b + 0x0 + + + + .debug_pubnames + 0x740 + 0x740 + 0x33e + 0x0 + + + + .debug_pubnames + 0xa7e + 0xa7e + 0x44 + 0x0 + + + + .debug_pubnames + 0xac2 + 0xac2 + 0x45 + 0x0 + + + + .debug_pubnames + 0xb07 + 0xb07 + 0x4c + 0x0 + + + + .debug_pubnames + 0xb53 + 0xb53 + 0x224 + 0x0 + + + + .debug_pubnames + 0xd77 + 0xd77 + 0x2b + 0x0 + + + + .debug_pubnames + 0xda2 + 0xda2 + 0x30 + 0x0 + + + + .debug_pubnames + 0xdd2 + 0xdd2 + 0x2c + 0x0 + + + + .debug_pubnames + 0xdfe + 0xdfe + 0x2b + 0x0 + + + + .debug_pubnames + 0xe29 + 0xe29 + 0x2a + 0x0 + + + + .debug_pubnames + 0xe53 + 0xe53 + 0x2d + 0x0 + + + + .debug_pubnames + 0xe80 + 0xe80 + 0x2d + 0x0 + + + + .debug_pubnames + 0xead + 0xead + 0x2b + 0x0 + + + + .debug_pubnames + 0xed8 + 0xed8 + 0x2c + 0x0 + + + + .debug_pubnames + 0xf04 + 0xf04 + 0x28 + 0x0 + + + + .debug_pubnames + 0xf2c + 0xf2c + 0x29 + 0x0 + + + + .debug_pubnames + 0xf55 + 0xf55 + 0x26 + 0x0 + + + + .debug_pubnames + 0xf7b + 0xf7b + 0x30 + 0x0 + + + + .debug_pubnames + 0xfab + 0xfab + 0x27 + 0x0 + + + + .debug_pubnames + 0xfd2 + 0xfd2 + 0x26 + 0x0 + + + + .debug_pubnames + 0xff8 + 0xff8 + 0x2c + 0x0 + + + + .debug_pubnames + 0x1024 + 0x1024 + 0x28 + 0x0 + + + + .debug_pubnames + 0x104c + 0x104c + 0x30 + 0x0 + + + + .debug_pubnames + 0x107c + 0x107c + 0x2d + 0x0 + + + + .debug_pubnames + 0x10a9 + 0x10a9 + 0x28 + 0x0 + + + + .debug_pubnames + 0x10d1 + 0x10d1 + 0x2d + 0x0 + + + + .debug_pubnames + 0x10fe + 0x10fe + 0x2e + 0x0 + + + + .debug_pubnames + 0x112c + 0x112c + 0x2b + 0x0 + + + + .debug_pubnames + 0x1157 + 0x1157 + 0x2f + 0x0 + + + + .debug_pubnames + 0x1186 + 0x1186 + 0x38 + 0x0 + + + + .debug_pubnames + 0x11be + 0x11be + 0x2b + 0x0 + + + + .debug_pubnames + 0x11e9 + 0x11e9 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1219 + 0x1219 + 0x27 + 0x0 + + + + .debug_pubnames + 0x1240 + 0x1240 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1266 + 0x1266 + 0x27 + 0x0 + + + + .debug_pubnames + 0x128d + 0x128d + 0x28 + 0x0 + + + + .debug_pubnames + 0x12b5 + 0x12b5 + 0x2f + 0x0 + + + + .debug_pubnames + 0x12e4 + 0x12e4 + 0x24 + 0x0 + + + + .debug_pubnames + 0x1308 + 0x1308 + 0x2a + 0x0 + + + + .debug_pubnames + 0x1332 + 0x1332 + 0x2f + 0x0 + + + + .debug_pubnames + 0x1361 + 0x1361 + 0x2d + 0x0 + + + + .debug_pubnames + 0x138e + 0x138e + 0x37 + 0x0 + + + + .debug_pubnames + 0x13c5 + 0x13c5 + 0x26 + 0x0 + + + + .debug_pubnames + 0x13eb + 0x13eb + 0x2b + 0x0 + + + + .debug_pubnames + 0x1416 + 0x1416 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1447 + 0x1447 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1477 + 0x1477 + 0x29 + 0x0 + + + + .debug_pubnames + 0x14a0 + 0x14a0 + 0x2a + 0x0 + + + + .debug_pubnames + 0x14ca + 0x14ca + 0x29 + 0x0 + + + + .debug_pubnames + 0x14f3 + 0x14f3 + 0x36 + 0x0 + + + + .debug_pubnames + 0x1529 + 0x1529 + 0x31 + 0x0 + + + + .debug_pubnames + 0x155a + 0x155a + 0x2a + 0x0 + + + + .debug_pubnames + 0x1584 + 0x1584 + 0x26 + 0x0 + + + + .debug_pubnames + 0x15aa + 0x15aa + 0x26 + 0x0 + + + + .debug_pubnames + 0x15d0 + 0x15d0 + 0x28 + 0x0 + + + + .debug_pubnames + 0x15f8 + 0x15f8 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1625 + 0x1625 + 0x2e + 0x0 + + + + .debug_pubnames + 0x1653 + 0x1653 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1684 + 0x1684 + 0x1b + 0x0 + + + + .debug_pubnames + 0x169f + 0x169f + 0x1b + 0x0 + + + + .debug_pubnames + 0x16ba + 0x16ba + 0x1f + 0x0 + + + + .debug_pubnames + 0x16d9 + 0x16d9 + 0x25 + 0x0 + + + + .debug_pubnames + 0x16fe + 0x16fe + 0x1d + 0x0 + + + + .debug_pubnames + 0x171b + 0x171b + 0x27 + 0x0 + + + + .debug_pubnames + 0x1742 + 0x1742 + 0x35 + 0x0 + + + + .debug_pubnames + 0x1777 + 0x1777 + 0x25 + 0x0 + + + + .debug_pubnames + 0x179c + 0x179c + 0x2b + 0x0 + + + + .debug_pubnames + 0x17c7 + 0x17c7 + 0x2b + 0x0 + + + + .debug_pubnames + 0x17f2 + 0x17f2 + 0x5e + 0x0 + + + + .debug_pubnames + 0x1850 + 0x1850 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1875 + 0x1875 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1891 + 0x1891 + 0x1e + 0x0 + + + + .debug_pubnames + 0x18af + 0x18af + 0x43 + 0x0 + + + + .debug_pubnames + 0x18f2 + 0x18f2 + 0x21 + 0x0 + + + + .debug_pubnames + 0x1913 + 0x1913 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1930 + 0x1930 + 0x1c + 0x0 + + + + .debug_pubnames + 0x194c + 0x194c + 0x29 + 0x0 + + + + SFRA_F32_Data + true + true + 0x2 + 0x22 + 0x2 + + + + + + .cinit + 0x83b40 + 0x83b40 + 0x28 + + + + + + + + + + .text + 0x82000 + 0x82000 + 0x1b3b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .text + + + + + + codestart + 0x80000 + 0x80000 + 0x2 + + + + + + .stack + 0x400 + 0x100 + + + + + + + .switch + 0x0 + 0x0 + + + + + .reset + 0x3fffc0 + 0x0 + + + + + .init_array + 0x0 + 0x0 + + + + + .bss + 0xa800 + 0x6c2 + + + + + + + + + + + + + + + + + + + + + + .bss:output + 0x0 + 0x0 + + + + + .bss:cio + 0x0 + 0x0 + + + + + .data + 0xaec2 + 0x13 + + + + + + + + + + + .sysmem + 0x0 + 0x0 + + + + + .const + 0x90000 + 0x90000 + 0x46f + + + + + + + + + + + + + + Filter_RegsFile + 0x0 + 0x0 + + + + + SHARERAMGS0 + 0x0 + 0x0 + + + + + SHARERAMGS1 + 0x0 + 0x0 + + + + + SHARERAMGS2 + 0x0 + 0x0 + + + + + ramgs0 + 0x0 + 0x0 + + + + + ramgs1 + 0x0 + 0x0 + + + + + .TI.ramfunc + 0x86000 + 0x8000 + 0x128 + + + + + + + + + + + + + + + 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 + 0x3367 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_info + 0x0 + 0x0 + 0xfef0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_line + 0x0 + 0x0 + 0x482d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_frame + 0x0 + 0x0 + 0x1b40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_abbrev + 0x0 + 0x0 + 0x2a92 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_str + 0x0 + 0x0 + 0xa2e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_aranges + 0x0 + 0x0 + 0xbc8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_pubnames + 0x0 + 0x0 + 0x1975 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SFRA_F32_Data + 0x2 + 0x22 + + + + + + SEGMENT_0 + 0x80000 + 0x80000 + 0x2 + 0x5 + + + + + + SEGMENT_1 + 0x82000 + 0x82000 + 0x1b3b + 0x5 + + + + + + SEGMENT_2 + 0x83b40 + 0x83b40 + 0x28 + 0x4 + + + + + + SEGMENT_3 + 0x86000 + 0x8000 + 0x128 + 0x5 + + + + + + SEGMENT_4 + 0x90000 + 0x90000 + 0x46f + 0x4 + + + + + + SEGMENT_5 + 0x2 + 0x22 + 0x6 + + + + + + SEGMENT_6 + 0x400 + 0x100 + 0x6 + + + + + + SEGMENT_7 + 0xa800 + 0x6d5 + 0x6 + + + + + + + + + RAMM0 + 0x0 + 0x123 + 0x2dd + 0x0 + 0x2dd + RWIX + + + + + RAMLS0 + 0x0 + 0x8000 + 0x800 + 0x128 + 0x6d8 + RWIX + + + 0x8000 + 0x128 + + + + 0x8128 + 0x6d8 + + + + + 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 + 0x0 + 0x800 + RWIX + + + + + RAMGS14 + 0x0 + 0x1a000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS15 + 0x0 + 0x1b000 + 0xff8 + 0x0 + 0xff8 + RWIX + + + + + BEGIN + 0x0 + 0x80000 + 0x2 + 0x2 + 0x0 + RWIX + + + 0x80000 + 0x2 + + + + + + FLASHA + 0x0 + 0x80002 + 0x1ffe + 0x0 + 0x1ffe + RWIX + + + + + FLASHB + 0x0 + 0x82000 + 0x2000 + 0x1b63 + 0x49d + RWIX + + + 0x82000 + 0x1b3b + + + + 0x83b3b + 0x5 + + + 0x83b40 + 0x28 + + + + 0x83b68 + 0x498 + + + + + FLASHC + 0x0 + 0x84000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHD + 0x0 + 0x86000 + 0x2000 + 0x128 + 0x1ed8 + RWIX + + + 0x86000 + 0x128 + + + + 0x86128 + 0x1ed8 + + + + + FLASHE + 0x0 + 0x88000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHF + 0x0 + 0x90000 + 0x8000 + 0x46f + 0x7b91 + RWIX + + + 0x90000 + 0x46f + + + + 0x9046f + 0x7b91 + + + + + 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 + 0x22 + 0xff + RWIX + + + 0x2 + 0x22 + + + + 0x24 + 0xff + + + + + RAMM1 + 0x1 + 0x400 + 0x3f8 + 0x100 + 0x2f8 + RWIX + + + 0x400 + 0x100 + + + + 0x500 + 0x2f8 + + + + + RAMLS5 + 0x1 + 0xa800 + 0x800 + 0x6d5 + 0x12b + RWIX + + + 0xa800 + 0x6c2 + + + + 0xaec2 + 0x13 + + + + 0xaed5 + 0x12b + + + + + 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 + + + + + CPU2TOCPU1RAM + 0x1 + 0x3f800 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CPU1TOCPU2RAM + 0x1 + 0x3fc00 + 0x400 + 0x0 + 0x400 + RWIX + + + + + + + __TI_cinit_table + + .data + 0x83b40 + 0xd + 0xaec2 + 0x13 + lzss + + + .bss + 0x83b54 + 0x4 + 0xa800 + 0x6c2 + zero_init + + + SFRA_F32_Data + 0x83b58 + 0x4 + 0x2 + 0x22 + zero_init + + + + + __TI_handler_table + + 0x0 + __TI_zero_init + + + 0x1 + __TI_decompress_lzss + + + 0x2 + __TI_decompress_none + + + + + RamfuncsLoadStart + 0x86000 + + + RamfuncsLoadSize + 0x128 + + + RamfuncsLoadEnd + 0x86128 + + + RamfuncsRunStart + 0x8000 + + + RamfuncsRunSize + 0x128 + + + RamfuncsRunEnd + 0x8128 + + + __TI_CINIT_Base + 0x83b5c + + + __TI_CINIT_Limit + 0x83b68 + + + __TI_CINIT_Warm + 0x83b68 + + + __TI_Handler_Table_Base + 0x83b4e + + + __TI_Handler_Table_Limit + 0x83b54 + + + __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 + + + INTERRUPT_init + 0x83234 + + + + PinMux_init + 0x831f4 + + + + Board_init + 0x831e9 + + + + GPIO_init + 0x8321d + + + + CPUTIMER_init + 0x831fa + + + + myCPUTIMER0_init + 0x831fd + + + + LED_Blue_init + 0x83220 + + + + main + 0x83a57 + + + + plantPhaseVect + 0xacb0 + + + + clPhaseVect + 0xa8c8 + + + + sfra_task_run + 0x83026 + + + + olPhaseVect + 0xab20 + + + + sfra_init + 0x82fb0 + + + + lowPass_test + 0xad80 + + + + plantMagVect + 0xabe8 + + + + sfra1 + 0xad8a + + + + freqVect + 0xa990 + + + + olMagVect + 0xaa58 + + + + clMagVect + 0xa800 + + + + TIMER0_ISR + 0x83575 + + + + SFRA_GUI_varGetList + 0xae42 + + + + SFRA_GUI_rcvTaskPointer + 0xadd2 + + + + SFRA_GUI_cmdInterpreter + 0x82350 + + + + SFRA_GUI_commsOKflg + 0xadc0 + + + + SFRA_GUI_memDataPtr16 + 0xadd8 + + + + SFRA_GUI_getVariable + 0x823df + + + + SFRA_GUI_runSerialHostComms + 0x82255 + + + + SFRA_GUI_rxChar + 0xadc4 + + + + SFRA_GUI_lowByteFlag + 0xadc2 + + + + SFRA_GUI_memDataPtr32 + 0xadda + + + + SFRA_GUI_varSetBtnList + 0xae62 + + + + SFRA_GUI_getData + 0x823e5 + + + + SFRA_GUI_config + 0x82143 + + + + SFRA_GUI_led_gpio + 0xadd0 + + + + SFRA_GUI_delayer + 0xadcb + + + + SFRA_GUI_sendTaskPtr + 0xadc3 + + + + SFRA_GUI_getCmdByte + 0x82269 + + + + SFRA_GUI_echoCmdByte + 0x822ab + + + + SFRA_GUI_sendData + 0x82448 + + + + SFRA_GUI_cmdPacket + 0xad78 + + + + SFRA_GUI_rxWord + 0xadc5 + + + + SFRA_GUI_led_flag + 0xadcf + + + + SFRA_GUI_memGetAmount + 0xadcd + + + + SFRA_GUI_arrayGetList + 0xade2 + + + + SFRA_GUI_echoSizeByte + 0x822e5 + + + + SFRA_GUI_setData32 + 0x82414 + + + + SFRA_GUI_dataOut32 + 0xadd6 + + + + SFRA_GUI_memGetAddress + 0xaddc + + + + SFRA_GUI_getDataByte + 0x822ff + + + + SFRA_GUI_dataOut16 + 0xadc9 + + + + SFRA_GUI_getSizeByte + 0x822c5 + + + + SFRA_GUI_echoDataByte + 0x8231f + + + + SFRA_GUI_packWord + 0x82332 + + + + SFRA_GUI_setText + 0x823a6 + + + + SFRA_GUI_sweep_start + 0xadd1 + + + + SFRA_GUI_setSlider + 0x823cc + + + + SFRA_GUI_lifePulseTsk + 0x82370 + + + + SFRA_GUI_rcvTskPtrShdw + 0xadca + + + + SFRA_GUI_numWords + 0xadc7 + + + + SFRA_GUI_varSetSldrList + 0xae82 + + + + SFRA_GUI_spareTsk08 + 0x82443 + + + + SFRA_GUI_wordsLeftToGet + 0xadc8 + + + + SFRA_GUI_serialCommsTimer + 0xadc1 + + + + SFRA_GUI_dataSetList + 0xae22 + + + + SFRA_GUI_temp + 0xade0 + + + + SFRA_GUI_sci_base_addr + 0xadd4 + + + + SFRA_GUI_varSetTxtList + 0xaea2 + + + + SFRA_GUI_memSetValue + 0xadde + + + + SFRA_GUI_memSetPtr + 0xadce + + + + SFRA_GUI_memGetPtr + 0xadcc + + + + SFRA_GUI_taskDoneFlag + 0xadc6 + + + + SFRA_GUI_cmdDispatcher + 0xae02 + + + + SFRA_GUI_getArray + 0x823e2 + + + + SFRA_GUI_setButton + 0x823b9 + + + + code_start + 0x80000 + + + + Device_enableAllPeripherals + 0x8261d + + + + Device_initGPIO + 0x82708 + + + + Example_Fail + 0xaec6 + + + + Example_setResultFail + 0x82926 + + + + Device_bootCPU2 + 0x827a0 + + + + Device_init + 0x825c8 + + + + Example_Result + 0xaec2 + + + + Device_enableUnbondedGPIOPullups + 0x82759 + + + + __error__ + 0x8291a + + + + Example_setResultPass + 0x82921 + + + + Device_configureTMXAnalogTrim + 0x8276f + + + + Device_enableUnbondedGPIOPullupsFor176Pin + 0x82729 + + + + Example_done + 0x8292b + + + + Example_PassCount + 0xaec4 + + + + Device_enableUnbondedGPIOPullupsFor100Pin + 0x8273c + + + + CPUTimer_setEmulationMode + 0x83a0d + + + + Flash_initModule + 0x8000 + + + + GPIO_setQualificationMode + 0x8372d + + + + GPIO_setPadConfig + 0x8348a + + + + GPIO_setDirectionMode + 0x8379b + + + + GPIO_setPinConfig + 0x836f6 + + + + GPIO_setControllerCore + 0x836bf + + + + Interrupt_defaultHandler + 0x839e3 + + + + Interrupt_initModule + 0x83682 + + + + Interrupt_nmiHandler + 0x83af8 + + + + Interrupt_enable + 0x83764 + + + + Interrupt_initVectorTable + 0x83901 + + + + Interrupt_illegalOperationHandler + 0x83aee + + + + SCI_clearInterruptStatus + 0x835bb + + + + SCI_setConfig + 0x83644 + + + + SCI_enableInterrupt + 0x83600 + + + + SysCtl_delay + 0x8124 + + + + SysCtl_getDeviceParametric + 0x83359 + + + + SysCtl_selectXTAL + 0x83241 + + + + SysCtl_selectOscSource + 0x8352d + + + + SysCtl_getLowSpeedClock + 0x83954 + + + + SysCtl_setClock + 0x8292c + + + + SysCtl_getClock + 0x834dc + + + + SFRA_F32_runBackgroundTask + 0x82b35 + + + + __SFRA_F32_collect + 0x833c1 + + + + _SFRA_F32_state + 0x2 + + + + SFRA_F32_updateInjectionAmplitude + 0x82d2f + + + + SFRA_F32_resetFreqRespArray + 0x82d37 + + + + _SFRA_F32_yCosSum + 0xe + + + + _SFRA_F32_ySinSum + 0xc + + + + _SFRA_F32_pointerStart + 0x10 + + + + _SFRA_F32_step + 0x18 + + + + _SFRA_F32_preCount + 0x1c + + + + _SFRA_F32_scalar + 0x16 + + + + _SFRA_F32_pointer + 0x1a + + + + SFRA_F32_config + 0x82e93 + + + + _SFRA_F32_reference + 0x12 + + + + _SFRA_F32_windowSamples + 0x20 + + + + _SFRA_F32_amplitude + 0x14 + + + + SFRA_F32_initFreqArrayWithLogSteps + 0x82e69 + + + + SFRA_F32_reset + 0x82e40 + + + + _SFRA_F32_uCosSum + 0xa + + + + _SFRA_F32_uSinSum + 0x8 + + + + _SFRA_F32_rCosSum + 0x6 + + + + _SFRA_F32_rSinSum + 0x4 + + + + _SFRA_F32_count + 0x1e + + + + _SFRA_F32_stateSlew + 0x3 + + + + _SFRA_F32_angle + 0x22 + + + + __SFRA_F32_inject + 0x8389c + + + + logf + 0x83033 + + + + tanf + 0x83428 + + + + _c_int00 + 0x839cc + + + + __stack + 0x400 + + + + __c28xabi_divf + 0x832d1 + + + + memcpy + 0x838c2 + + + + _system_pre_init + 0x83b38 + + + + __TI_auto_init_nobinit_nopinit + 0x837fa + + + + __TI_zero_init + 0x83b32 + + + + __TI_decompress_none + 0x83b1c + + + + __TI_decompress_lzss + 0x837cc + + + + C$$EXIT + 0x83825 + + + + abort + 0x83825 + + + + exit + 0x83827 + + + + __TI_dtors_ptr + 0xaecc + + + + __TI_cleanup_ptr + 0xaeca + + + + __TI_enable_exit_profile_output + 0xaec8 + + + + _nop + 0x83b13 + + + + _lock + 0xaece + + + + _unlock + 0xaed0 + + + + _register_lock + 0x83b0f + + + + _register_unlock + 0x83b0b + + + + _args_main + 0x83a69 + + + + memset + 0x83b2b + + + + errno + 0xaed4 + + + + _system_post_cinit + 0x83b3a + + + + Link successful +
diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.map b/28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.map new file mode 100644 index 0000000..c5a34d5 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.map @@ -0,0 +1,823 @@ +****************************************************************************** + TMS320C2000 Linker PC v25.11.0 +****************************************************************************** +>> Linked Sat May 30 02:09:41 2026 + +OUTPUT FILE NAME: <28379d_PP_SFRA.out> +ENTRY POINT SYMBOL: "code_start" address: 00080000 + + +MEMORY CONFIGURATION + + name origin length used unused attr fill +---------------------- -------- --------- -------- -------- ---- -------- +PAGE 0: + RAMM0 00000123 000002dd 00000000 000002dd RWIX + RAMLS0 00008000 00000800 00000128 000006d8 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 00000000 00000800 RWIX + RAMGS14 0001a000 00001000 00000000 00001000 RWIX + RAMGS15 0001b000 00000ff8 00000000 00000ff8 RWIX + BEGIN 00080000 00000002 00000002 00000000 RWIX + FLASHA 00080002 00001ffe 00000000 00001ffe RWIX + FLASHB 00082000 00002000 00001f68 00000098 RWIX + FLASHC 00084000 00002000 00000038 00001fc8 RWIX + FLASHD 00086000 00002000 00000128 00001ed8 RWIX + FLASHE 00088000 00008000 00000000 00008000 RWIX + FLASHF 00090000 00008000 00000513 00007aed 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 00000022 000000ff RWIX + RAMM1 00000400 000003f8 00000100 000002f8 RWIX + RAMLS5 0000a800 00000800 00000043 000007bd RWIX + RAMD1 0000b800 00000800 00000000 00000800 RWIX + RAMGS0 0000c000 00001000 00000958 000006a8 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 + CPU2TOCPU1RAM 0003f800 00000400 00000000 00000400 RWIX + CPU1TOCPU2RAM 0003fc00 00000400 00000000 00000400 RWIX + + +SECTION ALLOCATION MAP + + output attributes/ +section page origin length input sections +-------- ---- ---------- ---------- ---------------- +codestart +* 0 00080000 00000002 + 00080000 00000002 F2837xD_CodeStartBranch.obj (codestart) + +.cinit 0 00084000 00000038 + 00084000 0000001e (.cinit..data.load) [load image, compression = lzss] + 0008401e 00000006 (__TI_handler_table) + 00084024 00000004 (.cinit..bss.load) [load image, compression = zero_init] + 00084028 00000004 (.cinit.SFRA_F32_Data.load) [load image, compression = zero_init] + 0008402c 0000000c (__TI_cinit_table) + +.stack 1 00000400 00000100 UNINITIALIZED + 00000400 00000100 --HOLE-- + +.reset 0 003fffc0 00000000 DSECT + +.init_array +* 0 00082000 00000000 UNINITIALIZED + +.bss 1 0000c000 00000958 UNINITIALIZED + 0000c000 000002d8 sfra_test.obj (.bss) + 0000c2d8 000000c8 sfra_test.obj (.bss:clMagVect) + 0000c3a0 000000c8 sfra_test.obj (.bss:clPhaseVect) + 0000c468 000000c8 sfra_test.obj (.bss:freqVect) + 0000c530 000000c8 sfra_test.obj (.bss:olMagVect) + 0000c5f8 000000c8 sfra_test.obj (.bss:olPhaseVect) + 0000c6c0 000000c8 sfra_test.obj (.bss:plantMagVect) + 0000c788 000000c8 sfra_test.obj (.bss:plantPhaseVect) + 0000c850 00000022 sfra_gui_scicomms_driverlib.obj (.bss) + 0000c872 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_arrayGetList) + 0000c892 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdDispatcher) + 0000c8b2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_dataSetList) + 0000c8d2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varGetList) + 0000c8f2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetBtnList) + 0000c912 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetSldrList) + 0000c932 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetTxtList) + 0000c952 00000006 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdPacket) + +.data 1 0000a800 00000043 UNINITIALIZED + 0000a800 00000032 sfra_test.obj (.data) + 0000a832 00000006 device.obj (.data) + 0000a838 00000006 rts2800_fpu32_eabi.lib : exit.c.obj (.data) + 0000a83e 00000002 : _lock.c.obj (.data:_lock) + 0000a840 00000002 : _lock.c.obj (.data:_unlock) + 0000a842 00000001 : errno.c.obj (.data) + +.const 0 00090000 00000513 + 00090000 000000c2 driverlib_eabi.lib : sysctl.obj (.const:.string) + 000900c2 000000bf : flash.obj (.const:.string) + 00090181 00000001 --HOLE-- [fill = 0] + 00090182 000000bc : gpio.obj (.const:.string) + 0009023e 000000bb : sci.obj (.const:.string) + 000902f9 00000001 --HOLE-- [fill = 0] + 000902fa 000000a8 sfra_test.obj (.const:.string) + 000903a2 0000007f board.obj (.const:.string) + 00090421 00000001 --HOLE-- [fill = 0] + 00090422 0000007b sfra_gui_scicomms_driverlib.obj (.const:.string) + 0009049d 00000001 --HOLE-- [fill = 0] + 0009049e 00000062 driverlib_eabi.lib : cputimer.obj (.const:.string) + 00090500 00000013 device.obj (.const:.string) + +.TI.ramfunc +* 0 00086000 00000128 RUN ADDR = 00008000 + 00086000 00000043 driverlib_eabi.lib : flash.obj (.TI.ramfunc:Flash_initModule) + 00086043 0000002c : flash.obj (.TI.ramfunc:Flash_setBankPowerMode) + 0008606f 00000024 : flash.obj (.TI.ramfunc:Flash_setWaitstates) + 00086093 0000001d : flash.obj (.TI.ramfunc:Flash_setPumpPowerMode) + 000860b0 00000018 : flash.obj (.TI.ramfunc:Flash_disableCache) + 000860c8 00000018 : flash.obj (.TI.ramfunc:Flash_disablePrefetch) + 000860e0 00000017 : flash.obj (.TI.ramfunc:Flash_enableCache) + 000860f7 00000017 : flash.obj (.TI.ramfunc:Flash_enablePrefetch) + 0008610e 00000016 : flash.obj (.TI.ramfunc:Flash_enableECC) + 00086124 00000004 : sysctl.obj (.TI.ramfunc) + +GETBUFFER +* 0 0003f800 00000000 DSECT + +GETWRITEIDX +* 0 0003f800 00000000 DSECT + +PUTREADIDX +* 0 0003f800 00000000 DSECT + +.text 0 00082000 00001f68 + 00082000 0000052e sfra_gui_scicomms_driverlib.obj (.text) + 0008252e 000003fe device.obj (.text) + 0008292c 000002ef sfra_test.obj (.text) + 00082c1b 0000020c board.obj (.text) + 00082e27 00000209 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_setClock) + 00083030 000001fa sfra_f32_tmu_eabi.lib : sfra_f32_tmu_background.obj (.text) + 0008322a 000001c2 : sfra_f32_tmu_config_reset.obj (.text) + 000833ec 0000012b rts2800_fpu32_eabi.lib : e_logf.c.obj (.text) + 00083517 00000107 : ll_div28.asm.obj (.text) + 0008361e 00000090 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_selectXTAL) + 000836ae 00000088 rts2800_fpu32_eabi.lib : fs_div28.asm.obj (.text) + 00083736 00000068 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getDeviceParametric) + 0008379e 00000067 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_collect.obj (.text) + 00083805 00000062 rts2800_fpu32_eabi.lib : s_tanf.c.obj (.text) + 00083867 00000052 driverlib_eabi.lib : gpio.obj (.text:GPIO_setPadConfig) + 000838b9 00000051 : sysctl.obj (.text:SysCtl_getClock) + 0008390a 00000048 : sysctl.obj (.text:SysCtl_selectOscSource) + 00083952 00000046 sfra_test.obj (.text:retain) + 00083998 00000045 driverlib_eabi.lib : sci.obj (.text:SCI_clearInterruptStatus) + 000839dd 00000044 : sci.obj (.text:SCI_enableInterrupt) + 00083a21 0000003e : sci.obj (.text:SCI_setConfig) + 00083a5f 0000003d : interrupt.obj (.text:Interrupt_initModule) + 00083a9c 00000037 : gpio.obj (.text:GPIO_setControllerCore) + 00083ad3 00000037 : gpio.obj (.text:GPIO_setPinConfig) + 00083b0a 00000037 : gpio.obj (.text:GPIO_setQualificationMode) + 00083b41 00000037 : interrupt.obj (.text:Interrupt_enable) + 00083b78 00000031 : gpio.obj (.text:GPIO_setDirectionMode) + 00083ba9 0000002e rts2800_fpu32_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss) + 00083bd7 0000002b : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit) + 00083c02 0000002a : l_div28.asm.obj (.text) + 00083c2c 00000029 : exit.c.obj (.text) + 00083c55 00000028 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_selectClockSource) + 00083c7d 00000026 : flash.obj (.text:Flash_setBankPowerUpDelay) + 00083ca3 00000026 rts2800_fpu32_eabi.lib : fs_tollfpu32.asm.obj (.text) + 00083cc9 00000026 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_inject.obj (.text) + 00083cef 00000020 rts2800_fpu32_eabi.lib : memcpy.c.obj (.text) + 00083d0f 0000001f driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_getTimerOverflowStatus) + 00083d2e 0000001e : interrupt.obj (.text:Interrupt_initVectorTable) + 00083d4c 0000001b : sci.obj (.text:SCI_isBaseValid) + 00083d67 0000001a : sysctl.obj (.text:CPUTimer_startTimer) + 00083d81 0000001a : sysctl.obj (.text:SysCtl_getLowSpeedClock) + 00083d9b 00000018 : sci.obj (.text:SCI_disableModule) + 00083db3 00000018 : sci.obj (.text:SCI_performSoftwareReset) + 00083dcb 00000017 : cputimer.obj (.text:CPUTimer_isBaseValid) + 00083de2 00000017 : sysctl.obj (.text:CPUTimer_isBaseValid) + 00083df9 00000017 rts2800_fpu32_eabi.lib : boot28.asm.obj (.text) + 00083e10 00000016 driverlib_eabi.lib : interrupt.obj (.text:Interrupt_defaultHandler) + 00083e26 00000014 : sysctl.obj (.text:CPUTimer_stopTimer) + 00083e3a 00000013 : cputimer.obj (.text:CPUTimer_setEmulationMode) + 00083e4d 00000013 : sci.obj (.text:SCI_enableModule) + 00083e60 00000012 : sysctl.obj (.text:CPUTimer_clearOverflowFlag) + 00083e72 00000012 : sysctl.obj (.text:CPUTimer_disableInterrupt) + 00083e84 00000012 main.obj (.text) + 00083e96 00000012 rts2800_fpu32_eabi.lib : args_main.c.obj (.text) + 00083ea8 00000011 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_setPeriod) + 00083eb9 00000010 : flash.obj (.text:Flash_isCtrlBaseValid) + 00083ec9 00000010 : flash.obj (.text:Flash_isECCBaseValid) + 00083ed9 0000000f : sysctl.obj (.text:SysCtl_pollCpuTimer) + 00083ee8 0000000e : gpio.obj (.text:GPIO_isPinValid) + 00083ef6 0000000d : interrupt.obj (.text:Interrupt_disableGlobal) + 00083f03 0000000d : interrupt.obj (.text:Interrupt_enableGlobal) + 00083f10 0000000b : sysctl.obj (.text:SysCtl_isMCDClockFailureDetected) + 00083f1b 0000000a : interrupt.obj (.text:Interrupt_illegalOperationHandler) + 00083f25 0000000a : interrupt.obj (.text:Interrupt_nmiHandler) + 00083f2f 00000009 : sysctl.obj (.text:SysCtl_serviceWatchdog) + 00083f38 00000009 rts2800_fpu32_eabi.lib : _lock.c.obj (.text) + 00083f41 00000008 F2837xD_CodeStartBranch.obj (.text) + 00083f49 00000008 rts2800_fpu32_eabi.lib : copy_decompress_none.c.obj (.text:decompress:none) + 00083f51 00000007 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_resetMCD) + 00083f58 00000007 rts2800_fpu32_eabi.lib : memset.c.obj (.text) + 00083f5f 00000006 : copy_zero_init.c.obj (.text:decompress:ZI) + 00083f65 00000002 : pre_init.c.obj (.text) + 00083f67 00000001 : startup.c.obj (.text) + +SFRA_F32_Data +* 1 00000002 00000022 UNINITIALIZED + 00000002 00000022 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_config_reset.obj (SFRA_F32_Data) + +MODULE SUMMARY + + Module code ro data rw data + ------ ---- ------- ------- + .\ + sfra_test.obj 821 168 2178 + main.obj 18 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 839 168 2178 + + .\SFRA\ + sfra_gui_scicomms_driverlib.obj 1326 123 264 + +--+---------------------------------+------+---------+---------+ + Total: 1326 123 264 + + .\device\ + device.obj 1022 19 6 + F2837xD_CodeStartBranch.obj 10 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1032 19 6 + + .\syscfg\ + board.obj 524 127 0 + +--+---------------------------------+------+---------+---------+ + Total: 524 127 0 + + ../SFRA/sfra_f32_tmu_eabi.lib + sfra_f32_tmu_background.obj 506 0 0 + sfra_f32_tmu_config_reset.obj 450 0 34 + sfra_f32_tmu_collect.obj 103 0 0 + sfra_f32_tmu_inject.obj 38 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1097 0 34 + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_eabi.lib + sysctl.obj 1191 194 0 + flash.obj 654 191 0 + gpio.obj 310 188 0 + sci.obj 293 187 0 + interrupt.obj 214 0 0 + cputimer.obj 42 98 0 + +--+---------------------------------+------+---------+---------+ + Total: 2704 858 0 + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\rts2800_fpu32_eabi.lib + e_logf.c.obj 299 0 0 + ll_div28.asm.obj 263 0 0 + fs_div28.asm.obj 136 0 0 + s_tanf.c.obj 98 0 0 + exit.c.obj 41 0 6 + copy_decompress_lzss.c.obj 46 0 0 + autoinit.c.obj 43 0 0 + l_div28.asm.obj 42 0 0 + fs_tollfpu32.asm.obj 38 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 + memset.c.obj 7 0 0 + copy_zero_init.c.obj 6 0 0 + pre_init.c.obj 2 0 0 + errno.c.obj 0 0 1 + startup.c.obj 1 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1112 0 11 + + Stack: 0 0 256 + Linker Generated: 0 56 0 + +--+---------------------------------+------+---------+---------+ + Grand Total: 8634 1351 2749 + + +LINKER GENERATED COPY TABLES + +__TI_cinit_table @ 0008402c records: 3, size/record: 4, table size: 12 + .data: load addr=00084000, load size=0000001e bytes, run addr=0000a800, run size=00000043 bytes, compression=lzss + .bss: load addr=00084024, load size=00000004 bytes, run addr=0000c000, run size=00000958 bytes, compression=zero_init + SFRA_F32_Data: load addr=00084028, load size=00000004 bytes, run addr=00000002, run size=00000022 bytes, compression=zero_init + + +LINKER GENERATED HANDLER TABLE + +__TI_handler_table @ 0008401e records: 3, size/record: 2, table size: 6 + index: 0, handler: __TI_zero_init + index: 1, handler: __TI_decompress_lzss + index: 2, handler: __TI_decompress_none + + +GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE + +address data page name +-------- ---------------- ---- +00000002 0 (00000000) _SFRA_F32_state +00000003 0 (00000000) _SFRA_F32_stateSlew +00000004 0 (00000000) _SFRA_F32_rSinSum +00000006 0 (00000000) _SFRA_F32_rCosSum +00000008 0 (00000000) _SFRA_F32_uSinSum +0000000a 0 (00000000) _SFRA_F32_uCosSum +0000000c 0 (00000000) _SFRA_F32_ySinSum +0000000e 0 (00000000) _SFRA_F32_yCosSum +00000010 0 (00000000) _SFRA_F32_pointerStart +00000012 0 (00000000) _SFRA_F32_reference +00000014 0 (00000000) _SFRA_F32_amplitude +00000016 0 (00000000) _SFRA_F32_scalar +00000018 0 (00000000) _SFRA_F32_step +0000001a 0 (00000000) _SFRA_F32_pointer +0000001c 0 (00000000) _SFRA_F32_preCount +0000001e 0 (00000000) _SFRA_F32_count +00000020 0 (00000000) _SFRA_F32_windowSamples +00000022 0 (00000000) _SFRA_F32_angle + +00000400 10 (00000400) __stack + +0000a802 2a0 (0000a800) libsfra +0000a832 2a0 (0000a800) Example_Result +0000a834 2a0 (0000a800) Example_PassCount +0000a836 2a0 (0000a800) Example_Fail +0000a838 2a0 (0000a800) __TI_enable_exit_profile_output +0000a83a 2a0 (0000a800) __TI_cleanup_ptr +0000a83c 2a0 (0000a800) __TI_dtors_ptr +0000a83e 2a0 (0000a800) _lock + +0000a840 2a1 (0000a840) _unlock +0000a842 2a1 (0000a840) errno + +0000c000 300 (0000c000) lowPass_test +0000c00a 300 (0000c000) ti_sfra + +0000c040 301 (0000c040) hal_sfra + +0000c080 302 (0000c080) libsfra_results + +0000c2d8 30b (0000c2c0) clMagVect + +0000c3a0 30e (0000c380) clPhaseVect + +0000c468 311 (0000c440) freqVect + +0000c530 314 (0000c500) olMagVect + +0000c5f8 317 (0000c5c0) olPhaseVect + +0000c6c0 31b (0000c6c0) plantMagVect + +0000c788 31e (0000c780) plantPhaseVect + +0000c850 321 (0000c840) SFRA_GUI_commsOKflg +0000c851 321 (0000c840) SFRA_GUI_serialCommsTimer +0000c852 321 (0000c840) SFRA_GUI_lowByteFlag +0000c853 321 (0000c840) SFRA_GUI_sendTaskPtr +0000c854 321 (0000c840) SFRA_GUI_rxChar +0000c855 321 (0000c840) SFRA_GUI_rxWord +0000c856 321 (0000c840) SFRA_GUI_taskDoneFlag +0000c857 321 (0000c840) SFRA_GUI_numWords +0000c858 321 (0000c840) SFRA_GUI_wordsLeftToGet +0000c859 321 (0000c840) SFRA_GUI_dataOut16 +0000c85a 321 (0000c840) SFRA_GUI_rcvTskPtrShdw +0000c85b 321 (0000c840) SFRA_GUI_delayer +0000c85c 321 (0000c840) SFRA_GUI_memGetPtr +0000c85d 321 (0000c840) SFRA_GUI_memGetAmount +0000c85e 321 (0000c840) SFRA_GUI_memSetPtr +0000c85f 321 (0000c840) SFRA_GUI_led_flag +0000c860 321 (0000c840) SFRA_GUI_led_gpio +0000c861 321 (0000c840) SFRA_GUI_sweep_start +0000c862 321 (0000c840) SFRA_GUI_rcvTaskPointer +0000c864 321 (0000c840) SFRA_GUI_sci_base_addr +0000c866 321 (0000c840) SFRA_GUI_dataOut32 +0000c868 321 (0000c840) SFRA_GUI_memDataPtr16 +0000c86a 321 (0000c840) SFRA_GUI_memDataPtr32 +0000c86c 321 (0000c840) SFRA_GUI_memGetAddress +0000c86e 321 (0000c840) SFRA_GUI_memSetValue +0000c870 321 (0000c840) SFRA_GUI_temp +0000c872 321 (0000c840) SFRA_GUI_arrayGetList + +0000c892 322 (0000c880) SFRA_GUI_cmdDispatcher +0000c8b2 322 (0000c880) SFRA_GUI_dataSetList + +0000c8d2 323 (0000c8c0) SFRA_GUI_varGetList +0000c8f2 323 (0000c8c0) SFRA_GUI_varSetBtnList + +0000c912 324 (0000c900) SFRA_GUI_varSetSldrList +0000c932 324 (0000c900) SFRA_GUI_varSetTxtList + +0000c952 325 (0000c940) SFRA_GUI_cmdPacket + + +GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name + +page address name +---- ------- ---- +0 00082d75 Board_init +0 00083c2c C$$EXIT +0 00082da6 CPUTIMER_init +0 00083e3a CPUTimer_setEmulationMode +0 000827a0 Device_bootCPU2 +0 0008276f Device_configureTMXAnalogTrim +0 0008261d Device_enableAllPeripherals +0 00082759 Device_enableUnbondedGPIOPullups +0 0008273c Device_enableUnbondedGPIOPullupsFor100Pin +0 00082729 Device_enableUnbondedGPIOPullupsFor176Pin +0 000825c8 Device_init +0 00082708 Device_initGPIO +1 0000a836 Example_Fail +1 0000a834 Example_PassCount +1 0000a832 Example_Result +0 0008292b Example_done +0 00082926 Example_setResultFail +0 00082921 Example_setResultPass +0 00008000 Flash_initModule +0 00082dc9 GPIO_init +0 00083a9c GPIO_setControllerCore +0 00083b78 GPIO_setDirectionMode +0 00083867 GPIO_setPadConfig +0 00083ad3 GPIO_setPinConfig +0 00083b0a GPIO_setQualificationMode +0 00082de0 INTERRUPT_init +0 00083e10 Interrupt_defaultHandler +0 00083b41 Interrupt_enable +0 00083f1b Interrupt_illegalOperationHandler +0 00083a5f Interrupt_initModule +0 00083d2e Interrupt_initVectorTable +0 00083f25 Interrupt_nmiHandler +0 00082dcc LED_Blue_init +0 00082d82 PinMux_init +0 00086128 RamfuncsLoadEnd +abs 00000128 RamfuncsLoadSize +0 00086000 RamfuncsLoadStart +0 00008128 RamfuncsRunEnd +abs 00000128 RamfuncsRunSize +0 00008000 RamfuncsRunStart +0 00083998 SCI_clearInterruptStatus +0 000839dd SCI_enableInterrupt +0 00082ded SCI_init +0 00083a21 SCI_setConfig +0 0008338e SFRA_F32_config +0 00083364 SFRA_F32_initFreqArrayWithLogSteps +0 0008333b SFRA_F32_reset +0 00083232 SFRA_F32_resetFreqRespArray +0 00083030 SFRA_F32_runBackgroundTask +0 0008322a SFRA_F32_updateInjectionAmplitude +1 0000c872 SFRA_GUI_arrayGetList +1 0000c892 SFRA_GUI_cmdDispatcher +0 00082350 SFRA_GUI_cmdInterpreter +1 0000c952 SFRA_GUI_cmdPacket +1 0000c850 SFRA_GUI_commsOKflg +0 00082143 SFRA_GUI_config +1 0000c859 SFRA_GUI_dataOut16 +1 0000c866 SFRA_GUI_dataOut32 +1 0000c8b2 SFRA_GUI_dataSetList +1 0000c85b SFRA_GUI_delayer +0 000822ab SFRA_GUI_echoCmdByte +0 0008231f SFRA_GUI_echoDataByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000823e2 SFRA_GUI_getArray +0 00082269 SFRA_GUI_getCmdByte +0 000823e5 SFRA_GUI_getData +0 000822ff SFRA_GUI_getDataByte +0 000822c5 SFRA_GUI_getSizeByte +0 000823df SFRA_GUI_getVariable +1 0000c85f SFRA_GUI_led_flag +1 0000c860 SFRA_GUI_led_gpio +0 00082370 SFRA_GUI_lifePulseTsk +1 0000c852 SFRA_GUI_lowByteFlag +1 0000c868 SFRA_GUI_memDataPtr16 +1 0000c86a SFRA_GUI_memDataPtr32 +1 0000c86c SFRA_GUI_memGetAddress +1 0000c85d SFRA_GUI_memGetAmount +1 0000c85c SFRA_GUI_memGetPtr +1 0000c85e SFRA_GUI_memSetPtr +1 0000c86e SFRA_GUI_memSetValue +1 0000c857 SFRA_GUI_numWords +0 00082332 SFRA_GUI_packWord +1 0000c862 SFRA_GUI_rcvTaskPointer +1 0000c85a SFRA_GUI_rcvTskPtrShdw +0 00082255 SFRA_GUI_runSerialHostComms +1 0000c854 SFRA_GUI_rxChar +1 0000c855 SFRA_GUI_rxWord +1 0000c864 SFRA_GUI_sci_base_addr +0 00082448 SFRA_GUI_sendData +1 0000c853 SFRA_GUI_sendTaskPtr +1 0000c851 SFRA_GUI_serialCommsTimer +0 000823b9 SFRA_GUI_setButton +0 00082414 SFRA_GUI_setData32 +0 000823cc SFRA_GUI_setSlider +0 000823a6 SFRA_GUI_setText +0 00082443 SFRA_GUI_spareTsk08 +1 0000c861 SFRA_GUI_sweep_start +1 0000c856 SFRA_GUI_taskDoneFlag +1 0000c870 SFRA_GUI_temp +1 0000c8d2 SFRA_GUI_varGetList +1 0000c8f2 SFRA_GUI_varSetBtnList +1 0000c912 SFRA_GUI_varSetSldrList +1 0000c932 SFRA_GUI_varSetTxtList +1 0000c858 SFRA_GUI_wordsLeftToGet +0 00008124 SysCtl_delay +0 000838b9 SysCtl_getClock +0 00083736 SysCtl_getDeviceParametric +0 00083d81 SysCtl_getLowSpeedClock +0 0008390a SysCtl_selectOscSource +0 0008361e SysCtl_selectXTAL +0 00082e27 SysCtl_setClock +0 00083952 TIMER0_ISR +1 00000014 _SFRA_F32_amplitude +1 00000022 _SFRA_F32_angle +1 0000001e _SFRA_F32_count +1 0000001a _SFRA_F32_pointer +1 00000010 _SFRA_F32_pointerStart +1 0000001c _SFRA_F32_preCount +1 00000006 _SFRA_F32_rCosSum +1 00000004 _SFRA_F32_rSinSum +1 00000012 _SFRA_F32_reference +1 00000016 _SFRA_F32_scalar +1 00000002 _SFRA_F32_state +1 00000003 _SFRA_F32_stateSlew +1 00000018 _SFRA_F32_step +1 0000000a _SFRA_F32_uCosSum +1 00000008 _SFRA_F32_uSinSum +1 00000020 _SFRA_F32_windowSamples +1 0000000e _SFRA_F32_yCosSum +1 0000000c _SFRA_F32_ySinSum +0 0008379e __SFRA_F32_collect +0 00083cc9 __SFRA_F32_inject +0 0008402c __TI_CINIT_Base +0 00084038 __TI_CINIT_Limit +0 00084038 __TI_CINIT_Warm +0 0008401e __TI_Handler_Table_Base +0 00084024 __TI_Handler_Table_Limit +1 00000500 __TI_STACK_END +abs 00000100 __TI_STACK_SIZE +0 00083bd7 __TI_auto_init_nobinit_nopinit +1 0000a83a __TI_cleanup_ptr +0 00083ba9 __TI_decompress_lzss +0 00083f49 __TI_decompress_none +1 0000a83c __TI_dtors_ptr +1 0000a838 __TI_enable_exit_profile_output +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +0 00083f5f __TI_zero_init +0 000836ae __c28xabi_divf +0 00083c02 __c28xabi_divl +0 00083517 __c28xabi_divll +0 00083c1f __c28xabi_divul +0 0008358d __c28xabi_divull +0 00083ca3 __c28xabi_ftoll +0 00083c11 __c28xabi_modl +0 00083553 __c28xabi_modll +0 00083c26 __c28xabi_modul +0 000835bc __c28xabi_modull +abs ffffffff __c_args__ +0 0008291a __error__ +1 00000400 __stack +0 00083e96 _args_main +0 00083df9 _c_int00 +1 0000a83e _lock +0 00083f40 _nop +0 00083f3c _register_lock +0 00083f38 _register_unlock +0 00083f67 _system_post_cinit +0 00083f65 _system_pre_init +1 0000a840 _unlock +0 00083c2c abort +1 0000c2d8 clMagVect +1 0000c3a0 clPhaseVect +0 00080000 code_start +1 0000a842 errno +0 00083c2e exit +1 0000c468 freqVect +1 0000c040 hal_sfra +1 0000a802 libsfra +1 0000c080 libsfra_results +0 000833ec logf +1 0000c000 lowPass_test +0 00083e84 main +0 00083cef memcpy +0 00083f58 memset +0 00082da9 myCPUTIMER0_init +0 00082df0 mySCI0_init +1 0000c530 olMagVect +1 0000c5f8 olPhaseVect +1 0000c6c0 plantMagVect +1 0000c788 plantPhaseVect +0 00082b20 sfra_init +0 00082b96 sfra_print_results_csv +0 00082c0d sfra_task_run +0 00083805 tanf +1 0000c00a ti_sfra + + +GLOBAL SYMBOLS: SORTED BY Symbol Address + +page address name +---- ------- ---- +0 00008000 Flash_initModule +0 00008000 RamfuncsRunStart +0 00008124 SysCtl_delay +0 00008128 RamfuncsRunEnd +0 00080000 code_start +0 00082143 SFRA_GUI_config +0 00082255 SFRA_GUI_runSerialHostComms +0 00082269 SFRA_GUI_getCmdByte +0 000822ab SFRA_GUI_echoCmdByte +0 000822c5 SFRA_GUI_getSizeByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000822ff SFRA_GUI_getDataByte +0 0008231f SFRA_GUI_echoDataByte +0 00082332 SFRA_GUI_packWord +0 00082350 SFRA_GUI_cmdInterpreter +0 00082370 SFRA_GUI_lifePulseTsk +0 000823a6 SFRA_GUI_setText +0 000823b9 SFRA_GUI_setButton +0 000823cc SFRA_GUI_setSlider +0 000823df SFRA_GUI_getVariable +0 000823e2 SFRA_GUI_getArray +0 000823e5 SFRA_GUI_getData +0 00082414 SFRA_GUI_setData32 +0 00082443 SFRA_GUI_spareTsk08 +0 00082448 SFRA_GUI_sendData +0 000825c8 Device_init +0 0008261d Device_enableAllPeripherals +0 00082708 Device_initGPIO +0 00082729 Device_enableUnbondedGPIOPullupsFor176Pin +0 0008273c Device_enableUnbondedGPIOPullupsFor100Pin +0 00082759 Device_enableUnbondedGPIOPullups +0 0008276f Device_configureTMXAnalogTrim +0 000827a0 Device_bootCPU2 +0 0008291a __error__ +0 00082921 Example_setResultPass +0 00082926 Example_setResultFail +0 0008292b Example_done +0 00082b20 sfra_init +0 00082b96 sfra_print_results_csv +0 00082c0d sfra_task_run +0 00082d75 Board_init +0 00082d82 PinMux_init +0 00082da6 CPUTIMER_init +0 00082da9 myCPUTIMER0_init +0 00082dc9 GPIO_init +0 00082dcc LED_Blue_init +0 00082de0 INTERRUPT_init +0 00082ded SCI_init +0 00082df0 mySCI0_init +0 00082e27 SysCtl_setClock +0 00083030 SFRA_F32_runBackgroundTask +0 0008322a SFRA_F32_updateInjectionAmplitude +0 00083232 SFRA_F32_resetFreqRespArray +0 0008333b SFRA_F32_reset +0 00083364 SFRA_F32_initFreqArrayWithLogSteps +0 0008338e SFRA_F32_config +0 000833ec logf +0 00083517 __c28xabi_divll +0 00083553 __c28xabi_modll +0 0008358d __c28xabi_divull +0 000835bc __c28xabi_modull +0 0008361e SysCtl_selectXTAL +0 000836ae __c28xabi_divf +0 00083736 SysCtl_getDeviceParametric +0 0008379e __SFRA_F32_collect +0 00083805 tanf +0 00083867 GPIO_setPadConfig +0 000838b9 SysCtl_getClock +0 0008390a SysCtl_selectOscSource +0 00083952 TIMER0_ISR +0 00083998 SCI_clearInterruptStatus +0 000839dd SCI_enableInterrupt +0 00083a21 SCI_setConfig +0 00083a5f Interrupt_initModule +0 00083a9c GPIO_setControllerCore +0 00083ad3 GPIO_setPinConfig +0 00083b0a GPIO_setQualificationMode +0 00083b41 Interrupt_enable +0 00083b78 GPIO_setDirectionMode +0 00083ba9 __TI_decompress_lzss +0 00083bd7 __TI_auto_init_nobinit_nopinit +0 00083c02 __c28xabi_divl +0 00083c11 __c28xabi_modl +0 00083c1f __c28xabi_divul +0 00083c26 __c28xabi_modul +0 00083c2c C$$EXIT +0 00083c2c abort +0 00083c2e exit +0 00083ca3 __c28xabi_ftoll +0 00083cc9 __SFRA_F32_inject +0 00083cef memcpy +0 00083d2e Interrupt_initVectorTable +0 00083d81 SysCtl_getLowSpeedClock +0 00083df9 _c_int00 +0 00083e10 Interrupt_defaultHandler +0 00083e3a CPUTimer_setEmulationMode +0 00083e84 main +0 00083e96 _args_main +0 00083f1b Interrupt_illegalOperationHandler +0 00083f25 Interrupt_nmiHandler +0 00083f38 _register_unlock +0 00083f3c _register_lock +0 00083f40 _nop +0 00083f49 __TI_decompress_none +0 00083f58 memset +0 00083f5f __TI_zero_init +0 00083f65 _system_pre_init +0 00083f67 _system_post_cinit +0 0008401e __TI_Handler_Table_Base +0 00084024 __TI_Handler_Table_Limit +0 0008402c __TI_CINIT_Base +0 00084038 __TI_CINIT_Limit +0 00084038 __TI_CINIT_Warm +0 00086000 RamfuncsLoadStart +0 00086128 RamfuncsLoadEnd +1 00000002 _SFRA_F32_state +1 00000003 _SFRA_F32_stateSlew +1 00000004 _SFRA_F32_rSinSum +1 00000006 _SFRA_F32_rCosSum +1 00000008 _SFRA_F32_uSinSum +1 0000000a _SFRA_F32_uCosSum +1 0000000c _SFRA_F32_ySinSum +1 0000000e _SFRA_F32_yCosSum +1 00000010 _SFRA_F32_pointerStart +1 00000012 _SFRA_F32_reference +1 00000014 _SFRA_F32_amplitude +1 00000016 _SFRA_F32_scalar +1 00000018 _SFRA_F32_step +1 0000001a _SFRA_F32_pointer +1 0000001c _SFRA_F32_preCount +1 0000001e _SFRA_F32_count +1 00000020 _SFRA_F32_windowSamples +1 00000022 _SFRA_F32_angle +1 00000400 __stack +1 00000500 __TI_STACK_END +1 0000a802 libsfra +1 0000a832 Example_Result +1 0000a834 Example_PassCount +1 0000a836 Example_Fail +1 0000a838 __TI_enable_exit_profile_output +1 0000a83a __TI_cleanup_ptr +1 0000a83c __TI_dtors_ptr +1 0000a83e _lock +1 0000a840 _unlock +1 0000a842 errno +1 0000c000 lowPass_test +1 0000c00a ti_sfra +1 0000c040 hal_sfra +1 0000c080 libsfra_results +1 0000c2d8 clMagVect +1 0000c3a0 clPhaseVect +1 0000c468 freqVect +1 0000c530 olMagVect +1 0000c5f8 olPhaseVect +1 0000c6c0 plantMagVect +1 0000c788 plantPhaseVect +1 0000c850 SFRA_GUI_commsOKflg +1 0000c851 SFRA_GUI_serialCommsTimer +1 0000c852 SFRA_GUI_lowByteFlag +1 0000c853 SFRA_GUI_sendTaskPtr +1 0000c854 SFRA_GUI_rxChar +1 0000c855 SFRA_GUI_rxWord +1 0000c856 SFRA_GUI_taskDoneFlag +1 0000c857 SFRA_GUI_numWords +1 0000c858 SFRA_GUI_wordsLeftToGet +1 0000c859 SFRA_GUI_dataOut16 +1 0000c85a SFRA_GUI_rcvTskPtrShdw +1 0000c85b SFRA_GUI_delayer +1 0000c85c SFRA_GUI_memGetPtr +1 0000c85d SFRA_GUI_memGetAmount +1 0000c85e SFRA_GUI_memSetPtr +1 0000c85f SFRA_GUI_led_flag +1 0000c860 SFRA_GUI_led_gpio +1 0000c861 SFRA_GUI_sweep_start +1 0000c862 SFRA_GUI_rcvTaskPointer +1 0000c864 SFRA_GUI_sci_base_addr +1 0000c866 SFRA_GUI_dataOut32 +1 0000c868 SFRA_GUI_memDataPtr16 +1 0000c86a SFRA_GUI_memDataPtr32 +1 0000c86c SFRA_GUI_memGetAddress +1 0000c86e SFRA_GUI_memSetValue +1 0000c870 SFRA_GUI_temp +1 0000c872 SFRA_GUI_arrayGetList +1 0000c892 SFRA_GUI_cmdDispatcher +1 0000c8b2 SFRA_GUI_dataSetList +1 0000c8d2 SFRA_GUI_varGetList +1 0000c8f2 SFRA_GUI_varSetBtnList +1 0000c912 SFRA_GUI_varSetSldrList +1 0000c932 SFRA_GUI_varSetTxtList +1 0000c952 SFRA_GUI_cmdPacket +abs 00000100 __TI_STACK_SIZE +abs 00000128 RamfuncsLoadSize +abs 00000128 RamfuncsRunSize +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +abs ffffffff __c_args__ + +[197 symbols] diff --git a/28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.out b/28379d_P_SFRA/CPU1_FLASH/28379d_test_SFRA.out new file mode 100644 index 0000000000000000000000000000000000000000..f42e6e6646d87f36cf980b1d08237cd75c7c16eb GIT binary patch literal 134596 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

T#Xh%dQ(FfiDp1Lts#s; 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 + + TMS320C2000 Linker PC v25.11.0.LTS + Copyright (c) 1996-2018 Texas Instruments Incorporated + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\bin\lnk2000.exe -lC:\\Users\\zxc\\AppData\\Local\\Temp\\{BB2EF0EC-9B38-4F42-ACEF-4BCF167CA9E9} + 0x6a19d665 + 0x0 + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\28379d_PP_SFRA.out + + code_start +

0x80000
+ + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\syscfg\ + object + board.obj + board.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\syscfg\ + object + c2000ware_libraries.obj + c2000ware_libraries.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\ + object + main.obj + main.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\ + object + sfra_test.obj + sfra_test.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\LIBSFRA\ + object + libsfra.obj + libsfra.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\SFRA\ + object + sfra_gui_scicomms_driverlib.obj + sfra_gui_scicomms_driverlib.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\device\ + object + F2837xD_CodeStartBranch.obj + F2837xD_CodeStartBranch.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\.\device\ + object + device.obj + device.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\ + object + <internal> + <internal> + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + cputimer.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + flash.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + gpio.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + interrupt.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sci.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sysctl.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_background.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_collect.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_config_reset.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_PP_SFRA\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_inject.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + e_log10f.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + e_logf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_ceilf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_tanf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + boot28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_cmp28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + l_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_tollfpu32.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memcpy.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + pre_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + autoinit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_zero_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_none.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_lzss.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + exit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + _lock.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + args_main.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memset.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + errno.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + cpy_tbl.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + startup.c.obj + + + + + .cinit..data.load + 0x84000 + true + 0x84000 + 0x1e + 0x1 + + + __TI_handler_table + 0x8401e + true + 0x8401e + 0x6 + 0x2 + + + .cinit..bss.load + 0x84024 + true + 0x84024 + 0x4 + 0x2 + + + .cinit.SFRA_F32_Data.load + 0x84028 + true + 0x84028 + 0x4 + 0x2 + + + __TI_cinit_table + 0x8402c + true + 0x8402c + 0xc + 0x2 + + + .text + 0x82000 + true + true + 0x82000 + 0x52e + 0x1 + + + + .text + 0x8252e + true + true + 0x8252e + 0x3fe + 0x1 + + + + .text + 0x8292c + true + true + 0x8292c + 0x2ef + 0x1 + + + + .text + 0x82c1b + true + true + 0x82c1b + 0x20c + 0x1 + + + + .text:SysCtl_setClock + 0x82e27 + true + true + 0x82e27 + 0x209 + 0x1 + + + + .text + 0x83030 + true + true + 0x83030 + 0x1fa + 0x1 + + + + .text + 0x8322a + true + true + 0x8322a + 0x1c2 + 0x1 + + + + .text + 0x833ec + true + true + 0x833ec + 0x12b + 0x1 + + + + .text + 0x83517 + true + true + 0x83517 + 0x107 + 0x1 + + + + .text:SysCtl_selectXTAL + 0x8361e + true + true + 0x8361e + 0x90 + 0x1 + + + + .text + 0x836ae + true + true + 0x836ae + 0x88 + 0x1 + + + + .text:SysCtl_getDeviceParametric + 0x83736 + true + true + 0x83736 + 0x68 + 0x1 + + + + .text + 0x8379e + true + true + 0x8379e + 0x67 + 0x1 + + + + .text + 0x83805 + true + true + 0x83805 + 0x62 + 0x1 + + + + .text:GPIO_setPadConfig + 0x83867 + true + true + 0x83867 + 0x52 + 0x1 + + + + .text:SysCtl_getClock + 0x838b9 + true + true + 0x838b9 + 0x51 + 0x1 + + + + .text:SysCtl_selectOscSource + 0x8390a + true + true + 0x8390a + 0x48 + 0x1 + + + + .text:retain + 0x83952 + true + true + 0x83952 + 0x46 + 0x1 + + + + .text:SCI_clearInterruptStatus + 0x83998 + true + true + 0x83998 + 0x45 + 0x1 + + + + .text:SCI_enableInterrupt + 0x839dd + true + true + 0x839dd + 0x44 + 0x1 + + + + .text:SCI_setConfig + 0x83a21 + true + true + 0x83a21 + 0x3e + 0x1 + + + + .text:Interrupt_initModule + 0x83a5f + true + true + 0x83a5f + 0x3d + 0x1 + + + + .text:GPIO_setControllerCore + 0x83a9c + true + true + 0x83a9c + 0x37 + 0x1 + + + + .text:GPIO_setPinConfig + 0x83ad3 + true + true + 0x83ad3 + 0x37 + 0x1 + + + + .text:GPIO_setQualificationMode + 0x83b0a + true + true + 0x83b0a + 0x37 + 0x1 + + + + .text:Interrupt_enable + 0x83b41 + true + true + 0x83b41 + 0x37 + 0x1 + + + + .text:GPIO_setDirectionMode + 0x83b78 + true + true + 0x83b78 + 0x31 + 0x1 + + + + .text:decompress:lzss + 0x83ba9 + true + true + 0x83ba9 + 0x2e + 0x1 + + + + .text:__TI_auto_init_nobinit_nopinit + 0x83bd7 + true + true + 0x83bd7 + 0x2b + 0x1 + + + + .text + 0x83c02 + true + true + 0x83c02 + 0x2a + 0x1 + + + + .text + 0x83c2c + true + true + 0x83c2c + 0x29 + 0x1 + + + + .text:CPUTimer_selectClockSource + 0x83c55 + true + true + 0x83c55 + 0x28 + 0x1 + + + + .text:Flash_setBankPowerUpDelay + 0x83c7d + true + true + 0x83c7d + 0x26 + 0x1 + + + + .text + 0x83ca3 + true + true + 0x83ca3 + 0x26 + 0x1 + + + + .text + 0x83cc9 + true + true + 0x83cc9 + 0x26 + 0x1 + + + + .text + 0x83cef + true + true + 0x83cef + 0x20 + 0x1 + + + + .text:CPUTimer_getTimerOverflowStatus + 0x83d0f + true + true + 0x83d0f + 0x1f + 0x1 + + + + .text:Interrupt_initVectorTable + 0x83d2e + true + true + 0x83d2e + 0x1e + 0x1 + + + + .text:SCI_isBaseValid + 0x83d4c + true + true + 0x83d4c + 0x1b + 0x1 + + + + .text:CPUTimer_startTimer + 0x83d67 + true + true + 0x83d67 + 0x1a + 0x1 + + + + .text:SysCtl_getLowSpeedClock + 0x83d81 + true + true + 0x83d81 + 0x1a + 0x1 + + + + .text:SCI_disableModule + 0x83d9b + true + true + 0x83d9b + 0x18 + 0x1 + + + + .text:SCI_performSoftwareReset + 0x83db3 + true + true + 0x83db3 + 0x18 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x83dcb + true + true + 0x83dcb + 0x17 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x83de2 + true + true + 0x83de2 + 0x17 + 0x1 + + + + .text + 0x83df9 + true + true + 0x83df9 + 0x17 + 0x1 + + + + .text:Interrupt_defaultHandler + 0x83e10 + true + true + 0x83e10 + 0x16 + 0x1 + + + + .text:CPUTimer_stopTimer + 0x83e26 + true + true + 0x83e26 + 0x14 + 0x1 + + + + .text:CPUTimer_setEmulationMode + 0x83e3a + true + true + 0x83e3a + 0x13 + 0x1 + + + + .text:SCI_enableModule + 0x83e4d + true + true + 0x83e4d + 0x13 + 0x1 + + + + .text:CPUTimer_clearOverflowFlag + 0x83e60 + true + true + 0x83e60 + 0x12 + 0x1 + + + + .text:CPUTimer_disableInterrupt + 0x83e72 + true + true + 0x83e72 + 0x12 + 0x1 + + + + .text + 0x83e84 + true + true + 0x83e84 + 0x12 + 0x1 + + + + .text + 0x83e96 + true + true + 0x83e96 + 0x12 + 0x1 + + + + .text:CPUTimer_setPeriod + 0x83ea8 + true + true + 0x83ea8 + 0x11 + 0x1 + + + + .text:Flash_isCtrlBaseValid + 0x83eb9 + true + true + 0x83eb9 + 0x10 + 0x1 + + + + .text:Flash_isECCBaseValid + 0x83ec9 + true + true + 0x83ec9 + 0x10 + 0x1 + + + + .text:SysCtl_pollCpuTimer + 0x83ed9 + true + true + 0x83ed9 + 0xf + 0x1 + + + + .text:GPIO_isPinValid + 0x83ee8 + true + true + 0x83ee8 + 0xe + 0x1 + + + + .text:Interrupt_disableGlobal + 0x83ef6 + true + true + 0x83ef6 + 0xd + 0x1 + + + + .text:Interrupt_enableGlobal + 0x83f03 + true + true + 0x83f03 + 0xd + 0x1 + + + + .text:SysCtl_isMCDClockFailureDetected + 0x83f10 + true + true + 0x83f10 + 0xb + 0x1 + + + + .text:Interrupt_illegalOperationHandler + 0x83f1b + true + true + 0x83f1b + 0xa + 0x1 + + + + .text:Interrupt_nmiHandler + 0x83f25 + true + true + 0x83f25 + 0xa + 0x1 + + + + .text:SysCtl_serviceWatchdog + 0x83f2f + true + true + 0x83f2f + 0x9 + 0x1 + + + + .text + 0x83f38 + true + true + 0x83f38 + 0x9 + 0x1 + + + + .text + 0x83f41 + true + true + 0x83f41 + 0x8 + 0x1 + + + + .text:decompress:none + 0x83f49 + true + true + 0x83f49 + 0x8 + 0x1 + + + + .text:SysCtl_resetMCD + 0x83f51 + true + true + 0x83f51 + 0x7 + 0x1 + + + + .text + 0x83f58 + true + true + 0x83f58 + 0x7 + 0x1 + + + + .text:decompress:ZI + 0x83f5f + true + true + 0x83f5f + 0x6 + 0x1 + + + + .text + 0x83f65 + true + true + 0x83f65 + 0x2 + 0x1 + + + + .text + 0x83f67 + true + true + 0x83f67 + 0x1 + 0x1 + + + + codestart + 0x80000 + true + true + 0x80000 + 0x2 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x2 + + + .bss + true + true + 0xc000 + 0x2d8 + 0x2 + + + + .bss:plantMagVect + true + true + 0xc6c0 + 0xc8 + 0x2 + + + + .bss:plantPhaseVect + true + true + 0xc788 + 0xc8 + 0x2 + + + + .bss:olMagVect + true + true + 0xc530 + 0xc8 + 0x2 + + + + .bss:olPhaseVect + true + true + 0xc5f8 + 0xc8 + 0x2 + + + + .bss:clMagVect + true + true + 0xc2d8 + 0xc8 + 0x2 + + + + .bss:clPhaseVect + true + true + 0xc3a0 + 0xc8 + 0x2 + + + + .bss:freqVect + true + true + 0xc468 + 0xc8 + 0x2 + + + + .bss + true + true + 0xc850 + 0x22 + 0x2 + + + + .bss:SFRA_GUI_cmdPacket + true + true + 0xc952 + 0x6 + 0x1 + + + + .bss:SFRA_GUI_cmdDispatcher + true + true + 0xc892 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetTxtList + true + true + 0xc932 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetBtnList + true + true + 0xc8f2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetSldrList + true + true + 0xc912 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varGetList + true + true + 0xc8d2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_arrayGetList + true + true + 0xc872 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_dataSetList + true + true + 0xc8b2 + 0x20 + 0x2 + + + + .data + 0xa800 + true + 0xa800 + 0x32 + 0x2 + + + + .data + 0xa832 + true + 0xa832 + 0x6 + 0x2 + + + + .data + 0xa838 + true + 0xa838 + 0x6 + 0x2 + + + + .data:_lock + 0xa83e + true + 0xa83e + 0x2 + 0x2 + + + + .data:_unlock + 0xa840 + true + 0xa840 + 0x2 + 0x2 + + + + .data + 0xa842 + true + 0xa842 + 0x1 + 0x1 + + + + .const:.string + 0x90000 + true + 0x90000 + 0xc2 + 0x2 + + + + .const:.string + 0x900c2 + true + 0x900c2 + 0xbf + 0x2 + + + + .const:.string + 0x90182 + true + 0x90182 + 0xbc + 0x2 + + + + .const:.string + 0x9023e + true + 0x9023e + 0xbb + 0x2 + + + + .const:.string + 0x902fa + true + 0x902fa + 0xa8 + 0x2 + + + + .const:.string + 0x903a2 + true + 0x903a2 + 0x7f + 0x2 + + + + .const:.string + 0x90422 + true + 0x90422 + 0x7b + 0x2 + + + + .const:.string + 0x9049e + true + 0x9049e + 0x62 + 0x2 + + + + .const:.string + 0x90500 + true + 0x90500 + 0x13 + 0x2 + + + + .TI.ramfunc:Flash_initModule + 0x86000 + true + true + 0x8000 + 0x43 + 0x1 + + + + .TI.ramfunc:Flash_setBankPowerMode + 0x86043 + true + true + 0x8043 + 0x2c + 0x1 + + + + .TI.ramfunc:Flash_setWaitstates + 0x8606f + true + true + 0x806f + 0x24 + 0x1 + + + + .TI.ramfunc:Flash_setPumpPowerMode + 0x86093 + true + true + 0x8093 + 0x1d + 0x1 + + + + .TI.ramfunc:Flash_disableCache + 0x860b0 + true + true + 0x80b0 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_disablePrefetch + 0x860c8 + true + true + 0x80c8 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_enableCache + 0x860e0 + true + true + 0x80e0 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enablePrefetch + 0x860f7 + true + true + 0x80f7 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enableECC + 0x8610e + true + true + 0x810e + 0x16 + 0x1 + + + + .TI.ramfunc + 0x86124 + true + true + 0x8124 + 0x4 + 0x1 + + + + .debug_types + 0x0 + 0x0 + 0x767 + 0x0 + + + + .debug_types + 0x767 + 0x767 + 0x56 + 0x0 + + + + .debug_types + 0x7bd + 0x7bd + 0xede + 0x0 + + + + .debug_types + 0x169b + 0x169b + 0x22f + 0x0 + + + + .debug_types + 0x18ca + 0x18ca + 0xdc7 + 0x0 + + + + .debug_types + 0x2691 + 0x2691 + 0x6e + 0x0 + + + + .debug_types + 0x26ff + 0x26ff + 0x1d7 + 0x0 + + + + .debug_types + 0x28d6 + 0x28d6 + 0x2c4 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2b9a + 0x2b9a + 0x284 + 0x0 + + + + .debug_types + 0x2e1e + 0x2e1e + 0x21d + 0x0 + + + + .debug_types + 0x303b + 0x303b + 0x8d + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x30c8 + 0x30c8 + 0x117 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x31df + 0x31df + 0x470 + 0x0 + + + + .debug_types + 0x364f + 0x364f + 0x194 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x37e3 + 0x37e3 + 0x191 + 0x0 + + + + .debug_types + 0x3974 + 0x3974 + 0xbf + 0x0 + + + + .debug_types + 0x3a33 + 0x3a33 + 0x2f + 0x0 + + + + .debug_types + 0x3a62 + 0x3a62 + 0xe1 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_info + 0x0 + 0x0 + 0x1387 + 0x0 + + + + .debug_info + 0x1387 + 0x1387 + 0x181 + 0x0 + + + + .debug_info + 0x1508 + 0x1508 + 0x169 + 0x0 + + + + .debug_info + 0x1671 + 0x1671 + 0xe7 + 0x0 + + + + .debug_info + 0x1758 + 0x1758 + 0xf1 + 0x0 + + + + .debug_info + 0x1849 + 0x1849 + 0xf5 + 0x0 + + + + .debug_info + 0x193e + 0x193e + 0xeb + 0x0 + + + + .debug_info + 0x1a29 + 0x1a29 + 0xef + 0x0 + + + + .debug_info + 0x1b18 + 0x1b18 + 0xeb + 0x0 + + + + .debug_info + 0x1c03 + 0x1c03 + 0xef + 0x0 + + + + .debug_info + 0x1cf2 + 0x1cf2 + 0xe9 + 0x0 + + + + .debug_info + 0x1ddb + 0x1ddb + 0xddb + 0x0 + + + + .debug_info + 0x2bb6 + 0x2bb6 + 0x1c3 + 0x0 + + + + .debug_info + 0x2d79 + 0x2d79 + 0x6d0 + 0x0 + + + + .debug_info + 0x3449 + 0x3449 + 0x114 + 0x0 + + + + .debug_info + 0x355d + 0x355d + 0x11c + 0x0 + + + + .debug_info + 0x3679 + 0x3679 + 0x11c + 0x0 + + + + .debug_info + 0x3795 + 0x3795 + 0x11c + 0x0 + + + + .debug_info + 0x38b1 + 0x38b1 + 0x11e + 0x0 + + + + .debug_info + 0x39cf + 0x39cf + 0x116 + 0x0 + + + + .debug_info + 0x3ae5 + 0x3ae5 + 0x11a + 0x0 + + + + .debug_info + 0x3bff + 0x3bff + 0x118 + 0x0 + + + + .debug_info + 0x3d17 + 0x3d17 + 0x1ae1 + 0x0 + + + + .debug_info + 0x57f8 + 0x57f8 + 0x110 + 0x0 + + + + .debug_info + 0x5908 + 0x5908 + 0x111 + 0x0 + + + + .debug_info + 0x5a19 + 0x5a19 + 0x15b + 0x0 + + + + .debug_info + 0x5b74 + 0x5b74 + 0x1c3c + 0x0 + + + + .debug_info + 0x77b0 + 0x77b0 + 0x219 + 0x0 + + + + .debug_info + 0x79c9 + 0x79c9 + 0x265 + 0x0 + + + + .debug_info + 0x7c2e + 0x7c2e + 0x21d + 0x0 + + + + .debug_info + 0x7e4b + 0x7e4b + 0x219 + 0x0 + + + + .debug_info + 0x8064 + 0x8064 + 0x279 + 0x0 + + + + .debug_info + 0x82dd + 0x82dd + 0x28f + 0x0 + + + + .debug_info + 0x856c + 0x856c + 0x26e + 0x0 + + + + .debug_info + 0x87da + 0x87da + 0x23f + 0x0 + + + + .debug_info + 0x8a19 + 0x8a19 + 0x241 + 0x0 + + + + .debug_info + 0x8c5a + 0x8c5a + 0x239 + 0x0 + + + + .debug_info + 0x8e93 + 0x8e93 + 0x23b + 0x0 + + + + .debug_info + 0x90ce + 0x90ce + 0x232 + 0x0 + + + + .debug_info + 0x9300 + 0x9300 + 0x27b + 0x0 + + + + .debug_info + 0x957b + 0x957b + 0x397 + 0x0 + + + + .debug_info + 0x9912 + 0x9912 + 0x205 + 0x0 + + + + .debug_info + 0x9b17 + 0x9b17 + 0x27d + 0x0 + + + + .debug_info + 0x9d94 + 0x9d94 + 0x266 + 0x0 + + + + .debug_info + 0x9ffa + 0x9ffa + 0x2ae + 0x0 + + + + .debug_info + 0xa2a8 + 0xa2a8 + 0x296 + 0x0 + + + + .debug_info + 0xa53e + 0xa53e + 0x24f + 0x0 + + + + .debug_info + 0xa78d + 0xa78d + 0x1fe + 0x0 + + + + .debug_info + 0xa98b + 0xa98b + 0x200 + 0x0 + + + + .debug_info + 0xab8b + 0xab8b + 0x20f + 0x0 + + + + .debug_info + 0xad9a + 0xad9a + 0x21c + 0x0 + + + + .debug_info + 0xafb6 + 0xafb6 + 0x202 + 0x0 + + + + .debug_info + 0xb1b8 + 0xb1b8 + 0x1e8 + 0x0 + + + + .debug_info + 0xb3a0 + 0xb3a0 + 0x20c + 0x0 + + + + .debug_info + 0xb5ac + 0xb5ac + 0x2b3 + 0x0 + + + + .debug_info + 0xb85f + 0xb85f + 0x205 + 0x0 + + + + .debug_info + 0xba64 + 0xba64 + 0x225 + 0x0 + + + + .debug_info + 0xbc89 + 0xbc89 + 0x227 + 0x0 + + + + .debug_info + 0xbeb0 + 0xbeb0 + 0x235 + 0x0 + + + + .debug_info + 0xc0e5 + 0xc0e5 + 0x2b5 + 0x0 + + + + .debug_info + 0xc39a + 0xc39a + 0x23e + 0x0 + + + + .debug_info + 0xc5d8 + 0xc5d8 + 0x268 + 0x0 + + + + .debug_info + 0xc840 + 0xc840 + 0x1f2 + 0x0 + + + + .debug_info + 0xca32 + 0xca32 + 0x20e + 0x0 + + + + .debug_info + 0xcc40 + 0xcc40 + 0x1e4 + 0x0 + + + + .debug_info + 0xce24 + 0xce24 + 0x217 + 0x0 + + + + .debug_info + 0xd03b + 0xd03b + 0x244 + 0x0 + + + + .debug_info + 0xd27f + 0xd27f + 0x242 + 0x0 + + + + .debug_info + 0xd4c1 + 0xd4c1 + 0x24a + 0x0 + + + + .debug_info + 0xd70b + 0xd70b + 0x24d + 0x0 + + + + .debug_info + 0xd958 + 0xd958 + 0x24e + 0x0 + + + + .debug_info + 0xdba6 + 0xdba6 + 0x258 + 0x0 + + + + .debug_info + 0xddfe + 0xddfe + 0x27c + 0x0 + + + + .debug_info + 0xe07a + 0xe07a + 0x241 + 0x0 + + + + .debug_info + 0xe2bb + 0xe2bb + 0x277 + 0x0 + + + + .debug_info + 0xe532 + 0xe532 + 0x519 + 0x0 + + + + .debug_info + 0xea4b + 0xea4b + 0x3ba + 0x0 + + + + .debug_info + 0xee05 + 0xee05 + 0x243 + 0x0 + + + + .debug_info + 0xf048 + 0xf048 + 0x251 + 0x0 + + + + .debug_info + 0xf299 + 0xf299 + 0x241 + 0x0 + + + + .debug_info + 0xf4da + 0xf4da + 0x1d8 + 0x0 + + + + .debug_info + 0xf6b2 + 0xf6b2 + 0x179 + 0x0 + + + + .debug_info + 0xf82b + 0xf82b + 0x141 + 0x0 + + + + .debug_info + 0xf96c + 0xf96c + 0x110 + 0x0 + + + + .debug_info + 0xfa7c + 0xfa7c + 0x24a + 0x0 + + + + .debug_info + 0xfcc6 + 0xfcc6 + 0x1ca + 0x0 + + + + .debug_info + 0xfe90 + 0xfe90 + 0x120 + 0x0 + + + + .debug_info + 0xffb0 + 0xffb0 + 0x184 + 0x0 + + + + .debug_info + 0x10134 + 0x10134 + 0x136 + 0x0 + + + + .debug_info + 0x1026a + 0x1026a + 0x1a8 + 0x0 + + + + .debug_info + 0x10412 + 0x10412 + 0x188 + 0x0 + + + + .debug_info + 0x1059a + 0x1059a + 0x1a0 + 0x0 + + + + .debug_info + 0x1073a + 0x1073a + 0x1f5 + 0x0 + + + + .debug_info + 0x1092f + 0x1092f + 0x187 + 0x0 + + + + .debug_info + 0x10ab6 + 0x10ab6 + 0x192 + 0x0 + + + + .debug_info + 0x10c48 + 0x10c48 + 0xf0 + 0x0 + + + + .debug_info + 0x10d38 + 0x10d38 + 0xf4 + 0x0 + + + + .debug_info + 0x10e2c + 0x10e2c + 0x1ec + 0x0 + + + + .debug_info + 0x11018 + 0x11018 + 0x156 + 0x0 + + + + .debug_info + 0x1116e + 0x1116e + 0x1db + 0x0 + + + + .debug_info + 0x11349 + 0x11349 + 0xef + 0x0 + + + + .debug_info + 0x11438 + 0x11438 + 0x130 + 0x0 + + + + .debug_info + 0x11568 + 0x11568 + 0xb0 + 0x0 + + + .debug_line + 0x0 + 0x0 + 0x3dc + 0x0 + + + + .debug_line + 0x3dc + 0x3dc + 0xe9 + 0x0 + + + + .debug_line + 0x4c5 + 0x4c5 + 0x50 + 0x0 + + + + .debug_line + 0x515 + 0x515 + 0x21 + 0x0 + + + + .debug_line + 0x536 + 0x536 + 0x33 + 0x0 + + + + .debug_line + 0x569 + 0x569 + 0x33 + 0x0 + + + + .debug_line + 0x59c + 0x59c + 0x33 + 0x0 + + + + .debug_line + 0x5cf + 0x5cf + 0x33 + 0x0 + + + + .debug_line + 0x602 + 0x602 + 0x33 + 0x0 + + + + .debug_line + 0x635 + 0x635 + 0x33 + 0x0 + + + + .debug_line + 0x668 + 0x668 + 0x33 + 0x0 + + + + .debug_line + 0x69b + 0x69b + 0x33 + 0x0 + + + + .debug_line + 0x6ce + 0x6ce + 0x33 + 0x0 + + + + .debug_line + 0x701 + 0x701 + 0x3a1 + 0x0 + + + + .debug_line + 0xaa2 + 0xaa2 + 0x4e + 0x0 + + + + .debug_line + 0xaf0 + 0xaf0 + 0x2b7 + 0x0 + + + + .debug_line + 0xda7 + 0xda7 + 0x4a + 0x0 + + + + .debug_line + 0xdf1 + 0xdf1 + 0x4a + 0x0 + + + + .debug_line + 0xe3b + 0xe3b + 0x4a + 0x0 + + + + .debug_line + 0xe85 + 0xe85 + 0x4a + 0x0 + + + + .debug_line + 0xecf + 0xecf + 0x4a + 0x0 + + + + .debug_line + 0xf19 + 0xf19 + 0x4a + 0x0 + + + + .debug_line + 0xf63 + 0xf63 + 0x4a + 0x0 + + + + .debug_line + 0xfad + 0xfad + 0x4a + 0x0 + + + + .debug_line + 0xff7 + 0xff7 + 0x4a + 0x0 + + + + .debug_line + 0x1041 + 0x1041 + 0x69f + 0x0 + + + + .debug_line + 0x16e0 + 0x16e0 + 0xa4 + 0x0 + + + + .debug_line + 0x1784 + 0x1784 + 0x55 + 0x0 + + + + .debug_line + 0x17d9 + 0x17d9 + 0x5d + 0x0 + + + + .debug_line + 0x1836 + 0x1836 + 0x37 + 0x0 + + + + .debug_line + 0x186d + 0x186d + 0x3e1 + 0x0 + + + + .debug_line + 0x1c4e + 0x1c4e + 0xfd + 0x0 + + + + .debug_line + 0x1d4b + 0x1d4b + 0x9c + 0x0 + + + + .debug_line + 0x1de7 + 0x1de7 + 0x9e + 0x0 + + + + .debug_line + 0x1e85 + 0x1e85 + 0xe8 + 0x0 + + + + .debug_line + 0x1f6d + 0x1f6d + 0x99 + 0x0 + + + + .debug_line + 0x2006 + 0x2006 + 0x99 + 0x0 + + + + .debug_line + 0x209f + 0x209f + 0x9d + 0x0 + + + + .debug_line + 0x213c + 0x213c + 0x9c + 0x0 + + + + .debug_line + 0x21d8 + 0x21d8 + 0x9c + 0x0 + + + + .debug_line + 0x2274 + 0x2274 + 0x9c + 0x0 + + + + .debug_line + 0x2310 + 0x2310 + 0x9c + 0x0 + + + + .debug_line + 0x23ac + 0x23ac + 0x9c + 0x0 + + + + .debug_line + 0x2448 + 0x2448 + 0x9c + 0x0 + + + + .debug_line + 0x24e4 + 0x24e4 + 0x9c + 0x0 + + + + .debug_line + 0x2580 + 0x2580 + 0x9d + 0x0 + + + + .debug_line + 0x261d + 0x261d + 0xa4 + 0x0 + + + + .debug_line + 0x26c1 + 0x26c1 + 0xe5 + 0x0 + + + + .debug_line + 0x27a6 + 0x27a6 + 0x98 + 0x0 + + + + .debug_line + 0x283e + 0x283e + 0xa2 + 0x0 + + + + .debug_line + 0x28e0 + 0x28e0 + 0xb1 + 0x0 + + + + .debug_line + 0x2991 + 0x2991 + 0x9f + 0x0 + + + + .debug_line + 0x2a30 + 0x2a30 + 0x9f + 0x0 + + + + .debug_line + 0x2acf + 0x2acf + 0x9f + 0x0 + + + + .debug_line + 0x2b6e + 0x2b6e + 0xe4 + 0x0 + + + + .debug_line + 0x2c52 + 0x2c52 + 0x9d + 0x0 + + + + .debug_line + 0x2cef + 0x2cef + 0x9d + 0x0 + + + + .debug_line + 0x2d8c + 0x2d8c + 0xb8 + 0x0 + + + + .debug_line + 0x2e44 + 0x2e44 + 0xa3 + 0x0 + + + + .debug_line + 0x2ee7 + 0x2ee7 + 0x9b + 0x0 + + + + .debug_line + 0x2f82 + 0x2f82 + 0x9b + 0x0 + + + + .debug_line + 0x301d + 0x301d + 0xb1 + 0x0 + + + + .debug_line + 0x30ce + 0x30ce + 0xb1 + 0x0 + + + + .debug_line + 0x317f + 0x317f + 0x21 + 0x0 + + + + .debug_line + 0x31a0 + 0x31a0 + 0x97 + 0x0 + + + + .debug_line + 0x3237 + 0x3237 + 0x98 + 0x0 + + + + .debug_line + 0x32cf + 0x32cf + 0x99 + 0x0 + + + + .debug_line + 0x3368 + 0x3368 + 0x99 + 0x0 + + + + .debug_line + 0x3401 + 0x3401 + 0x9e + 0x0 + + + + .debug_line + 0x349f + 0x349f + 0xb3 + 0x0 + + + + .debug_line + 0x3552 + 0x3552 + 0xa7 + 0x0 + + + + .debug_line + 0x35f9 + 0x35f9 + 0xe3 + 0x0 + + + + .debug_line + 0x36dc + 0x36dc + 0x9d + 0x0 + + + + .debug_line + 0x3779 + 0x3779 + 0x9a + 0x0 + + + + .debug_line + 0x3813 + 0x3813 + 0x9c + 0x0 + + + + .debug_line + 0x38af + 0x38af + 0x9c + 0x0 + + + + .debug_line + 0x394b + 0x394b + 0x9d + 0x0 + + + + .debug_line + 0x39e8 + 0x39e8 + 0x9d + 0x0 + + + + .debug_line + 0x3a85 + 0x3a85 + 0xa1 + 0x0 + + + + .debug_line + 0x3b26 + 0x3b26 + 0xa2 + 0x0 + + + + .debug_line + 0x3bc8 + 0x3bc8 + 0x9d + 0x0 + + + + .debug_line + 0x3c65 + 0x3c65 + 0x9d + 0x0 + + + + .debug_line + 0x3d02 + 0x3d02 + 0xa7 + 0x0 + + + + .debug_line + 0x3da9 + 0x3da9 + 0xa1 + 0x0 + + + + .debug_line + 0x3e4a + 0x3e4a + 0xb4 + 0x0 + + + + .debug_line + 0x3efe + 0x3efe + 0x19e + 0x0 + + + + .debug_line + 0x409c + 0x409c + 0xd2 + 0x0 + + + + .debug_line + 0x416e + 0x416e + 0xbe + 0x0 + + + + .debug_line + 0x422c + 0x422c + 0xa1 + 0x0 + + + + .debug_line + 0x42cd + 0x42cd + 0xc7 + 0x0 + + + + .debug_line + 0x4394 + 0x4394 + 0x14b + 0x0 + + + + .debug_line + 0x44df + 0x44df + 0xd5 + 0x0 + + + + .debug_line + 0x45b4 + 0x45b4 + 0x21 + 0x0 + + + + .debug_line + 0x45d5 + 0x45d5 + 0x68 + 0x0 + + + + .debug_line + 0x463d + 0x463d + 0x21 + 0x0 + + + + .debug_line + 0x465e + 0x465e + 0x4f + 0x0 + + + + .debug_line + 0x46ad + 0x46ad + 0xae + 0x0 + + + + .debug_line + 0x475b + 0x475b + 0x16c + 0x0 + + + + .debug_line + 0x48c7 + 0x48c7 + 0x8f + 0x0 + + + + .debug_line + 0x4956 + 0x4956 + 0x63 + 0x0 + + + + .debug_line + 0x49b9 + 0x49b9 + 0x57 + 0x0 + + + + .debug_line + 0x4a10 + 0x4a10 + 0x21 + 0x0 + + + + .debug_line + 0x4a31 + 0x4a31 + 0x3f + 0x0 + + + + .debug_line + 0x4a70 + 0x4a70 + 0x21 + 0x0 + + + + .debug_line + 0x4a91 + 0x4a91 + 0x74 + 0x0 + + + + .debug_line + 0x4b05 + 0x4b05 + 0x21 + 0x0 + + + + .debug_line + 0x4b26 + 0x4b26 + 0x52 + 0x0 + + + + .debug_line + 0x4b78 + 0x4b78 + 0x21 + 0x0 + + + + .debug_line + 0x4b99 + 0x4b99 + 0x57 + 0x0 + + + + .debug_line + 0x4bf0 + 0x4bf0 + 0x21 + 0x0 + + + + .debug_line + 0x4c11 + 0x4c11 + 0x9a + 0x0 + + + + .debug_line + 0x4cab + 0x4cab + 0x21 + 0x0 + + + + .debug_line + 0x4ccc + 0x4ccc + 0x2b + 0x0 + + + + .debug_line + 0x4cf7 + 0x4cf7 + 0x66 + 0x0 + + + + .debug_line + 0x4d5d + 0x4d5d + 0x21 + 0x0 + + + + .debug_line + 0x4d7e + 0x4d7e + 0x2c + 0x0 + + + + .debug_line + 0x4daa + 0x4daa + 0x2c + 0x0 + + + + .debug_line + 0x4dd6 + 0x4dd6 + 0x5f + 0x0 + + + + .debug_line + 0x4e35 + 0x4e35 + 0x21 + 0x0 + + + + .debug_line + 0x4e56 + 0x4e56 + 0x50 + 0x0 + + + + .debug_line + 0x4ea6 + 0x4ea6 + 0x30 + 0x0 + + + + .debug_line + 0x4ed6 + 0x4ed6 + 0x99 + 0x0 + + + + .debug_line + 0x4f6f + 0x4f6f + 0x21 + 0x0 + + + + .debug_line + 0x4f90 + 0x4f90 + 0x2c + 0x0 + + + + .debug_line + 0x4fbc + 0x4fbc + 0x21 + 0x0 + + + + .debug_line + 0x4fdd + 0x4fdd + 0x3b + 0x0 + + + + .debug_line + 0x5018 + 0x5018 + 0x21 + 0x0 + + + + .debug_frame + 0x0 + 0x0 + 0x2d0 + 0x4 + + + + .debug_frame + 0x2d0 + 0x2d0 + 0x40 + 0x4 + + + + .debug_frame + 0x310 + 0x310 + 0x1d4 + 0x4 + + + + .debug_frame + 0x4e4 + 0x4e4 + 0xb4 + 0x4 + + + + .debug_frame + 0x598 + 0x598 + 0x384 + 0x4 + + + + .debug_frame + 0x91c + 0x91c + 0x21c + 0x4 + + + + .debug_frame + 0xb38 + 0xb38 + 0x44 + 0x4 + + + + .debug_frame + 0xb7c + 0xb7c + 0x44 + 0x4 + + + + .debug_frame + 0xbc0 + 0xbc0 + 0x44 + 0x4 + + + + .debug_frame + 0xc04 + 0xc04 + 0x44 + 0x4 + + + + .debug_frame + 0xc48 + 0xc48 + 0x44 + 0x4 + + + + .debug_frame + 0xc8c + 0xc8c + 0x44 + 0x4 + + + + .debug_frame + 0xcd0 + 0xcd0 + 0x44 + 0x4 + + + + .debug_frame + 0xd14 + 0xd14 + 0x44 + 0x4 + + + + .debug_frame + 0xd58 + 0xd58 + 0x44 + 0x4 + + + + .debug_frame + 0xd9c + 0xd9c + 0x44 + 0x4 + + + + .debug_frame + 0xde0 + 0xde0 + 0x44 + 0x4 + + + + .debug_frame + 0xe24 + 0xe24 + 0x44 + 0x4 + + + + .debug_frame + 0xe68 + 0xe68 + 0x44 + 0x4 + + + + .debug_frame + 0xeac + 0xeac + 0x44 + 0x4 + + + + .debug_frame + 0xef0 + 0xef0 + 0x44 + 0x4 + + + + .debug_frame + 0xf34 + 0xf34 + 0x44 + 0x4 + + + + .debug_frame + 0xf78 + 0xf78 + 0x44 + 0x4 + + + + .debug_frame + 0xfbc + 0xfbc + 0x44 + 0x4 + + + + .debug_frame + 0x1000 + 0x1000 + 0x44 + 0x4 + + + + .debug_frame + 0x1044 + 0x1044 + 0x44 + 0x4 + + + + .debug_frame + 0x1088 + 0x1088 + 0x40 + 0x4 + + + + .debug_frame + 0x10c8 + 0x10c8 + 0x40 + 0x4 + + + + .debug_frame + 0x1108 + 0x1108 + 0x40 + 0x4 + + + + .debug_frame + 0x1148 + 0x1148 + 0x4c + 0x4 + + + + .debug_frame + 0x1194 + 0x1194 + 0x48 + 0x4 + + + + .debug_frame + 0x11dc + 0x11dc + 0x48 + 0x4 + + + + .debug_frame + 0x1224 + 0x1224 + 0x44 + 0x4 + + + + .debug_frame + 0x1268 + 0x1268 + 0x44 + 0x4 + + + + .debug_frame + 0x12ac + 0x12ac + 0x44 + 0x4 + + + + .debug_frame + 0x12f0 + 0x12f0 + 0x44 + 0x4 + + + + .debug_frame + 0x1334 + 0x1334 + 0x44 + 0x4 + + + + .debug_frame + 0x1378 + 0x1378 + 0x44 + 0x4 + + + + .debug_frame + 0x13bc + 0x13bc + 0x44 + 0x4 + + + + .debug_frame + 0x1400 + 0x1400 + 0x44 + 0x4 + + + + .debug_frame + 0x1444 + 0x1444 + 0x44 + 0x4 + + + + .debug_frame + 0x1488 + 0x1488 + 0x40 + 0x4 + + + + .debug_frame + 0x14c8 + 0x14c8 + 0x40 + 0x4 + + + + .debug_frame + 0x1508 + 0x1508 + 0x40 + 0x4 + + + + .debug_frame + 0x1548 + 0x1548 + 0x44 + 0x4 + + + + .debug_frame + 0x158c + 0x158c + 0x44 + 0x4 + + + + .debug_frame + 0x15d0 + 0x15d0 + 0x44 + 0x4 + + + + .debug_frame + 0x1614 + 0x1614 + 0x44 + 0x4 + + + + .debug_frame + 0x1658 + 0x1658 + 0x44 + 0x4 + + + + .debug_frame + 0x169c + 0x169c + 0x44 + 0x4 + + + + .debug_frame + 0x16e0 + 0x16e0 + 0x44 + 0x4 + + + + .debug_frame + 0x1724 + 0x1724 + 0x44 + 0x4 + + + + .debug_frame + 0x1768 + 0x1768 + 0x40 + 0x4 + + + + .debug_frame + 0x17a8 + 0x17a8 + 0x44 + 0x4 + + + + .debug_frame + 0x17ec + 0x17ec + 0x50 + 0x4 + + + + .debug_frame + 0x183c + 0x183c + 0x44 + 0x4 + + + + .debug_frame + 0x1880 + 0x1880 + 0x44 + 0x4 + + + + .debug_frame + 0x18c4 + 0x18c4 + 0x44 + 0x4 + + + + .debug_frame + 0x1908 + 0x1908 + 0x44 + 0x4 + + + + .debug_frame + 0x194c + 0x194c + 0x80 + 0x4 + + + + .debug_frame + 0x19cc + 0x19cc + 0x50 + 0x4 + + + + .debug_frame + 0x1a1c + 0x1a1c + 0x40 + 0x4 + + + + .debug_frame + 0x1a5c + 0x1a5c + 0x40 + 0x4 + + + + .debug_frame + 0x1a9c + 0x1a9c + 0x58 + 0x4 + + + + .debug_frame + 0x1af4 + 0x1af4 + 0x40 + 0x4 + + + + .debug_frame + 0x1b34 + 0x1b34 + 0x40 + 0x4 + + + + .debug_frame + 0x1b74 + 0x1b74 + 0x40 + 0x4 + + + + .debug_frame + 0x1bb4 + 0x1bb4 + 0x60 + 0x4 + + + + .debug_frame + 0x1c14 + 0x1c14 + 0x70 + 0x4 + + + + .debug_frame + 0x1c84 + 0x1c84 + 0x40 + 0x4 + + + + .debug_frame + 0x1cc4 + 0x1cc4 + 0x40 + 0x4 + + + + .debug_frame + 0x1d04 + 0x1d04 + 0x40 + 0x4 + + + + .debug_abbrev + 0x0 + 0x0 + 0xf0 + 0x0 + + + + .debug_abbrev + 0xf0 + 0xf0 + 0x76 + 0x0 + + + + .debug_abbrev + 0x166 + 0x166 + 0x48 + 0x0 + + + + .debug_abbrev + 0x1ae + 0x1ae + 0x25 + 0x0 + + + + .debug_abbrev + 0x1d3 + 0x1d3 + 0x28 + 0x0 + + + + .debug_abbrev + 0x1fb + 0x1fb + 0x28 + 0x0 + + + + .debug_abbrev + 0x223 + 0x223 + 0x28 + 0x0 + + + + .debug_abbrev + 0x24b + 0x24b + 0x28 + 0x0 + + + + .debug_abbrev + 0x273 + 0x273 + 0x28 + 0x0 + + + + .debug_abbrev + 0x29b + 0x29b + 0x28 + 0x0 + + + + .debug_abbrev + 0x2c3 + 0x2c3 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2eb + 0x2eb + 0x28 + 0x0 + + + + .debug_abbrev + 0x313 + 0x313 + 0x28 + 0x0 + + + + .debug_abbrev + 0x33b + 0x33b + 0xfd + 0x0 + + + + .debug_abbrev + 0x438 + 0x438 + 0x6f + 0x0 + + + + .debug_abbrev + 0x4a7 + 0x4a7 + 0xbd + 0x0 + + + + .debug_abbrev + 0x564 + 0x564 + 0x28 + 0x0 + + + + .debug_abbrev + 0x58c + 0x58c + 0x28 + 0x0 + + + + .debug_abbrev + 0x5b4 + 0x5b4 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5dc + 0x5dc + 0x28 + 0x0 + + + + .debug_abbrev + 0x604 + 0x604 + 0x28 + 0x0 + + + + .debug_abbrev + 0x62c + 0x62c + 0x28 + 0x0 + + + + .debug_abbrev + 0x654 + 0x654 + 0x28 + 0x0 + + + + .debug_abbrev + 0x67c + 0x67c + 0x28 + 0x0 + + + + .debug_abbrev + 0x6a4 + 0x6a4 + 0x28 + 0x0 + + + + .debug_abbrev + 0x6cc + 0x6cc + 0x103 + 0x0 + + + + .debug_abbrev + 0x7cf + 0x7cf + 0xb3 + 0x0 + + + + .debug_abbrev + 0x882 + 0x882 + 0x25 + 0x0 + + + + .debug_abbrev + 0x8a7 + 0x8a7 + 0x25 + 0x0 + + + + .debug_abbrev + 0x8cc + 0x8cc + 0x28 + 0x0 + + + + .debug_abbrev + 0x8f4 + 0x8f4 + 0xf4 + 0x0 + + + + .debug_abbrev + 0x9e8 + 0x9e8 + 0xa5 + 0x0 + + + + .debug_abbrev + 0xa8d + 0xa8d + 0x5c + 0x0 + + + + .debug_abbrev + 0xae9 + 0xae9 + 0x6a + 0x0 + + + + .debug_abbrev + 0xb53 + 0xb53 + 0x71 + 0x0 + + + + .debug_abbrev + 0xbc4 + 0xbc4 + 0x5c + 0x0 + + + + .debug_abbrev + 0xc20 + 0xc20 + 0x5c + 0x0 + + + + .debug_abbrev + 0xc7c + 0xc7c + 0x68 + 0x0 + + + + .debug_abbrev + 0xce4 + 0xce4 + 0x68 + 0x0 + + + + .debug_abbrev + 0xd4c + 0xd4c + 0x68 + 0x0 + + + + .debug_abbrev + 0xdb4 + 0xdb4 + 0x68 + 0x0 + + + + .debug_abbrev + 0xe1c + 0xe1c + 0x68 + 0x0 + + + + .debug_abbrev + 0xe84 + 0xe84 + 0x68 + 0x0 + + + + .debug_abbrev + 0xeec + 0xeec + 0x68 + 0x0 + + + + .debug_abbrev + 0xf54 + 0xf54 + 0x68 + 0x0 + + + + .debug_abbrev + 0xfbc + 0xfbc + 0x68 + 0x0 + + + + .debug_abbrev + 0x1024 + 0x1024 + 0x6a + 0x0 + + + + .debug_abbrev + 0x108e + 0x108e + 0x62 + 0x0 + + + + .debug_abbrev + 0x10f0 + 0x10f0 + 0x5c + 0x0 + + + + .debug_abbrev + 0x114c + 0x114c + 0x6a + 0x0 + + + + .debug_abbrev + 0x11b6 + 0x11b6 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1220 + 0x1220 + 0x6a + 0x0 + + + + .debug_abbrev + 0x128a + 0x128a + 0x6a + 0x0 + + + + .debug_abbrev + 0x12f4 + 0x12f4 + 0x5c + 0x0 + + + + .debug_abbrev + 0x1350 + 0x1350 + 0x69 + 0x0 + + + + .debug_abbrev + 0x13b9 + 0x13b9 + 0x46 + 0x0 + + + + .debug_abbrev + 0x13ff + 0x13ff + 0x46 + 0x0 + + + + .debug_abbrev + 0x1445 + 0x1445 + 0x54 + 0x0 + + + + .debug_abbrev + 0x1499 + 0x1499 + 0x48 + 0x0 + + + + .debug_abbrev + 0x14e1 + 0x14e1 + 0x3b + 0x0 + + + + .debug_abbrev + 0x151c + 0x151c + 0x3b + 0x0 + + + + .debug_abbrev + 0x1557 + 0x1557 + 0x51 + 0x0 + + + + .debug_abbrev + 0x15a8 + 0x15a8 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1612 + 0x1612 + 0x44 + 0x0 + + + + .debug_abbrev + 0x1656 + 0x1656 + 0x5c + 0x0 + + + + .debug_abbrev + 0x16b2 + 0x16b2 + 0x68 + 0x0 + + + + .debug_abbrev + 0x171a + 0x171a + 0x68 + 0x0 + + + + .debug_abbrev + 0x1782 + 0x1782 + 0x68 + 0x0 + + + + .debug_abbrev + 0x17ea + 0x17ea + 0x6a + 0x0 + + + + .debug_abbrev + 0x1854 + 0x1854 + 0x6a + 0x0 + + + + .debug_abbrev + 0x18be + 0x18be + 0x6a + 0x0 + + + + .debug_abbrev + 0x1928 + 0x1928 + 0x62 + 0x0 + + + + .debug_abbrev + 0x198a + 0x198a + 0x44 + 0x0 + + + + .debug_abbrev + 0x19ce + 0x19ce + 0x46 + 0x0 + + + + .debug_abbrev + 0x1a14 + 0x1a14 + 0x44 + 0x0 + + + + .debug_abbrev + 0x1a58 + 0x1a58 + 0x5c + 0x0 + + + + .debug_abbrev + 0x1ab4 + 0x1ab4 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1b1c + 0x1b1c + 0x68 + 0x0 + + + + .debug_abbrev + 0x1b84 + 0x1b84 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1bec + 0x1bec + 0x68 + 0x0 + + + + .debug_abbrev + 0x1c54 + 0x1c54 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1cbc + 0x1cbc + 0x6a + 0x0 + + + + .debug_abbrev + 0x1d26 + 0x1d26 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1d8e + 0x1d8e + 0x52 + 0x0 + + + + .debug_abbrev + 0x1de0 + 0x1de0 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1e4c + 0x1e4c + 0x6c + 0x0 + + + + .debug_abbrev + 0x1eb8 + 0x1eb8 + 0x5f + 0x0 + + + + .debug_abbrev + 0x1f17 + 0x1f17 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1f81 + 0x1f81 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1fed + 0x1fed + 0x5e + 0x0 + + + + .debug_abbrev + 0x204b + 0x204b + 0x8f + 0x0 + + + + .debug_abbrev + 0x20da + 0x20da + 0x6f + 0x0 + + + + .debug_abbrev + 0x2149 + 0x2149 + 0x44 + 0x0 + + + + .debug_abbrev + 0x218d + 0x218d + 0x6f + 0x0 + + + + .debug_abbrev + 0x21fc + 0x21fc + 0x35 + 0x0 + + + + .debug_abbrev + 0x2231 + 0x2231 + 0x3d + 0x0 + + + + .debug_abbrev + 0x226e + 0x226e + 0x3b + 0x0 + + + + .debug_abbrev + 0x22a9 + 0x22a9 + 0x61 + 0x0 + + + + .debug_abbrev + 0x230a + 0x230a + 0x3b + 0x0 + + + + .debug_abbrev + 0x2345 + 0x2345 + 0x3b + 0x0 + + + + .debug_abbrev + 0x2380 + 0x2380 + 0x61 + 0x0 + + + + .debug_abbrev + 0x23e1 + 0x23e1 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2425 + 0x2425 + 0x4b + 0x0 + + + + .debug_abbrev + 0x2470 + 0x2470 + 0x1c + 0x0 + + + + .debug_abbrev + 0x248c + 0x248c + 0x71 + 0x0 + + + + .debug_abbrev + 0x24fd + 0x24fd + 0xb3 + 0x0 + + + + .debug_abbrev + 0x25b0 + 0x25b0 + 0x6d + 0x0 + + + + .debug_abbrev + 0x261d + 0x261d + 0x44 + 0x0 + + + + .debug_abbrev + 0x2661 + 0x2661 + 0x6d + 0x0 + + + + .debug_abbrev + 0x26ce + 0x26ce + 0x44 + 0x0 + + + + .debug_abbrev + 0x2712 + 0x2712 + 0x5f + 0x0 + + + + .debug_abbrev + 0x2771 + 0x2771 + 0x44 + 0x0 + + + + .debug_abbrev + 0x27b5 + 0x27b5 + 0x28 + 0x0 + + + + .debug_abbrev + 0x27dd + 0x27dd + 0xa0 + 0x0 + + + + .debug_abbrev + 0x287d + 0x287d + 0x57 + 0x0 + + + + .debug_abbrev + 0x28d4 + 0x28d4 + 0x28 + 0x0 + + + + .debug_abbrev + 0x28fc + 0x28fc + 0x28 + 0x0 + + + + .debug_abbrev + 0x2924 + 0x2924 + 0x5f + 0x0 + + + + .debug_abbrev + 0x2983 + 0x2983 + 0x3a + 0x0 + + + + .debug_abbrev + 0x29bd + 0x29bd + 0x64 + 0x0 + + + + .debug_abbrev + 0x2a21 + 0x2a21 + 0x79 + 0x0 + + + + .debug_abbrev + 0x2a9a + 0x2a9a + 0x61 + 0x0 + + + + .debug_abbrev + 0x2afb + 0x2afb + 0x44 + 0x0 + + + + .debug_abbrev + 0x2b3f + 0x2b3f + 0x26 + 0x0 + + + + .debug_abbrev + 0x2b65 + 0x2b65 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2b81 + 0x2b81 + 0x49 + 0x0 + + + + .debug_abbrev + 0x2bca + 0x2bca + 0x1c + 0x0 + + + + .debug_abbrev + 0x2be6 + 0x2be6 + 0xf + 0x0 + + + .debug_str + 0x0 + 0x0 + 0x68 + 0x0 + + + + .debug_str + 0x68 + 0x68 + 0x68 + 0x0 + + + + .debug_str + 0xd0 + 0xd0 + 0x68 + 0x0 + + + + .debug_str + 0x138 + 0x138 + 0x68 + 0x0 + + + + .debug_str + 0x1a0 + 0x1a0 + 0x68 + 0x0 + + + + .debug_str + 0x208 + 0x208 + 0x69 + 0x0 + + + + .debug_str + 0x271 + 0x271 + 0x69 + 0x0 + + + + .debug_str + 0x2da + 0x2da + 0x69 + 0x0 + + + + .debug_str + 0x343 + 0x343 + 0x69 + 0x0 + + + + .debug_str + 0x3ac + 0x3ac + 0x69 + 0x0 + + + + .debug_str + 0x415 + 0x415 + 0x69 + 0x0 + + + + .debug_str + 0x47e + 0x47e + 0x68 + 0x0 + + + + .debug_str + 0x4e6 + 0x4e6 + 0x68 + 0x0 + + + + .debug_str + 0x54e + 0x54e + 0x68 + 0x0 + + + + .debug_str + 0x5b6 + 0x5b6 + 0x68 + 0x0 + + + + .debug_str + 0x61e + 0x61e + 0x68 + 0x0 + + + + .debug_str + 0x686 + 0x686 + 0x68 + 0x0 + + + + .debug_str + 0x6ee + 0x6ee + 0x68 + 0x0 + + + + .debug_str + 0x756 + 0x756 + 0x68 + 0x0 + + + + .debug_str + 0x7be + 0x7be + 0x68 + 0x0 + + + + .debug_str + 0x826 + 0x826 + 0x68 + 0x0 + + + + .debug_str + 0x88e + 0x88e + 0x68 + 0x0 + + + + .debug_str + 0x8f6 + 0x8f6 + 0x68 + 0x0 + + + + .debug_str + 0x95e + 0x95e + 0x68 + 0x0 + + + + .debug_str + 0x9c6 + 0x9c6 + 0x68 + 0x0 + + + + .debug_aranges + 0x0 + 0x0 + 0xe0 + 0x0 + + + + .debug_aranges + 0xe0 + 0xe0 + 0x20 + 0x0 + + + + .debug_aranges + 0x100 + 0x100 + 0x90 + 0x0 + + + + .debug_aranges + 0x190 + 0x190 + 0x20 + 0x0 + + + + .debug_aranges + 0x1b0 + 0x1b0 + 0x120 + 0x0 + + + + .debug_aranges + 0x2d0 + 0x2d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x2f0 + 0x2f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x310 + 0x310 + 0xb0 + 0x0 + + + + .debug_aranges + 0x3c0 + 0x3c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x3e0 + 0x3e0 + 0x20 + 0x0 + + + + .debug_aranges + 0x400 + 0x400 + 0x20 + 0x0 + + + + .debug_aranges + 0x420 + 0x420 + 0x20 + 0x0 + + + + .debug_aranges + 0x440 + 0x440 + 0x20 + 0x0 + + + + .debug_aranges + 0x460 + 0x460 + 0x20 + 0x0 + + + + .debug_aranges + 0x480 + 0x480 + 0x20 + 0x0 + + + + .debug_aranges + 0x4a0 + 0x4a0 + 0x20 + 0x0 + + + + .debug_aranges + 0x4c0 + 0x4c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x4e0 + 0x4e0 + 0x20 + 0x0 + + + + .debug_aranges + 0x500 + 0x500 + 0x20 + 0x0 + + + + .debug_aranges + 0x520 + 0x520 + 0x20 + 0x0 + + + + .debug_aranges + 0x540 + 0x540 + 0x20 + 0x0 + + + + .debug_aranges + 0x560 + 0x560 + 0x20 + 0x0 + + + + .debug_aranges + 0x580 + 0x580 + 0x20 + 0x0 + + + + .debug_aranges + 0x5a0 + 0x5a0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5c0 + 0x5c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5e0 + 0x5e0 + 0x20 + 0x0 + + + + .debug_aranges + 0x600 + 0x600 + 0x20 + 0x0 + + + + .debug_aranges + 0x620 + 0x620 + 0x20 + 0x0 + + + + .debug_aranges + 0x640 + 0x640 + 0x20 + 0x0 + + + + .debug_aranges + 0x660 + 0x660 + 0x20 + 0x0 + + + + .debug_aranges + 0x680 + 0x680 + 0x20 + 0x0 + + + + .debug_aranges + 0x6a0 + 0x6a0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6c0 + 0x6c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6e0 + 0x6e0 + 0x20 + 0x0 + + + + .debug_aranges + 0x700 + 0x700 + 0x20 + 0x0 + + + + .debug_aranges + 0x720 + 0x720 + 0x20 + 0x0 + + + + .debug_aranges + 0x740 + 0x740 + 0x20 + 0x0 + + + + .debug_aranges + 0x760 + 0x760 + 0x20 + 0x0 + + + + .debug_aranges + 0x780 + 0x780 + 0x20 + 0x0 + + + + .debug_aranges + 0x7a0 + 0x7a0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7c0 + 0x7c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7e0 + 0x7e0 + 0x20 + 0x0 + + + + .debug_aranges + 0x800 + 0x800 + 0x20 + 0x0 + + + + .debug_aranges + 0x820 + 0x820 + 0x20 + 0x0 + + + + .debug_aranges + 0x840 + 0x840 + 0x20 + 0x0 + + + + .debug_aranges + 0x860 + 0x860 + 0x20 + 0x0 + + + + .debug_aranges + 0x880 + 0x880 + 0x20 + 0x0 + + + + .debug_aranges + 0x8a0 + 0x8a0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8c0 + 0x8c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8e0 + 0x8e0 + 0x20 + 0x0 + + + + .debug_aranges + 0x900 + 0x900 + 0x20 + 0x0 + + + + .debug_aranges + 0x920 + 0x920 + 0x20 + 0x0 + + + + .debug_aranges + 0x940 + 0x940 + 0x20 + 0x0 + + + + .debug_aranges + 0x960 + 0x960 + 0x20 + 0x0 + + + + .debug_aranges + 0x980 + 0x980 + 0x20 + 0x0 + + + + .debug_aranges + 0x9a0 + 0x9a0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9c0 + 0x9c0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9e0 + 0x9e0 + 0x20 + 0x0 + + + + .debug_aranges + 0xa00 + 0xa00 + 0x20 + 0x0 + + + + .debug_aranges + 0xa20 + 0xa20 + 0x20 + 0x0 + + + + .debug_aranges + 0xa40 + 0xa40 + 0x20 + 0x0 + + + + .debug_aranges + 0xa60 + 0xa60 + 0x20 + 0x0 + + + + .debug_aranges + 0xa80 + 0xa80 + 0x20 + 0x0 + + + + .debug_aranges + 0xaa0 + 0xaa0 + 0x20 + 0x0 + + + + .debug_aranges + 0xac0 + 0xac0 + 0x20 + 0x0 + + + + .debug_aranges + 0xae0 + 0xae0 + 0x40 + 0x0 + + + + .debug_aranges + 0xb20 + 0xb20 + 0x38 + 0x0 + + + + .debug_aranges + 0xb58 + 0xb58 + 0x20 + 0x0 + + + + .debug_aranges + 0xb78 + 0xb78 + 0x20 + 0x0 + + + + .debug_aranges + 0xb98 + 0xb98 + 0x20 + 0x0 + + + + .debug_aranges + 0xbb8 + 0xbb8 + 0x20 + 0x0 + + + + .debug_aranges + 0xbd8 + 0xbd8 + 0x20 + 0x0 + + + + .debug_aranges + 0xbf8 + 0xbf8 + 0x20 + 0x0 + + + + .debug_aranges + 0xc18 + 0xc18 + 0x20 + 0x0 + + + + .debug_aranges + 0xc38 + 0xc38 + 0x28 + 0x0 + + + + .debug_aranges + 0xc60 + 0xc60 + 0x30 + 0x0 + + + + .debug_aranges + 0xc90 + 0xc90 + 0x20 + 0x0 + + + + .debug_aranges + 0xcb0 + 0xcb0 + 0x20 + 0x0 + + + + .debug_aranges + 0xcd0 + 0xcd0 + 0x20 + 0x0 + + + + .debug_pubnames + 0x0 + 0x0 + 0x228 + 0x0 + + + + .debug_pubnames + 0x228 + 0x228 + 0x1b + 0x0 + + + + .debug_pubnames + 0x243 + 0x243 + 0x50 + 0x0 + + + + .debug_pubnames + 0x293 + 0x293 + 0x1e + 0x0 + + + + .debug_pubnames + 0x2b1 + 0x2b1 + 0x23 + 0x0 + + + + .debug_pubnames + 0x2d4 + 0x2d4 + 0x25 + 0x0 + + + + .debug_pubnames + 0x2f9 + 0x2f9 + 0x20 + 0x0 + + + + .debug_pubnames + 0x319 + 0x319 + 0x22 + 0x0 + + + + .debug_pubnames + 0x33b + 0x33b + 0x20 + 0x0 + + + + .debug_pubnames + 0x35b + 0x35b + 0x22 + 0x0 + + + + .debug_pubnames + 0x37d + 0x37d + 0x1f + 0x0 + + + + .debug_pubnames + 0x39c + 0x39c + 0x156 + 0x0 + + + + .debug_pubnames + 0x4f2 + 0x4f2 + 0x21 + 0x0 + + + + .debug_pubnames + 0x513 + 0x513 + 0x28a + 0x0 + + + + .debug_pubnames + 0x79d + 0x79d + 0x29 + 0x0 + + + + .debug_pubnames + 0x7c6 + 0x7c6 + 0x2d + 0x0 + + + + .debug_pubnames + 0x7f3 + 0x7f3 + 0x2d + 0x0 + + + + .debug_pubnames + 0x820 + 0x820 + 0x2d + 0x0 + + + + .debug_pubnames + 0x84d + 0x84d + 0x2e + 0x0 + + + + .debug_pubnames + 0x87b + 0x87b + 0x2a + 0x0 + + + + .debug_pubnames + 0x8a5 + 0x8a5 + 0x2c + 0x0 + + + + .debug_pubnames + 0x8d1 + 0x8d1 + 0x2b + 0x0 + + + + .debug_pubnames + 0x8fc + 0x8fc + 0x33e + 0x0 + + + + .debug_pubnames + 0xc3a + 0xc3a + 0x44 + 0x0 + + + + .debug_pubnames + 0xc7e + 0xc7e + 0x45 + 0x0 + + + + .debug_pubnames + 0xcc3 + 0xcc3 + 0x4c + 0x0 + + + + .debug_pubnames + 0xd0f + 0xd0f + 0x224 + 0x0 + + + + .debug_pubnames + 0xf33 + 0xf33 + 0x2b + 0x0 + + + + .debug_pubnames + 0xf5e + 0xf5e + 0x30 + 0x0 + + + + .debug_pubnames + 0xf8e + 0xf8e + 0x2c + 0x0 + + + + .debug_pubnames + 0xfba + 0xfba + 0x2b + 0x0 + + + + .debug_pubnames + 0xfe5 + 0xfe5 + 0x2a + 0x0 + + + + .debug_pubnames + 0x100f + 0x100f + 0x2d + 0x0 + + + + .debug_pubnames + 0x103c + 0x103c + 0x2d + 0x0 + + + + .debug_pubnames + 0x1069 + 0x1069 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1094 + 0x1094 + 0x2c + 0x0 + + + + .debug_pubnames + 0x10c0 + 0x10c0 + 0x28 + 0x0 + + + + .debug_pubnames + 0x10e8 + 0x10e8 + 0x29 + 0x0 + + + + .debug_pubnames + 0x1111 + 0x1111 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1137 + 0x1137 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1167 + 0x1167 + 0x27 + 0x0 + + + + .debug_pubnames + 0x118e + 0x118e + 0x26 + 0x0 + + + + .debug_pubnames + 0x11b4 + 0x11b4 + 0x2c + 0x0 + + + + .debug_pubnames + 0x11e0 + 0x11e0 + 0x28 + 0x0 + + + + .debug_pubnames + 0x1208 + 0x1208 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1238 + 0x1238 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1265 + 0x1265 + 0x28 + 0x0 + + + + .debug_pubnames + 0x128d + 0x128d + 0x2d + 0x0 + + + + .debug_pubnames + 0x12ba + 0x12ba + 0x2e + 0x0 + + + + .debug_pubnames + 0x12e8 + 0x12e8 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1313 + 0x1313 + 0x2f + 0x0 + + + + .debug_pubnames + 0x1342 + 0x1342 + 0x38 + 0x0 + + + + .debug_pubnames + 0x137a + 0x137a + 0x2b + 0x0 + + + + .debug_pubnames + 0x13a5 + 0x13a5 + 0x30 + 0x0 + + + + .debug_pubnames + 0x13d5 + 0x13d5 + 0x27 + 0x0 + + + + .debug_pubnames + 0x13fc + 0x13fc + 0x26 + 0x0 + + + + .debug_pubnames + 0x1422 + 0x1422 + 0x27 + 0x0 + + + + .debug_pubnames + 0x1449 + 0x1449 + 0x28 + 0x0 + + + + .debug_pubnames + 0x1471 + 0x1471 + 0x2f + 0x0 + + + + .debug_pubnames + 0x14a0 + 0x14a0 + 0x24 + 0x0 + + + + .debug_pubnames + 0x14c4 + 0x14c4 + 0x2a + 0x0 + + + + .debug_pubnames + 0x14ee + 0x14ee + 0x2f + 0x0 + + + + .debug_pubnames + 0x151d + 0x151d + 0x2d + 0x0 + + + + .debug_pubnames + 0x154a + 0x154a + 0x37 + 0x0 + + + + .debug_pubnames + 0x1581 + 0x1581 + 0x26 + 0x0 + + + + .debug_pubnames + 0x15a7 + 0x15a7 + 0x2b + 0x0 + + + + .debug_pubnames + 0x15d2 + 0x15d2 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1603 + 0x1603 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1633 + 0x1633 + 0x29 + 0x0 + + + + .debug_pubnames + 0x165c + 0x165c + 0x2a + 0x0 + + + + .debug_pubnames + 0x1686 + 0x1686 + 0x29 + 0x0 + + + + .debug_pubnames + 0x16af + 0x16af + 0x36 + 0x0 + + + + .debug_pubnames + 0x16e5 + 0x16e5 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1716 + 0x1716 + 0x2a + 0x0 + + + + .debug_pubnames + 0x1740 + 0x1740 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1766 + 0x1766 + 0x26 + 0x0 + + + + .debug_pubnames + 0x178c + 0x178c + 0x28 + 0x0 + + + + .debug_pubnames + 0x17b4 + 0x17b4 + 0x2d + 0x0 + + + + .debug_pubnames + 0x17e1 + 0x17e1 + 0x2e + 0x0 + + + + .debug_pubnames + 0x180f + 0x180f + 0x31 + 0x0 + + + + .debug_pubnames + 0x1840 + 0x1840 + 0x1b + 0x0 + + + + .debug_pubnames + 0x185b + 0x185b + 0x1b + 0x0 + + + + .debug_pubnames + 0x1876 + 0x1876 + 0x1f + 0x0 + + + + .debug_pubnames + 0x1895 + 0x1895 + 0x25 + 0x0 + + + + .debug_pubnames + 0x18ba + 0x18ba + 0x70 + 0x0 + + + + .debug_pubnames + 0x192a + 0x192a + 0x60 + 0x0 + + + + .debug_pubnames + 0x198a + 0x198a + 0x26 + 0x0 + + + + .debug_pubnames + 0x19b0 + 0x19b0 + 0x1d + 0x0 + + + + .debug_pubnames + 0x19cd + 0x19cd + 0x27 + 0x0 + + + + .debug_pubnames + 0x19f4 + 0x19f4 + 0x35 + 0x0 + + + + .debug_pubnames + 0x1a29 + 0x1a29 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1a4e + 0x1a4e + 0x2b + 0x0 + + + + .debug_pubnames + 0x1a79 + 0x1a79 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1aa4 + 0x1aa4 + 0x5e + 0x0 + + + + .debug_pubnames + 0x1b02 + 0x1b02 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1b27 + 0x1b27 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1b43 + 0x1b43 + 0x1e + 0x0 + + + + .debug_pubnames + 0x1b61 + 0x1b61 + 0x43 + 0x0 + + + + .debug_pubnames + 0x1ba4 + 0x1ba4 + 0x21 + 0x0 + + + + .debug_pubnames + 0x1bc5 + 0x1bc5 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1be2 + 0x1be2 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1bfe + 0x1bfe + 0x29 + 0x0 + + + + SFRA_F32_Data + true + true + 0x2 + 0x22 + 0x2 + + + + + + .cinit + 0x84000 + 0x84000 + 0x38 + + + + + + + + + + .text + 0x82000 + 0x82000 + 0x1f68 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .text + + + + + + codestart + 0x80000 + 0x80000 + 0x2 + + + + + + .stack + 0x400 + 0x100 + + + + + + + .switch + 0x0 + 0x0 + + + + + .reset + 0x3fffc0 + 0x0 + + + + + .init_array + 0x0 + 0x0 + + + + + .bss + 0xc000 + 0x958 + + + + + + + + + + + + + + + + + + + + + + .bss:output + 0x0 + 0x0 + + + + + .bss:cio + 0x0 + 0x0 + + + + + .data + 0xa800 + 0x43 + + + + + + + + + + + .sysmem + 0x0 + 0x0 + + + + + .const + 0x90000 + 0x90000 + 0x513 + + + + + + + + + + + + + + Filter_RegsFile + 0x0 + 0x0 + + + + + SHARERAMGS0 + 0x0 + 0x0 + + + + + SHARERAMGS1 + 0x0 + 0x0 + + + + + SHARERAMGS2 + 0x0 + 0x0 + + + + + ramgs0 + 0x0 + 0x0 + + + + + ramgs1 + 0x0 + 0x0 + + + + + .TI.ramfunc + 0x86000 + 0x8000 + 0x128 + + + + + + + + + + + + + + + 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 + 0x3b43 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_info + 0x0 + 0x0 + 0x11618 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_line + 0x0 + 0x0 + 0x5039 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_frame + 0x0 + 0x0 + 0x1d44 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_abbrev + 0x0 + 0x0 + 0x2bf5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_str + 0x0 + 0x0 + 0xa2e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_aranges + 0x0 + 0x0 + 0xcf0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_pubnames + 0x0 + 0x0 + 0x1c27 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SFRA_F32_Data + 0x2 + 0x22 + + + + + + SEGMENT_0 + 0x80000 + 0x80000 + 0x2 + 0x5 + + + + + + SEGMENT_1 + 0x82000 + 0x82000 + 0x1f68 + 0x5 + + + + + + SEGMENT_2 + 0x84000 + 0x84000 + 0x38 + 0x4 + + + + + + SEGMENT_3 + 0x86000 + 0x8000 + 0x128 + 0x5 + + + + + + SEGMENT_4 + 0x90000 + 0x90000 + 0x513 + 0x4 + + + + + + SEGMENT_5 + 0x2 + 0x22 + 0x6 + + + + + + SEGMENT_6 + 0x400 + 0x100 + 0x6 + + + + + + SEGMENT_7 + 0xa800 + 0x43 + 0x6 + + + + + + SEGMENT_8 + 0xc000 + 0x958 + 0x6 + + + + + + + + RAMM0 + 0x0 + 0x123 + 0x2dd + 0x0 + 0x2dd + RWIX + + + + + RAMLS0 + 0x0 + 0x8000 + 0x800 + 0x128 + 0x6d8 + RWIX + + + 0x8000 + 0x128 + + + + 0x8128 + 0x6d8 + + + + + 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 + 0x0 + 0x800 + RWIX + + + + + RAMGS14 + 0x0 + 0x1a000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS15 + 0x0 + 0x1b000 + 0xff8 + 0x0 + 0xff8 + RWIX + + + + + BEGIN + 0x0 + 0x80000 + 0x2 + 0x2 + 0x0 + RWIX + + + 0x80000 + 0x2 + + + + + + FLASHA + 0x0 + 0x80002 + 0x1ffe + 0x0 + 0x1ffe + RWIX + + + + + FLASHB + 0x0 + 0x82000 + 0x2000 + 0x1f68 + 0x98 + RWIX + + + 0x82000 + 0x1f68 + + + + 0x83f68 + 0x98 + + + + + FLASHC + 0x0 + 0x84000 + 0x2000 + 0x38 + 0x1fc8 + RWIX + + + 0x84000 + 0x38 + + + + 0x84038 + 0x1fc8 + + + + + FLASHD + 0x0 + 0x86000 + 0x2000 + 0x128 + 0x1ed8 + RWIX + + + 0x86000 + 0x128 + + + + 0x86128 + 0x1ed8 + + + + + FLASHE + 0x0 + 0x88000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHF + 0x0 + 0x90000 + 0x8000 + 0x513 + 0x7aed + RWIX + + + 0x90000 + 0x513 + + + + 0x90513 + 0x7aed + + + + + 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 + 0x22 + 0xff + RWIX + + + 0x2 + 0x22 + + + + 0x24 + 0xff + + + + + RAMM1 + 0x1 + 0x400 + 0x3f8 + 0x100 + 0x2f8 + RWIX + + + 0x400 + 0x100 + + + + 0x500 + 0x2f8 + + + + + RAMLS5 + 0x1 + 0xa800 + 0x800 + 0x43 + 0x7bd + RWIX + + + 0xa800 + 0x43 + + + + 0xa843 + 0x7bd + + + + + RAMD1 + 0x1 + 0xb800 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMGS0 + 0x1 + 0xc000 + 0x1000 + 0x958 + 0x6a8 + RWIX + + + 0xc000 + 0x958 + + + + 0xc958 + 0x6a8 + + + + + 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 + + + + + CPU2TOCPU1RAM + 0x1 + 0x3f800 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CPU1TOCPU2RAM + 0x1 + 0x3fc00 + 0x400 + 0x0 + 0x400 + RWIX + + + + + + + __TI_cinit_table + + .data + 0x84000 + 0x1e + 0xa800 + 0x43 + lzss + + + .bss + 0x84024 + 0x4 + 0xc000 + 0x958 + zero_init + + + SFRA_F32_Data + 0x84028 + 0x4 + 0x2 + 0x22 + zero_init + + + + + __TI_handler_table + + 0x0 + __TI_zero_init + + + 0x1 + __TI_decompress_lzss + + + 0x2 + __TI_decompress_none + + + + + RamfuncsLoadStart + 0x86000 + + + RamfuncsLoadSize + 0x128 + + + RamfuncsLoadEnd + 0x86128 + + + RamfuncsRunStart + 0x8000 + + + RamfuncsRunSize + 0x128 + + + RamfuncsRunEnd + 0x8128 + + + __TI_CINIT_Base + 0x8402c + + + __TI_CINIT_Limit + 0x84038 + + + __TI_CINIT_Warm + 0x84038 + + + __TI_Handler_Table_Base + 0x8401e + + + __TI_Handler_Table_Limit + 0x84024 + + + __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 + + + INTERRUPT_init + 0x82de0 + + + + PinMux_init + 0x82d82 + + + + SCI_init + 0x82ded + + + + Board_init + 0x82d75 + + + + GPIO_init + 0x82dc9 + + + + mySCI0_init + 0x82df0 + + + + CPUTIMER_init + 0x82da6 + + + + myCPUTIMER0_init + 0x82da9 + + + + LED_Blue_init + 0x82dcc + + + + main + 0x83e84 + + + + plantPhaseVect + 0xc788 + + + + clPhaseVect + 0xc3a0 + + + + sfra_task_run + 0x82c0d + + + + libsfra + 0xa802 + + + + olPhaseVect + 0xc5f8 + + + + sfra_init + 0x82b20 + + + + ti_sfra + 0xc00a + + + + lowPass_test + 0xc000 + + + + plantMagVect + 0xc6c0 + + + + freqVect + 0xc468 + + + + olMagVect + 0xc530 + + + + libsfra_results + 0xc080 + + + + sfra_print_results_csv + 0x82b96 + + + + clMagVect + 0xc2d8 + + + + TIMER0_ISR + 0x83952 + + + + hal_sfra + 0xc040 + + + + SFRA_GUI_varGetList + 0xc8d2 + + + + SFRA_GUI_rcvTaskPointer + 0xc862 + + + + SFRA_GUI_cmdInterpreter + 0x82350 + + + + SFRA_GUI_commsOKflg + 0xc850 + + + + SFRA_GUI_memDataPtr16 + 0xc868 + + + + SFRA_GUI_getVariable + 0x823df + + + + SFRA_GUI_runSerialHostComms + 0x82255 + + + + SFRA_GUI_rxChar + 0xc854 + + + + SFRA_GUI_lowByteFlag + 0xc852 + + + + SFRA_GUI_memDataPtr32 + 0xc86a + + + + SFRA_GUI_varSetBtnList + 0xc8f2 + + + + SFRA_GUI_getData + 0x823e5 + + + + SFRA_GUI_config + 0x82143 + + + + SFRA_GUI_led_gpio + 0xc860 + + + + SFRA_GUI_delayer + 0xc85b + + + + SFRA_GUI_sendTaskPtr + 0xc853 + + + + SFRA_GUI_getCmdByte + 0x82269 + + + + SFRA_GUI_echoCmdByte + 0x822ab + + + + SFRA_GUI_sendData + 0x82448 + + + + SFRA_GUI_cmdPacket + 0xc952 + + + + SFRA_GUI_rxWord + 0xc855 + + + + SFRA_GUI_led_flag + 0xc85f + + + + SFRA_GUI_memGetAmount + 0xc85d + + + + SFRA_GUI_arrayGetList + 0xc872 + + + + SFRA_GUI_echoSizeByte + 0x822e5 + + + + SFRA_GUI_setData32 + 0x82414 + + + + SFRA_GUI_dataOut32 + 0xc866 + + + + SFRA_GUI_memGetAddress + 0xc86c + + + + SFRA_GUI_getDataByte + 0x822ff + + + + SFRA_GUI_dataOut16 + 0xc859 + + + + SFRA_GUI_getSizeByte + 0x822c5 + + + + SFRA_GUI_echoDataByte + 0x8231f + + + + SFRA_GUI_packWord + 0x82332 + + + + SFRA_GUI_setText + 0x823a6 + + + + SFRA_GUI_sweep_start + 0xc861 + + + + SFRA_GUI_setSlider + 0x823cc + + + + SFRA_GUI_lifePulseTsk + 0x82370 + + + + SFRA_GUI_rcvTskPtrShdw + 0xc85a + + + + SFRA_GUI_numWords + 0xc857 + + + + SFRA_GUI_varSetSldrList + 0xc912 + + + + SFRA_GUI_spareTsk08 + 0x82443 + + + + SFRA_GUI_wordsLeftToGet + 0xc858 + + + + SFRA_GUI_serialCommsTimer + 0xc851 + + + + SFRA_GUI_dataSetList + 0xc8b2 + + + + SFRA_GUI_temp + 0xc870 + + + + SFRA_GUI_sci_base_addr + 0xc864 + + + + SFRA_GUI_varSetTxtList + 0xc932 + + + + SFRA_GUI_memSetValue + 0xc86e + + + + SFRA_GUI_memSetPtr + 0xc85e + + + + SFRA_GUI_memGetPtr + 0xc85c + + + + SFRA_GUI_taskDoneFlag + 0xc856 + + + + SFRA_GUI_cmdDispatcher + 0xc892 + + + + SFRA_GUI_getArray + 0x823e2 + + + + SFRA_GUI_setButton + 0x823b9 + + + + code_start + 0x80000 + + + + Device_enableAllPeripherals + 0x8261d + + + + Device_initGPIO + 0x82708 + + + + Example_Fail + 0xa836 + + + + Example_setResultFail + 0x82926 + + + + Device_bootCPU2 + 0x827a0 + + + + Device_init + 0x825c8 + + + + Example_Result + 0xa832 + + + + Device_enableUnbondedGPIOPullups + 0x82759 + + + + __error__ + 0x8291a + + + + Example_setResultPass + 0x82921 + + + + Device_configureTMXAnalogTrim + 0x8276f + + + + Device_enableUnbondedGPIOPullupsFor176Pin + 0x82729 + + + + Example_done + 0x8292b + + + + Example_PassCount + 0xa834 + + + + Device_enableUnbondedGPIOPullupsFor100Pin + 0x8273c + + + + CPUTimer_setEmulationMode + 0x83e3a + + + + Flash_initModule + 0x8000 + + + + GPIO_setQualificationMode + 0x83b0a + + + + GPIO_setPadConfig + 0x83867 + + + + GPIO_setDirectionMode + 0x83b78 + + + + GPIO_setPinConfig + 0x83ad3 + + + + GPIO_setControllerCore + 0x83a9c + + + + Interrupt_defaultHandler + 0x83e10 + + + + Interrupt_initModule + 0x83a5f + + + + Interrupt_nmiHandler + 0x83f25 + + + + Interrupt_enable + 0x83b41 + + + + Interrupt_initVectorTable + 0x83d2e + + + + Interrupt_illegalOperationHandler + 0x83f1b + + + + SCI_clearInterruptStatus + 0x83998 + + + + SCI_setConfig + 0x83a21 + + + + SCI_enableInterrupt + 0x839dd + + + + SysCtl_delay + 0x8124 + + + + SysCtl_getDeviceParametric + 0x83736 + + + + SysCtl_selectXTAL + 0x8361e + + + + SysCtl_selectOscSource + 0x8390a + + + + SysCtl_getLowSpeedClock + 0x83d81 + + + + SysCtl_setClock + 0x82e27 + + + + SysCtl_getClock + 0x838b9 + + + + SFRA_F32_runBackgroundTask + 0x83030 + + + + __SFRA_F32_collect + 0x8379e + + + + _SFRA_F32_state + 0x2 + + + + SFRA_F32_updateInjectionAmplitude + 0x8322a + + + + SFRA_F32_resetFreqRespArray + 0x83232 + + + + _SFRA_F32_yCosSum + 0xe + + + + _SFRA_F32_ySinSum + 0xc + + + + _SFRA_F32_pointerStart + 0x10 + + + + _SFRA_F32_step + 0x18 + + + + _SFRA_F32_preCount + 0x1c + + + + _SFRA_F32_scalar + 0x16 + + + + _SFRA_F32_pointer + 0x1a + + + + SFRA_F32_config + 0x8338e + + + + _SFRA_F32_reference + 0x12 + + + + _SFRA_F32_windowSamples + 0x20 + + + + _SFRA_F32_amplitude + 0x14 + + + + SFRA_F32_initFreqArrayWithLogSteps + 0x83364 + + + + SFRA_F32_reset + 0x8333b + + + + _SFRA_F32_uCosSum + 0xa + + + + _SFRA_F32_uSinSum + 0x8 + + + + _SFRA_F32_rCosSum + 0x6 + + + + _SFRA_F32_rSinSum + 0x4 + + + + _SFRA_F32_count + 0x1e + + + + _SFRA_F32_stateSlew + 0x3 + + + + _SFRA_F32_angle + 0x22 + + + + __SFRA_F32_inject + 0x83cc9 + + + + logf + 0x833ec + + + + tanf + 0x83805 + + + + _c_int00 + 0x83df9 + + + + __stack + 0x400 + + + + __c28xabi_divf + 0x836ae + + + + __c28xabi_modull + 0x835bc + + + + __c28xabi_divull + 0x8358d + + + + __c28xabi_divll + 0x83517 + + + + __c28xabi_modll + 0x83553 + + + + __c28xabi_divul + 0x83c1f + + + + __c28xabi_modul + 0x83c26 + + + + __c28xabi_modl + 0x83c11 + + + + __c28xabi_divl + 0x83c02 + + + + __c28xabi_ftoll + 0x83ca3 + + + + memcpy + 0x83cef + + + + _system_pre_init + 0x83f65 + + + + __TI_auto_init_nobinit_nopinit + 0x83bd7 + + + + __TI_zero_init + 0x83f5f + + + + __TI_decompress_none + 0x83f49 + + + + __TI_decompress_lzss + 0x83ba9 + + + + C$$EXIT + 0x83c2c + + + + abort + 0x83c2c + + + + exit + 0x83c2e + + + + __TI_dtors_ptr + 0xa83c + + + + __TI_cleanup_ptr + 0xa83a + + + + __TI_enable_exit_profile_output + 0xa838 + + + + _nop + 0x83f40 + + + + _lock + 0xa83e + + + + _unlock + 0xa840 + + + + _register_lock + 0x83f3c + + + + _register_unlock + 0x83f38 + + + + _args_main + 0x83e96 + + + + memset + 0x83f58 + + + + errno + 0xa842 + + + + _system_post_cinit + 0x83f67 + + + + Link successful + diff --git a/28379d_P_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk b/28379d_P_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk new file mode 100644 index 0000000..a9acbf9 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk @@ -0,0 +1,14 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# Each subdirectory must supply rules for building sources it contributes +LIBSFAR/%.obj: ../LIBSFAR/%.c $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) + @echo 'C2000 Compiler - building file: "$<"' + "C:/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 --fp_mode=relaxed --include_path="C:/Users/zxc/workspace_ccstheia/28379d_PP_SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_PP_SFRA/LIBSFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_PP_SFRA/SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_PP_SFRA/device" --include_path="C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/" --include_path="C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=_FLASH --define=CPU1 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="LIBSFAR/$(basename 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%0A6ve>nmBE_( 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 D5h{RX literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.d b/28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.d new file mode 100644 index 0000000..88b2dde --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.d @@ -0,0 +1,291 @@ +# FIXED + +SFRA/sfra_gui_scicomms_driverlib.obj: ../SFRA/sfra_gui_scicomms_driverlib.c +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/driverlib.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h +SFRA/sfra_gui_scicomms_driverlib.obj: syscfg/clocktree.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h +SFRA/sfra_gui_scicomms_driverlib.obj: ../SFRA/sfra_gui_scicomms_driverlib.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h +SFRA/sfra_gui_scicomms_driverlib.obj: ../SFRA/sfra_f32.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h +SFRA/sfra_gui_scicomms_driverlib.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h + +../SFRA/sfra_gui_scicomms_driverlib.c: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h: + +syscfg/clocktree.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + +../SFRA/sfra_gui_scicomms_driverlib.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h: + +../SFRA/sfra_f32.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h: + diff --git a/28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.obj b/28379d_P_SFRA/CPU1_FLASH/SFRA/sfra_gui_scicomms_driverlib.obj new file mode 100644 index 0000000000000000000000000000000000000000..4df6c1a7a580b72d637002d762690d0acd64cebb GIT binary patch literal 91596 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 J_&$`4<)6CJ^Fsgt literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/device/device.d b/28379d_P_SFRA/CPU1_FLASH/device/device.d new file mode 100644 index 0000000..0a3de25 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/device/device.d @@ -0,0 +1,273 @@ +# FIXED + +device/device.obj: ../device/device.c +device/device.obj: ../device/device.h +device/device.obj: ../device/driverlib.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +device/device.obj: syscfg/clocktree.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h + +../device/device.c: + +../device/device.h: + +../device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +syscfg/clocktree.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + diff --git a/28379d_P_SFRA/CPU1_FLASH/device/device.obj b/28379d_P_SFRA/CPU1_FLASH/device/device.obj new file mode 100644 index 0000000000000000000000000000000000000000..6455ea1007cbfe67e97f4cf780f291a313ce921d GIT binary patch literal 28428 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 R0dtvn5)Hw+H-Xe-_g~wOqXqx~ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/device/subdir_rules.mk b/28379d_P_SFRA/CPU1_FLASH/device/subdir_rules.mk new file mode 100644 index 0000000..6116852 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/device/subdir_rules.mk @@ -0,0 +1,20 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# 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: "$<"' + "C:/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 --fp_mode=relaxed --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device" --include_path="C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/" --include_path="C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=_FLASH --define=CPU1 --define=_LAUNCHXL_F28379D --c99 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="device/$(basename $(6~1?7*B*Oq*N;t8rzuRSO%u}0?m9_h$A#G4Hjaf;ta_7_YNgHW?$|r( zdS{uLb)5iCp!Dr3sH&Yqxbs+v}5e}n=eNQD$6B=Q6CiV6r-MLbj?^+%yX1ar=v zJ2Q8t8wvP<#Fb{wJ>U86xsP-1%D*-Wlb$8j%(X z%qnr)JqMp-GYnnT7BEWa90+ zp07li!8mx6PBIcUdG>?HlhX3tY1Xo#JAz96WdS z(!#)JqYdg-V~I#faq+&P_x*PKPx+rkiGgRYMJM@GIF{WfQq_uiVK~|Xi7I0!l4MuN zes|M_i#zVfbVb<_|GZhJxawygynX&he|f1HZMImqbcj!a+#GiB=<@eha!)?CC(5i^ zt#aKUiG-L~pFaK0#kYR_-ru5BHu8{v9=?FFJh56S z-f!9WIZeG{lqwa+tr@0X92?)YccNOFFD)Fnd%BpPKb$Kan44ZWND8xR;n2dav21=U zo6V{-yVQIpzhj4*x2ndH(NO2}>dM$2Etk`>+FW4)@aA#bT&lV1w#s%jH!*SR&arH6 zTrC)@x}(lE9M^6w8x0rh70Yf~w(c5LLS<*s)=Or?bV)~|D^xt()t&oFcB=ulZe|Mr z`F2aUtGuDSCTP+f#)=7ZWIlUo9~E`cI5R){Inql zv$U-tMn7UyT+1%#7)&aCGuB45k`q@A90qUj|000Wmthi^ayVo*<_JHQ(dAth*ub2e+5X^YnZ1kc42n!|oeHpfK zGO%$nAKf^a$i~T3S;}#t)zAg(Jl8C;-E&m8jnb{9Y_^om!M|9w%@xD0o8{snx>>CX z2%L*v>iJ&&lVODWH{%?4DvL{*GVT)3m8KQFEo3;Zhv3BLV5kXlBhH!9f8G{dgfN0Q zBa)QZpURWhB$Mg&^(WRJU7t&)4kfz=lBqX4Bnm!m07`fE++6AMzUx&_Nn$OzDuUAj({%(7{7f%EMEsN2XFwP4$AaN4`R# zhXMN7)G!WU1e8?jGuZPaRDm!}`!|pF;b{Ly2j^DkiiHCf(J#12e%TBa&yI)8MbLsh zI*l0*+kjW-P1#Hf|arHRlRHy3Uen3+CjT%kLL{Zpn%_?B&7E@ zaNn^d04YH-_;n=7po{U8B{`-ih>ApBWVrHGUjZq@3n!{~vTM?($dW=Pe1-A5$V^0+ zV)kxQh}e5#_7o{a?7hT0;XF{5`pBAK?}z1CkLgdx^cQ3L>oNU@G5x1p$FL5<`u#Fy zM>P#G#K@$FaNB|0LFWr=c%)&`@c>MN6Fl|O1CYKTSpvXcgHML1EjvSjh$$h1 z@@*tRelxs>@KrNQMYmunz{{vdH+_-tcg zn#+)d_^^}#-_P+p$B%Hl#_>AGAL95k9Dk1E-{Sa>InKrp{@>;JUpfAFlz{i)_@G}E zB`oL&O2DT%zQFOL95*@sMUJ23_!*AB!tvKQ{sWHxoa2`{{sG53A-LFY3MKS=6G|A* z9*$3N{9caNIo{;>*Es$($Io#59LL|}_*)#m1?SyGNERi;kHtSpNPkR+;a#op=jTX% zWG+WE*I0FlRyE44C3s9NT7JE5HVnTGFTmwM(aUAqSn*Bn@uuPU3cMlxs&4CzrO?uB zl^fv0A<;)-_y`bQAMCLqJQvzNIRw6Ua7J0;^CLRP$bkQg3I7{&ER_ngrE<%xS4+C< z+Ge@s;z~HjmtDO~G~1~2RWHmUShnh#UN?21pven`xBQ{*jWpExG(v#KC3X4c`c>c|SiF;dtU_n}^>6;xgoQ zyx=|Lw?SJD@|>M_F=CweXEhamD^hEK%nz(XAU`8kgIcVavjc-L_r%#W3J zymjE=1IWWWPwe*}z&iyKK%T!2$a_1+`x4wc$iWZoSWvzPpXhI0;6arY@5=dW_Z_kj0)j06<2GsZgyo$W<~P*D9B Dx!x_# literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/makefile b/28379d_P_SFRA/CPU1_FLASH/makefile new file mode 100644 index 0000000..0d33c91 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/makefile @@ -0,0 +1,160 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +CG_TOOL_ROOT := C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS + +GEN_OPTS__FLAG := --cmd_file="syscfg/board.opt" --cmd_file="syscfg/c2000ware_libraries.opt" +GEN_CMDS__FLAG := + +ORDERED_OBJS += \ +"./syscfg/board.obj" \ +"./syscfg/c2000ware_libraries.obj" \ +"./main.obj" \ +"./sfra_test.obj" \ +"./SFRA/sfra_f32.obj" \ +"./SFRA/sfra_gui_scicomms_driverlib.obj" \ +"./device/F2837xD_CodeStartBranch.obj" \ +"./device/device.obj" \ +"../2837xD_FLASH_lnk_cpu1.cmd" \ +"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib" \ +$(GEN_CMDS__FLAG) \ +-llibc.a \ +-l"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_f32_tmu_eabi.lib" \ + +-include ../makefile.init + +RM := DEL /F +RMDIR := RMDIR /S/Q + +# All of the sources participating in the build are defined here +-include sources.mk +-include subdir_vars.mk +-include SFRA/subdir_vars.mk +-include device/subdir_vars.mk +-include subdir_rules.mk +-include SFRA/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 += \ +28379d_P_SFRA.out + +EXE_OUTPUTS__QUOTED += \ +"28379d_P_SFRA.out" + + +# All Target +all: $(OBJS) $(CMD_SRCS) $(LIB_SRCS) $(GEN_CMDS) + @$(MAKE) --no-print-directory -Onone "28379d_P_SFRA.out" + +# Tool invocations +28379d_P_SFRA.out: $(OBJS) $(CMD_SRCS) $(LIB_SRCS) $(GEN_CMDS) + @echo 'C2000 Linker - building target: "$@"' + "C:/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 --fp_mode=relaxed --define=DEBUG --define=_FLASH --define=CPU1 --define=_LAUNCHXL_F28379D --c99 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi -z -m"28379d_P_SFRA.map" --stack_size=0x100 --warn_sections -i"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib" -i"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --reread_libs --diag_wrap=off --display_error_number --xml_link_info="28379d_P_SFRA_linkInfo.xml" --entry_point=code_start --rom_model -o "28379d_P_SFRA.out" $(ORDERED_OBJS) + @echo 'Finished building target: "$@"' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(GEN_MISC_FILES__QUOTED)$(GEN_FILES__QUOTED)$(EXE_OUTPUTS__QUOTED) + -$(RM) "syscfg\board.obj" "syscfg\c2000ware_libraries.obj" "main.obj" "sfra_test.obj" "SFRA\sfra_f32.obj" "SFRA\sfra_gui_scicomms_driverlib.obj" "device\F2837xD_CodeStartBranch.obj" "device\device.obj" + -$(RM) "syscfg\board.d" "syscfg\c2000ware_libraries.d" "main.d" "sfra_test.d" "SFRA\sfra_f32.d" "SFRA\sfra_gui_scicomms_driverlib.d" "device\device.d" + -$(RM) "device\F2837xD_CodeStartBranch.d" + -$(RMDIR) $(GEN_MISC_DIRS__QUOTED) + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include ../makefile.targets + diff --git a/28379d_P_SFRA/CPU1_FLASH/objects.mk b/28379d_P_SFRA/CPU1_FLASH/objects.mk new file mode 100644 index 0000000..cc72fbb --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -llibc.a -l"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_f32_tmu_eabi.lib" + diff --git a/28379d_P_SFRA/CPU1_FLASH/sfra-test.d b/28379d_P_SFRA/CPU1_FLASH/sfra-test.d new file mode 100644 index 0000000..38ac37d --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/sfra-test.d @@ -0,0 +1,300 @@ +# FIXED + +sfra-test.obj: ../sfra-test.c +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_f32.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/driverlib.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/device.h +sfra-test.obj: syscfg/board.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/device.h +sfra-test.obj: ../filter_rc.h +sfra-test.obj: ../lowpass.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_gui_scicomms_driverlib.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/device.h + +../sfra-test.c: + +C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_f32.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/device.h: + +syscfg/board.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/device.h: + +../filter_rc.h: + +../lowpass.h: + +C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_gui_scicomms_driverlib.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/device.h: + diff --git a/28379d_P_SFRA/CPU1_FLASH/sfra_test.d b/28379d_P_SFRA/CPU1_FLASH/sfra_test.d new file mode 100644 index 0000000..70584bd --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/sfra_test.d @@ -0,0 +1,309 @@ +# FIXED + +sfra_test.obj: ../sfra_test.c +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_f32.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h +sfra_test.obj: ../sfra_test.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/driverlib.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h +sfra_test.obj: syscfg/clocktree.h +sfra_test.obj: syscfg/board.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h +sfra_test.obj: ../lowpass.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdio.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdarg.h + +../sfra_test.c: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_f32.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h: + +../sfra_test.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h: + +syscfg/clocktree.h: + +syscfg/board.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h: + +../lowpass.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdio.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdarg.h: + diff --git a/28379d_P_SFRA/CPU1_FLASH/sfra_test.obj b/28379d_P_SFRA/CPU1_FLASH/sfra_test.obj new file mode 100644 index 0000000000000000000000000000000000000000..3dea1f010d23ff5d2ea9bb3bf43fbe1ff2b418ff GIT binary patch literal 67532 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/sources.mk b/28379d_P_SFRA/CPU1_FLASH/sources.mk new file mode 100644 index 0000000..56e7ea4 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/sources.mk @@ -0,0 +1,124 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C55_SRCS := +A_SRCS := +ASM_UPPER_SRCS := +PINMUX_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 := +SYSCFG_SRCS := +K_SRCS := +CLA_SRCS := +S55_SRCS := +LD_UPPER_SRCS := +OUT_SRCS := +LIB_SRCS := +ASM_SRCS := +S_UPPER_SRCS := +SYSCONFIG_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 := +GEN_CMDS := +GEN_FILES := +CLA_DEPS := +S55_DEPS := +SV7A_DEPS := +EXE_OUTPUTS := +C62_DEPS := +C67_DEPS := +GEN_MISC_DIRS := +K_DEPS := +C_DEPS := +CC_DEPS := +BIN_OUTPUTS := +GEN_OPTS := +C++_DEPS := +C43_DEPS := +S43_DEPS := +OBJS := +ASM_DEPS := +GEN_MISC_FILES := +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 := +GEN_MISC_DIRS__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 := +GEN_CMDS__QUOTED := +GEN_MISC_FILES__QUOTED := +C62_DEPS__QUOTED := +C_DEPS__QUOTED := +C_UPPER_DEPS__QUOTED := +C43_DEPS__QUOTED := +CPP_DEPS__QUOTED := +BIN_OUTPUTS__QUOTED := +GEN_FILES__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 := +GEN_OPTS__QUOTED := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ +SFRA \ +device \ + diff --git a/28379d_P_SFRA/CPU1_FLASH/subdir_rules.mk b/28379d_P_SFRA/CPU1_FLASH/subdir_rules.mk new file mode 100644 index 0000000..79f6b3e --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/subdir_rules.mk @@ -0,0 +1,39 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# Each subdirectory must supply rules for building sources it contributes +build-1803436276: ../c2000.syscfg + @echo 'SysConfig - building file: "$<"' + "C:/ti/ccs2050/ccs/utils/sysconfig_1.27.0/sysconfig_cli.bat" -s "C:/ti/C2000Ware_6_00_01_00/.metadata/sdk.json" -d "F2837xD" -p "F2837xD_176PTP" -r "F2837xD_176PTP" --script "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/c2000.syscfg" --context "CPU1" -o "syscfg" --compiler ccs + @echo 'Finished building: "$<"' + @echo ' ' + +syscfg/board.c: build-1803436276 ../c2000.syscfg +syscfg/board.h: build-1803436276 +syscfg/board.cmd.genlibs: build-1803436276 +syscfg/board.opt: build-1803436276 +syscfg/board.json: build-1803436276 +syscfg/pinmux.csv: build-1803436276 +syscfg/c2000ware_libraries.cmd.genlibs: build-1803436276 +syscfg/c2000ware_libraries.opt: build-1803436276 +syscfg/c2000ware_libraries.c: build-1803436276 +syscfg/c2000ware_libraries.h: build-1803436276 +syscfg/clocktree.h: build-1803436276 +syscfg: build-1803436276 + +syscfg/%.obj: ./syscfg/%.c $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) + @echo 'C2000 Compiler - building file: "$<"' + "C:/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 --fp_mode=relaxed --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device" --include_path="C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/" --include_path="C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=_FLASH --define=CPU1 --define=_LAUNCHXL_F28379D --c99 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="syscfg/$(basename $( LED_Blue Pinmux + GPIO_setPinConfig(GPIO_31_GPIO31); + // + // SCIA -> mySCI0 Pinmux + // + GPIO_setPinConfig(mySCI0_SCIRX_PIN_CONFIG); + GPIO_setPadConfig(mySCI0_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP); + GPIO_setQualificationMode(mySCI0_SCIRX_GPIO, GPIO_QUAL_ASYNC); + + GPIO_setPinConfig(mySCI0_SCITX_PIN_CONFIG); + GPIO_setPadConfig(mySCI0_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP); + GPIO_setQualificationMode(mySCI0_SCITX_GPIO, GPIO_QUAL_ASYNC); + + +} + +//***************************************************************************** +// +// CPUTIMER Configurations +// +//***************************************************************************** +void CPUTIMER_init(){ + myCPUTIMER0_init(); +} + +void myCPUTIMER0_init(){ + CPUTimer_setEmulationMode(myCPUTIMER0_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT); + CPUTimer_setPreScaler(myCPUTIMER0_BASE, 0U); + CPUTimer_setPeriod(myCPUTIMER0_BASE, 10000U); + CPUTimer_enableInterrupt(myCPUTIMER0_BASE); + CPUTimer_stopTimer(myCPUTIMER0_BASE); + + CPUTimer_reloadTimerCounter(myCPUTIMER0_BASE); +} + +//***************************************************************************** +// +// GPIO Configurations +// +//***************************************************************************** +void GPIO_init(){ + LED_Blue_init(); +} + +void LED_Blue_init(){ + GPIO_setPadConfig(LED_Blue, GPIO_PIN_TYPE_STD); + GPIO_setQualificationMode(LED_Blue, GPIO_QUAL_SYNC); + GPIO_setDirectionMode(LED_Blue, GPIO_DIR_MODE_OUT); + GPIO_setControllerCore(LED_Blue, GPIO_CORE_CPU1); +} + +//***************************************************************************** +// +// INTERRUPT Configurations +// +//***************************************************************************** +void INTERRUPT_init(){ + + // Interrupt Settings for INT_myCPUTIMER0 + // ISR need to be defined for the registered interrupts + Interrupt_register(INT_myCPUTIMER0, &TIMER0_ISR); + Interrupt_enable(INT_myCPUTIMER0); +} +//***************************************************************************** +// +// SCI Configurations +// +//***************************************************************************** +void SCI_init(){ + mySCI0_init(); +} + +void mySCI0_init(){ + SCI_clearInterruptStatus(mySCI0_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY); + SCI_clearOverflowStatus(mySCI0_BASE); + SCI_resetTxFIFO(mySCI0_BASE); + SCI_resetRxFIFO(mySCI0_BASE); + SCI_resetChannels(mySCI0_BASE); + SCI_setConfig(mySCI0_BASE, DEVICE_LSPCLK_FREQ, mySCI0_BAUDRATE, (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE)); + SCI_disableLoopback(mySCI0_BASE); + SCI_performSoftwareReset(mySCI0_BASE); + SCI_enableFIFO(mySCI0_BASE); + SCI_enableModule(mySCI0_BASE); +} + diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs new file mode 100644 index 0000000..4890daf --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs @@ -0,0 +1,20 @@ +/* + * ======== board.cmd.genlibs ======== + * Libraries needed to link this application's configuration + * + * NOTE, this feature requires software components configured in your + * system to correctly indicate their dependencies and report the + * libraries needed for your specific configuration. If you find + * errors, please report them on TI's E2E forums + * (https://e2e.ti.com/) so they can be addressed in a future + * release. + * + * This file allows one to portably link applications that use SysConfig + * _without_ having to make changes to build rules when moving to a new + * device OR when upgrading to a new version of a SysConfig enabled + * product. + * + * DO NOT EDIT - This file is generated by the SysConfig tool for the + * TI C/C++ toolchain + */ + diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/board.d b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.d new file mode 100644 index 0000000..137760c --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.d @@ -0,0 +1,276 @@ +# FIXED + +syscfg/board.obj: syscfg/board.c +syscfg/board.obj: syscfg/board.h +syscfg/board.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/driverlib.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +syscfg/board.obj: C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h +syscfg/board.obj: syscfg/clocktree.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h + +syscfg/board.c: + +syscfg/board.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.h: + +syscfg/clocktree.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/board.h b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.h new file mode 100644 index 0000000..d99c630 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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 BOARD_H +#define BOARD_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +// +// Included Files +// + +#include "driverlib.h" +#include "device.h" + +//***************************************************************************** +// +// PinMux Configurations +// +//***************************************************************************** +// +// GPIO31 - GPIO Settings +// +#define LED_Blue_GPIO_PIN_CONFIG GPIO_31_GPIO31 + +// +// SCIA -> mySCI0 Pinmux +// +// +// SCIRXDA - GPIO Settings +// +#define GPIO_PIN_SCIRXDA 43 +#define mySCI0_SCIRX_GPIO 43 +#define mySCI0_SCIRX_PIN_CONFIG GPIO_43_SCIRXDA +// +// SCITXDA - GPIO Settings +// +#define GPIO_PIN_SCITXDA 42 +#define mySCI0_SCITX_GPIO 42 +#define mySCI0_SCITX_PIN_CONFIG GPIO_42_SCITXDA + +//***************************************************************************** +// +// CPUTIMER Configurations +// +//***************************************************************************** +#define myCPUTIMER0_BASE CPUTIMER0_BASE +void myCPUTIMER0_init(); + +//***************************************************************************** +// +// GPIO Configurations +// +//***************************************************************************** +#define LED_Blue 31 +void LED_Blue_init(); + +//***************************************************************************** +// +// INTERRUPT Configurations +// +//***************************************************************************** + +// Interrupt Settings for INT_myCPUTIMER0 +// ISR need to be defined for the registered interrupts +#define INT_myCPUTIMER0 INT_TIMER0 +#define INT_myCPUTIMER0_INTERRUPT_ACK_GROUP INTERRUPT_ACK_GROUP1 +extern __interrupt void TIMER0_ISR(void); + +//***************************************************************************** +// +// SCI Configurations +// +//***************************************************************************** +#define mySCI0_BASE SCIA_BASE +#define mySCI0_BAUDRATE 115200 +#define mySCI0_CONFIG_WLEN SCI_CONFIG_WLEN_8 +#define mySCI0_CONFIG_STOP SCI_CONFIG_STOP_ONE +#define mySCI0_CONFIG_PAR SCI_CONFIG_PAR_NONE +void mySCI0_init(); + +//***************************************************************************** +// +// Board Configurations +// +//***************************************************************************** +void Board_init(); +void CPUTIMER_init(); +void GPIO_init(); +void INTERRUPT_init(); +void SCI_init(); +void PinMux_init(); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // end of BOARD_H definition diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/board.json b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.json new file mode 100644 index 0000000..4490047 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.json @@ -0,0 +1,8 @@ +{ + "interruptInfo" : [ + { + "interruptName": "INT_myCPUTIMER0", + "interruptHandler": "TIMER0_ISR" + } + ] +} diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/board.obj b/28379d_P_SFRA/CPU1_FLASH/syscfg/board.obj new file mode 100644 index 0000000000000000000000000000000000000000..64cdd00d643bb11bf79a0266733e8e1e22ce7a3b GIT binary patch literal 19916 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
gJj>mINdNUd4GA?JllJR-Q*BIYobYl}m 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 LP0)c3o1pm@9d1(^ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.opt b/28379d_P_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.opt new file mode 100644 index 0000000..e69de29 diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/clocktree.h b/28379d_P_SFRA/CPU1_FLASH/syscfg/clocktree.h new file mode 100644 index 0000000..3ab7cfd --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/syscfg/clocktree.h @@ -0,0 +1,208 @@ +//############################################################################# +// +// FILE: clockTree.h +// +// TITLE: Setups device clocking for examples. +// +//############################################################################# +// $Copyright: +// Copyright (C) 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 CLOCKTREE_H +#define CLOCKTREE_H + +//***************************************************************************** +// +// Summary of SYSPLL related clock configuration +// +//***************************************************************************** +// +// Input Clock to SYSPLL (OSCCLK) = 10 MHz (INTOSC1 provides OSCCLK) +// +//##### SYSPLL ENABLED ##### +// +// PLLRAWCLK = 400 MHz (Output of SYSPLL if enabled) +// PLLSYSCLK = 200 MHz +// CPU1CLK = 200 MHz +// CPU2CLK = 200 MHz +// CPU1_SYSCLK = 200 MHz +// CPU2_SYSCLK = 200 MHz +// LSPCLK = 50 MHz +// EPWMCLK = 100 MHz + +//***************************************************************************** +// +// Macro definitions used in device.c (SYSPLL / LSPCLK) +// +//***************************************************************************** +// +// Input Clock to SYSPLL (OSCCLK) = INTOSC1 = 10 MHz +// +#define DEVICE_OSCSRC_FREQ 10000000U +// +// Define to pass to SysCtl_setClock(). Will configure the clock as follows: +// SYSPLL ENABLED +// SYSCLK = 200 MHz = 10 MHz (OSCCLK) * (40 (IMULT) + 0 (FMULT)) / 2 (SYSCLKDIVSEL) +#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * (40 + 0)) / 2) +// +#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_OSC1 | SYSCTL_IMULT(40) | \ + SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2)| \ + SYSCTL_PLL_ENABLE) + +// +// Define to pass to SysCtl_setLowSpeedClock(). +// Low Speed Clock (LSPCLK) = 200 MHz / 4 = 50 MHz +// +#define DEVICE_LSPCLK_CFG SYSCTL_LSPCLK_PRESCALE_4 + +#define DEVICE_LSPCLK_FREQ (DEVICE_SYSCLK_FREQ / 4) + +//***************************************************************************** +// +// Summary of AUXPLL related clock configuration +// +//***************************************************************************** +// +// Input Clock to AUXOSCCLK = 10 MHz (XTAL provides AUXOSCCLK) +// +//##### AUXPLL DISABLED ##### +// +// AUXPLLRAWCLK = 200 MHz (Output of AUXPLL if enabled) +// AUXPLLCLK = 5 MHz +// +//***************************************************************************** +// +// Macro definitions used in device.c (AUXPLL) +// +//***************************************************************************** +// +// Input Clock to AUXPLL (AUXOSCCLK) = XTAL = 10 MHz +// +#define DEVICE_AUXOSCSRC_FREQ 10000000U +// +// Define to pass to SysCtl_setAuxClock(). Will configure the clock as follows: +// AUXPLL DISABLED +// AUXPLLCLK = 5 MHz = 10 MHz (XTAL) / 2 (AUXCLKDIVSEL) +#define DEVICE_AUXCLK_FREQ (DEVICE_AUXOSCSRC_FREQ / 2) +// +#define DEVICE_SETAUXCLOCK_CFG (SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(20) | \ + SYSCTL_AUXPLL_FMULT_NONE | SYSCTL_AUXPLL_DIV_2 | \ + SYSCTL_AUXPLL_DISABLE) + + +//***************************************************************************** +// +// CPU1CLK / CPU2CLK Domain (200 MHz) +// +//***************************************************************************** +// VCU +// TMU +// FPU +// Flash +// BOOTROM +// Mx/DxRAM +// + +//***************************************************************************** +// +// CPU1 SYSCLK Domain (200 MHz) +// +//***************************************************************************** +// EPIE +// LSxRAMs +// CLAMessageRAM +// DCSM +// + +///////////////////// +// Gated CPU1 SYSCLK +///////////////////// +// CPU1_CLA1 +// CPU1_DMA +// CPU1_Timer +// EMIF2 +// uPP +// + +//***************************************************************************** +// +// CPU2 SYSCLK Domain (200 MHz) +// +//***************************************************************************** +// EPIE +// LSxRAMs +// CLAMessageRAM +// DCSM +// + +///////////////////// +// Gated CPU2 SYSCLK +///////////////////// +// CPU2_CLA1 +// CPU2_DMA +// CPU2_Timer +// +//***************************************************************************** +// +// Gated Peripheral EPWM Domain (100 MHz) +// +//***************************************************************************** +// EPWM +// HRPWM +// +//***************************************************************************** +// +// Gated Peripheral SYSCLK Domain (200 MHz) +// +//***************************************************************************** +// ADC +// CMPSS +// DAC +// EPWM +// ECAP +// EQEP +// I2C +// SDFM +// EMIF +// +//***************************************************************************** +// +// Gated LSPCLK Domain (50 MHz) +// +//***************************************************************************** +// SCI +// SPI +// McBSP + +#endif // CLOCKTREE_H + diff --git a/28379d_P_SFRA/CPU1_FLASH/syscfg/pinmux.csv b/28379d_P_SFRA/CPU1_FLASH/syscfg/pinmux.csv new file mode 100644 index 0000000..cb51190 --- /dev/null +++ b/28379d_P_SFRA/CPU1_FLASH/syscfg/pinmux.csv @@ -0,0 +1,211 @@ +All device pins and their pinmux options +Pin,Name, Selected Mode, Used By,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 +1,GPIO10,,,GPIO10,EPWM6A,CANRXB,ADCSOCBO,GPIO10,EQEP1A,SCITXDB,,GPIO10,,,,GPIO10,,,UPP-WAIT +2,GPIO11,,,GPIO11,EPWM6B,SCIRXDB,OUTPUTXBAR7,GPIO11,EQEP1B,SCIRXDB,,GPIO11,,,,GPIO11,,,UPP-STRT +3,VDDIO,VDDIO +,VDDIO +4,GPIO12,,,GPIO12,EPWM7A,CANTXB,MDXB,GPIO12,EQEP1S,SCITXDC,,GPIO12,,,,GPIO12,,,UPP-ENA +5,GPIO13,,,GPIO13,EPWM7B,CANRXB,MDRB,GPIO13,EQEP1I,SCIRXDC,,GPIO13,,,,GPIO13,,,UPP-D7 +6,GPIO14,,,GPIO14,EPWM8A,SCITXDB,MCLKXB,GPIO14,,OUTPUTXBAR3,,GPIO14,,,,GPIO14,,,UPP-D6 +7,GPIO15,,,GPIO15,EPWM8B,SCIRXDB,MFSXB,GPIO15,,OUTPUTXBAR4,,GPIO15,,,,GPIO15,,,UPP-D5 +8,GPIO16,,,GPIO16,SPISIMOA,CANTXB,OUTPUTXBAR7,GPIO16,EPWM9A,,SD1_D1,GPIO16,,,,GPIO16,,,UPP-D4 +9,GPIO17,,,GPIO17,SPISOMIA,CANRXB,OUTPUTXBAR8,GPIO17,EPWM9B,,SD1_C1,GPIO17,,,,GPIO17,,,UPP-D3 +10,GPIO18,,,GPIO18,SPICLKA,SCITXDB,CANRXA,GPIO18,EPWM10A,,SD1_D2,GPIO18,,,,GPIO18,,,UPP-D2 +11,VDDIO,VDDIO +,VDDIO +12,GPIO19,,,GPIO19,SPISTEA,SCIRXDB,CANTXA,GPIO19,EPWM10B,,SD1_C2,GPIO19,,,,GPIO19,,,UPP-D1 +13,GPIO20,,,GPIO20,EQEP1A,MDXA,CANTXB,GPIO20,EPWM11A,,SD1_D3,GPIO20,,,,GPIO20,,,UPP-D0 +14,GPIO21,,,GPIO21,EQEP1B,MDRA,CANRXB,GPIO21,EPWM11B,,SD1_C3,GPIO21,,,,GPIO21,,,UPP-CLK +15,VDDIO,VDDIO +,VDDIO +16,VDD,VDD +,VDD +17,GPIO99,,,GPIO99,,,EM2A1,GPIO99,EQEP1I,,,GPIO99,,,,GPIO99,,, +18,GPIO8,,,GPIO8,EPWM5A,CANTXB,ADCSOCAO,GPIO8,EQEP3S,SCITXDA,,GPIO8,,,,GPIO8,,, +19,GPIO9,,,GPIO9,EPWM5B,SCITXDB,OUTPUTXBAR6,GPIO9,EQEP3I,SCIRXDA,,GPIO9,,,,GPIO9,,, +20,VDDIO,VDDIO +,VDDIO +21,VDD,VDD +,VDD +22,GPIO22,,,GPIO22,EQEP1S,MCLKXA,SCITXDB,GPIO22,EPWM12A,SPICLKB,SD1_D4,GPIO22,,,,GPIO22,,, +23,GPIO23,,,GPIO23,EQEP1I,MFSXA,SCIRXDB,GPIO23,EPWM12B,SPISTEB,SD1_C4,GPIO23,,,,GPIO23,,, +24,GPIO24,,,GPIO24,OUTPUTXBAR1,EQEP2A,MDXB,GPIO24,,SPISIMOB,SD2_D1,GPIO24,,,,GPIO24,,, +25,GPIO25,,,GPIO25,OUTPUTXBAR2,EQEP2B,MDRB,GPIO25,,SPISOMIB,SD2_C1,GPIO25,,,,GPIO25,,, +26,VDDIO,VDDIO +,VDDIO +27,GPIO26,,,GPIO26,OUTPUTXBAR3,EQEP2I,MCLKXB,GPIO26,OUTPUTXBAR3,SPICLKB,SD2_D2,GPIO26,,,,GPIO26,,, +28,GPIO27,,,GPIO27,OUTPUTXBAR4,EQEP2S,MFSXB,GPIO27,OUTPUTXBAR4,SPISTEB,SD2_C2,GPIO27,,,,GPIO27,,, +29,ADCINC4,ADCINC4,ADCINC4 +30,ADCINC3,ADCINC3,ADCINC3 +31,ADCINC2,ADCINC2,ADCINC2 +32,ADCINC1,ADCINC1,ADCINC1 +33,ADCINC0,ADCINC0,ADCINC0 +34,VSSA,VSSA +,VSSA +35,VREFHIC,VREFHIC,VREFHIC +36,VDDA,VDDA +,VDDA +37,VREFHIA,VREFHIA,VREFHIA +38,ADCINA5,ADCINA5,ADCINA5 +39,ADCINA4,ADCINA4,ADCINA4 +40,ADCINA3,ADCINA3,ADCINA3 +41,ADCINA2,ADCINA2,ADCINA2 +42,ADCINA1,ADCINA1,ADCINA1 +43,ADCINA0,ADCINA0,ADCINA0 +44,ADCIN14,ADCIN14,ADCIN14 +45,ADCIN15,ADCIN15,ADCIN15 +46,ADCINB0,ADCINB0,ADCINB0 +47,ADCINB1,ADCINB1,ADCINB1 +48,ADCINB2,ADCINB2,ADCINB2 +49,ADCINB3,ADCINB3,ADCINB3 +50,VREFLOB,VREFLOB,VREFLOB +51,VREFLOD,VREFLOD,VREFLOD +52,VSSA,VSSA,VSSA +53,VREFHIB,VREFHIB,VREFHIB +54,VDDA,VDDA,VDDA +55,VREFHID,VREFHID,VREFHID +56,ADCIND0,ADCIND0,ADCIND0 +57,ADCIND1,ADCIND1,ADCIND1 +58,ADCIND2,ADCIND2,ADCIND2 +59,ADCIND3,ADCIND3,ADCIND3 +60,ADCIND4,ADCIND4,ADCIND4 +61,VDD,VDD,VDD +62,VDDIO,VDDIO,VDDIO +63,GPIO30,,,GPIO30,CANRXA,EM1CLK,,GPIO30,OUTPUTXBAR7,EQEP3S,SD2_D4,GPIO30,,,,GPIO30,,, +64,GPIO28,,,GPIO28,SCIRXDA,EM1CS4n,,GPIO28,OUTPUTXBAR5,EQEP3A,SD2_D3,GPIO28,,,,GPIO28,,, +65,GPIO29,,,GPIO29,SCITXDA,EM1SDCKE,,GPIO29,OUTPUTXBAR6,EQEP3B,SD2_C3,GPIO29,,,,GPIO29,,, +66,GPIO31,GPIO31,LED_Blue,GPIO31,CANTXA,EM1WEn,,GPIO31,OUTPUTXBAR8,EQEP3I,SD2_C4,GPIO31,,,,GPIO31,,, +67,GPIO32,,,GPIO32,SDAA,EM1CS0n,,GPIO32,,,,GPIO32,,,,GPIO32,,, +68,VDDIO,VDDIO +,VDDIO +69,GPIO33,,,GPIO33,SCLA,EM1RNW,,GPIO33,,,,GPIO33,,,,GPIO33,,, +70,GPIO34,,,GPIO34,OUTPUTXBAR1,EM1CS2n,,GPIO34,,SDAB,,GPIO34,,,,GPIO34,,, +71,GPIO35,,,GPIO35,SCIRXDA,EM1CS3n,,GPIO35,,SCLB,,GPIO35,,,,GPIO35,,, +72,VDD3VFL,VDD3VFL,VDD3VFL +73,FLT1,FLT1,FLT1 +74,FLT2,FLT2,FLT2 +75,VDDIO,VDDIO +,VDDIO +76,VDD,VDD +,VDD +77,TDI,TDI,TDI +78,TDO,TDO,TDO +79,TRSTN,TRSTN,TRSTN +80,TMS,TMS,TMS +81,TCK,TCK,TCK +82,VDDIO,VDDIO +,VDDIO +83,GPIO36,,,GPIO36,SCITXDA,EM1WAIT,,GPIO36,,CANRXA,,GPIO36,,,,GPIO36,,, +84,GPIO37,,,GPIO37,OUTPUTXBAR2,EM1OEn,,GPIO37,,CANTXA,,GPIO37,,,,GPIO37,,, +85,GPIO38,,,GPIO38,,EM1A0,,GPIO38,SCITXDC,CANTXB,,GPIO38,,,,GPIO38,,, +86,GPIO39,,,GPIO39,,EM1A1,,GPIO39,SCIRXDC,CANRXB,,GPIO39,,,,GPIO39,,, +87,GPIO40,,,GPIO40,,EM1A2,,GPIO40,,SDAB,,GPIO40,,,,GPIO40,,, +88,VDDIO,VDDIO +,VDDIO +89,GPIO41,,,GPIO41,,EM1A3,,GPIO41,,SCLB,,GPIO41,,,,GPIO41,,, +90,GPIO48,,,GPIO48,OUTPUTXBAR3,EM1A8,,GPIO48,,SCITXDA,SD1_D1,GPIO48,,,,GPIO48,,, +91,VDDIO,VDDIO +,VDDIO +92,ERROR,ERROR,ERROR +93,GPIO49,,,GPIO49,OUTPUTXBAR4,EM1A9,,GPIO49,,SCIRXDA,SD1_C1,GPIO49,,,,GPIO49,,, +94,GPIO50,,,GPIO50,EQEP1A,EM1A10,,GPIO50,,SPISIMOC,SD1_D2,GPIO50,,,,GPIO50,,, +95,GPIO51,,,GPIO51,EQEP1B,EM1A11,,GPIO51,,SPISOMIC,SD1_C2,GPIO51,,,,GPIO51,,, +96,GPIO52,,,GPIO52,EQEP1S,EM1A12,,GPIO52,,SPICLKC,SD1_D3,GPIO52,,,,GPIO52,,, +97,GPIO53,,,GPIO53,EQEP1I,EM1D31,EM2D15,GPIO53,,SPISTEC,SD1_C3,GPIO53,,,,GPIO53,,, +98,GPIO54,,,GPIO54,SPISIMOA,EM1D30,EM2D14,GPIO54,EQEP2A,SCITXDB,SD1_D4,GPIO54,,,,GPIO54,,, +99,VDDIO,VDDIO +,VDDIO +100,GPIO55,,,GPIO55,SPISOMIA,EM1D29,EM2D13,GPIO55,EQEP2B,SCIRXDB,SD1_C4,GPIO55,,,,GPIO55,,, +101,GPIO56,,,GPIO56,SPICLKA,EM1D28,EM2D12,GPIO56,EQEP2S,SCITXDC,SD2_D1,GPIO56,,,,GPIO56,,, +102,GPIO57,,,GPIO57,SPISTEA,EM1D27,EM2D11,GPIO57,EQEP2I,SCIRXDC,SD2_C1,GPIO57,,,,GPIO57,,, +103,GPIO58,,,GPIO58,MCLKRA,EM1D26,EM2D10,GPIO58,OUTPUTXBAR1,SPICLKB,SD2_D2,GPIO58,,,,GPIO58,,,SPISIMOA +104,GPIO59,,,GPIO59,MFSRA,EM1D25,EM2D9,GPIO59,OUTPUTXBAR2,SPISTEB,SD2_C2,GPIO59,,,,GPIO59,,,SPISOMIA +105,GPIO60,,,GPIO60,MCLKRB,EM1D24,EM2D8,GPIO60,OUTPUTXBAR3,SPISIMOB,SD2_D3,GPIO60,,,,GPIO60,,,SPICLKA +106,VDDIO,VDDIO +,VDDIO +107,GPIO61,,,GPIO61,MFSRB,EM1D23,EM2D7,GPIO61,OUTPUTXBAR4,SPISOMIB,SD2_C3,GPIO61,,,,GPIO61,,,SPISTEA +108,GPIO62,,,GPIO62,SCIRXDC,EM1D22,EM2D6,GPIO62,EQEP3A,CANRXA,SD2_D4,GPIO62,,,,GPIO62,,, +109,GPIO63,,,GPIO63,SCITXDC,EM1D21,EM2D5,GPIO63,EQEP3B,CANTXA,SD2_C4,GPIO63,,,,GPIO63,,,SPISIMOB +110,GPIO64,,,GPIO64,,EM1D20,EM2D4,GPIO64,EQEP3S,SCIRXDA,,GPIO64,,,,GPIO64,,,SPISOMIB +111,GPIO65,,,GPIO65,,EM1D19,EM2D3,GPIO65,EQEP3I,SCITXDA,,GPIO65,,,,GPIO65,,,SPICLKB +112,GPIO66,,,GPIO66,,EM1D18,EM2D2,GPIO66,,SDAB,,GPIO66,,,,GPIO66,,,SPISTEB +113,GPIO44,,,GPIO44,,EM1A4,,GPIO44,,,,GPIO44,,,,GPIO44,,, +114,VDDIO,VDDIO +,VDDIO +115,GPIO45,,,GPIO45,,EM1A5,,GPIO45,,,,GPIO45,,,,GPIO45,,, +116,VDDIO,VDDIO +,VDDIO +117,VDD,VDD +,VDD +118,GPIO133,,,GPIO133,,,,GPIO133,,,SD2_C2,GPIO133,,,,GPIO133,,, +119,VREGENZ,VREGENZ,VREGENZ +120,VDDOSC,VDDOSC,VDDOSC +121,X2,X2,X2 +122,VSSOSC,VSSOSC,VSSOSC +123,X1,X1,X1 +124,XRSN,XRSN,XRSN +125,VDDOSC,VDDOSC +,VDDOSC +126,VDD,VDD +,VDD +127,VDDIO,VDDIO +,VDDIO +128,GPIO46,,,GPIO46,,EM1A6,,GPIO46,,SCIRXDD,,GPIO46,,,,GPIO46,,, +129,GPIO47,,,GPIO47,,EM1A7,,GPIO47,,SCITXDD,,GPIO47,,,,GPIO47,,, +130,GPIO42,SCITXDA,mySCI0,GPIO42,,,,GPIO42,,SDAA,,GPIO42,,,,GPIO42,,,SCITXDA +131,GPIO43,SCIRXDA,mySCI0,GPIO43,,,,GPIO43,,SCLA,,GPIO43,,,,GPIO43,,,SCIRXDA +132,GPIO67,,,GPIO67,,EM1D17,EM2D1,GPIO67,,,,GPIO67,,,,GPIO67,,, +133,GPIO68,,,GPIO68,,EM1D16,EM2D0,GPIO68,,,,GPIO68,,,,GPIO68,,, +134,GPIO69,,,GPIO69,,EM1D15,,GPIO69,,SCLB,,GPIO69,,,,GPIO69,,,SPISIMOC +135,GPIO70,,,GPIO70,,EM1D14,,GPIO70,CANRXA,SCITXDB,,GPIO70,,,,GPIO70,,,SPISOMIC +136,GPIO71,,,GPIO71,,EM1D13,,GPIO71,CANTXA,SCIRXDB,,GPIO71,,,,GPIO71,,,SPICLKC +137,VDD,VDD +,VDD +138,VDDIO,VDDIO +,VDDIO +139,GPIO72,,,GPIO72,,EM1D12,,GPIO72,CANTXB,SCITXDC,,GPIO72,,,,GPIO72,,,SPISTEC +140,GPIO73,,,GPIO73,,EM1D11,XCLKOUT,GPIO73,CANRXB,SCIRXDC,,GPIO73,,,,GPIO73,,, +141,GPIO74,,,GPIO74,,EM1D10,,GPIO74,,,,GPIO74,,,,GPIO74,,, +142,GPIO75,,,GPIO75,,EM1D9,,GPIO75,,,,GPIO75,,,,GPIO75,,, +143,GPIO76,,,GPIO76,,EM1D8,,GPIO76,,SCITXDD,,GPIO76,,,,GPIO76,,, +144,GPIO77,,,GPIO77,,EM1D7,,GPIO77,,SCIRXDD,,GPIO77,,,,GPIO77,,, +145,GPIO78,,,GPIO78,,EM1D6,,GPIO78,,EQEP2A,,GPIO78,,,,GPIO78,,, +146,GPIO79,,,GPIO79,,EM1D5,,GPIO79,,EQEP2B,,GPIO79,,,,GPIO79,,, +147,VDDIO,VDDIO +,VDDIO +148,GPIO80,,,GPIO80,,EM1D4,,GPIO80,,EQEP2S,,GPIO80,,,,GPIO80,,, +149,GPIO81,,,GPIO81,,EM1D3,,GPIO81,,EQEP2I,,GPIO81,,,,GPIO81,,, +150,GPIO82,,,GPIO82,,EM1D2,,GPIO82,,,,GPIO82,,,,GPIO82,,, +151,GPIO83,,,GPIO83,,EM1D1,,GPIO83,,,,GPIO83,,,,GPIO83,,, +152,VDDIO,VDDIO +,VDDIO +153,VDD,VDD +,VDD +154,GPIO84,,,GPIO84,,,,GPIO84,SCITXDA,MDXB,,GPIO84,,,,GPIO84,,,MDXA +155,GPIO85,,,GPIO85,,EM1D0,,GPIO85,SCIRXDA,MDRB,,GPIO85,,,,GPIO85,,,MDRA +156,GPIO86,,,GPIO86,,EM1A13,EM1CAS,GPIO86,SCITXDB,MCLKXB,,GPIO86,,,,GPIO86,,,MCLKXA +157,GPIO87,,,GPIO87,,EM1A14,EM1RAS,GPIO87,SCIRXDB,MFSXB,,GPIO87,,,,GPIO87,,,MFSXA +158,VDD,VDD +,VDD +159,VDDIO,VDDIO +,VDDIO +160,GPIO0,,,GPIO0,EPWM1A,,,GPIO0,,SDAA,,GPIO0,,,,GPIO0,,, +161,GPIO1,,,GPIO1,EPWM1B,,MFSRB,GPIO1,,SCLA,,GPIO1,,,,GPIO1,,, +162,GPIO2,,,GPIO2,EPWM2A,,,GPIO2,OUTPUTXBAR1,SDAB,,GPIO2,,,,GPIO2,,, +163,GPIO3,,,GPIO3,EPWM2B,OUTPUTXBAR2,MCLKRB,GPIO3,OUTPUTXBAR2,SCLB,,GPIO3,,,,GPIO3,,, +164,GPIO4,,,GPIO4,EPWM3A,,,GPIO4,OUTPUTXBAR3,CANTXA,,GPIO4,,,,GPIO4,,, +165,GPIO5,,,GPIO5,EPWM3B,MFSRA,OUTPUTXBAR3,GPIO5,,CANRXA,,GPIO5,,,,GPIO5,,, +166,GPIO6,,,GPIO6,EPWM4A,OUTPUTXBAR4,EPWMSYNCO,GPIO6,EQEP3A,CANTXB,,GPIO6,,,,GPIO6,,, +167,GPIO7,,,GPIO7,EPWM4B,MCLKRA,OUTPUTXBAR5,GPIO7,EQEP3B,CANRXB,,GPIO7,,,,GPIO7,,, +168,VDDIO,VDDIO +,VDDIO +169,VDD,VDD +,VDD +170,GPIO88,,,GPIO88,,EM1A15,EM1DQM0,GPIO88,,,,GPIO88,,,,GPIO88,,, +171,GPIO89,,,GPIO89,,EM1A16,EM1DQM1,GPIO89,,SCITXDC,,GPIO89,,,,GPIO89,,, +172,GPIO90,,,GPIO90,,EM1A17,EM1DQM2,GPIO90,,SCIRXDC,,GPIO90,,,,GPIO90,,, +173,GPIO91,,,GPIO91,,EM1A18,EM1DQM3,GPIO91,,SDAA,,GPIO91,,,,GPIO91,,, +174,GPIO92,,,GPIO92,,EM1A19,EM1BA1,GPIO92,,SCLA,,GPIO92,,,,GPIO92,,, +175,GPIO93,,,GPIO93,,,EM1BA0,GPIO93,,SCITXDD,,GPIO93,,,,GPIO93,,, +176,GPIO94,,,GPIO94,,,,GPIO94,,SCIRXDD,,GPIO94,,,,GPIO94,,, + diff --git a/28379d_P_SFRA/CPU1_RAM/.clangd/compile_commands.json b/28379d_P_SFRA/CPU1_RAM/.clangd/compile_commands.json new file mode 100644 index 0000000..82ddb5c --- /dev/null +++ b/28379d_P_SFRA/CPU1_RAM/.clangd/compile_commands.json @@ -0,0 +1,37 @@ +[ + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\" -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA/libsfra.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\" -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/LIBSFRA/libsfra_ti_hal.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\" -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\"", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/F2837xD_CodeStartBranch.asm" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\" -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device/device.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\" -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/main.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -I\"C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/CPU1_RAM/syscfg\" -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_P_SFRA/sfra_test.c" + } +] diff --git a/28379d_P_SFRA/SFRA/sfra_f32.c b/28379d_P_SFRA/SFRA/sfra_f32.c new file mode 100644 index 0000000..9471840 --- /dev/null +++ b/28379d_P_SFRA/SFRA/sfra_f32.c @@ -0,0 +1,454 @@ +/** + * @file sfra_f32.c + * @brief 软件频率响应分析器 (SFRA) 库实现,完全兼容 TI SFRA_F32 接口。 + * @details 实现功率级传函 H(s)、系统开环传函 GH(s) 和闭环传函 CL(s) 的测量。 + * 支持浮点运算,自动检测上位机参数变化并更新频率向量。 + */ + +#include "sfra_f32.h" +#include + +/*============================================================================ + * 常量定义 + *============================================================================*/ +#define TWO_PI (2.0f * 3.14159265358979323846f) +#define RAD_TO_DEG (180.0f / 3.14159265358979323846f) +#define INVALID_MAG_DB (-200.0f) + +/*============================================================================ + * 内部静态数据(单实例,非重入) + *============================================================================*/ +typedef struct { + uint16_t active; /**< 扫频是否激活 */ + uint16_t dtft_running; /**< 当前频率点是否正在累积 DTFT */ + uint16_t freqIndex; /**< 当前频率点索引 */ + uint16_t dataIndex; /**< 当前频率点的采样计数器 */ + uint16_t dataCount; /**< 当前频率点总采样数 */ + + float32_t foi_rad; /**< 每个采样的角度增量 (rad) */ + float32_t foi_sin; /**< 当前采样点 sin 值 */ + float32_t foi_cos; /**< 当前采样点 cos 值 */ + + /* DTFT 累加器 (使用 e^{-jwt} 核) */ + float32_t dtft_real_inj; /**< 注入信号 I 的实部 */ + float32_t dtft_imag_inj; /**< 注入信号 I 的虚部 */ + float32_t dtft_real_fb; /**< 反馈信号 Y 的实部 */ + float32_t dtft_imag_fb; /**< 反馈信号 Y 的虚部 */ + float32_t dtft_real_ctrl; /**< 控制输出 U 的实部 */ + float32_t dtft_imag_ctrl; /**< 控制输出 U 的虚部 */ + + /* 影子变量:用于检测上位机参数变更 */ + float32_t shadow_amplitude; /**< 上次同步的注入幅度 */ + float32_t shadow_freqStart; /**< 上次同步的起始频率 */ + float32_t shadow_freqStep; /**< 上次同步的频率步进乘数 */ + int16_t shadow_speed; /**< 上次同步的扫频速度 */ + + int16_t storeH; /**< 是否存储 H 向量 */ + int16_t storeGH; /**< 是否存储 GH 向量 */ + int16_t storeCL; /**< 是否存储 CL 向量 */ +} SFRA_Internal; + +static SFRA_Internal s_sfra = {0}; + +/*============================================================================ + * 辅助函数 + *============================================================================*/ + +/** + * @brief 计算指定频率点需要累积的采样点数(基于 libsfra 的周期对齐策略) + * @param foi_hz 注入频率 (Hz) + * @param isrFreq 控制 ISR 频率 (Hz) + * @param speed 速度因子(越大扫频越慢,累积周期越多) + * @return 采样点数 + */ +static uint16_t calcDataCount(float32_t foi_hz, float32_t isrFreq, int16_t speed) +{ + uint16_t cycles; + if (foi_hz < 10.0f) + cycles = 10; + else if (foi_hz < 100.0f) + cycles = (uint16_t)ceilf(foi_hz); + else + cycles = 100; + + cycles = (uint16_t)((float32_t)cycles * (float32_t)speed); + if (cycles < 4) cycles = 4; + + float32_t samples_per_cycle = isrFreq / foi_hz; + return (uint16_t)ceilf(samples_per_cycle * cycles); +} + +/** + * @brief 复数除法:计算 (num_re + j*num_im) / (den_re + j*den_im) + * @param re_num 分子实部 + * @param im_num 分子虚部 + * @param re_den 分母实部 + * @param im_den 分母虚部 + * @param mag 输出幅值 (dB) + * @param phase_deg 输出相位 (度) + */ +static void complexDiv(float32_t re_num, float32_t im_num, + float32_t re_den, float32_t im_den, + float32_t *mag, float32_t *phase_deg) +{ + float32_t den_sq = re_den * re_den + im_den * im_den; + if (den_sq < 1e-12f) { + *mag = INVALID_MAG_DB; + *phase_deg = 0.0f; + return; + } + float32_t re = (re_num * re_den + im_num * im_den) / den_sq; + float32_t im = (im_num * re_den - re_num * im_den) / den_sq; + *mag = 10.0f * log10f(re * re + im * im); + *phase_deg = atan2f(im, re) * RAD_TO_DEG; +} + +/** + * @brief 从指定索引开始重新生成频率向量(使用当前的 freqStart 和 freqStep) + * @param obj SFRA 对象指针 + * @param startIdx 起始索引(该点之前的频率点保持不变) + */ +static void regenerateFreqVectorFrom(SFRA_F32 *obj, uint16_t startIdx) +{ + if (!obj || !obj->freqVect || obj->vecLength <= 0) return; + if (startIdx >= (uint16_t)obj->vecLength) return; + + for (int16_t i = startIdx; i < obj->vecLength; i++) { + if (i == 0) { + obj->freqVect[0] = obj->freqStart; + } else { + obj->freqVect[i] = obj->freqVect[i-1] * obj->freqStep; + } + } +} + +/*============================================================================ + * 公开 API 实现 + *============================================================================*/ + +void SFRA_F32_reset(SFRA_F32 *obj) +{ + if (!obj) return; + obj->state = 0; + obj->status = 0; + obj->freqIndex = 0; + obj->start = 0; + + s_sfra.active = 0; + s_sfra.dtft_running = 0; + s_sfra.freqIndex = 0; + s_sfra.dataIndex = 0; + s_sfra.dataCount = 0; + s_sfra.foi_rad = 0; + s_sfra.foi_sin = 0; + s_sfra.foi_cos = 0; + s_sfra.dtft_real_inj = 0; + s_sfra.dtft_imag_inj = 0; + s_sfra.dtft_real_fb = 0; + s_sfra.dtft_imag_fb = 0; + s_sfra.dtft_real_ctrl = 0; + s_sfra.dtft_imag_ctrl = 0; + + s_sfra.shadow_amplitude = obj->amplitude; + s_sfra.shadow_freqStart = obj->freqStart; + s_sfra.shadow_freqStep = obj->freqStep; + s_sfra.shadow_speed = obj->speed; +} + +void SFRA_F32_config(SFRA_F32 *obj, + float32_t isrFrequency, + float32_t injectionAmplitude, + int16_t noFreqPoints, + float32_t fraSweepStartFreq, + float32_t freqStep, + float32_t *h_magVect, + float32_t *h_phaseVect, + float32_t *gh_magVect, + float32_t *gh_phaseVect, + float32_t *cl_magVect, + float32_t *cl_phaseVect, + float32_t *freqVect, + int16_t speed) +{ + if (!obj) return; + obj->isrFreq = isrFrequency; + obj->amplitude = injectionAmplitude; + obj->vecLength = noFreqPoints; + obj->freqStart = fraSweepStartFreq; + obj->freqStep = freqStep; + obj->speed = speed; + + obj->h_magVect = h_magVect; + obj->h_phaseVect = h_phaseVect; + obj->gh_magVect = gh_magVect; + obj->gh_phaseVect = gh_phaseVect; + obj->cl_magVect = cl_magVect; + obj->cl_phaseVect = cl_phaseVect; + obj->freqVect = freqVect; + + obj->storeH = (h_magVect && h_phaseVect) ? 1 : 0; + obj->storeGH = (gh_magVect && gh_phaseVect) ? 1 : 0; + obj->storeCL = (cl_magVect && cl_phaseVect) ? 1 : 0; + + s_sfra.storeH = obj->storeH; + s_sfra.storeGH = obj->storeGH; + s_sfra.storeCL = obj->storeCL; + + s_sfra.shadow_amplitude = injectionAmplitude; + s_sfra.shadow_freqStart = fraSweepStartFreq; + s_sfra.shadow_freqStep = freqStep; + s_sfra.shadow_speed = speed; + + SFRA_F32_reset(obj); +} + +void SFRA_F32_initFreqArrayWithLogSteps(SFRA_F32 *obj, + float32_t fra_sweep_start_freq, + float32_t freqStep) +{ + if (!obj || !obj->freqVect || obj->vecLength <= 0) return; + obj->freqVect[0] = fra_sweep_start_freq; + for (int16_t i = 1; i < obj->vecLength; i++) { + obj->freqVect[i] = obj->freqVect[i-1] * freqStep; + } + s_sfra.shadow_freqStart = fra_sweep_start_freq; + s_sfra.shadow_freqStep = freqStep; +} + +void SFRA_F32_resetFreqRespArray(SFRA_F32 *obj) +{ + if (!obj) return; + uint16_t len = obj->vecLength; + if (obj->storeH && obj->h_magVect && obj->h_phaseVect) { + for (uint16_t i = 0; i < len; i++) { + obj->h_magVect[i] = 0.0f; + obj->h_phaseVect[i] = 0.0f; + } + } + if (obj->storeGH && obj->gh_magVect && obj->gh_phaseVect) { + for (uint16_t i = 0; i < len; i++) { + obj->gh_magVect[i] = 0.0f; + obj->gh_phaseVect[i] = 0.0f; + } + } + if (obj->storeCL && obj->cl_magVect && obj->cl_phaseVect) { + for (uint16_t i = 0; i < len; i++) { + obj->cl_magVect[i] = 0.0f; + obj->cl_phaseVect[i] = 0.0f; + } + } +} + +void SFRA_F32_updateInjectionAmplitude(SFRA_F32 *obj, float32_t new_injection_amplitude) +{ + if (obj) { + obj->amplitude = new_injection_amplitude; + s_sfra.shadow_amplitude = new_injection_amplitude; + } +} + +/** + * @brief 注入函数:生成正弦扰动并叠加到参考值上。 + * @param ref 原始参考值 + * @return 叠加扰动后的参考值 + */ +float SFRA_F32_inject(float ref) +{ + if (!s_sfra.active || !s_sfra.dtft_running) return ref; + + float32_t angle = s_sfra.foi_rad * s_sfra.dataIndex; + s_sfra.foi_cos = cosf(angle); + s_sfra.foi_sin = sinf(angle); + return ref + s_sfra.shadow_amplitude * s_sfra.foi_cos; +} + +/** + * @brief 收集函数:在控制 ISR 中调用,累积 DTFT 数据。 + * @param control_output 控制输出指针(例如占空比) + * @param feedback 反馈信号指针(例如 ADC 读数) + */ +void SFRA_F32_collect(float *control_output, float *feedback) +{ + if (!s_sfra.active || !s_sfra.dtft_running) return; + if (!control_output || !feedback) return; + + float32_t ctrl = *control_output; + float32_t fb = *feedback; + float32_t cosv = s_sfra.foi_cos; + float32_t sinv = s_sfra.foi_sin; + + /* DTFT 采用 e^{-jwt} 核,虚部为负号 */ + s_sfra.dtft_real_fb += fb * cosv; + s_sfra.dtft_imag_fb -= fb * sinv; + + s_sfra.dtft_real_ctrl += ctrl * cosv; + s_sfra.dtft_imag_ctrl -= ctrl * sinv; + + float32_t inj = s_sfra.shadow_amplitude * cosv; + s_sfra.dtft_real_inj += inj * cosv; + s_sfra.dtft_imag_inj -= inj * sinv; + + s_sfra.dataIndex++; + if (s_sfra.dataIndex >= s_sfra.dataCount) { + s_sfra.dtft_running = 0; /* 当前频率点累积完成 */ + } +} + +/** + * @brief 后台任务:状态机,管理扫频流程,计算传函并存储结果。 + * @param obj SFRA 对象指针 + * @note 传函定义: + * - H(s) = Y / U (功率级传函,用于开环模式) + * - GH(s) = Y / (I - Y) (系统开环传函,闭环模式下测量) + * - CL(s) = Y / I (系统闭环传函) + */ +void SFRA_F32_runBackgroundTask(SFRA_F32 *obj) +{ + if (!obj) return; + + /*------------------------------------------------------------------------ + * 1. 扫频未激活时,检测参数变化并更新频率向量 + *------------------------------------------------------------------------*/ + if (!s_sfra.active) { + if (obj->amplitude != s_sfra.shadow_amplitude) { + s_sfra.shadow_amplitude = obj->amplitude; + } + if (obj->speed != s_sfra.shadow_speed) { + s_sfra.shadow_speed = obj->speed; + } + if (obj->freqStart != s_sfra.shadow_freqStart || + obj->freqStep != s_sfra.shadow_freqStep) { + regenerateFreqVectorFrom(obj, 0); + s_sfra.shadow_freqStart = obj->freqStart; + s_sfra.shadow_freqStep = obj->freqStep; + } + } + + /*------------------------------------------------------------------------ + * 2. 启动新扫频 + *------------------------------------------------------------------------*/ + if (!s_sfra.active && obj->start) { + s_sfra.active = 1; + s_sfra.freqIndex = 0; + obj->start = 0; + obj->state = 1; + obj->status = 1; + obj->freqIndex = 0; + + if (obj->freqVect && obj->vecLength > 0) { + float32_t freq = obj->freqVect[0]; + s_sfra.dataCount = calcDataCount(freq, obj->isrFreq, obj->speed); + + uint16_t cycles_raw; + if (freq < 10.0f) cycles_raw = 10; + else if (freq < 100.0f) cycles_raw = (uint16_t)ceilf(freq); + else cycles_raw = 100; + cycles_raw = (uint16_t)((float32_t)cycles_raw * obj->speed); + if (cycles_raw < 4) cycles_raw = 4; + + s_sfra.foi_rad = TWO_PI * (float32_t)cycles_raw / (float32_t)s_sfra.dataCount; + + s_sfra.dataIndex = 0; + s_sfra.dtft_real_inj = 0; + s_sfra.dtft_imag_inj = 0; + s_sfra.dtft_real_fb = 0; + s_sfra.dtft_imag_fb = 0; + s_sfra.dtft_real_ctrl = 0; + s_sfra.dtft_imag_ctrl = 0; + s_sfra.dtft_running = 1; + } + return; + } + + if (!s_sfra.active) { + obj->state = 0; + obj->status = 0; + return; + } + + if (s_sfra.dtft_running) return; + + /*------------------------------------------------------------------------ + * 3. 当前频率点 DTFT 已完成,计算并存储各类传函 + *------------------------------------------------------------------------*/ + uint16_t idx = s_sfra.freqIndex; + if (idx < (uint16_t)obj->vecLength) { + float32_t mag, phase; + + /* 功率级传函 H(s) = Y / U */ + if (s_sfra.storeH && obj->h_magVect && obj->h_phaseVect) { + complexDiv(s_sfra.dtft_real_fb, s_sfra.dtft_imag_fb, + s_sfra.dtft_real_ctrl, s_sfra.dtft_imag_ctrl, + &mag, &phase); + obj->h_magVect[idx] = mag; + obj->h_phaseVect[idx] = phase; + } + + /* 开环传函 GH(s) = Y / (I - Y) */ + if (s_sfra.storeGH && obj->gh_magVect && obj->gh_phaseVect) { + float32_t re_iy = s_sfra.dtft_real_inj - s_sfra.dtft_real_fb; + float32_t im_iy = s_sfra.dtft_imag_inj - s_sfra.dtft_imag_fb; + complexDiv(s_sfra.dtft_real_fb, s_sfra.dtft_imag_fb, + re_iy, im_iy, &mag, &phase); + obj->gh_magVect[idx] = mag; + obj->gh_phaseVect[idx] = phase; + } + + /* 闭环传函 CL(s) = Y / I */ + if (s_sfra.storeCL && obj->cl_magVect && obj->cl_phaseVect) { + complexDiv(s_sfra.dtft_real_fb, s_sfra.dtft_imag_fb, + s_sfra.dtft_real_inj, s_sfra.dtft_imag_inj, + &mag, &phase); + obj->cl_magVect[idx] = mag; + obj->cl_phaseVect[idx] = phase; + } + } + + /*------------------------------------------------------------------------ + * 4. 准备下一个频率点(如果参数已变化,则重新生成剩余频率向量) + *------------------------------------------------------------------------*/ + s_sfra.freqIndex++; + obj->freqIndex = s_sfra.freqIndex; + + if (s_sfra.freqIndex < (uint16_t)obj->vecLength) { + /* 检测频率参数变化,重新生成剩余频率点 */ + if (obj->freqStart != s_sfra.shadow_freqStart || + obj->freqStep != s_sfra.shadow_freqStep) { + regenerateFreqVectorFrom(obj, s_sfra.freqIndex); + s_sfra.shadow_freqStart = obj->freqStart; + s_sfra.shadow_freqStep = obj->freqStep; + } + if (obj->speed != s_sfra.shadow_speed) { + s_sfra.shadow_speed = obj->speed; + } + + float32_t freq = obj->freqVect[s_sfra.freqIndex]; + s_sfra.dataCount = calcDataCount(freq, obj->isrFreq, obj->speed); + + uint16_t cycles_raw; + if (freq < 10.0f) cycles_raw = 10; + else if (freq < 100.0f) cycles_raw = (uint16_t)ceilf(freq); + else cycles_raw = 100; + cycles_raw = (uint16_t)((float32_t)cycles_raw * obj->speed); + if (cycles_raw < 4) cycles_raw = 4; + + s_sfra.foi_rad = TWO_PI * (float32_t)cycles_raw / (float32_t)s_sfra.dataCount; + + s_sfra.dataIndex = 0; + s_sfra.dtft_real_inj = 0; + s_sfra.dtft_imag_inj = 0; + s_sfra.dtft_real_fb = 0; + s_sfra.dtft_imag_fb = 0; + s_sfra.dtft_real_ctrl = 0; + s_sfra.dtft_imag_ctrl = 0; + s_sfra.dtft_running = 1; + obj->state = 1; + obj->status = 1; + } else { + /* 扫频结束 */ + s_sfra.active = 0; + obj->state = 0; + obj->status = 2; + obj->freqIndex = obj->vecLength; + } +} diff --git a/28379d_P_SFRA/SFRA/sfra_f32.h b/28379d_P_SFRA/SFRA/sfra_f32.h new file mode 100644 index 0000000..108ccfe --- /dev/null +++ b/28379d_P_SFRA/SFRA/sfra_f32.h @@ -0,0 +1,182 @@ +//########################################################################### +// +// FILE: sfra_f32.h +// +// TITLE: Prototypes and Definitions for the C28x FPU SFRA Library +// +// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX) +// +//############################################################################# +// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $ +// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $ +// $Copyright: +// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/ +// +// ALL RIGHTS RESERVED +// $ +//############################################################################# + +#ifndef SFRA_F32_H +#define SFRA_F32_H + +#ifdef __cplusplus +extern "C" { +#endif + +//***************************************************************************** +// +//! \addtogroup SFRA +//! @{ +// +//***************************************************************************** + +// +// the includes & defines +// +#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}} + +#include +#include +#include + +#ifdef __TI_EABI__ +#define SFRA_F32_inject __SFRA_F32_inject +#define SFRA_F32_collect __SFRA_F32_collect +#else +#define SFRA_F32_inject _SFRA_F32_inject +#define SFRA_F32_collect _SFRA_F32_collect +#endif +//! \brief Defines the SFRA_F32 structure +//! +//! \details The SFRA_F32 can be used to run a software based +//! frequency response analysis on power converters +//! +typedef struct{ + float32_t *h_magVect; //!< Plant Mag SFRA Vector + float32_t *h_phaseVect; //!< Plant Phase SFRA Vector + float32_t *gh_magVect; //!< Open Loop Mag SFRA Vector + float32_t *gh_phaseVect; //!< Open Loop Phase SFRA Vector + float32_t *cl_magVect; //!< Closed Loop Mag SFRA Vector + float32_t *cl_phaseVect; //!< Closed Loop Phase SFRA Vector + float32_t *freqVect; //!< Frequency Vector + float32_t amplitude; //!< Injection Amplitude + float32_t isrFreq; //!< SFRA ISR frequency + float32_t freqStart; //!< Start frequency of SFRA sweep + float32_t freqStep; //!< Log space between frequency points (optional) + int16_t start; //!< Command to start SFRA + int16_t state; //!< State of SFRA + int16_t status; //!< Status of SFRA + int16_t vecLength; //!< No. of Points in the SFRA + int16_t freqIndex; //!< Index of the frequency vector + int16_t storeH; //!< Flag to indicate if H vector is stored + int16_t storeGH; //!< Flag to indicate if GH vector is stored + int16_t storeCL; //!< Flag to indicate if CL vector is stored + int16_t speed; //!< variable to change the speed of the sweep +}SFRA_F32; + +//! \brief Resets internal data of SFRA_F32 module +//! \param SFRA_F_obj Pointer to the SFRA_F32 structure +//! +extern void SFRA_F32_reset(SFRA_F32 *SFRA_F_obj); + +//! \brief Configures the SFRA_F32 module +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure +//! \param isrFrequency Frequency at which SFRA routine in called, +//! typically the control ISR rate +//! \param injectionAmplitude Per Unit (PU) injection amplitude +//! \param noFreqPoints Number of frequency points sweeped +//! \param fraSweepStartFreq Start frequency of SFRA sweep +//! \param freqStep Multiplier used to keep frequency points log step apart +//! \param *h_magVect Pointer to array that stores plant FRA magnitude data +//! \param *h_phaseVect Pointer to array that stores plant FRA phase data +//! \param *gh_magVect Pointer to array that stores OL FRA magnitude data +//! \param *gh_phaseVect Pointer to array that stores OL FRA phase data +//! \param *cl_magVect Pointer to array that stores OL FRA magnitude data +//! \param *cl_phaseVect Pointer to array that stores OL FRA phase data +//! \param *freqVect Pointer to array that stores the freq points for the sweep +//! \param speed indiactes the speed of the sweep +//! +extern void SFRA_F32_config(SFRA_F32 *SFRA_F_obj, + float32_t isrFrequency, + float32_t injectionAmplitude, + int16_t noFreqPoints, + float32_t fraSweepStartFreq, + float32_t freqStep, + float32_t *h_magVect, + float32_t *h_phaseVect, + float32_t *gh_magVect, + float32_t *gh_phaseVect, + float32_t *cl_magVect, + float32_t *cl_phaseVect, + float32_t *freqVect, + int16_t speed); + +//! \brief Initailizes the freq vectors with points that are log step apart +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure +//! \param fra_sweep_start_freq Start frequency of SFRA sweep +//! \param freqStep Multiplier used to keep frequency points log step apart +//! +extern void SFRA_F32_initFreqArrayWithLogSteps(SFRA_F32 *SFRA_F_obj, + float32_t fra_sweep_start_freq, + float32_t freqStep); + +//! \brief Resets the response data stored in the ol and plant +//! phase and mag vector +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure pointer +//! +extern void SFRA_F32_resetFreqRespArray(SFRA_F32 *SFRA_F_obj); + +//! \brief Updates injection amplitude +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure +//! \param new_injection_amplitude Injection amplitude +//! +extern void SFRA_F32_updateInjectionAmplitude(SFRA_F32 *SFRA_F_obj, + float32_t new_injection_amplitude); + +//! \brief Injects small signal disturbance into the control loop +//! \param ref refernce value on which the injection is added +//! \return Routine returns the reference plus the injection when SFRA sweep +//! is active, when SFRA sweep is not active that is if SFRA state is 0 +//! it returns the the refernce without any change +//! +extern float SFRA_F32_inject(float ref); + +//! \brief Collects the response of the loop because of small signal disturbance +//! injected +//! \param *control_output pointer to the variable where control output is saved +//! note though the parameter is passed by reference +//! it is unchanged by the module +//! \param *feedback pointer to the variable where control output is saved +//! note though the parameter is passed by reference +//! it is unchanged by the module +//! +extern void SFRA_F32_collect(float *control_output, float *feedback); + +//! \brief Runs the background task, this routine executes the state machine +//! when a frequency sweep is started and is responsible for changing +//! the frequency points and saving the measured results in an array +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure pointer +//! +extern void SFRA_F32_runBackgroundTask(SFRA_F32 *SFRA_F_obj); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#ifdef __cplusplus +} +#endif // extern "C" + +#endif // end of SFRA_F32_H definition diff --git a/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.c b/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.c new file mode 100644 index 0000000..28bed9e --- /dev/null +++ b/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.c @@ -0,0 +1,880 @@ +//########################################################################### +// +// FILE: sfra_gui_scicomms_driverlib.c +// +// TITLE: Comms kernel as an interface to SFRA GUI +// +// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX) +// +//############################################################################# +// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $ +// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $ +// $Copyright: +// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/ +// +// ALL RIGHTS RESERVED +// $ +//############################################################################# + +#include +#include "driverlib.h" +#include "device.h" +#include "sfra_gui_scicomms_driverlib.h" + +// +// Function prototypes for Command RECEIVE State machine +// ------------------------------------------------------------ +// +void SFRA_GUI_getCmdByte(void); +void SFRA_GUI_echoCmdByte(void); +void SFRA_GUI_getSizeByte(void); +void SFRA_GUI_echoSizeByte(void); +void SFRA_GUI_getDataByte(void); +void SFRA_GUI_echoDataByte(void); +void SFRA_GUI_packWord(void); +void SFRA_GUI_packArray(void); +void SFRA_GUI_cmdInterpreter(void); + +// +// Function prototypes for Command Interpreter and dispatcher +// +void SFRA_GUI_lifePulseTsk(void); // 0 +void SFRA_GUI_setText(void); // 1 +void SFRA_GUI_setButton(void); // 2 +void SFRA_GUI_setSlider(void); // 3 +void SFRA_GUI_getVariable(void); // 4 +void SFRA_GUI_getArray(void); // 5 +void SFRA_GUI_getData(void); // 6 +void SFRA_GUI_setData32(void); // 7 +void SFRA_GUI_spareTsk08(void); // 8 + +void SFRA_GUI_sendData(void); + +// +// Variable declarations +// State pointer for Command Packet Receive +// +void (*SFRA_GUI_rcvTaskPointer)(void); + +// +// Array of pointers to Function (that are tasks) +// +void (*SFRA_GUI_cmdDispatcher[SFRA_GUI_CMD_NUMBER])(void); + +volatile int16_t *SFRA_GUI_varSetTxtList[16]; +volatile int16_t *SFRA_GUI_varSetBtnList[16]; +volatile int16_t *SFRA_GUI_varSetSldrList[16]; +volatile int16_t *SFRA_GUI_varGetList[16]; +volatile int32_t *SFRA_GUI_arrayGetList[16]; +volatile int16_t *SFRA_GUI_dataGetList[16]; +volatile uint32_t *SFRA_GUI_dataSetList[16]; + +volatile int16_t SFRA_GUI_commsOKflg; +volatile int16_t SFRA_GUI_serialCommsTimer; + +volatile uint32_t SFRA_GUI_sci_base_addr; + +uint16_t SFRA_GUI_lowByteFlag; +uint16_t SFRA_GUI_sendTaskPtr; +uint16_t SFRA_GUI_rxChar; +uint16_t SFRA_GUI_rxWord; +uint16_t SFRA_GUI_cmdPacket[SFRA_GUI_PKT_SIZE]; +uint16_t SFRA_GUI_taskDoneFlag; +uint16_t SFRA_GUI_numWords; +uint16_t SFRA_GUI_wordsLeftToGet; + +uint16_t SFRA_GUI_dataOut16; +int32_t SFRA_GUI_dataOut32; + +int16_t *SFRA_GUI_memDataPtr16; +int32_t *SFRA_GUI_memDataPtr32; + +// +// for debug +// +int16_t SFRA_GUI_rcvTskPtrShdw; + +int16_t SFRA_GUI_delayer; + +int16_t SFRA_GUI_memGetPtr; +uint32_t SFRA_GUI_memGetAddress; +int16_t SFRA_GUI_memGetAmount; + +int16_t SFRA_GUI_memSetPtr; +uint32_t SFRA_GUI_memSetValue; + +uint32_t SFRA_GUI_temp; + +uint16_t SFRA_GUI_led_flag; +uint16_t SFRA_GUI_led_gpio; + +uint16_t SFRA_GUI_sweep_start; + +void SFRA_GUI_config(volatile uint32_t sci_base, + uint32_t vbus_clk, + uint32_t baudrate, + uint16_t scirx_gpio_pin, + uint32_t scirx_gpio_pin_config, + uint16_t scitx_gpio_pin, + uint32_t scitx_gpio_pin_config, + uint16_t led_indicator_flag, + uint16_t led_gpio_pin, + uint32_t led_gpio_pin_config, + SFRA_F32 *sfra, + uint16_t plot_option) +{ + int16_t j = 0; + + // + // setup Gpio for SCI comms for SFRA + // + + GPIO_setPinConfig(scirx_gpio_pin_config); + GPIO_setPinConfig(scitx_gpio_pin_config); + GPIO_setQualificationMode(scirx_gpio_pin, GPIO_QUAL_ASYNC); + GPIO_setQualificationMode(scitx_gpio_pin, GPIO_QUAL_ASYNC); + + // + // Note: Assumes Clocks to SCI are turned on in setupDevice()->Device_init() + // Note: Assumes GPIO pins for SCIA are configured to Primary function + // + + // + // 1 stop bit, No parity, 8 char bits, + // + SCI_setConfig(sci_base, + vbus_clk, baudrate, + (SCI_CONFIG_WLEN_8 | + SCI_CONFIG_STOP_ONE | + SCI_CONFIG_PAR_NONE)); + // + // No loopback + // + SCI_disableLoopback(sci_base); + + SCI_enableInterrupt(sci_base, SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY); + + // + // Relinquish SCI from Reset by SW Reset and setting TXE, and RXE bits + // + SCI_enableModule(sci_base); + SCI_performSoftwareReset(sci_base); + + HWREGH(sci_base + SCI_O_FFTX) = 0x8040; + HWREGH(sci_base + SCI_O_FFRX) = 0x204f; + HWREGH(sci_base + SCI_O_FFCT) = 0x0; + + // + // Disable RX ERR, SLEEP, TXWAKE + // + SCI_clearInterruptStatus(sci_base, + SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT ); + + // + // Initialize the CmdPacket Rcv Handler state machine ptr + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + // + // DEBUG + // + SFRA_GUI_rcvTskPtrShdw = 1; + // + // Init to 1st state + // + SFRA_GUI_sendTaskPtr = 0; + // + // Start with LSB during Byte-to-Word packing + // + SFRA_GUI_lowByteFlag = 1; + + SFRA_GUI_dataOut16 = 0; + SFRA_GUI_dataOut32 = 0; + + // + // for debug + // + SFRA_GUI_rcvTskPtrShdw = 0; + + SFRA_GUI_delayer = 0; + + SFRA_GUI_memGetPtr = 0; + SFRA_GUI_memGetAddress = 0x00000000; + SFRA_GUI_memGetAmount = 0; + + SFRA_GUI_memSetPtr = 0; + SFRA_GUI_memSetValue = 0x00000000; + + SFRA_GUI_sweep_start = 0; + SFRA_GUI_serialCommsTimer = 0; + SFRA_GUI_commsOKflg = 0; + + SFRA_GUI_sci_base_addr = sci_base; + + // + // clear Command Packet + // + for (j = 0; j < SFRA_GUI_PKT_SIZE; j++) + { + SFRA_GUI_cmdPacket[j] = 0x0; + } + + j = 0; + + // + // init all dispatch Tasks + // + SFRA_GUI_cmdDispatcher[0] = SFRA_GUI_lifePulseTsk; + SFRA_GUI_cmdDispatcher[1] = SFRA_GUI_setText; + SFRA_GUI_cmdDispatcher[2] = SFRA_GUI_setButton; + SFRA_GUI_cmdDispatcher[3] = SFRA_GUI_setSlider; + SFRA_GUI_cmdDispatcher[4] = SFRA_GUI_getVariable; + SFRA_GUI_cmdDispatcher[5] = SFRA_GUI_getArray; + SFRA_GUI_cmdDispatcher[6] = SFRA_GUI_getData; + SFRA_GUI_cmdDispatcher[7] = SFRA_GUI_setData32; + SFRA_GUI_cmdDispatcher[8] = SFRA_GUI_spareTsk08; + + + + SFRA_GUI_varSetBtnList[0] = (int16_t *)&(SFRA_GUI_sweep_start); + + SFRA_GUI_varGetList[0] = (int16_t *)&(sfra->vecLength); + SFRA_GUI_varGetList[1] = (int16_t *)&(sfra->status); + SFRA_GUI_varGetList[2] = (int16_t *)&(sfra->freqIndex); + + // + //"Setable" variables + // assign GUI "setable" by Text parameter address + // + SFRA_GUI_dataSetList[0] = (uint32_t *)&(sfra->freqStart); + SFRA_GUI_dataSetList[1] = (uint32_t *)&(sfra->amplitude); + SFRA_GUI_dataSetList[2] = (uint32_t *)&(sfra->freqStep); + + // + // assign a GUI "getable" parameter array address + // + SFRA_GUI_arrayGetList[0] = (int32_t *)sfra->freqVect; + + + if(plot_option == SFRA_GUI_PLOT_GH_CL) + { + SFRA_GUI_arrayGetList[1] = (int32_t *)sfra->gh_magVect; + SFRA_GUI_arrayGetList[2] = (int32_t *)sfra->gh_phaseVect; + + SFRA_GUI_arrayGetList[3] = (int32_t *)sfra->cl_magVect; + SFRA_GUI_arrayGetList[4] = (int32_t *)sfra->cl_phaseVect; + } + // + // default is to plot gh and h + // + else + { + SFRA_GUI_arrayGetList[1] = (int32_t *)sfra->gh_magVect; + SFRA_GUI_arrayGetList[2] = (int32_t *)sfra->gh_phaseVect; + + SFRA_GUI_arrayGetList[3] = (int32_t *)sfra->h_magVect; + SFRA_GUI_arrayGetList[4] = (int32_t *)sfra->h_phaseVect; + } + + + + SFRA_GUI_arrayGetList[5] = (int32_t *)&(sfra->freqStart); + SFRA_GUI_arrayGetList[6] = (int32_t *)&(sfra->amplitude); + SFRA_GUI_arrayGetList[7] = (int32_t *)&(sfra->freqStep); + + + if(led_indicator_flag == 1) + { + GPIO_setDirectionMode(led_gpio_pin, GPIO_DIR_MODE_OUT); + GPIO_setQualificationMode(led_gpio_pin, GPIO_QUAL_SYNC); + GPIO_setPinConfig(led_gpio_pin_config); + SFRA_GUI_led_flag = 1; + SFRA_GUI_led_gpio = led_gpio_pin; + } + else + { + SFRA_GUI_led_flag = 0; + } + +} + +// +// Host Command RECEIVE and DISPATCH State Machine +// + +// +// State Machine Entry Point +// +void SFRA_GUI_runSerialHostComms(SFRA_F32 *sfra) +{ + if(SFRA_GUI_sweep_start == 1) + { + SFRA_GUI_sweep_start = 0; + sfra->start = 1; + } + // + // Call routine pointed to by state pointer + // + (*SFRA_GUI_rcvTaskPointer)(); + + SFRA_GUI_serialCommsTimer++; +} + + +// +// Task 1 +// +void SFRA_GUI_getCmdByte(void) +{ + // + // check if a char has been received + // + if((SCI_getRxStatus(SFRA_GUI_sci_base_addr) & SCI_RXSTATUS_READY ) != 0) + { + SFRA_GUI_rxChar = SCI_readCharBlockingNonFIFO(SFRA_GUI_sci_base_addr); + // + // point to next state + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_echoCmdByte; + SFRA_GUI_serialCommsTimer = 0; + // + // DEBUG + //RcvTskPtrShdw = 2; + // + SFRA_GUI_echoCmdByte(); + } + // + //~2.5 s timeout, SFRA GUI function is called at 100Hz (recommended) + // hence 2500/100 = 2.5sec + // + else if((SCI_getRxStatus(SFRA_GUI_sci_base_addr)&SCI_RXSTATUS_BREAK) != 0 + || SFRA_GUI_serialCommsTimer > 2500) + { + + SCI_enableModule(SFRA_GUI_sci_base_addr); + + // + // If break detected or serialport times out, reset SCI + //--- Needed by some serialports when code is run with an emulator + // + SCI_performSoftwareReset(SFRA_GUI_sci_base_addr); + + SCI_clearInterruptStatus(SFRA_GUI_sci_base_addr, + SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT); + + asm(" RPT#8 || NOP"); + + // + // Init to 1st state + // + SFRA_GUI_sendTaskPtr = 0; + SFRA_GUI_serialCommsTimer = 0; + + // + // go back and wait for new CMD + // + SFRA_GUI_commsOKflg = 0; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + } + else + { + + } +} + +// +// Task 2 +// +void SFRA_GUI_echoCmdByte(void) +{ + // + // is TXBUF empty ?, that is TXRDY = 1 + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, SFRA_GUI_rxChar); + SFRA_GUI_cmdPacket[0] = SFRA_GUI_rxChar; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getSizeByte; + // + // DEBUG + // RcvTskPtrShdw = 3; + // Un-comment for simple echo test + // RcvTaskPointer = &GetCmdByte; + // Reset Time-out timer + // + SFRA_GUI_serialCommsTimer = 0; + } + +} + +// +// Task 3 +// +void SFRA_GUI_getSizeByte(void) +{ + // + // check if a char has been received + // + if((SCI_getRxStatus(SFRA_GUI_sci_base_addr) & SCI_RXSTATUS_READY ) != 0) + { + SFRA_GUI_rxChar = SCI_readCharBlockingNonFIFO(SFRA_GUI_sci_base_addr); + + // + // point to next state + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_echoSizeByte; + // + // DEBUG + //RcvTskPtrShdw = 4; + // + SFRA_GUI_echoSizeByte(); + } + + // + // 1000*1mS = 1.0 sec timeout, SFRA GUI function is called at 1ms + // + else if(SFRA_GUI_serialCommsTimer > 1000) + { + SFRA_GUI_commsOKflg = 0; + // + // Abort, go back wait for new CMD + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + SFRA_GUI_serialCommsTimer = 0; + } +} + +// +// Task 4 +// +void SFRA_GUI_echoSizeByte(void) +{ + // + // is TXBUF empty ?, that is TXRDY = 1 + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, SFRA_GUI_rxChar); + SFRA_GUI_cmdPacket[1] = SFRA_GUI_rxChar; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getDataByte; + // + // DEBUG + //RcvTskPtrShdw = 5; + // Un-comment for Test + //RcvTaskPointer = &GetCmdByte; + // Reset Time-out timer + // + SFRA_GUI_serialCommsTimer = 0; + } +} + +// +// Task 5 +// +void SFRA_GUI_getDataByte(void) +{ + // + // check if a char has been received + // + if((SCI_getRxStatus(SFRA_GUI_sci_base_addr) & SCI_RXSTATUS_READY ) != 0) + { + SFRA_GUI_rxChar = SCI_readCharBlockingNonFIFO(SFRA_GUI_sci_base_addr); + // + // point to next state + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_echoDataByte; + // + // DEBUG + //RcvTskPtrShdw = 6; + // + SFRA_GUI_echoDataByte(); + } + + // + // 1000*1mS = 1 sec timeout, SFRA GUI function is called at 1ms/100Hz + // + else if(SFRA_GUI_serialCommsTimer > 1000) + { + SFRA_GUI_commsOKflg = 0; + // + // Abort, go back wait for new CMD + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + SFRA_GUI_serialCommsTimer = 0; + } +} + +// +// Task 6 +// +void SFRA_GUI_echoDataByte(void) +{ + // + // is TXBUF empty ?, that is TXRDY = 1 + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, SFRA_GUI_rxChar); + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_packWord; + // + // DEBUG + //RcvTskPtrShdw = 7; + // + } +} + +// +// expects LSB first then MSB // Task 7 +// +void SFRA_GUI_packWord(void) +{ + if(SFRA_GUI_lowByteFlag == 1) + { + SFRA_GUI_rxWord = SFRA_GUI_rxChar; + SFRA_GUI_lowByteFlag = 0; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getDataByte; + // + // DEBUG + // RcvTskPtrShdw = 5; + // + SFRA_GUI_getDataByte(); + } + else + { + SFRA_GUI_rxWord = SFRA_GUI_rxWord | (SFRA_GUI_rxChar << 8); + SFRA_GUI_lowByteFlag = 1; + // + // store data in packet + // + SFRA_GUI_cmdPacket[2] = SFRA_GUI_rxWord; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_cmdInterpreter; + // + // DEBUG + // RcvTskPtrShdw = 8; + // indicate new task underway + // + SFRA_GUI_taskDoneFlag = 0; + } +} + +// +// Task 8 +// +void SFRA_GUI_cmdInterpreter(void) +{ + if(SFRA_GUI_taskDoneFlag == 0) + { + // + // dispatch Task + // + (*SFRA_GUI_cmdDispatcher[SFRA_GUI_cmdPacket[0]])(); + } + + // + // Incase Task never finishes + // 2500*1mS = 2.5 sec timeout + // + if(SFRA_GUI_serialCommsTimer > 2500) + { + SFRA_GUI_commsOKflg = 0; + // + // Abort, go back wait for new CMD + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + SFRA_GUI_serialCommsTimer = 0; + } + if(SFRA_GUI_taskDoneFlag == 1) + { + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + // + // DEBUG + //RcvTskPtrShdw = 1; + // + } +} + +// +// Slave Tasks commanded by Host +// + +// +// CmdPacket[0] = 0 +// +void SFRA_GUI_lifePulseTsk(void) +{ + if(SFRA_GUI_led_flag == 1) + { + // + // LED2-ON + // + if(SFRA_GUI_cmdPacket[2] == 0x0000 && SFRA_GUI_cmdPacket[1] == 0x00) + { + GPIO_togglePin(SFRA_GUI_led_gpio); + } + // + // LED2-OFF + // + if(SFRA_GUI_cmdPacket[2] == 0x0001 && SFRA_GUI_cmdPacket[1] == 0x00) + { + GPIO_togglePin(SFRA_GUI_led_gpio); + } + // + // LED2-Toggle + // + if(SFRA_GUI_cmdPacket[2] == 0x0002 && SFRA_GUI_cmdPacket[1] == 0x00) + { + GPIO_togglePin(SFRA_GUI_led_gpio); + } + } + + SFRA_GUI_commsOKflg = 1; + SFRA_GUI_serialCommsTimer = 0; + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 1 +// +void SFRA_GUI_setText(void) +{ + *SFRA_GUI_varSetTxtList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_cmdPacket[2]; + + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 2 +// +void SFRA_GUI_setButton(void) +{ + *SFRA_GUI_varSetBtnList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_cmdPacket[2]; + + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 3 +// +void SFRA_GUI_setSlider(void) +{ + *SFRA_GUI_varSetSldrList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_cmdPacket[2]; + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 4 +// +void SFRA_GUI_getVariable(void) +{ + SFRA_GUI_sendData(); +} + +// +//Send a Uint16 array one element at a time +// CmdPacket[0] = 5 +// +void SFRA_GUI_getArray(void) +{ + SFRA_GUI_sendData(); +} + +// +// CmdPacket[0] = 6 +// +void SFRA_GUI_getData(void) +{ + switch(SFRA_GUI_memGetPtr) + { + case 0: + SFRA_GUI_memGetAddress = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memGetPtr = 1; + + SFRA_GUI_wordsLeftToGet = 1; + SFRA_GUI_sendTaskPtr = 1; + SFRA_GUI_taskDoneFlag = 1; + break; + + case 1: + SFRA_GUI_temp = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memGetAddress = SFRA_GUI_memGetAddress + + (SFRA_GUI_temp << 16); + SFRA_GUI_memDataPtr16 = (int16_t *)SFRA_GUI_memGetAddress; + SFRA_GUI_dataOut16 = *SFRA_GUI_memDataPtr16; + SFRA_GUI_sendData(); + + if(SFRA_GUI_taskDoneFlag == 1) + { + SFRA_GUI_memGetPtr = 0; + } + break; + } + + // + // indicate Task execution is complete + // TaskDoneFlag = 1; + // +} + +// +// CmdPacket[0] = 7 [Edited to get 32-bit set text and set label working] +// +void SFRA_GUI_setData32(void) +{ + switch(SFRA_GUI_memSetPtr) + { + case 0: + SFRA_GUI_memSetValue = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memSetPtr = 1; + + SFRA_GUI_taskDoneFlag = 1; + break; + + case 1: + SFRA_GUI_temp = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memSetValue = SFRA_GUI_memSetValue + (SFRA_GUI_temp << 16); + + *SFRA_GUI_dataSetList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_memSetValue; + + SFRA_GUI_memSetPtr = 0; + SFRA_GUI_taskDoneFlag = 1; + break; + } + +} + +// +// CmdPacket[0] = 8 +// +void SFRA_GUI_spareTsk08(void) +{ + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// +// +void SFRA_GUI_sendData(void) +{ + if(SFRA_GUI_cmdPacket[0] == 0x04 || SFRA_GUI_cmdPacket[0] == 0x06) + { + switch(SFRA_GUI_sendTaskPtr) + { + case 0: //initialization + + SFRA_GUI_memDataPtr16 = + (int16_t *) SFRA_GUI_varGetList[SFRA_GUI_cmdPacket[1]]; + SFRA_GUI_dataOut16 = *SFRA_GUI_memDataPtr16; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_cmdPacket[2]; + // + //Note that case 0 rolls into case 1 (no break) + // + + case 1: //send LSB + if(SFRA_GUI_wordsLeftToGet > 0) + { + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut16 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 2; + } + } + else + { + SFRA_GUI_sendTaskPtr = 0; + SFRA_GUI_taskDoneFlag = 1; + break; + } + + case 2: //send MSB + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut16 >> 8 & 0x000000FF); + + SFRA_GUI_memDataPtr16 = SFRA_GUI_memDataPtr16 + 1; + SFRA_GUI_dataOut16 = *SFRA_GUI_memDataPtr16; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_wordsLeftToGet - 1; + SFRA_GUI_sendTaskPtr = 1; + } + break; + } + } + else + { + switch(SFRA_GUI_sendTaskPtr) + { + case 0: //initialization + SFRA_GUI_memDataPtr32 = + (int32_t *) SFRA_GUI_arrayGetList[SFRA_GUI_cmdPacket[1]]; + SFRA_GUI_dataOut32 = *SFRA_GUI_memDataPtr32; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_cmdPacket[2]; + // + //Note that case 0 rolls into case 1 (no break) + // + case 1: //send LSB + if(SFRA_GUI_wordsLeftToGet > 0) + { + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 2; + } + } + else + { + SFRA_GUI_sendTaskPtr = 0; + SFRA_GUI_taskDoneFlag = 1; + break; + } + + case 2: + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 >> 8 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 3; + } + + case 3: + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 >> 16 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 4; + } + + case 4: + // + // send MSB + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 >> 24 & 0x000000FF); + + SFRA_GUI_memDataPtr32 = SFRA_GUI_memDataPtr32 + 1; + SFRA_GUI_dataOut32 = *SFRA_GUI_memDataPtr32; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_wordsLeftToGet - 1; + SFRA_GUI_sendTaskPtr = 1; + } + break; + default: + break; + } + } + +} + diff --git a/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.h b/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.h new file mode 100644 index 0000000..b4d59ef --- /dev/null +++ b/28379d_P_SFRA/SFRA/sfra_gui_scicomms_driverlib.h @@ -0,0 +1,86 @@ +//########################################################################### +// +// FILE: sfra_gui_scicomms_driverlib.h +// +// TITLE: Comms kernel as an interface to SFRA GUI header file +// +// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX) +// +//############################################################################# +// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $ +// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $ +// $Copyright: +// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/ +// +// ALL RIGHTS RESERVED +// $ +//############################################################################# +#ifndef SFRA_GUI_H +#define SFRA_GUI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "driverlib.h" +#include "device.h" +#include "sfra_f32.h" + +#define SFRA_GUI_PKT_SIZE 6 +#define SFRA_GUI_CMD_NUMBER 16 +#define SFRA_GUI_MAX_CMD_NUM 8 + + +#define SFRA_GUI_PLOT_GH_H 1 +#define SFRA_GUI_PLOT_GH_CL 2 + +// +//! \brief Configures the SFRA_GUI module +//! \param sci_base Base address of the SCI module used by the SFRA GUI +//! \param vbus_clk Frequency of the VBUS, used by the SCI module +//! \param baudrate baudrate used by the SFRA GUI +//! \param scirx_gpio_pin GPIO pin used for SCI_RX +//! \param scirx_gpio_pin_config GPIO pin config used for SCI_RX +//! \param scitx_gpio_pin GPIO pin used for SCI_TX +//! \param scitx_gpio_pin_config GPIO pin config used for SCI_TX +//! \param led_indicator_flag Flag to indicate if LED toggle for SFRA_GUI is +//! enabled, 1 -> Enable , anything else Disable +//! \param led_gpio_pin GPIO pin used for LED, if led_flag_indicator is 1 +//! otherwise pass 0 +//! \param led_gpio_pin_config GPIO pin config value for LED, +//! if led_flag_indicator is 1 otherwise pass 0 +//! \param *sfra Pointer to sfra object +//! \param plot_option used to select what SFRA GUI will plot, +//! 1 - GH & H +//! 2 - CL & H +//! +void SFRA_GUI_config( volatile uint32_t sci_base, + uint32_t vbus_clk, + uint32_t baudrate, + uint16_t scirx_gpio_pin, + uint32_t scirx_gpio_pin_config, + uint16_t scitx_gpio_pin, + uint32_t scitx_gpio_pin_config, + uint16_t led_indicator_flag, + uint16_t led_gpio_pin, + uint32_t led_gpio_pin_config, + SFRA_F32 *sfra, + uint16_t plot_option); + +// +//! \brief Runs the serial host comms GUI , +//! needs to be called at ~100ms for proper function +//! \param *sfra Pointer to sfra object +//! +void SFRA_GUI_runSerialHostComms(SFRA_F32 *sfra); + + + +#ifdef __cplusplus +} +#endif // extern "C" + +#endif // end of SFRA_F32_H definition + + diff --git a/28379d_P_SFRA/c2000.syscfg b/28379d_P_SFRA/c2000.syscfg new file mode 100644 index 0000000..9a68e82 --- /dev/null +++ b/28379d_P_SFRA/c2000.syscfg @@ -0,0 +1,42 @@ +/** + * These arguments were used when this file was generated. They will be automatically applied on subsequent loads + * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. + * @cliArgs --device "F2837xD" --part "F2837xD_176PTP" --package "F2837xD_176PTP" --context "CPU1" --product "C2000WARE@6.00.01.00" + * @v2CliArgs --device "TMS320F28379D" --package "176PTP" --context "CPU1" --product "C2000WARE@6.00.01.00" + * @versions {"tool":"1.27.0+4565"} + */ + +/** + * Import the modules used in this configuration. + */ +const cputimer = scripting.addModule("/driverlib/cputimer.js", {}, false); +const cputimer1 = cputimer.addInstance(); +const gpio = scripting.addModule("/driverlib/gpio.js", {}, false); +const gpio1 = gpio.addInstance(); +const sci = scripting.addModule("/driverlib/sci.js", {}, false); +const sci1 = sci.addInstance(); + +/** + * Write custom configuration values to the imported modules. + */ +const mux6 = system.clockTree["OSCCLKSRCSEL"]; +mux6.inputSelect = "INTOSC1"; + +cputimer1.$name = "myCPUTIMER0"; +cputimer1.timerPeriod = 10000; +cputimer1.enableInterrupt = true; +cputimer1.registerInterrupts = true; +cputimer1.timerInt.enableInterrupt = true; +cputimer1.timerInt.interruptHandler = "TIMER0_ISR"; + +gpio1.direction = "GPIO_DIR_MODE_OUT"; +gpio1.$name = "LED_Blue"; +gpio1.gpioPin.$assign = "GPIO31"; + +sci1.$name = "mySCI0"; +sci1.useInterrupts = false; +sci1.sci.$assign = "SCIA"; +sci1.sci.scirxdPin.$assign = "GPIO43"; +sci1.sci.scitxdPin.$assign = "GPIO42"; +sci1.rxQual.$name = "myGPIOQUAL0"; +sci1.txQual.$name = "myGPIOQUAL1"; diff --git a/28379d_P_SFRA/device/F2837xD_CodeStartBranch.asm b/28379d_P_SFRA/device/F2837xD_CodeStartBranch.asm new file mode 100644 index 0000000..c7c23be --- /dev/null +++ b/28379d_P_SFRA/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-2025 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/28379d_P_SFRA/device/device.c b/28379d_P_SFRA/device/device.c new file mode 100644 index 0000000..fbd6855 --- /dev/null +++ b/28379d_P_SFRA/device/device.c @@ -0,0 +1,706 @@ +//############################################################################# +// +// FILE: device.c +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2025 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/28379d_P_SFRA/device/device.h b/28379d_P_SFRA/device/device.h new file mode 100644 index 0000000..7ec3bb0 --- /dev/null +++ b/28379d_P_SFRA/device/device.h @@ -0,0 +1,395 @@ +//############################################################################# +// +// FILE: device.h +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2025 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" +#include "clocktree.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/28379d_P_SFRA/device/driverlib.h b/28379d_P_SFRA/device/driverlib.h new file mode 100644 index 0000000..5d5985e --- /dev/null +++ b/28379d_P_SFRA/device/driverlib.h @@ -0,0 +1,87 @@ +//############################################################################# +// +// FILE: driverlib.h +// +// TITLE: C28x Driverlib Header File +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2025 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/28379d_P_SFRA/device/driverlib/adc.c b/28379d_P_SFRA/device/driverlib/adc.c new file mode 100644 index 0000000..a4371c1 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/adc.c @@ -0,0 +1,342 @@ +//########################################################################### +// +// FILE: adc.c +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/adc.h b/28379d_P_SFRA/device/driverlib/adc.h new file mode 100644 index 0000000..2e5e442 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/adc.h @@ -0,0 +1,2098 @@ +//########################################################################### +// +// FILE: adc.h +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/asysctl.c b/28379d_P_SFRA/device/driverlib/asysctl.c new file mode 100644 index 0000000..029b5c5 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/asysctl.c @@ -0,0 +1,43 @@ +//########################################################################### +// +// FILE: asysctl.c +// +// TITLE: C28x Driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/asysctl.h b/28379d_P_SFRA/device/driverlib/asysctl.h new file mode 100644 index 0000000..dccba07 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/asysctl.h @@ -0,0 +1,160 @@ +//########################################################################### +// +// FILE: asysctl.h +// +// TITLE: C28x driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/can.c b/28379d_P_SFRA/device/driverlib/can.c new file mode 100644 index 0000000..af33864 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/can.c @@ -0,0 +1,1122 @@ +//########################################################################### +// +// FILE: can.c +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/can.h b/28379d_P_SFRA/device/driverlib/can.h new file mode 100644 index 0000000..9367593 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/can.h @@ -0,0 +1,1924 @@ +//########################################################################### +// +// FILE: can.h +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib.lib b/28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..84fe7d9b9322141d0f7c6f0be6bdc041e6556ec6 GIT binary patch literal 698 zcma)4O-sW-5S`stEm6diJqcUMK|LfUO=AxtRIm^zdg(o1P3S_klBC6(MLgu8i@P^)VjTXaV01Er6YzEQf133@c)qk$0?MaH8^ zk>p_7C{@9#32ax+5@`1qy)GdH>&`*o8E5*z(}Fs{kR3n;D0KFa3cW(kFTHhqjP3Rv zE*i)tI#sexwh8!t-}6iDzM|d8hk20|VT6hQh0s?4_+Gk$e(R5qg%Zpwm5VS(YY3u1 Y)GC$fde1xeF1uIe%0EDEkFh}e0-R-N)&Kwi literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib_coff.lib b/28379d_P_SFRA/device/driverlib/ccs/Debug/driverlib_coff.lib new file mode 100644 index 0000000000000000000000000000000000000000..6294eedf788a6bcc79ed64541ceae6523ee04ca5 GIT binary patch literal 575952 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∨g!$}R1Tl^AOAcb# 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®TsAv6 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

ZTO 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

  • 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⋙5Nbds^RNCZcQ+@WGQAyoaqRm@2*>_hF(MRE* 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

    (c0cXw!5E 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/28379d_P_SFRA/device/driverlib/cla.c b/28379d_P_SFRA/device/driverlib/cla.c new file mode 100644 index 0000000..6f28d7b --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cla.c @@ -0,0 +1,89 @@ +//########################################################################### +// +// FILE: cla.c +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/cla.h b/28379d_P_SFRA/device/driverlib/cla.h new file mode 100644 index 0000000..e4ddc85 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cla.h @@ -0,0 +1,984 @@ +//########################################################################### +// +// FILE: cla.h +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/clb.c b/28379d_P_SFRA/device/driverlib/clb.c new file mode 100644 index 0000000..becb9ab --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/clb.c @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: clb.c +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/clb.h b/28379d_P_SFRA/device/driverlib/clb.h new file mode 100644 index 0000000..e750d19 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/clb.h @@ -0,0 +1,1290 @@ +//########################################################################### +// +// FILE: clb.h +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/cmpss.c b/28379d_P_SFRA/device/driverlib/cmpss.c new file mode 100644 index 0000000..70715c9 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cmpss.c @@ -0,0 +1,223 @@ +//########################################################################### +// +// FILE: cmpss.c +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/cmpss.h b/28379d_P_SFRA/device/driverlib/cmpss.h new file mode 100644 index 0000000..0bc5de3 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cmpss.h @@ -0,0 +1,1325 @@ +//########################################################################### +// +// FILE: cmpss.h +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/cpu.h b/28379d_P_SFRA/device/driverlib/cpu.h new file mode 100644 index 0000000..050e279 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cpu.h @@ -0,0 +1,172 @@ +//########################################################################### +// +// FILE: cpu.h +// +// TITLE: Useful C28x CPU defines. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/cputimer.c b/28379d_P_SFRA/device/driverlib/cputimer.c new file mode 100644 index 0000000..1f68c20 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cputimer.c @@ -0,0 +1,61 @@ +//############################################################################# +// +// FILE: cputimer.c +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/cputimer.h b/28379d_P_SFRA/device/driverlib/cputimer.h new file mode 100644 index 0000000..9fc9c64 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/cputimer.h @@ -0,0 +1,509 @@ +//############################################################################# +// +// FILE: cputimer.h +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/dac.h b/28379d_P_SFRA/device/driverlib/dac.h new file mode 100644 index 0000000..35c082c --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/dac.h @@ -0,0 +1,604 @@ +//########################################################################### +// +// FILE: dac.h +// +// TITLE: C28x DAC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/dcsm.c b/28379d_P_SFRA/device/driverlib/dcsm.c new file mode 100644 index 0000000..03f808a --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/dcsm.c @@ -0,0 +1,377 @@ +//############################################################################# +// +// FILE: dcsm.c +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/dcsm.h b/28379d_P_SFRA/device/driverlib/dcsm.h new file mode 100644 index 0000000..f6d2253 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/dcsm.h @@ -0,0 +1,669 @@ +//############################################################################# +// +// FILE: dcsm.h +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/debug.h b/28379d_P_SFRA/device/driverlib/debug.h new file mode 100644 index 0000000..8696954 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/debug.h @@ -0,0 +1,91 @@ +//########################################################################### +// +// FILE: debug.h +// +// TITLE: Assert definition macro for debug. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/dma.c b/28379d_P_SFRA/device/driverlib/dma.c new file mode 100644 index 0000000..bac3729 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/dma.c @@ -0,0 +1,370 @@ +//########################################################################### +// +// FILE: dma.c +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/dma.h b/28379d_P_SFRA/device/driverlib/dma.h new file mode 100644 index 0000000..7b253b1 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/dma.h @@ -0,0 +1,1171 @@ +//########################################################################### +// +// FILE: dma.h +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/driver_inclusive_terminology_mapping.h b/28379d_P_SFRA/device/driverlib/driver_inclusive_terminology_mapping.h new file mode 100644 index 0000000..00e9ac6 --- /dev/null +++ b/28379d_P_SFRA/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/28379d_P_SFRA/device/driverlib/ecap.c b/28379d_P_SFRA/device/driverlib/ecap.c new file mode 100644 index 0000000..957b0c5 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/ecap.c @@ -0,0 +1,61 @@ +//########################################################################### +// +// FILE: ecap.c +// +// TITLE: C28x ECAP driver +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/ecap.h b/28379d_P_SFRA/device/driverlib/ecap.h new file mode 100644 index 0000000..630c603 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/ecap.h @@ -0,0 +1,1164 @@ +//########################################################################### +// +// FILE: ecap.h +// +// TITLE: C28x ECAP driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/emif.c b/28379d_P_SFRA/device/driverlib/emif.c new file mode 100644 index 0000000..66a4c90 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/emif.c @@ -0,0 +1,46 @@ +//########################################################################### +// +// FILE: emif.c +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/emif.h b/28379d_P_SFRA/device/driverlib/emif.h new file mode 100644 index 0000000..16a85f1 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/emif.h @@ -0,0 +1,1369 @@ +//########################################################################### +// +// FILE: emif.h +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/epwm.c b/28379d_P_SFRA/device/driverlib/epwm.c new file mode 100644 index 0000000..cf1cfcf --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/epwm.c @@ -0,0 +1,363 @@ +//########################################################################### +// +// FILE: epwm.c +// +// TITLE: C28x EPWM driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/epwm.h b/28379d_P_SFRA/device/driverlib/epwm.h new file mode 100644 index 0000000..99605b8 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/epwm.h @@ -0,0 +1,7496 @@ +//############################################################################# +// +// FILE: epwm.h +// +// TITLE: C28x EPWM Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/eqep.c b/28379d_P_SFRA/device/driverlib/eqep.c new file mode 100644 index 0000000..134d52e --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/eqep.c @@ -0,0 +1,149 @@ +//########################################################################### +// +// FILE: eqep.c +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/eqep.h b/28379d_P_SFRA/device/driverlib/eqep.h new file mode 100644 index 0000000..082db20 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/eqep.h @@ -0,0 +1,1691 @@ +//########################################################################### +// +// FILE: eqep.h +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/flash.c b/28379d_P_SFRA/device/driverlib/flash.c new file mode 100644 index 0000000..3d683c2 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/flash.c @@ -0,0 +1,175 @@ +//########################################################################### +// +// FILE: flash.c +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/flash.h b/28379d_P_SFRA/device/driverlib/flash.h new file mode 100644 index 0000000..57ae8c0 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/flash.h @@ -0,0 +1,1671 @@ +//########################################################################### +// +// FILE: flash.h +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/gpio.c b/28379d_P_SFRA/device/driverlib/gpio.c new file mode 100644 index 0000000..6ffe086 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/gpio.c @@ -0,0 +1,489 @@ +//########################################################################### +// +// FILE: gpio.c +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/gpio.h b/28379d_P_SFRA/device/driverlib/gpio.h new file mode 100644 index 0000000..2b1b408 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/gpio.h @@ -0,0 +1,1047 @@ +//########################################################################### +// +// FILE: gpio.h +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/hrpwm.c b/28379d_P_SFRA/device/driverlib/hrpwm.c new file mode 100644 index 0000000..c43107f --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/hrpwm.c @@ -0,0 +1,47 @@ +//########################################################################### +// +// FILE: hrpwm.c +// +// TITLE: C28x HRPWM driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/hrpwm.h b/28379d_P_SFRA/device/driverlib/hrpwm.h new file mode 100644 index 0000000..f1bea62 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/hrpwm.h @@ -0,0 +1,1657 @@ +//############################################################################# +// +// FILE: hrpwm.h +// +// TITLE: C28x HRPWM Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/hw_reg_inclusive_terminology.h b/28379d_P_SFRA/device/driverlib/hw_reg_inclusive_terminology.h new file mode 100644 index 0000000..d3dc018 --- /dev/null +++ b/28379d_P_SFRA/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/28379d_P_SFRA/device/driverlib/i2c.c b/28379d_P_SFRA/device/driverlib/i2c.c new file mode 100644 index 0000000..b6bc156 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/i2c.c @@ -0,0 +1,351 @@ +//########################################################################### +// +// FILE: i2c.c +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/i2c.h b/28379d_P_SFRA/device/driverlib/i2c.h new file mode 100644 index 0000000..46fa0b7 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/i2c.h @@ -0,0 +1,1386 @@ +//########################################################################### +// +// FILE: i2c.h +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_adc.h b/28379d_P_SFRA/device/driverlib/inc/hw_adc.h new file mode 100644 index 0000000..8d1578a --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_adc.h @@ -0,0 +1,911 @@ +//########################################################################### +// +// FILE: hw_adc.h +// +// TITLE: Definitions for the ADC registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_asysctl.h b/28379d_P_SFRA/device/driverlib/inc/hw_asysctl.h new file mode 100644 index 0000000..25ee807 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_asysctl.h @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: hw_asysctl.h +// +// TITLE: Definitions for the ASYSCTL registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_can.h b/28379d_P_SFRA/device/driverlib/inc/hw_can.h new file mode 100644 index 0000000..9b05495 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_can.h @@ -0,0 +1,514 @@ +//########################################################################### +// +// FILE: hw_can.h +// +// TITLE: Definitions for the CAN registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_cla.h b/28379d_P_SFRA/device/driverlib/inc/hw_cla.h new file mode 100644 index 0000000..3d90a64 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_cla.h @@ -0,0 +1,241 @@ +//########################################################################### +// +// FILE: hw_cla.h +// +// TITLE: Definitions for the CLA registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_clb.h b/28379d_P_SFRA/device/driverlib/inc/hw_clb.h new file mode 100644 index 0000000..f362bc9 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_clb.h @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: hw_clb.h +// +// TITLE: Definitions for the CLB registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_clbxbar.h b/28379d_P_SFRA/device/driverlib/inc/hw_clbxbar.h new file mode 100644 index 0000000..8518d84 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_clbxbar.h @@ -0,0 +1,1272 @@ +//########################################################################### +// +// FILE: hw_clbxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_cmpss.h b/28379d_P_SFRA/device/driverlib/inc/hw_cmpss.h new file mode 100644 index 0000000..46ae283 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_cmpss.h @@ -0,0 +1,235 @@ +//########################################################################### +// +// FILE: hw_cmpss.h +// +// TITLE: Definitions for the CMPSS registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_cputimer.h b/28379d_P_SFRA/device/driverlib/inc/hw_cputimer.h new file mode 100644 index 0000000..577a7b8 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_cputimer.h @@ -0,0 +1,112 @@ +//########################################################################### +// +// FILE: hw_cputimer.h +// +// TITLE: Definitions for the CPUTIMER registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_dac.h b/28379d_P_SFRA/device/driverlib/inc/hw_dac.h new file mode 100644 index 0000000..a43d0ce --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_dac.h @@ -0,0 +1,122 @@ +//########################################################################### +// +// FILE: hw_dac.h +// +// TITLE: Definitions for the DAC registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_dcsm.h b/28379d_P_SFRA/device/driverlib/inc/hw_dcsm.h new file mode 100644 index 0000000..df618e4 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_dcsm.h @@ -0,0 +1,442 @@ +//########################################################################### +// +// FILE: hw_dcsm.h +// +// TITLE: Definitions for the DCSM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_dma.h b/28379d_P_SFRA/device/driverlib/inc/hw_dma.h new file mode 100644 index 0000000..63d1d1e --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_dma.h @@ -0,0 +1,165 @@ +//########################################################################### +// +// FILE: hw_dma.h +// +// TITLE: Definitions for the DMA registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_ecap.h b/28379d_P_SFRA/device/driverlib/inc/hw_ecap.h new file mode 100644 index 0000000..2b624bb --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_ecap.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_ecap.h +// +// TITLE: Definitions for the ECAP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_emif.h b/28379d_P_SFRA/device/driverlib/inc/hw_emif.h new file mode 100644 index 0000000..b3f57f9 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_emif.h @@ -0,0 +1,259 @@ +//########################################################################### +// +// FILE: hw_emif.h +// +// TITLE: Definitions for the EMIF registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_epwm.h b/28379d_P_SFRA/device/driverlib/inc/hw_epwm.h new file mode 100644 index 0000000..89347dc --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_epwm.h @@ -0,0 +1,1050 @@ +//########################################################################### +// +// FILE: hw_epwm.h +// +// TITLE: Definitions for the EPWM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_epwmxbar.h b/28379d_P_SFRA/device/driverlib/inc/hw_epwmxbar.h new file mode 100644 index 0000000..d3dd068 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_epwmxbar.h @@ -0,0 +1,1192 @@ +//########################################################################### +// +// FILE: hw_epwmxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_eqep.h b/28379d_P_SFRA/device/driverlib/inc/hw_eqep.h new file mode 100644 index 0000000..bb82497 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_eqep.h @@ -0,0 +1,225 @@ +//########################################################################### +// +// FILE: hw_eqep.h +// +// TITLE: Definitions for the EQEP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_flash.h b/28379d_P_SFRA/device/driverlib/inc/hw_flash.h new file mode 100644 index 0000000..99b3cf0 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_flash.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_flash.h +// +// TITLE: Definitions for the FLASH registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_gpio.h b/28379d_P_SFRA/device/driverlib/inc/hw_gpio.h new file mode 100644 index 0000000..df5a00b --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_gpio.h @@ -0,0 +1,4018 @@ +//########################################################################### +// +// FILE: hw_gpio.h +// +// TITLE: Definitions for the GPIO registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_hic.h b/28379d_P_SFRA/device/driverlib/inc/hw_hic.h new file mode 100644 index 0000000..9e3e0fb --- /dev/null +++ b/28379d_P_SFRA/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 v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_hrpwm.h b/28379d_P_SFRA/device/driverlib/inc/hw_hrpwm.h new file mode 100644 index 0000000..9850368 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_hrpwm.h @@ -0,0 +1,1058 @@ +//########################################################################### +// +// FILE: hw_hrpwm.h +// +// TITLE: Definitions for the HRPWM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_i2c.h b/28379d_P_SFRA/device/driverlib/inc/hw_i2c.h new file mode 100644 index 0000000..e228836 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_i2c.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_i2c.h +// +// TITLE: Definitions for the I2C registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_inputxbar.h b/28379d_P_SFRA/device/driverlib/inc/hw_inputxbar.h new file mode 100644 index 0000000..14785ea --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_inputxbar.h @@ -0,0 +1,92 @@ +//########################################################################### +// +// FILE: hw_inputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_ints.h b/28379d_P_SFRA/device/driverlib/inc/hw_ints.h new file mode 100644 index 0000000..d49c58d --- /dev/null +++ b/28379d_P_SFRA/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/28379d_P_SFRA/device/driverlib/inc/hw_ipc.h b/28379d_P_SFRA/device/driverlib/inc/hw_ipc.h new file mode 100644 index 0000000..b80b187 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_ipc.h @@ -0,0 +1,323 @@ +//########################################################################### +// +// FILE: hw_ipc.h +// +// TITLE: Definitions for the IPC registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_mcbsp.h b/28379d_P_SFRA/device/driverlib/inc/hw_mcbsp.h new file mode 100644 index 0000000..4598bc2 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_mcbsp.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_mcbsp.h +// +// TITLE: Definitions for the MCBSP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_memcfg.h b/28379d_P_SFRA/device/driverlib/inc/hw_memcfg.h new file mode 100644 index 0000000..4673bcd --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_memcfg.h @@ -0,0 +1,870 @@ +//########################################################################### +// +// FILE: hw_memcfg.h +// +// TITLE: Definitions for the MEMCFG registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_memmap.h b/28379d_P_SFRA/device/driverlib/inc/hw_memmap.h new file mode 100644 index 0000000..45bfd0d --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_memmap.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_memmap.h +// +// TITLE: Macros defining the memory map of the C28x. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_nmi.h b/28379d_P_SFRA/device/driverlib/inc/hw_nmi.h new file mode 100644 index 0000000..4afb13a --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_nmi.h @@ -0,0 +1,134 @@ +//########################################################################### +// +// FILE: hw_nmi.h +// +// TITLE: Definitions for the NMI registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_otp.h b/28379d_P_SFRA/device/driverlib/inc/hw_otp.h new file mode 100644 index 0000000..c0721f4 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_otp.h @@ -0,0 +1,63 @@ +//########################################################################### +// +// FILE: hw_otp.h +// +// TITLE: Definitions for the OTP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_outputxbar.h b/28379d_P_SFRA/device/driverlib/inc/hw_outputxbar.h new file mode 100644 index 0000000..7d54b0a --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_outputxbar.h @@ -0,0 +1,1340 @@ +//########################################################################### +// +// FILE: hw_outputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_pie.h b/28379d_P_SFRA/device/driverlib/inc/hw_pie.h new file mode 100644 index 0000000..e7fdc30 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_pie.h @@ -0,0 +1,636 @@ +//########################################################################### +// +// FILE: hw_pie.h +// +// TITLE: Definitions for the PIE registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_sci.h b/28379d_P_SFRA/device/driverlib/inc/hw_sci.h new file mode 100644 index 0000000..e418165 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_sci.h @@ -0,0 +1,209 @@ +//########################################################################### +// +// FILE: hw_sci.h +// +// TITLE: Definitions for the SCI registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_sdfm.h b/28379d_P_SFRA/device/driverlib/inc/hw_sdfm.h new file mode 100644 index 0000000..1008154 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_sdfm.h @@ -0,0 +1,431 @@ +//########################################################################### +// +// FILE: hw_sdfm.h +// +// TITLE: Definitions for the SDFM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_spi.h b/28379d_P_SFRA/device/driverlib/inc/hw_spi.h new file mode 100644 index 0000000..399ea31 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_spi.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_spi.h +// +// TITLE: Definitions for the SPI registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_sysctl.h b/28379d_P_SFRA/device/driverlib/inc/hw_sysctl.h new file mode 100644 index 0000000..3a2ca40 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_sysctl.h @@ -0,0 +1,1428 @@ +//########################################################################### +// +// FILE: hw_sysctl.h +// +// TITLE: Definitions for the SYSCTL registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_types.h b/28379d_P_SFRA/device/driverlib/inc/hw_types.h new file mode 100644 index 0000000..3fb031a --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_types.h @@ -0,0 +1,166 @@ +//########################################################################### +// +// FILE: hw_types.h +// +// TITLE: Type definitions used in driverlib functions. +// +//########################################################################### +// +// C2000Ware v6.00.01.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((int16_t *)(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/28379d_P_SFRA/device/driverlib/inc/hw_upp.h b/28379d_P_SFRA/device/driverlib/inc/hw_upp.h new file mode 100644 index 0000000..1a735d6 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_upp.h @@ -0,0 +1,306 @@ +//########################################################################### +// +// FILE: hw_upp.h +// +// TITLE: Definitions for the UPP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_usb.h b/28379d_P_SFRA/device/driverlib/inc/hw_usb.h new file mode 100644 index 0000000..653f599 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_usb.h @@ -0,0 +1,4614 @@ +//########################################################################### +// +// FILE: hw_usb.h +// +// TITLE: Definitions for the USB registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_xbar.h b/28379d_P_SFRA/device/driverlib/inc/hw_xbar.h new file mode 100644 index 0000000..ca276e9 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_xbar.h @@ -0,0 +1,271 @@ +//########################################################################### +// +// FILE: hw_xbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/inc/hw_xint.h b/28379d_P_SFRA/device/driverlib/inc/hw_xint.h new file mode 100644 index 0000000..bab3b4e --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/inc/hw_xint.h @@ -0,0 +1,108 @@ +//########################################################################### +// +// FILE: hw_xint.h +// +// TITLE: Definitions for the XINT registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/interrupt.c b/28379d_P_SFRA/device/driverlib/interrupt.c new file mode 100644 index 0000000..aa41a92 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/interrupt.c @@ -0,0 +1,425 @@ +//########################################################################### +// +// FILE: interrupt.c +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/interrupt.h b/28379d_P_SFRA/device/driverlib/interrupt.h new file mode 100644 index 0000000..78760f7 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/interrupt.h @@ -0,0 +1,504 @@ +//########################################################################### +// +// FILE: interrupt.h +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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); + +//***************************************************************************** +// +// Extern compiler intrinsic prototypes. See compiler User's Guide for details. +// +//***************************************************************************** +extern uint16_t __disable_interrupts(void); +extern uint16_t __enable_interrupts(void); + +//***************************************************************************** +// +// 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/28379d_P_SFRA/device/driverlib/ipc.c b/28379d_P_SFRA/device/driverlib/ipc.c new file mode 100644 index 0000000..b6509d1 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/ipc.c @@ -0,0 +1,445 @@ +//########################################################################### +// +// FILE: ipc.c +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/ipc.h b/28379d_P_SFRA/device/driverlib/ipc.h new file mode 100644 index 0000000..5e95212 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/ipc.h @@ -0,0 +1,880 @@ +//########################################################################### +// +// FILE: ipc.h +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/mcbsp.c b/28379d_P_SFRA/device/driverlib/mcbsp.c new file mode 100644 index 0000000..0c10160 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/mcbsp.c @@ -0,0 +1,1621 @@ +//########################################################################### +// +// FILE: mcbsp.c +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/mcbsp.h b/28379d_P_SFRA/device/driverlib/mcbsp.h new file mode 100644 index 0000000..e003224 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/mcbsp.h @@ -0,0 +1,3340 @@ +//########################################################################### +// +// FILE: mcbsp.h +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/memcfg.c b/28379d_P_SFRA/device/driverlib/memcfg.c new file mode 100644 index 0000000..a9fa1a7 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/memcfg.c @@ -0,0 +1,701 @@ +//########################################################################### +// +// FILE: memcfg.c +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/memcfg.h b/28379d_P_SFRA/device/driverlib/memcfg.h new file mode 100644 index 0000000..b5185f9 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/memcfg.h @@ -0,0 +1,1266 @@ +//########################################################################### +// +// FILE: memcfg.h +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/pin_map.h b/28379d_P_SFRA/device/driverlib/pin_map.h new file mode 100644 index 0000000..884f3f8 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/pin_map.h @@ -0,0 +1,894 @@ +//########################################################################### +// +// FILE: pin_map.h +// +// TITLE: Definitions of pin mux info for gpio.c. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/pin_map_legacy.h b/28379d_P_SFRA/device/driverlib/pin_map_legacy.h new file mode 100644 index 0000000..2ae6218 --- /dev/null +++ b/28379d_P_SFRA/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 v6.00.01.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/28379d_P_SFRA/device/driverlib/sci.c b/28379d_P_SFRA/device/driverlib/sci.c new file mode 100644 index 0000000..2458227 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/sci.c @@ -0,0 +1,421 @@ +//########################################################################### +// +// FILE: sci.c +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/sci.h b/28379d_P_SFRA/device/driverlib/sci.h new file mode 100644 index 0000000..27013e5 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/sci.h @@ -0,0 +1,1646 @@ +//########################################################################### +// +// FILE: sci.h +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/sdfm.c b/28379d_P_SFRA/device/driverlib/sdfm.c new file mode 100644 index 0000000..b7a28b8 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/sdfm.c @@ -0,0 +1,188 @@ +//########################################################################### +// +// FILE: sdfm.c +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/sdfm.h b/28379d_P_SFRA/device/driverlib/sdfm.h new file mode 100644 index 0000000..dd7139c --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/sdfm.h @@ -0,0 +1,1178 @@ +//########################################################################### +// +// FILE: sdfm.h +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/spi.c b/28379d_P_SFRA/device/driverlib/spi.c new file mode 100644 index 0000000..910152a --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/spi.c @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: spi.c +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/spi.h b/28379d_P_SFRA/device/driverlib/spi.h new file mode 100644 index 0000000..2dfbce5 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/spi.h @@ -0,0 +1,1743 @@ +//########################################################################### +// +// FILE: spi.h +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/sysctl.c b/28379d_P_SFRA/device/driverlib/sysctl.c new file mode 100644 index 0000000..25dd980 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/sysctl.c @@ -0,0 +1,1469 @@ +//########################################################################### +// +// FILE: sysctl.c +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/sysctl.h b/28379d_P_SFRA/device/driverlib/sysctl.h new file mode 100644 index 0000000..39ffbcc --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/sysctl.h @@ -0,0 +1,3531 @@ +//########################################################################### +// +// FILE: sysctl.h +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/upp.c b/28379d_P_SFRA/device/driverlib/upp.c new file mode 100644 index 0000000..72a1e1b --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/upp.c @@ -0,0 +1,298 @@ +//########################################################################### +// +// FILE: upp.c +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/upp.h b/28379d_P_SFRA/device/driverlib/upp.h new file mode 100644 index 0000000..2337868 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/upp.h @@ -0,0 +1,1574 @@ +//########################################################################### +// +// FILE: upp.h +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/usb.h b/28379d_P_SFRA/device/driverlib/usb.h new file mode 100644 index 0000000..7d5f908 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/usb.h @@ -0,0 +1,560 @@ +//########################################################################### +// +// FILE: usb.h +// +// TITLE: Prototypes for the USB Interface Driver. +// +//########################################################################### +// +// +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/version.c b/28379d_P_SFRA/device/driverlib/version.c new file mode 100644 index 0000000..f6490af --- /dev/null +++ b/28379d_P_SFRA/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 v6.00.01.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/28379d_P_SFRA/device/driverlib/version.h b/28379d_P_SFRA/device/driverlib/version.h new file mode 100644 index 0000000..9be429c --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/version.h @@ -0,0 +1,100 @@ +//########################################################################### +// +// FILE: version.h +// +// TITLE: API to return the version number of the driverlib.lib in use. +// +//########################################################################### +// +// C2000Ware v6.00.01.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 6000100U + +//***************************************************************************** +// +//! 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 x.xx.xx.xx, so for +//! example, if the function returns 2100200, the driverlib version being used +//! is 2.10.02.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/28379d_P_SFRA/device/driverlib/xbar.c b/28379d_P_SFRA/device/driverlib/xbar.c new file mode 100644 index 0000000..f6b5a9c --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/xbar.c @@ -0,0 +1,255 @@ +//########################################################################### +// +// FILE: xbar.c +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/device/driverlib/xbar.h b/28379d_P_SFRA/device/driverlib/xbar.h new file mode 100644 index 0000000..fc8b4f9 --- /dev/null +++ b/28379d_P_SFRA/device/driverlib/xbar.h @@ -0,0 +1,1294 @@ +//########################################################################### +// +// FILE: xbar.h +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_P_SFRA/lowpass.h b/28379d_P_SFRA/lowpass.h new file mode 100644 index 0000000..75256dc --- /dev/null +++ b/28379d_P_SFRA/lowpass.h @@ -0,0 +1,46 @@ +#ifndef LOWPASS_H +#define LOWPASS_H + +#include + +// 一阶低通滤波器结构体 +typedef struct { + float b0, b1; // 分子系数 + float a1; // 分母系数 (a0 归一化为 1) + float x1; // 上一个输入样本 + float y1; // 上一个输出样本 +} LowPassFilter_t; + +/** + * 初始化低通滤波器 + * @param f 滤波器结构体指针 + * @param fs 采样频率 (Hz) + * @param fc 截止频率 (-3dB 频率) (Hz) + */ +static inline void LowPassFilter_Init(LowPassFilter_t *f, float fs, float fc) { + // 预畸变角频率: w = 2 * pi * fc / fs, 然后 tan(w/2) + float wc = 2.0f * M_PI * fc / fs; + float tan_wc2 = tanf(wc * 0.5f); + float den = 1.0f + tan_wc2; + f->b0 = tan_wc2 / den; + f->b1 = f->b0; + f->a1 = (tan_wc2 - 1.0f) / den; + f->x1 = 0.0f; + f->y1 = 0.0f; +} + +/** + * 运行低通滤波器 + * @param f 滤波器结构体指针 + * @param x 当前输入样本 + * @return 滤波后的输出 + */ +static inline float LowPassFilter_Run(LowPassFilter_t *f, float x) { + // y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1] + float y = f->b0 * x + f->b1 * f->x1 - f->a1 * f->y1; + f->x1 = x; + f->y1 = y; + return y; +} + +#endif // LOWPASS_H diff --git a/28379d_P_SFRA/main.c b/28379d_P_SFRA/main.c new file mode 100644 index 0000000..029e692 --- /dev/null +++ b/28379d_P_SFRA/main.c @@ -0,0 +1,105 @@ +//############################################################################# +// +// FILE: empty_driverlib_main.c +// +// TITLE: Empty Project +// +// Empty Project Example +// +// This example is an empty project setup for Driverlib development. +// +//############################################################################# +// +// +// $Copyright: +// Copyright (C) 2013-2025 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" +#include "device.h" +#include "board.h" +#include "c2000ware_libraries.h" + +#include "sfra_test.h" +// +// Main +// +void main(void) +{ + + // + // Initialize device clock and peripherals + // + Device_init(); + + // + // Disable pin locks and enable internal pull-ups. + // + Device_initGPIO(); + + // + // Initialize PIE and clear PIE registers. Disables CPU interrupts. + // + Interrupt_initModule(); + + // + // Initialize the PIE vector table with pointers to the shell Interrupt + // Service Routines (ISR). + // + Interrupt_initVectorTable(); + + // + // PinMux and Peripheral Initialization + // + Board_init(); + + sfra_init(); + + // + // Enable Global Interrupt (INTM) and real time interrupt (DBGM) + // + EINT; + ERTM; + + while(1) + { + sfra_task_run(); + } +} + + +// +// End of File +// diff --git a/28379d_P_SFRA/sfra_test.c b/28379d_P_SFRA/sfra_test.c new file mode 100644 index 0000000..1b6a319 --- /dev/null +++ b/28379d_P_SFRA/sfra_test.c @@ -0,0 +1,124 @@ +#include "sfra_f32.h" +#include "sfra_test.h" +#include "lowpass.h" +#include "sfra_gui_scicomms_driverlib.h" +#include + + + +// sfra变量定义 +SFRA_F32 ti_sfra; + +#define CONTROL_ISR_FREQUENCY ((float32_t)100 * 1000) // 100KHz + +#define SFRA_ISR_FREQ CONTROL_ISR_FREQUENCY +#define SFRA_FREQ_START 10 +// +// SFRA step Multiply = 10^(1/No of steps per decade(40)) +// +#define SFRA_FREQ_STEP_MULTIPLY (float32_t)1.105 +#define SFRA_AMPLITUDE (float32_t)0.1 +#define SFRA_FREQ_LENGTH 100 + +float32_t plantMagVect[SFRA_FREQ_LENGTH]; +float32_t plantPhaseVect[SFRA_FREQ_LENGTH]; +float32_t olMagVect[SFRA_FREQ_LENGTH]; +float32_t olPhaseVect[SFRA_FREQ_LENGTH]; +float32_t clMagVect[SFRA_FREQ_LENGTH]; +float32_t clPhaseVect[SFRA_FREQ_LENGTH]; +float32_t freqVect[SFRA_FREQ_LENGTH]; + + +// 通信串口,LED +#define SFRA_GUI_SCI_BASE SCIA_BASE +#define SFRA_GUI_VBUS_CLK DEVICE_LSPCLK_FREQ +#define SFRA_GUI_SCI_BAUDRATE 115200 +#define SFRA_GUI_SCIRX_GPIO 43 +#define SFRA_GUI_SCITX_GPIO 42 +#define SFRA_GUI_SCIRX_GPIO_PIN_CONFIG GPIO_43_SCIRXDA +#define SFRA_GUI_SCITX_GPIO_PIN_CONFIG GPIO_42_SCITXDA + +#define SFRA_GUI_LED_INDICATOR 1 +#define SFRA_GUI_LED_GPIO 31 +#define SFRA_GUI_LED_GPIO_PIN_CONFIG GPIO_31_GPIO31 + + + +// lowpass filter +LowPassFilter_t lowPass_test; +#define FS CONTROL_ISR_FREQUENCY +#define FC 10.0f * 1000 + + +void sfra_init() +{ + CPUTimer_setPeriod(CPUTIMER0_BASE, + (DEVICE_SYSCLK_FREQ / CONTROL_ISR_FREQUENCY) - 1); + CPUTimer_startTimer(CPUTIMER0_BASE); + + LowPassFilter_Init(&lowPass_test, FS, FC); + + + SFRA_F32_reset(&ti_sfra); + SFRA_F32_config(&ti_sfra, + SFRA_ISR_FREQ, + SFRA_AMPLITUDE, + SFRA_FREQ_LENGTH, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY, + plantMagVect, + plantPhaseVect, + olMagVect, + olPhaseVect, + clMagVect, + clPhaseVect, + freqVect, + 1); + SFRA_F32_resetFreqRespArray(&ti_sfra); + SFRA_F32_initFreqArrayWithLogSteps(&ti_sfra, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY); + SFRA_GUI_config(SFRA_GUI_SCI_BASE, + SFRA_GUI_VBUS_CLK, + SFRA_GUI_SCI_BAUDRATE, + SFRA_GUI_SCIRX_GPIO, + SFRA_GUI_SCIRX_GPIO_PIN_CONFIG, + SFRA_GUI_SCITX_GPIO, + SFRA_GUI_SCITX_GPIO_PIN_CONFIG, + SFRA_GUI_LED_INDICATOR, + SFRA_GUI_LED_GPIO, + SFRA_GUI_LED_GPIO_PIN_CONFIG, + &ti_sfra, + SFRA_GUI_PLOT_GH_CL); + +} + + +void sfra_task_run() +{ + DEVICE_DELAY_US(1.0f *1000); + + SFRA_F32_runBackgroundTask(&ti_sfra); + SFRA_GUI_runSerialHostComms(&ti_sfra); + +} + +__interrupt void TIMER0_ISR() +{ + static float32_t input_dc = 0.8f; + float32_t plant_input; + float32_t plant_output; + + plant_input = SFRA_F32_inject(input_dc); + + + // 直通,用于测试SFRA,plant扫描结果应为0°,0db + // plant_output = plant_input; + + // 注入扫描lowpass + plant_output = LowPassFilter_Run(&lowPass_test, plant_input); + + SFRA_F32_collect(&plant_input, &plant_output); + + Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); +} diff --git a/28379d_P_SFRA/sfra_test.h b/28379d_P_SFRA/sfra_test.h new file mode 100644 index 0000000..4c90149 --- /dev/null +++ b/28379d_P_SFRA/sfra_test.h @@ -0,0 +1,12 @@ +#ifndef _SFRA_TEST_H_ +#define _SFRA_TEST_H_ + +#include "driverlib.h" +#include "device.h" +#include "board.h" + + +void sfra_init(void); +void sfra_task_run(void); + +#endif diff --git a/28379d_P_SFRA/targetConfigs/TMS320F28377D.ccxml b/28379d_P_SFRA/targetConfigs/TMS320F28377D.ccxml new file mode 100644 index 0000000..79dd5cc --- /dev/null +++ b/28379d_P_SFRA/targetConfigs/TMS320F28377D.ccxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/28379d_P_SFRA/targetConfigs/readme.txt b/28379d_P_SFRA/targetConfigs/readme.txt new file mode 100644 index 0000000..d783fef --- /dev/null +++ b/28379d_P_SFRA/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/28379d_test_SFRA/.ccsproject b/28379d_test_SFRA/.ccsproject new file mode 100644 index 0000000..6936707 --- /dev/null +++ b/28379d_test_SFRA/.ccsproject @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/28379d_test_SFRA/.clangd b/28379d_test_SFRA/.clangd new file mode 100644 index 0000000..a8a6d76 --- /dev/null +++ b/28379d_test_SFRA/.clangd @@ -0,0 +1,8 @@ +# This is an auto-generated file - do not add it to source-control + +CompileFlags: + CompilationDatabase: CPU1_FLASH/.clangd + +Diagnostics: + Suppress: '*' + diff --git a/28379d_test_SFRA/.cproject b/28379d_test_SFRA/.cproject new file mode 100644 index 0000000..5a36a51 --- /dev/null +++ b/28379d_test_SFRA/.cproject @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/28379d_test_SFRA/.project b/28379d_test_SFRA/.project new file mode 100644 index 0000000..1d5c020 --- /dev/null +++ b/28379d_test_SFRA/.project @@ -0,0 +1,37 @@ + + + 28379d_test_SFRA + + + + + + 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 + + + C2000WARE_ROOT + $%7BCOM_TI_C2000WARE_INSTALL_DIR%7D + + + diff --git a/28379d_test_SFRA/.settings/org.eclipse.cdt.codan.core.prefs b/28379d_test_SFRA/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..f653028 --- /dev/null +++ b/28379d_test_SFRA/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/28379d_test_SFRA/.settings/org.eclipse.core.resources.prefs b/28379d_test_SFRA/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..2972fa4 --- /dev/null +++ b/28379d_test_SFRA/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +encoding//CPU1_FLASH/LIBSFAR/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/LIBSFAR/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/LIBSFRA/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/LIBSFRA/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/SFRA/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/SFRA/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/device/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/device/subdir_vars.mk=UTF-8 +encoding//CPU1_FLASH/makefile=UTF-8 +encoding//CPU1_FLASH/objects.mk=UTF-8 +encoding//CPU1_FLASH/sources.mk=UTF-8 +encoding//CPU1_FLASH/subdir_rules.mk=UTF-8 +encoding//CPU1_FLASH/subdir_vars.mk=UTF-8 +encoding/=UTF-8 diff --git a/28379d_test_SFRA/.theia/launch.json b/28379d_test_SFRA/.theia/launch.json new file mode 100644 index 0000000..c927c50 --- /dev/null +++ b/28379d_test_SFRA/.theia/launch.json @@ -0,0 +1,49 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "28379d", + "type": "ccs-debug", + "request": "launch", + "projectInfo": { + "name": "28379d", + "resourceId": "/28379d" + }, + "connections": [ + { + "name": "Texas Instruments XDS100v2 USB Debug Probe_0", + "cores": [ + { + "name": "C28xx_CPU1", + "debuggerSettings": { + "data": "\n\n" + } + } + ] + } + ] + }, + { + "name": "28379d_test_SFRA", + "type": "ccs-debug", + "request": "launch", + "projectInfo": { + "name": "28379d_test_SFRA", + "resourceId": "/28379d_test_SFRA" + }, + "connections": [ + { + "name": "Texas Instruments XDS100v2 USB Debug Probe_0", + "cores": [ + { + "name": "C28xx_CPU1", + "debuggerSettings": { + "data": "\n\n" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/28379d_test_SFRA/2837xD_FLASH_lnk_cpu1.cmd b/28379d_test_SFRA/2837xD_FLASH_lnk_cpu1.cmd new file mode 100644 index 0000000..c8635b9 --- /dev/null +++ b/28379d_test_SFRA/2837xD_FLASH_lnk_cpu1.cmd @@ -0,0 +1,182 @@ + +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) + .cinit : > FLASHC PAGE = 0, ALIGN(8) // 原为 FLASHB,改为 FLASHC + .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 为多个 RAM 区域,扩大容量 + .bss : > RAMLS5 | RAMGS0 | RAMGS1, 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 + + // 添加 SFRA 库需要的段 + // SFRA_F32_Data : > RAMGS0, PAGE = 1 + + 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/28379d_test_SFRA/2837xD_RAM_lnk_cpu1.cmd b/28379d_test_SFRA/2837xD_RAM_lnk_cpu1.cmd new file mode 100644 index 0000000..5d5167a --- /dev/null +++ b/28379d_test_SFRA/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/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_defs.h.39F345F2FD66E401.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_defs.h.39F345F2FD66E401.idx new file mode 100644 index 0000000000000000000000000000000000000000..12f8f460b23030680995f65b05e760f0b9f32507 GIT binary patch literal 5788 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 W8ku%2otjk;6m!sLV3%i;Nc10xonQI@ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.415269F042D2A201.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint.h.415269F042D2A201.idx new file mode 100644 index 0000000000000000000000000000000000000000..8753927ccfdadaf8d801bfa1999cffa9f29aba10 GIT binary patch literal 1486 zcmYL|e@s(X6vuBX%&V7a=xZaC%9==#f%H9Ui=;S*GbLJ)G9OZ;7{pSrrawsEV}ZC$ zahlOaPaQ4?c~e`t(9mbtiP=f3W|*QDp%eEL1# z-h0ovE0@*RU(F?CN!POeWK8YMA%qCAx5$TR6Vt!E+m-t0B zE=Hq@NAgKLi)uQZP{e3D*$a{k{8}09Q7fY!Ns>A|K6h1>TXHuv%VIngP4soeL}fq` zJJ6VbeN}ab%JY0rHdlMIxh9*Eo&DKGubP2HA6D>%R>Bur4PWpgp0ibal`T^SlIw;| zgsctk$+>m!WC0`72{8w(0f!dIH0{79Q|`sB-o5F8^F@s0fxs{L?OHGdKaCc>Jt&`^ z!w3aI$Qp8J!4ME<&C@5+>v@dK0D)|ii?v_~T8o9}cMs)-8JP-#ur=(^f+0BZcZb&VpBkneDq3Mi>Z!)}TWRhTz)K zKU)6!`q~g9AA%raixg|Y5UA~mh0iOheq#it#OxKkb}bl!QrFPP-0)`;j7$MRxlnG` zf+6^4(zfQ8&xal|@&O1+EF}e6Fa()cx8j2018rZmdCvSvOnK%24Op;60r!jJskP^F z0E<-2$1^83uU9u6r@4TGG-$z--m_h}U3NW}0S?o!1@9QmOw+S{&JH%gE(7K*{+|-; zEnwbQ#Mn{5yq$<2Onz^h<@>!Fa1(9PP5!>K$9wp6Pb2K4j@DVQnJwS^+aTW@Z31;O zZ7xESVfVLJoXW2&0oT)d-30d!m=6f5(F`yj3&dslbH>u!Yg^$jWhx7}-y6-o!jp{~ z+dy4GD+*DKHwl=J4q~N@z5jUEmvJx&(U1l2;(p9(56EF4V<8bAT-{_e41=|AZT3V}{Y#VGT-Pd2T4e)Zh zT;CwhEMPvc=>3U2_~Q)w(;oo)s82U}_vmG#yko^~!0ohMzwf@Ko8LR_XZOQSA~YhP zC+-N;eAdx>GUZxzY{Tqvz)tF%g*enbcBzN;a_pk60>qamB72{$ViSN{X{&C6R|c3r z6IA2-0L&i;;^dLh%8MIE-T+=q7wc-0i6uI@M#)6sS;LDmA2oeCK6q@npOF6m%EMU5 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint40.h.7C423B932F3FDFD8.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_stdint40.h.7C423B932F3FDFD8.idx new file mode 100644 index 0000000000000000000000000000000000000000..2fb86fe16610e385ffd6c8ac6e6a7889cf504845 GIT binary patch literal 242 zcmWIYbaQ*fz`)>~;#rZKT9U{DWD5gvaY<2TG>`^^w9K4TD}8-^XDj`ZO#S5KVj}}n z0}!oWlAoVbte>2pTL4s21eDcHPA}0-HZm|Uh&M9TGc?pQ(DMli*3ZmK&M8ev)sHVO zNy*GBF)`4~0NPQRn*=hyC^fCv3rPRyee*qA$WoV?hf$qDT?}kBklpNTNmt^WECl?zTm>Pg+{gV9roMQdt z{M-Vdk|Ln2ZgP5wZZgo52JuFwdWMF226{dr!TOnb$vLGdsrsN0$xGMEprVl#5Vz{b z!_CgjD`9|nfC1toP*f!6=j6oafLIl2MY%v0LvdwpQamtf44IGXM76~R@-Xm#ql$rn zL!VWjkAahgiIJ0y;c#R~vo4$0E*=J6n6v?hfgl4XD>DN(8zVcbpyZ2XPIa+|xEZ*B zS`{P}6u|@oCscV+YFhD4Ap2gsfOp_oPa#Gg4h4P%ahSG`Y)Pvelbd9ic{ud>^+lkX z7=S!keI*3XK*~TK#)G+-krU!lsQA>>fTsD%JEIu6IJ7vlq+qJUP4@Q+T9vc`h2=Tq zC1Juae*p~v`v)oxa~3lf#1~LupmVhKjbRq^Z~&v&0%ih3QEE;iNL_JJaxpiMX5yI2 NZ1Q`R(sW>m0RYfP#3uj% literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_ti_config.h.EAEED0DE25AF55A1.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_ti_config.h.EAEED0DE25AF55A1.idx new file mode 100644 index 0000000000000000000000000000000000000000..113bed16282427d81e3cd2c59dd3a65659d04dca GIT binary patch literal 500 zcmWIYbaQ*d$iU#7;#rZKT9U}Zz`!63#Kk2=nHzvK7^G$9q+03g>pNTNmt^WECl?zT zm>Pg+{gV9roMQdt{M-Vdk|Ln2ZgP5wZnBYqfkC{Hsh**so`IfENU(lpUUE)pN~(T* zNoIUGr}3t8&2aWNWk8p*?ic^FL@OvMm9GX^sx zo;ia#63>Fc0*Tkd$k4+G=i7+Hw)>{d4h7n(#-Sz(GjPq^Jxe76)Y5>$X7)&4n444>slex59 LWOpSoGBE%E8f$D` literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.9B6053A3B460A657.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.9B6053A3B460A657.idx new file mode 100644 index 0000000000000000000000000000000000000000..d310e59fc009a37ff9510bc3cd63bd70c6773354 GIT binary patch literal 4000 zcmZvfZEPIH8OLYSm`puO$nKKHi5+`wW7i?I?=mD2q*4j72sm-=P`@U1bza}?*^AG2 zr`t8gj_q?C2SchVNgG5!yp*&w(3B+fC26aI0;njJT2wx`RUi^-6cJh|YCeDR674S(^XVYLvVTX;y(Ej*v-E?kTG z@d9+=YRu=u_mRVe>!E~&6D(X2MW`v}*F+?7QA8hCTKQWKw=4o*Bvll7no0yg#Uq^Jp|0 z;~N^*t!s!jG`F`!ymUM@oNyyUPJF;iyOEgK>VCrjoR86=zAHt9JhN+J7eD<8VZ8O%ZWU1fLG$e@7K z)Ig9wNsAb%1fZp~rA7t;z-fhByuJLDx9ZLnF-E=yK)2alCWD%xWAxgKlP}i;uo8d) zbD&%X1#J7>rDZeGR)djh0LHEHDj5{;+2K5W^wWP^jKDkdS#9O4R$XWm^w&3kkv{X@ zxe`Wh0I1DsE0aM0i{yj8`*Fj2lixL~8TmQ@Q<^mevxJSBrRuG)EU)JXCC=xHzVHwV8j|Jmq7ttuU1~%^+I_MBT(>ppV?>2pn%K2Irua0@*DsZ zfR1Gyt7K5X%DKC{)*iiQfRWVzWJ|KP3<~h;*tInW$2~??0MJv?Qze4}F06d!`v-RB z(~J}YaA(<_H8Ln*@#jTHhF@zA7`YXIoRzDPK>@#_n+|`=-8RaI4nULDR3?J}!sBq} z;_>`HukQ!oW&q-5+?GMjaN>hCHMLLOHo-_e08eU5pVU?q8Ucap!J)eJT-S5mw@>C7 zSprbI*|0y3DTCGALl#PjH{(K>^!e z-{1M)jw63yq!xg@m9LgT0qOY%o{=>GOj?swGALmD#Vgb2dzvpWQU<`FIan%#0)BqWiBE36qw^9Y1^@{&Q7MB0 zjONKl7yaYd6-G(`=r8TBl|ccs+gnaGUfKIGBQ*ewS!0zlD1hYLq~8Pu4l93gaai$X z!6!uLZM4nAQmFGR&6;>@be^L*6L+}IN9c%&r&j0Vblk*3tV3C(Q<{ktQ-_*C_i84V z6CG+9ozYAzb2@wyx=%ClYoY6C#i8329!|Ts^~ZhZ>lT4rOKahahd;C+S{zzWLDqRY zZ8z{B=)8+|8Mq~N-a~r~JnlMosAJ%U*SSkw18b+wJ?a^_&vZUW2Mzp?Xl;v&Lra^# zu}^&y517s;=!A)Hq(iBvdo&YW0L>3xNjP6&27;CcvhX{UaeYA+E{8JO8_1!zVFJG+ zB!r)#jGqPMf_)V-XkL&I&V@WaEXW0;DrE5cK_c`hyaKHW62g~I#zh5LxDm=|LpKzM z_EXSxK1Rn(+|oMVO?R6(vCb#yq=`pP=Xshpv0CV0K6F|$(U)-7!CgZK!}}rtiO{t$ zfo25>;Z!K&W(QgL6Ut~zAPZMQ8SMyU;YBFpX#!a|5X!h0K^DG)G8zsnjc^;3bsnQJ z1M8>GdugwM1xn{}8aL2Jbe^CI11pQp2k3x-y9gC(n8Uw!&3M z;lTo0*cQrod_fjwg)+Jn$ikvfKKagH)|}n{{wa_j*672U_@`0+utGpWI2Ovd)F2C= zLK(Ll$ikga#&Q9&@FbM6yn!4#5hl=pAW^WLLI%GnB!uH2fBkCekE133`4h;8G12m?YM3l_-2c2LG$0kSX~l+k5C78Zjt9z>9Zv7ii&l5)hr&&7TCAAl_4AJ%ui LIv33TnUMbh0HXl$ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.A7E3BCDCA3D52814.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/_types.h.A7E3BCDCA3D52814.idx new file mode 100644 index 0000000000000000000000000000000000000000..fe637c190eb7a3391312f9b790293f6acfeadd20 GIT binary patch literal 3888 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/asysctl.h.6B7A1E576DB00B93.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/asysctl.h.6B7A1E576DB00B93.idx new file mode 100644 index 0000000000000000000000000000000000000000..8631aace56d2477f89b6e8fdfb45e32e780b17b6 GIT binary patch literal 2396 zcmds2O=uHA6rO2U(@9p_(jG*L-GfNAG`o%VhbV;-Ef(uOs7eqP2Q*cGJlQsvtC89LVf^Z{B?GeeVsE zL;ZbyaRfjt(|^*yG$jB48rY9eTYI&NE!@$v8EmQK2nMB{8cC&fEKzJ^v7Mqh8%qS6 z#InO|H$I^eX)I@|RI^MeQ}iVgo%r1W$;#1ej!M+>9C~-gT#6AJGg4F9XPKDcN~XW1 z;?>w?{&g|1=lUPlV!%?5|52W5nbfv)$;RUvq1d}D|FqM+g9Q?!dUELw#{KI$=-pPp z9g2PV^S;hxE#Fn6c`&BwI4a9>EGkn?jzttj8A{nW*_l+7q|(l2Ib&;iZ0lND9*cBu z?K+t$v!qCYs8kP6tdvO2=2lLU!Rg%i%4sxHl_yRlE2eFU&%lO}%2q5rTF7Fuj7?QZ zMCnju_LZq+=|om7Bg>j>v;MZJFtg5epXqB{Z^X&Z0_8Acbn8PG& zn1ssG$8{1sr_&4TdZ=~nwFp)-ry(%Z>`ksiwdVkAJVvIf0JwFqyXlKIDpZLm(UI8W z{jsn~M6`?UNi#ZzON-7awR$Ein~77xyy zVVNaDi6(AlnnSb#Zq(3W3t@bd&13^p7o^qKfhaab+Te| zGt7!yXIqq(o9oYSS);)A2aAXZPi%1XXWoQxxCSeKNSWmg0#8yetU95Gd;;7{d m07Cw<6dzQf9nryOmmbeu4Aj+%Yu1K>K=l3U{ADQ`0KWhpgilNW literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.0C2E67B58D684010.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.0C2E67B58D684010.idx new file mode 100644 index 0000000000000000000000000000000000000000..390a1f60458dde84f624be15b713382de7f51305 GIT binary patch literal 1518 zcmb_bOHUI~6uuW3kvn6-mWL6EAfi}=p@5=jNU*lpghwqcXhNv%blMqS#ZFs+g}Om} z#b_cLF(xJ$11=0fL=zS!MqL;KE_^IBafP}d(YP>5M7=Z3argn;q|@{G&Ue2v=Zwo? zw|`;~vIZP|-D1?2j1V%>pAwD8Q#l(c?lzSRteF
    {D%iWpJ&fj)sh9*%S>y*@$o3W5@qMA^re@2;rY6X5Bc7O%a&w)r5h z^eaLz#QW8zONEspl2CU)G**_784t?=r1W?DKhv>&uuj#~+Gkk~(W#O~rqRgy8NU&w zVvN?NVwU-G?etRh)9wNet)hSurX-E^F}^evkfZ^6UtMiCk3OUTx*~+;46MKi2A$!8 z_vo9VGhG%At)YM#rY4;g88KZ4JgXd^{V`m1ibE+BKyyY`6`}(IzogWMeSfAow3-5r zF~>}7fC-p%K=Zcr!TQN73moDoz{R*SSvzCT)Bz|W29?Dmz278`l;d&(bVsz-wMC|n zyfe3Y@%uIob0maA8$e%RaN_5;;=?92To|f=@US8G#n-LzoYfp@&S@?N5{|gD-P?4} zli}H-do3GU%(~Z_(Yh>mB=<-O1KE|{I@jRLSiiYZFSi({k2snS=X}%H5a;ds9Ee%%^5n9Y1kCZfiRt4 zPH34NDO=j4=j8Qr9(ce{JMd$_0p2gswiH0?$UV=yl$lZ5y($&D-}$knW2$}R0o5d9 zIUA^8nJHx@u1o_o(e@fB=ZjL^k2(im(pvR}LU?lQ$>Q0ithXxVX1NR~Vf`s(6K+}u m-!##_1gMROT|U)TB7%~w8m#)z&MH!n`RmTf^f!x`MgIVa;Chk( literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.6F44E7CA7D811DD7.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.c.6F44E7CA7D811DD7.idx new file mode 100644 index 0000000000000000000000000000000000000000..6f11e7a8d60c39b6484e6d0ae6550e87cc9055e7 GIT binary patch literal 2774 zcmb_eiBl6-7~fA>k(Q6QFPlHWoyp{V@Av!e@4elO zWTo;vLs5x^$yMb#W4;?jQBv~bj0XLWKo+)V)@zjfRXz+8oKTr>C=5=ltSHhKn+*9z zePsp5Ft5^yoU;4S=qvO_Dp8%CmAot|!yzqIC#O4B$!S?h85!B?EQhE{TB1oPGwB?X zT3@luROMJ_CMG);+Bh>+q%YIODHMvtI7K$6GjNIxRa(XRN<%5PHeajLXtkWNM5oVJ zM7|ys`$nP0sN;;9Ol3yAf`k#FQL5rI-%@bZoVKV~QDCb>nD*71ETPJ)G3#(g=;hTU ziYbQ5^8bwJmFC-126-x80LRnG@mY62mVD5Y#I(6u1tDVa0H z4XS~TKUm6>P>2s7b_Kn{hbK@5T@hDGqVVwu@Eo~R>;|l$9iSZ~SgR>VqeHu|`nwaL z4WJFg2)uuF&6r%Enn(aEgj->;}CAySAHW$Yb6Qt;Lf*21;b?08n70+q~J zG=Un_E)oZv469}F*m5~x@=lT6VTlzsVkCtP{g3a>ep^ZaE`*ChKEfo9W`Jg3v8v3= z)?+LILoXJDJexCx=o_aRBT*j%2gW`J$ZnJ!rp|NpwPj5st zxCs=Xa7TwZ$9gk#2a}=+KTVn@NA~dcyT%s>F3hv1T4RA7co9=K!`3%0)aJwzq!pl* zpQ*!VPe1M1Ae>JCrBpc;Epe3_c1>)45Kp#aA(osw$MfJwj%-N$ZUWi10$4$a9alg7 z?N_l}vXlTjfcTw+fMpvq_!re^1B_tw#e~1_3mQ09T$Mr!nJ!JAf%aK}+Fv~frSHsl z{(M~3kVZz5D$mpLu;hJN=>5{nfQtdNO->B>k8BRROo4rE!O z7=dXcz8k~u1@E^fNLQ+hPOHIRVQvA4dr}W?G z7v_h*9O$=^q^T}#SNW@)ZO2Q4kfI^l10!T!-pXh>=EjOOCvtl}A<3J-D!P0X*IYUTv;& zJ4o9hh{vrUvVx44JHV#{f_b?UWSy@5x8)d3N-$j*|^OL^8E5< z@>0HczDpGfWChNn%nG#LS{FSG|OS;<4 zix^G+N`OVvbJDn_8KciWbjr<{=Se zpOK+OT1N5o*r<|BsLpCIt(^xTw`tvTq@H>+s+UyBS>4!l{s$#n}+@c|0i8=n?V9>lc4U9~asMv;}}p+!+uxtOaU- z*9Kl*It1i%eqSU`woJC!K#+$cE@w`^>bR8e z5fBFrF&qnu1e0LB;YshE)o;sv=LNJ40QeRXYd5U}#`kI8O7+)60c{0f4$p-}0~_Hw zFtRszVfg;l4FNR)pklRIl(F1g2TYQ)2LAHl@i`vc8!!8JJ^Qk!vctoR2`@q>XC}uoC76XxodMGb<3=Hr#k)Y2(VvMY#`3#<}tB ztmM&5e0}h_e+J?tmkhF)nS&DB7|VC2o;G|~y9M+FH?g0kOe4^?J~w~wi=2D0TYL?4 tjEl80nmGm9cIoCO$!oQ#W$IQtj9!sHtRH(9&L8jw{K)T8F#HjK&~Iz|EIt4L literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.C366A3B4A21CF1C9.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/board.h.C366A3B4A21CF1C9.idx new file mode 100644 index 0000000000000000000000000000000000000000..523fe8fb0375bf16788c041c6b0546345062c8bb GIT binary patch literal 1626 zcmb`HTWAwY9L8s>tCMuo)>b)Mwbm+Hqn!0pZ&8bF?6#3KhNKZeY)m)XW@|3GyNRjR zwidh~^>7N_P+vr?ctL9s3o7D+7km*BMbSQp9HpQ>94ZG6Uhu!WGl|dAflX$9^YP8h zH~(FqOAvhH5ORiH>6oO2#v+7@;88V2UYr9Ry_L^H_R(xsYiV^Nq=ZYIiFmWzl2k&P zoQSJd>u4@wN5&dKIWB9+=?yfv>T7)FsMhP+VD?;|h8mwQ;B7F6?wWPM>S$6jM_xHz zpG=#5ztd%Q44Z{Pm*0m(hYOw*YL=stgXejtgAb^ZqVl`aBEK`CY*V*~L@6kWsuq#t z5WjfElI1JIK}}M%pkMG+@vy5!LBU<+ujAD=RcvnIoAg-zjQqZ3SW3yF#G8MkVWh|@ zNr}o$;3da36l+^VGfmJCVKt4q2#RFT?I-Y}tK;|BqM((?4!<2wpX#*}53E ziz&)V{BsNTxd)DX;?M*t*~o63locpav#P=yIo$hZ>e`N6ma*DoEYBxmbozDcOM9*x z16Hu|2gURj7>k)c;WT@|M&<<5!~q*g6HIdkY~)Mu>noRzeqJ+S4lG%Q%kl|DG;~lK zVG~ZH223I*6PvG|^GO$KD!|5rJu|4yv%Zpnt1apEfa`Jn6pGK4oEaHv33~w7;kt~v zy{j^QtNl?c;0TUnj$eM=>bZG-X#%i-g~`-}-YM+GxJ$yFy+xskv8nq&oy5t^l7cwx z+S}rf#{j#rJ7cnXXu+4xDa-l*t5_|j-e105FFAB_m5#UIEd><6l)B?RmoHxgtYIyq z{(ApzYUIQDe!#W3HnSwHDcB&XCE`OX2_{Gdk%`Cs)uj#Z4m|{;9e9WS2{+mYi+%UA znYLGeD{*Bhp@>!+*ceqt`0ay2{I7QVzn~7_K<1=Kk)k18qAH>~OYh|AKW59^JIb+b Q+9e(odZG*1}a@-tHyiYs%I6oH=m zl)3oq#6L4ic^H@&7+6$TRb*L>SdC;EI2jok*q9kvSs98_(~8BBR5Egbl|e!VNEW5$ dB!W1_Maf`w%q)@m>y6|?69X7o8Cc=U7ywdnOHzwV;)C6S9QB<8LJi~Hd>n&4^ouKtlhe}mlR@^Bqu8UDOlu1=7|QZ9 zQy7XXbCVQ-9{!ZM`0T_#GfH_Fm>3vXR9IDHS&dkYWEnUa85!7^8Ch8wic-^x#gSAp na)FgWLJLS1rRF4pIK@TDV08?va4BY%Nd5Ij@}Y?VjI0a*RG4d_ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.CB1FADC4790BDAB1.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.CB1FADC4790BDAB1.idx new file mode 100644 index 0000000000000000000000000000000000000000..1937e0fd5632abb8fba83f01fcb7830df2f82312 GIT binary patch literal 458 zcmWIYbaOkz$iU#7;#rZKT9U}Zz`!63#Kk2=nTkMhFwoFsa5ge9FbGd9N{!FSOe#t& z%1kYe&&K4EE43t}ISYOV>}zPb^B&%b?t#WRNqYl8ePb3{Vt7027? literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.E7563C27A6820166.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/c2000ware_libraries.h.E7563C27A6820166.idx new file mode 100644 index 0000000000000000000000000000000000000000..6bf01c374f6b5cfb2081365230b9e22134516d06 GIT binary patch literal 390 zcmWIYbaSg?WMFVk@vO*AElFfyU|nOHzwV;)C6S9QB<8LJi~Hd>n&4^ouKtlhe}mlkyXbQuH#YX=F0U>E$R+ z2U<{;pP9l?T$!7s2=wBo%*AIX{+UtA!@vafGOH1*kt_ozBO?PFGb1Z2Ls4p4u^y62 zMox$dsB(42Y!}ai2j($yu_|#W$wEbex^fah?Bb&2VsRkN#OgIObkZK5nd=!@7(hV{ F1pvdiYrg;h literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/can.h.9E3FC4B8900B7465.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/can.h.9E3FC4B8900B7465.idx new file mode 100644 index 0000000000000000000000000000000000000000..87590bd624c102885e9743dac7c00815a2d31f5a GIT binary patch literal 174 zcmWIYbaPwAz`)>~;#rZKT9U{DWD5gvaY<387mx;nw9K4TD}8-^XDj`ZOnqk~0|SHb z#G=%Avv>o8cmqQqsh?7mS(aLqlbNKSW@KS(UXg+%lAM^Qm%&h6nVSSMttd6ESR6>R utTbC1B6mHSk&97_LyH$|5kx*G5kwakB^Pr8X(q-^O>q)me1BhJU;qH^LM!e7 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cdefs.h.543ADD3A5BABD5D3.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cdefs.h.543ADD3A5BABD5D3.idx new file mode 100644 index 0000000000000000000000000000000000000000..c8725eb8a3469dfd84dde87e209462f1f59438e7 GIT binary patch literal 2648 zcmb`}i&s=d7y$5{JG1wG;R+-oVUYPeX38#}vWJzKxJY4<())q3EQT$j?3QU+#s-QD zl01(n@lY4AC@Vmd9-0N>11&%WEQQS1LJ0||aIo*%xpVgqXwTVm&)nagnQy+i-|Q|3 zGa4g2G@3avVeiD7ZHt*kqw&G7)s`6d6<%+BV&g34hxK~>oQL(cIK9baoo=|_AYb*i zganIKZ%T+?j*ldwPBSgBO*2h57z|OY;jShgk`aD zOM>3e{C~q*S78t_=2$C^YF!l{Ek~V*&8KhEXm0!P`mhK6?;^xQuv4&8&;Qn>(YUr{ z44&HmC`0HZ&`G=$_$>Fgh_bxzWJs4FUAj|&UFl8Z3d3_e5JDkTPSdT=G>iY)-}ZXy z@OFv-DZ)qvBHN#juJjuvLq3Ci=Bq%&?2N*MzlvpWYQd@HJ$Czmb=|d_GL$hWQ+t&6 z#3#?0I(|690D}SMtqisN{NYhwEE|xaM1&I2Pl0YRdgp9YQUJm!0;kAu1==QG=>6r~ zQ-KIa2^=MSsISt}J&MYgjzzF*!LH>A$!#C4%P!d{Lm7oK%6ru8KKCV@erFs)od|W} zSY?is%3Pn4Q0Ei`hXfAEUx61!3PX)Qk*166jPq787n&d zYuZW;2yFz~)E=3WhrM>MbIg4Rtpr*L-`GiI-Lb*`kuwnbDD=@0%H)^E9=*eF^1g=< z8VEEH4r8e8&Et2^eFR~P7Pe^l*3Jx$^)**m9!Dq^p;+Wmg|V2}{wdB7gtZc^m2Ow& zsQzY8P4y26a}jnh*unVLj$FFo^5D2$BZ3i(e4yu!zOnqL^cA6a`wW9K>c%ciU${5S z+&2#)TY_wf50v4x+Hj(!VLn2R1UVAl@v@t%tD@GNm!XbAox1LfiGS}|y7++w2=yY= zi+3x*ezeBU!YnV!kfntzE#FwLrV)wJP2Wc&oD|`t$V*^BSL^T2qG~fj5`!ehQ)n1S z3p%i=WeGwmg;dI;(l_t-_@iR{n+PRZDADpv#jMTK?C`6yAoNn`RePLjotrz)=#s&~ zz`=Nruvy~l`+B}kK)4~o4KYAjhu?{Sy2wTQS0WrHa9AznQDYn8*KBN(;UIy7>dQ0x zrtea(`jpiOE(R`j9VZ%RzV>X>85s&F6sS?PEPqaX{9N372u=o0#@~_YJM|wPs=6x) zVVels#8FCAS7YtA`5~9rAtX^qQeWvGy(9M?-mi1`cnI4GY$rTdI^i4YJH4Y@y`LRkuR8!wHrH1~EU zWtr~ne9H3O+eMTWxwlKHwv@WXf043_?tX=`EAH(f%7)zA*^FhYsnrSFnRdHcL$$gm zjsy&E$iR&5)WS}+P7`LmvMi^+>tlp|3jOK{)gv4`IP*YhHiAn8mwG%_oNsKu-IlT$ z!7hPaJ>-X6(&z($)iO+iNxV*d+D0G$e3q~UZ&y&Lpn*zGzdMa}+7cy0IfHV>lV2nG zcxHKgv=t#)f@J9qrAK>i$RocN6c->2iZCeh!?DXdXOXY>nokgNDdegJJn!c*U0$2( zOAxXI$P#!(%z7s0jCX#x6XB`|SJk05EneU8c|}w?fHoTK-^GL8@5)dlLXmm~j=$ctFCeYG2Ej$ZrB>Zv8^b%U zt=zK@;adjZs=s35iW7%=K6tVgp<9G*k)Iwjj_WgCKJW;_ z5dufl0)EW0>)pK63BMrJ5~wA^lR z`NV02O9UI9Azn%xLUI=o6t&4Y#m^Em>in(T8wdfa?NJ`-9Uu z!sqpOTtjFf(4zi?Zk|82?8#o!079V%g=*O(nk|dvyjc@XR{7Wxgv$KD&<{qeuOvi6 Jl#FUL{{m3aJ{SN1 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cla.h.5DC7BC19533B3061.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cla.h.5DC7BC19533B3061.idx new file mode 100644 index 0000000000000000000000000000000000000000..f1be8a68380f4599e053fabdfbe5c1a4a3d84033 GIT binary patch literal 2436 zcmb_dZD<@t7@oUclFc=}i~Y(aZJG@UHfhc6-KDvNSkW{#7>r3tf@zwxo4vicyQTYa z-Pvs#Od$ldfBL_O)(59O1C|u%f$|h)zLqL{%}x3>J$DAvh~KmN+;vAm_1j44YZa%ug!h^pLLP zJ38+Q^C`-WoyB%ex8_T8w@;0`=7gg-E`c?SC)k;^wR|4i6P9bM*!Qw=ULy{+kDA%B z9CaNw;g{_e9lBI8vuwF*{+})^D)b~+bYT6cYhAa3xcB06}s@x=}G% zhN&{_F2h4**i(k-GVCqGJ__Z@fr$rY=IcS`>p|x0LFVg0=IcS`>p|x0!IH0^81@;B z9Dy!_7SOUNV_7;<`-kDlpq!@Teo2xB`z1${22+VdVoI^GoR$*_Igx}YWo-@Wu4@@7 zm+I^8J(saE$?5NNEbd2KoQ@!HxwThUGs zxIwp`1uEEr5C}efZsm`=6Bq8UL%Tq*6huqGXz7J&g8{TV2BPNUC7jw_k|UmbplRYc%~t{KrJGMINVA7K64#D_|8j80 za&Rx7=qwyv{Uvr|99EnZPWt{o8h_{1fmdaqPY5S`nimUbS}AVw^()uftk|U&fSwkn zeKoHf(6nq^&Fcj;Ef%MFm4K!t;?`uIV{w&&4hOK4jcLzevW!66dLjM5SPh|A~ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clb.h.56151511229BBA8B.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/clb.h.56151511229BBA8B.idx new file mode 100644 index 0000000000000000000000000000000000000000..1cac6ea0ff75ea2d7a6d76460fedb00e158f9fe9 GIT binary patch literal 53894 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�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 l{CTau;PaJKrZ%O_rX*)Jz3ms*9&{{f?}M+E=? literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cpu.h.F8DE4A1566FF8E5C.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/cpu.h.F8DE4A1566FF8E5C.idx new file mode 100644 index 0000000000000000000000000000000000000000..76b8d724d4325278fc6551a12018f7c841c94c2f GIT binary patch literal 1070 zcmb_aPe>F|7=LfwZRd?+lv`BhVZ<;~+?m~U3yFo2HH4+8bqOSx)|t2NquHHp-mIwy z4}u6GMC7H2)==sY2GOBFJcLkWk$CFhp-a&vI+z6gIrOdVOwri~Z{B;~{J!7s_kHi3 z@9XVt@gvk@^o``HlYuP?!Q_t3RxoTTqxA@C+s+}1a$>}xc0tyye36;dmRSJ=3!Le4 z(Y74R87)#CmQ$4eg`_#P4|Dl+i5XPRTDEL}UuN>KC~l{@HgtkJ2KWi*;z-kI#x$*~ zm5sqTEH)it9K34|(!2X$4x=no(5)y+Pq*SQr6;PY>V=F=wV0-=ni_$xV%Th$+9n%R zveDy5kBu1rMD$`QocoVN*LhU!QWaPg$FfYWxSaxt4t>b!&?_=pv@0Bmgw=4eKc%pO zZk7zHxb9I2iipI(=&;2M#7FakLvWd^Q&Sgj&qq2XRJrTQAZ09-@g77l_DKRJf!*Sx z^t<5VoP+{@5QxlTX%^R4AZQCRms@=AocX?7hiY9&yfJ2wLU+I2jlfFpPwXx3Geh)J9Q&Bv$_{@2ZRAH*Z%T+ zQ+SIjaf z^^-Kz>HS|XLAYILuX9P8*J8W&fBMEDJdK5E>~;aUy#xMg&#EaC6XoS6FYexlj7cm^ zV$XK^UdziLXPcMcM@mR}!fr==glu)TN<&DZF>%PXQS-E^VR|gI0=XF>DX zPriXL6PTyew2*$dS$?$+;TbHLXJ72mj5Q~;#rZKT9U{DWD5gvaY<38Kad84w9K4TD}8-^XDj`ZOnqk~0|SHb z#G=%Avv>o8cmqQqsh?7mS(aLqlbNKSW@KS(UXg+%l3Y+)l9`)Yq?Z9Sw=y>gWM)xn zTCq5gZqrd^JAVAxM@BA2Z4PZAuyqjmoJ0^^T$EhQ4WyYE@2^%rIN#s(1_J{CceyVT literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dac.h.37C11C37B22880CC.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dac.h.37C11C37B22880CC.idx new file mode 100644 index 0000000000000000000000000000000000000000..f323a4e119059d046b693a70ade73741eb79c8d6 GIT binary patch literal 13934 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 IQupWo0JABAivR!s literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dcsm.h.CB1085BAF53705B4.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dcsm.h.CB1085BAF53705B4.idx new file mode 100644 index 0000000000000000000000000000000000000000..d6d32c90aaf07cb11df6eeb28addab3d9c79a7f4 GIT binary patch literal 21114 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 Ijamr(1*Z$fbpQYW literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.0B8A578C07DBB270.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.c.0B8A578C07DBB270.idx new file mode 100644 index 0000000000000000000000000000000000000000..a035adc53f613cc7cb355ec416902a8831772c59 GIT binary patch literal 15466 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 Zc%@&n9UG^wIWU9|XxHB0eJn5-{tIsxe$M~^ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.1D43A9D0D509FAB8.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.1D43A9D0D509FAB8.idx new file mode 100644 index 0000000000000000000000000000000000000000..83d059d51bb34dae95a11985515281b3ef24b5a3 GIT binary patch literal 7182 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 VdQah{pV_XSz!3_4u4X?t?jQB$46^_L literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.B30C87AC9A848133.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/device.h.B30C87AC9A848133.idx new file mode 100644 index 0000000000000000000000000000000000000000..45ad349598ef2efe3505cf87db124a715f8c96ef GIT binary patch literal 7206 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 gIysDNuJKa?dQa))pANoeEcwTcrTc`hYYIRA1R literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dma.h.780BE45E34CDCB6E.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/dma.h.780BE45E34CDCB6E.idx new file mode 100644 index 0000000000000000000000000000000000000000..3324a6b87b96622eb15d0d2bdaa7c67cc0ff5e45 GIT binary patch literal 38708 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driver_inclusive_terminology_mapping.h.2717AD4B05C9ECCA.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driver_inclusive_terminology_mapping.h.2717AD4B05C9ECCA.idx new file mode 100644 index 0000000000000000000000000000000000000000..3f595e48938943c4d950f5f707366beeefcc1cde GIT binary patch literal 1450 zcmYk+3rtgI6bJBIg>j%jg+?A72xGJ;(%vdooMM5NG%2NE4*Ian=x4lcho{NaWIJMXn+_as zcx)0o?s>$$Z)HC(WA*)wLB?i7p5J;FA~-ReScnxq&O%YPmp;n>cI$Zi&W%7C|t*Kf0g2Jy*9YQLJ$%T z--dv2NFzkngFcC^o@<@1nx5y2kZYiZtX*Jl?k-qAnS;y)u9&UX1|FaAQatfp*v(--Vvh>aD+%jZ4*fUu^J>onb zE0gU;PKIRCyg7kCFgm-p3Rw(dvZdDWS7?JlTa8=>WvT2U-A#YCMGeYokO3fv<;wAe z`ARvz7C9QC$x$taBVL~hMAjoKK}il)G}EiCIA3By)`C{RE^_~JUS@Ej&5T?Jb!2D{ za|;qmkFK&HbAUs$)ysu1Ue9KVJ;-Zd4SB0R84F8KhO>OgI?$1JuFYBAJ9Iy*6*(1B zNjooiR_B^6iN}!TASXk6OEB?7DF0qNasxDwfWwcjzueqi*@3J81!-r&y~X=;zqlJ& z00L4SQ9b;XYDWDEaty?ffbC}$7jqVF1(12bBS&@O$6t-{Mf3o2BQ%nL*UYNcr?{iT z$n{W9)=uKl`sA+Qr^p)6kk?1rcgM8ccK8x<6hw*GqdIxw`Rv!ujDCq65Ah^P-@6;W z8TzAj1epOQi>-e9pX}8S1ECt{0ehVvuIri4n?a6)I5Mq`Hb{bkJ>R(v)H4^{; literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.145F05FD2B7B5404.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.145F05FD2B7B5404.idx new file mode 100644 index 0000000000000000000000000000000000000000..324ba48083990c052b7caaa7dfbc91da43fd7c6a GIT binary patch literal 3118 zcmb`K$!^;)5Qb@IbDZ5toIOtBvrYM_;D6^y#+kL4% zMSJWE^j(Tlu${?WGk~NIqV!{CI0KFDZoA#*>x6W|+p(4@UnGR=`opDGJ*#@iEmE<( zp_F!R=ocrgqd&%ij)wN$87?Ff!leVLIBmau_2ym3Qt49mxqJ74hVnrPNkgk1q>WYY z#o(z{s%WPj1i@EsC40?+fCVr886Kxmt~d^#+~J`>5OEVH(zv*g;0c0A%rQg|k}I@v z4#5|bp@^hPOIutiD6mvHy9#Y?^VR4m#Mahh6BQ%-fWEw!(~;-RU; zm$l7IiXdeW!qcMX5W@255fMUr`XzEXl3LM{Pl0`Q>jt^_q$XrwJNQAo}8MMG0(|a;eM7p zz!JI07p8VN2SOT;ST40be*5*O{GK%r$_tB2%PW=D>e~9o*7ifb+k)F3N>*MM7qXMp>FOMqp-J-~CoI^ZSXD&P^IAH3&wH3vc#0BeBT hfNOxKfK9*(;0E9_;3nWPV7_%T%l`vrwlfDp{sY6VR%ieK literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.65EB2857F01F4A36.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/driverlib.h.65EB2857F01F4A36.idx new file mode 100644 index 0000000000000000000000000000000000000000..4a00138748b7e5e789c3a4ff118d2fcdb94d67ea GIT binary patch literal 3108 zcmb`JOK%!65P%JN5%MMpc|bxEa^g^LsnkcLo{%Et)>f)|skAa)FKcDJxb_mDf2zNt zJ@yauzf`pao9TULq+LGk!Y7YCBj(e?{e63zkU{h?QzB=pgpfmb+1$uh-GPr-rs9rL zI=G{stuU5;pK&@Jn@6h|7a`|1PlRN&|Mu0JcM*-mljMR%Mm`CX%HfOTe?u)^H1YrrPKWTt5UD@YCS(iF2abEd9sGv9~B4iid^{@i#RQS zkPcumgSsazc)9_23%Cb(0eB3!23Q3=0=xul0$x93wbJ|W_2=*E`>=abU0GdQ->7ZY zx3+io_756|N5{?6v-4K_;<9sfebc?&C7aJbBxitb+%Dp#076y(w*dD6cL5uKZNM&I X4R8l=9q=5`AKfzi^uLUQ0topBfjd&F literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ecap.h.2E6968E1813CA158.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ecap.h.2E6968E1813CA158.idx new file mode 100644 index 0000000000000000000000000000000000000000..f1f84c9380fa104c6f1bb3b3a293dccbe53c01d8 GIT binary patch literal 33320 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 G^Zx)Y16OPS literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/empty_driverlib_main.c.6F76583ADBF50123.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/empty_driverlib_main.c.6F76583ADBF50123.idx new file mode 100644 index 0000000000000000000000000000000000000000..39824ae9f9da665da7d6b1ebd8f1108b58135f54 GIT binary patch literal 764 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⁣sOi&N_2+R#_=oNu&y%ki4SQRj%eGjGcFz7HoD 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3109B13531C2F3DC.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3109B13531C2F3DC.idx new file mode 100644 index 0000000000000000000000000000000000000000..c633aeab95e647ce1cb8f9717766c96666e457e7 GIT binary patch literal 1778 zcmbtTPi)&{6#v@VYny!Tk}M_vXziw5)oy9*xa-;_tXf(%Tc&hOOOZfTYk7{_8sa32 z-O>WnCJhNrz-eN;O&c2$Lpva$Ng%WX6GDJ?*#T+N4ij)Fl@LNOxbd9o)hR+;u#(T; z@4ffE@AuyO`Aj~S+uTFQbSb}X>bA-dLiWMmvg<~q6*kV}5suZ=x@rnlQ(sn)^;g&J?G!g_(r#Z&t`dh6Y|wrI%F8R)C|jP08M<=`OqT!(<44{~0q(v~(W+YoxSl znj54MY#EiEjbf{3%lbBSE;1^H?II{faV{lGMp;jbqBxxvU$FGLCBC+=oTmMR{U${76YG=_ZcCAI&ZVWl~PZHRECER9LdTePdyvL$L&vj#Nl zqHT<5%l3#SOOm9>W64x1DJ2VYMbW5e<<*idnyS5$Tp_j&-E}B#@1QNqWvHcUDNcvh zszwPEvSFV60>p7(bo1Sxwls#44nn9m;Ei(8Kr~7^nbsCB+rqJl?r%R)AH4TGN7^BP z-^&LZOG8<(oc{8+t5WP|lOvtrW&^CySkQf<`;BjsH=bOf#0Ty{I>9JuQ@G1~LcGd@XzG>Cua=y#a=@ee5WfK&dz8O=3eB%Jpy(B1(OXFNBDp zzC*qoB1-*?zsctp{aN%eG}s>;Z$g>iEFwxnOlapErC}!Agd$9&2}PM`6XL`CL7WRi z`7!>ui{ks^}aNR zl9>$Qbz42x?_79r?K%sp0v)+Qj&fWS1g*HpnX-$VDI?1N5PO_oh~IJ=335g=Z4BQ< z&hQc841lKd(V>}AnUOiHp}_q$JM_!>yO1{|g{Ix0$av(Wi(yo7vV6BkS=%oHw8S!H~;_u literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3D42EC1E511A716C.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.3D42EC1E511A716C.idx new file mode 100644 index 0000000000000000000000000000000000000000..6caa1d468256c5c393690ddcae06bbda13c8ad5e GIT binary patch literal 1798 zcmb_bL2TP(6#kRgYn%M;k}M@{LTfkas&-3b$6ePhVb#*AVVTk~Eky!Vt>rmxYlxdH zc1sIPn=~Xi0jG)WHVrl;hBzRhNg%WX6GDJ?*#T+N4ij(~l@LNOxFDWWy*fpR6ISy3 z|K5B5`@i?z=hMYP;jcY}Ojn8^eB|k2B@zd}$^n{F@c>kfDKBGT9~7vK8Q{Y*Vr~>$=PC+%Oq}-+#so6D?bW|2nCx zndT;G23yAJ&PK7-GgW;XIu{wMhV3FKMsY4BOGZ`CilR836`!^Ah9$ndp@}cm8ZTOP zRnrwsv+Nb!P(^uSbo@v~v31~GE}YJbrQ%fcjV#mJ|Cno~HJ5FOKtqJ8C0Mzm#nM3W^+Qsl98CX<%ZrMa?btZLP@iY}U}y^>xbP38{S?H#mgxeE2w zEXC>Cdd;YSYBtR?pMziyj6Qnn$1RPaq@55N2nS+ZEF6oG4#w*VupW+0b$#=(diU*T zIMN0I{9ZoNT$*Zw<e>DI%7>Kf1-C$juI7Sn@q_PG1hTXb+HU=u6foKDP>w zzgYsFKQj3HAMJgYdOeip266|`d^Laa@zD$3zA!`Ces&Z~pfnHt z58_-H%8&6+yC|_gF^+9zXf~KlU>6yhOXrRu@*MgtG|2^$&>M#$_U7=}t)5Ts-;lt} z6CO0N{k(Ad;>NAXdl@kI2mANo1wVYH`>(VeEr2-@Omw3e*?9fCv_ff;Np@h+{l5C; z$IqQw^ij$ZHq$ZBYeRTfr)oU!M3UuTKIm&TS1hnEJXUZ;eri`fgef&XjA#uZLB*+=f zv^jhiIm1VUGXR>-M~7xgWk%+(h7$MZ?9k8WZb9Ct6rFa1dd7QBxF|jxe+tpf_=R__ zM_&KdY2=eR9t*}de4frnjL{9fsychCp;<|I`{)F{eecqPn{RlzPSS~CgmCWmZ{r=z Av;Y7A literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.7769E057D87727EE.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.c.7769E057D87727EE.idx new file mode 100644 index 0000000000000000000000000000000000000000..4105e7051d208e1709229b218e45a182c2c39c98 GIT binary patch literal 1762 zcmbVLPi)&%7=LN(wMm}4Buhz~(ArJAs@>Yyao4p=ShcKbw@mGrNRdEQYk7{_8sa94 z-O>WnCJhNrz-eN;O&c2$Lpva$Ng%WX6GDJ?*#R+WhY2{0N(dns-1uIquTBx-fR#MI z-}m?T{qb{!sj2UG5i(IKtlOrmbA*sR@ORvr6=;GBdxFxDs$SD=sbZT;y0%iWr8#9# zty=SvtyimNNpdSpBB=}gQ~BboRxF&-u$On0@mBFznD1~WSx zhyLMHoXAg44od$fg*c?Y_q9xRQFmMoIBHvz+>NT~u{%3J`r-GVHUq@S7T~`|N~^ZL zLF&eiwX%KDT>W&}+=48TwPLv*f?_n5lq_0hGb_vTL{@&@F>8+e>bfDnQmMV{RCUAD z48w7kO-q;6vEk7}B^f!TjsNYr-010AGNe$I5rw^Fw^AuPvQe?CK&vLZ){wE}4jHPV zD4IHw&ScU`dV01fTPsF+wPeb+?k=a7iEBbP8MUn&v|*_X+$)a8INpzfiH$a(TxLOswMMiF~+@XTh%rw?u@AQp)TJF)e=bmzkQ?eY5= z5O;^W_h5n_zcPcDn-5QcI2BH{qZrvV1$XQUr9E6v0F54WRWChx;naekQl9XUhAEIx z1bYOWCvz_%XXX9r%E1rrEW0f#y5PP o>?20&npxJ_-KiN)54#BLs6T!>M(^Ce`0(aiO+qVaMKK|N19Sesv;Y7A literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.68CDEA8E023F06F3.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.68CDEA8E023F06F3.idx new file mode 100644 index 0000000000000000000000000000000000000000..c5c540f574a301a6b5fc5514b69ed996136acb38 GIT binary patch literal 1272 zcmb_aK}^$77=9hw=+-`98;P+UP{f!`*}4r7Sj0F83ri+3Y$hfIn%WhpZfnz)2^yjY zPagDOVxpc1A!!&j7jl_#A)gw~jtaw>eC}8xJcTH9*__wQ++-x)9sjK`@<&Z>B$XZQ=Kh8v z9uPWwC7zrS4O2iKg{mcUQIqTLmck%}-hbwVft1XkuLA5eNj0j0p_HqEMXr<;v%acJ z)iJaw!4d~EN>NVoJU^1;&l<9B@Rt`P{*tO+G&E6?1xYf@Iav|;#6VB~U_mft&FCDcs7e9dkj2vZRdhLy_H5nyuq`=hKmtHheu{yNpJ9N< z=^!W<0bR?f@!g?oj&=%o0f4R+SC>5ikA1gL!saX4d#`aQO@l_1z;bNJ9xMi6Gpx63 zcX!X7nWg}R65K8BPJ5^`@Q>HV{MSEi(H2AxxCZ>N!`0yjo`wd{>_!qmmuHN3MBS~! zQ*~*3Ks7K(1q0Z~W`CvcbN{yh;f0WdoqIU|Z^Y@XZlG4nuuQbp2FQll6PU>fgIur| zuZZ5SzLSvZa(H2Y3 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.7DC4267892CAA0F9.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/fast_tri.h.7DC4267892CAA0F9.idx new file mode 100644 index 0000000000000000000000000000000000000000..086618035a1642ed42faf6c711b9ecf39364594e GIT binary patch literal 1236 zcmbVKPiWIn7=P*7E=}^b{uu~Kw`ESG)wOB6&27br+t{#Bhu8_i*g{ORE!s38$?B#I zJ$Uk<2SHFzV+<7!;?09s5kc@e9Ec3(VGM@ioL#gGm$%*icTR4Q?cjGB0m{Rb|rr+jQvrQ8yU)ucJY5h z5f6wQx|&SSNR}-kk7C7=y=W+PcS}(aLGM3vqCie(&{qQGG+DPQfu$BJfkUnqRlB~c zOVu&dl<0_q8MUCK1wj}|3+F7ww1g`QvT#{9FIk2pE21o0_MDSO#@XKNfl-w3)sLuPfc7qW=O1N z^<$4-P9uQ;8Q`!$>F&>+7Z27P*hl(mu<|T&bNy?(Os8^_VlFc-PNqh(W8z3=GIul{nno0cVl5aYekvU6jr~>_{-Y*0n#zv#@_$1S z4+tK*5=+iXrX?beV%3thq$>?~%OMa%?>}=wKu%`RD1%CxteMroR7=&sCRaQABiYHE zpqAvqLS7L}E3cNU$UG=(Y98H&rQ-QDbPzPeav|e71zUdZsm&M0hiMYH#y9!9cE=gP7Y;3X&b0hHO@P*Mk252L!hr**6{F0?`6~ E0b^Y^I{*Lx literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.37AD27353E0A9129.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/filter_rc.h.37AD27353E0A9129.idx new file mode 100644 index 0000000000000000000000000000000000000000..b57372d015d1fc9fe72dfbad6f471096a04e8368 GIT binary patch literal 1646 zcmcgr-EZ4e6u;@m(zu@6(I%+?q0=(X{iJn$y~FFYWg_ydp-F9;zd-g!jhZAd%}UME1}VaIl_9ibt3!jg}DK7YS+?z#P5 zw`-pxq+|7t$4t;ULdXiff$*L0X7ML_6zEXb3|%T%0Aj>|vtt3a;|k`37m7(J>JW^) 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

    %g7v-1T*Vu><2@py1&Ro8D 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_spi.h.51B150874501A7D3.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_spi.h.51B150874501A7D3.idx new file mode 100644 index 0000000000000000000000000000000000000000..7f845eab09a31db148affe4bac7de1bb5bb33ff4 GIT binary patch literal 1450 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 F{{sacQdIx| literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_types.h.3EE2C317F1D1EBC4.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_types.h.3EE2C317F1D1EBC4.idx new file mode 100644 index 0000000000000000000000000000000000000000..b3823bb7cb804207eab3ddcc2cf6df7fec289ffc GIT binary patch literal 1118 zcmb`F?@Lor7{||b&TiXkYB2)?Pv8&G@~#=WmMxiPE_~5uW?8WA-MwQcw%vK}(QRS9 z5Tzdw_JiqjD{W#e$op2uTo1EUDEN%UU*6iRx7-O@*|}sE(pYOy+5gD@0ea+Fg)AAvY}Dt1D77 zaiJd`sbq+$v0uZ3W!GHf+>!d3zzc(K%fKxRdR)>Dc3XJUFMGtOMM~uzgH{ zzAsle?$Wvr#%2nz zfqcDZeFc5Caa~<>*;-$mn>+!yimft=?w{OVq})rL0vu+;#kzWE@8S4wUuhTM0frr5 z41L#&#pkUNRr{^Cn96ZxK54eSGF%G%@(#!k5%q;@;*gS^C nefG@sA^Kq%u*#~&*+`LMeD*|D39D9Eb4*jSzDfJ2>O$x*Gff2F literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_upp.h.536226D452BC0CC1.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_upp.h.536226D452BC0CC1.idx new file mode 100644 index 0000000000000000000000000000000000000000..a12b28badce93cfad551e124f1f173848c09875a GIT binary patch literal 3108 zcmYk82~>?~AHeVP8uiykTBevuV=|WH-l^OcZCX`)MY7X!-Ds~HNrq^*RHNcBrliss ztzwKqH#%Rq%vVYc(L|OKy23OgzUKSCGpFbI?m2bO`Td^v|2+TYea>Cx>F)lShCtx5 z(K8`Zx+Ulnfk2>xe{ox6p-b`m?@vf*gw$3j6uQ_7w}c8^%ta#6${?9EKpY?v1&F@J z|H6&3(0HjVA~aYSVs33=m9X*uNNAKqxOrQ^)|i-in=$hC$Y4IIOd1lGt}YNvcZ)hb zzH^iiHBv>OiWvU0r$8`M&BFd+j^20_IUMA0pN@&P32|%9ei&9k;Sc@>V_5NWPQ~r= zLO^T_w)$gOnI$M){7z*8Vj0M2^q2d>O}3@q%Z~?m z91OuU{+{mC(Ob(}CLxZ7Xqv72zwBGD>iB9SF6W?}qZypiITD-kyObAC2|OkA2_v^( zM;%|JOhIvwz(H2g*CYCo=7}-JC=L-g#KcaO_&*#XW`2QUKFsI)|MzDw?b^An<4HVT z0W0W1-_ABs-<5uI7UFsW^(@SHKkEGZRfF$b6!u_GJ8)lhS#GrGPab=KhwfPPI8URA zm(LEHAy6 z>UnicY4k#236``2sl(l~HplN@j5r8_XenI1Kbe?+Mb58LLz+!TwT=fX_f9;jrbygi|jn>y8H~b_%*IU5e8xO z<$h%LPSdVh7J%3t+-W0==d9Ntexp2I2`g!tr@OYVNPW6881ZESms#}Lna}kNlLQhJ z`2_Nrc;!_gFt&{1g_3}hl_7Lnn7dc?U>J%;u!wHl`2Lr`_WF)+#9|OrY-bnZv$kVX z6yoCqjNT=SE>Q50}cz|jfypUBmYQ&;lh8i8vp)LhLy z#ZHrQOHfo0s9>9)nG|D}uwiN`iVFlTFfnYg*0ITXlou}GLaUnAKhRmz7k(149oSLa zF=4r_fvD^h;&KAzEX-S_v);xYqjD4_1WH&AMi0azQ>)fipl}37+6DQN7iS!7)>R>H zC(zFB-6#)TkDq!%Yf)qn$Y80dJ(9n#yRzvl3ONBe+d3%ASXa8Kl^2y9RI(~v$(d19 zIsEx~6xjr_*%Rh7JI?)}T+fR<0(nemz}v}cHVwR}CQ!}9y%M=e%{Y&rQ7nh$^vaYM zi3A@r6+HF^Z<<`=)jE}Z8Mzk`4-yz;IXoUTbnvR0bp=HlfixzHy(c$LBaTfdA|aAq zfMHaqD7K(2Pe9O+Sy$*Ia?O4Q% z1_BLCh?ffw$&4L;LD5E_jrBqHEasB2%0LT>IEbT{NK=t?U(d3-HpJl&PI14_L-UUA zx^~2c1PWREyW%o^xBD#UKvBU#1#3?H{)6Jyl*yea?i0ArPV_SC@CH?d=3Nvw2;5*b zy0fMCL9mJUJrqL(hL~{rZF5ic_M^PWC6LQPsao26`NUw57j*>cm{8L`vY|L}P8SLb zu%LZ=BD;eqnFHmiMWqIAG@lKn7zJ!?Q7vH6zK%gS!#KK=ZgANcJZQ=gHl$$ z#1~~ArFWIQFa^^|V?Sq_Z$A!BzdC6MaT*6{Y%(N6rdrkt*Ec8vA&^c|jC1+Wjn@2k xh+`p^9`s=6$?g@P_d8-Q@S<0nOd1iy?-VDK#Nm%}0Y?OR+Q+{6ta7|S@ITb3osR$j literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xbar.h.2EAA26D1296240AA.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_xbar.h.2EAA26D1296240AA.idx new file mode 100644 index 0000000000000000000000000000000000000000..0bbdb7ede859ee6136c3d457caee7ab8f54a1366 GIT binary patch literal 4552 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/i2c.h.7C76D219DDFBE67A.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/i2c.h.7C76D219DDFBE67A.idx new file mode 100644 index 0000000000000000000000000000000000000000..399f563db24adffb5e41b09b3d9767c978f62692 GIT binary patch literal 45338 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 z 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 BFkAot literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ipc.h.0D3D6CDE1416C56D.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/ipc.h.0D3D6CDE1416C56D.idx new file mode 100644 index 0000000000000000000000000000000000000000..8db1a155e5969d106a71cbd00ebb19c705483b13 GIT binary patch literal 31546 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.145BDE08646F4A0A.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.145BDE08646F4A0A.idx new file mode 100644 index 0000000000000000000000000000000000000000..55718774d8489720f4c51877e4ccc6eb62127b1d GIT binary patch literal 4506 zcmb`Kdu&tJ8NlzCT$lLx#7UgQ%?&Zm!;d^n?1ThJ3LycSgr=-XpejzX7{{?=C&BjY zYbcMZKps>{SISmZtlMB>FjiWv4JII!rwEV{x=m_TRH_z=VBNZP)l??PAMLi|nB#M( z_UA17+P{0g^PTT?zH{Barm^uS8G^8?cg^#g+_F;?1R;}r!g9zLN+LgEuVTaYirTOz zaMC8~AQA6Im=I@~;e{S#* zec!tmS5+doYS)mDhkP~*F6W@j;o9mNbcY3xZ_r(9wOUuzTAvNOLt*Q-=Uvt~Fgx_wS-<XR3`Ds48Kqq4fZqN3bZ{`C5FR-fNB80mFe zH#uc*xmO5=0xowr?C=D9j$Wti6vA%V5s#bCb29>}DkB@Pynyas&fDzbwp! zx5w!k=nDlRe&W6}JP^N0g69l5dINrUoIQiiKF7le5AzWp@cDhR!x>W^s}P^R-|c!R z<_mN434|hkzt7(n7u*ye^8%qbgk@()7B&Zby+U~FrkMzb7in|O&U)|vR>nda5!rw@Eh7#7rII2Y&U&t2&7S6_d1 zc-e*NA7del3@0m+HL7k!w?2Hw22yEQsIa0Uw!5l||WX)1@pk;XJM?DC~4KaJeRLN*bY zfYb@dQEg4#8h0{t9&s|{_Jo&_6ij5JsV~cJE0Qrn5?YW@je-S1Q^HgfDhMTrrZ5RT zk~)lbg18g1=%kO96n^?(eK1qR$X;x>C9;AdxsgIDgwZf)hhYKZ5m+z+iM879tm~T{ z{`cd6QHi<4MwjmNrM&-2+Q(87M(={~E?^pcjLw2^mT}{1`x}k_jOK!fCc!)j)igAP z`<1pM<@XASbsou6#H@=#TNFB}7)Dn?x(Y>!vO_bVn*lRrZL$BmBhPt_#J)0fSvj?@ zan_r3s$D1{Q8h0%ucEgx>X-UWY^`aKrolvYjorIec&7hsNj65g4Y_L*b%yd%^0GL} z&$BQxh=z2g-Y6P5GKnUR%%Yhit7zqDnYfIj<>GRV>cl#ZTJ$Yti4B5Us#@w9*+qLg zb8Z5J3BW9nQAmkG7UL6;a)Re`kbe#=G#Hrd?W%K7&-fyU7a^VT6o^xdpB)=c_6R3S zNkyCl-AOR8g)V~aA}pa3N7J8ws&?{UWeSWs7IoAxd%G&TmNJTzN2*v+4uN$Dsu_=h zb`NBPp`auO1jic>Ns~{?ow75MPgAJwFIMdt4DMWHeZHMI1OKA4@SQf!oopUvjxL};maGJ51( z!e}$zoTw>`_CU%W$f0)9Q;P&Mc4X0r1x&qLYVM71Cren&mPG&g@NkQE=sV?3MB1jl z#KZzwsxRfJOkc*4MQ`D#N#Dd#v%Z-ld%oRFy}&4M_xg>3U>NEv!s2^eK(XV0f?0i!})VG;9t zgKh(NsQGjK`E+GW9tflf(90b<{z7{i=;`J@&y>a(f6C55WpLF!1f= z1DV@*%#eXm(2YW(kD+(cFC3}5Gea`jC3SIe>wc!&POZb_=&zrFr)Zp_m(cItTX+9` zGRd&mz@@)W>f_RX38YIb{WkCL6X8Q}ot!=c(twfa-l5x3LhZ!pIOvW;33VT%^RVDN zl+u+kx(2#yP(pdVH2e1JH{Q8vCC_jO<rRy;+8MT!1I z{4pDTqkMn#S)W;!@r9BEoQK;Z~WfWQ&Pl9@qmp=*WlRTe? zwDX{&WrEQ~D7Xk###2x*#q%XVmslgf=rWLZqA_4}1<0G@X+YCFUj_2G%#F{0dIs{? zdNWWl11lI`1NAjFPW>XgJpPx3?(?H9tJ+@dEWJZ^nkHXkpsfZYt)$hl8XgDTI26!m z_xgykl-X)v8$=p;$%lSXo+uOIS9r-J{ZPi;1^!DwNQ{No?_5%6W6n}->gU;BmaL5%div3WS$p8QV literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.473FB5CABF6EB2AC.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.c.473FB5CABF6EB2AC.idx new file mode 100644 index 0000000000000000000000000000000000000000..8388b330788662f7ae3e47d009e216732c568a06 GIT binary patch literal 4472 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 D*D10L literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.51696F63CFB19E46.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.51696F63CFB19E46.idx new file mode 100644 index 0000000000000000000000000000000000000000..8d2fa758cd7293eb92661b63470cd5e4ea2d0800 GIT binary patch literal 4204 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.DA60C8E49C152C9C.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.DA60C8E49C152C9C.idx new file mode 100644 index 0000000000000000000000000000000000000000..a43713055792dabe81628d8bd52c4b154a434b56 GIT binary patch literal 4408 zcmb_feQ;D)6+fH2ExXCxw{Mqx+)b#2G~XY)OTH-KGf5kXASAmfOp@Bo%kE3EWwV>^ zdjS&4Xj`PU)k?J@tqL<(hNG(QxVE)uq?OxugkEhj$ zQPE&N_tgI%tf``EcZ=mVo=B+%I>(dKGsYg1XuX+8%@`(wVep@tOeJThQZsr5t~wJn z>N`83ZsBt1vvAl{Ax1YX@+r)UUk}mFKKvcW-yIN5CCB3v5H-??NHRW^c}r_*0%EG6 zMxv>iq+z|rlQC@<#8OEOV#c^3+#@k9xnPu>nX*P^fE*`AIc_GIj3*~xe9T%ApJKi7 zctYz81Oh#sfqQfFxTo8r34vsBTPZaW&9#XX}cUv52ARMkL%D>I!V? z>kjvJg#wBAn0W^NDBQA8lea7so}_uw{+l8i@c?eCCDEm8h|mhbP_8-H&jD|xSsAsZO~M=Bn}J~BHsw#^Q3ytv?(A2eRF%W$Uze3i1QSQv0v9p=3imFGVhoL($L zCDH+JpiCH|2QG&v=J)=$R0f80y|=zx7@{i=I)g|3*D7U@k?v7?%7h`hq%L{m=(fpf z8A_0D^fvm0A-Z>dGVf#v>Sa)n9xNNI6^7`?ubr)Y`Tkex3!w>sSIJdn!hlm`ZsYcQ z9^ack4nJv-VF}Lf_w;jNX#PHB*XKHae7#YI0;GrC!^Of7ebM>X3x6Kz?Utbm=~hoG z7l!CFHTyTRi>|w5_zcopJX^RhM2~cR9Qg3DQ+F|F04OcC7Z>p{`&bb;?KbFiVsfW{ z`{Y+o`d-^m2<@1CwWoTCFuCl%`Mv(yXC6HglA#b6Xz(_a3quR6yk7luy7}9~h0u!g zgLy%hFuD1E`}If9t{HxPM20$?zgk&cDh$nk;e!nacRaCNWzd2NzG}0-YV+_p`N4AI_w2RpjfSEpsT z9qG-U&0H9wk9{(~sL(!Y$WVi{-|H_IhUo8VPfZRSd~^qcAg1SG9?n&!a&dl*i}3t9 ze){jP%-c(L7D52`zcp`bu`s#)r)pw5S6+K!w+zL&K$Ex0Ck!p{?sFSU9=YNCk_@#- z4=F>X!VrD+qpQ!YK7HnE44QHMe0#o^-)Fzi3(ov}>u^q0$>)w#pW82k2j_>%Lbbxs z{HE`Gq4rAu*PmigkMooEq>o4KQD5%+zj&f;&M`6jbRn$3{O`@X*C9+U|BZF09(r(O z!_h)$M2DK!VtavKfgM( zc=v;E%CHRSc2B!c7@`YaQcfRjyNt98>29UFOc76g-Rx~%Dh$z(*2eYVqFjHq6BDhim=&C2_D_{ zjP$!d{)pQcuXa=`)H_Dvj<=q4|G|f_*WoQ9Z|b@j#B8|)Q@2IfY_$YamqplYu>@0h zEiSOSY6fS#UaD6pO~xCf28B8mgniV=U#{H6Cp%%b+Knf^y zB8<06tqOHt#@nPeg$kANcBx&V!ee~1v{|7(!}u0yi$ZOg@qVdaAq8N3z%}5bl4CsN z3i;>)Gahz@ebmetA9M}+=u8-&g;|y@7Cu)o*OYCXe6DS7J&kB3JVjGz=oCp~5H7+))`b(1hK-Ys>z>7p~W<#1T+IvSHgTv?aZJ+cLiZnGYO`y zg|MlW1k>$7*wjdZsaGLvY9qlUi&!(JCKAl}urw@Fv!R{hTvHdxiAoA#Qx6HIZ-JW= z0+_++@X*`TKJumxj+sue%;z&+B9$yi_ipL# v1tU$;vZJ(?P|c`%8vhtIU$WN-AbV(#$FILx`q*E5w{Oia_mx5R*Z}?qNfS_0 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.E973DD7529BD6449.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra.h.E973DD7529BD6449.idx new file mode 100644 index 0000000000000000000000000000000000000000..9444e35db71bebbe1cc4d2bbf2b61abbc0fd3772 GIT binary patch literal 4220 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.C04FFCBFA24491DA.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_config.h.C04FFCBFA24491DA.idx new file mode 100644 index 0000000000000000000000000000000000000000..467ae7cce859de7d04be3159fe8cf252546c7afa GIT binary patch literal 256 zcmWIYbaVT`z`)>~;#rZKT9U{DWD5gvaY<2TIFJT|w9K4TD}8-^XDj{C;?$yI{i=#& z{qp>x?BasNTy)XYSEBMW15%ar(%)Z&u(V7DMgeIHLJFrAZ`RGe0n7@wS< zmzJ5XmjN`tGB*iic2R0taSV_a Mv~;#rZKT9U{DWD5gvaY<2TIFJT|w9K4TD}8-^XDj{C;?$yI{i=#& z{qp>x?BasNTy)XYSEBMW15%ar(%)Z&u(V7DMgeIHM!U^mAg{hZ9C;IGjcG>!h|1cZvQm@+{qt6VHOS+0hn-6YEB}EU0jr0%nhWO Q7&D&Nm-9wwH83y$0GGl*wEzGB literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_test_c2000.c.65A029E46C9A85C9.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_test_c2000.c.65A029E46C9A85C9.idx new file mode 100644 index 0000000000000000000000000000000000000000..bbf7a92219eb7b0609f78623dc42ccac00c55f3a GIT binary patch literal 218 zcmWIYbaT7Jz`)>~;#rZKT9U{DWD5gvaY<2T6Oaajw9K4TD}8-^XDj{C;?$yI{i=#& z{qp>x?BasNTy)XYSEBMW15%M|^b%%tM9qC~w62J$qq;Jba7E~u{emq2qM6Mndz#ilKt#w9WsoJ3;-b(JbwTH literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.c.B6CA10369432859E.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.c.B6CA10369432859E.idx new file mode 100644 index 0000000000000000000000000000000000000000..37f247150021b57b064da6a3fe3d1fddf7010e7b GIT binary patch literal 4928 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 LgA2kioALQy^ND5R literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.h.058FEEA52F352324.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/libsfra_ti_hal.h.058FEEA52F352324.idx new file mode 100644 index 0000000000000000000000000000000000000000..c2f2f4fa6daf3764efaa8f779da9dec13fd9e7ca GIT binary patch literal 1542 zcmb_c%WD%s7@uvMnoYLv*N6mH8nsQUYmz>Lhdv+@5S7O2!NaoMOp>ihHr<`R5v3?r zXlt=WCNYgR@78~GM!NHcmx@ij)0QF-Y!y|QnSU^ zRDyLw>ZGd4cHv2c(qSxVIO{VUT^0u#3uBZvglR9(P~3zt5xyF#)1V z0tEy?7z_x*I?{AuW=a+&RqeK(mSiN#vX0|Okpy3lzq>agVx(g++d#M+8Zh3u^M5}6 z-&%=S5#v(gUpg9-8D}Nx_mM`qA#8)CmRQx#w7v(>vFi7V`_}n+!hQAb4-Rmq!D(|sz?PMOieto}p{Rb2 zDRg4kgAO^j9iI5;A5*&+2g}$Qm}9~EueJ}bzrIo#j&%W--5g`{O~;HqHoZz{=W*vr zbMv*x@|Ct*VY|5iEr{@>X-W=E_lUKsZ{N(1SBo!kz^ZPZFkg{uCll5luE@2;KMmN`+FM3KG McHl5=0N4x5zp|zEk^lez literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/linkage.h.EFAF2659D07C2D82.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/linkage.h.EFAF2659D07C2D82.idx new file mode 100644 index 0000000000000000000000000000000000000000..4b44b6a43cd0e911389986899f80b095b59c27d2 GIT binary patch literal 328 zcmWIYbaQiHWMFVk@vO*AElFfyU|>`p#DRC7Jrk$;Czn zrUoEdza&3Dr&vEZKeqs=qzEXho19*vn`~rYU=VL)s%L1ZXQ1a360Dz@mz-0YlB%DR znU|fIo~oAtw4pLL31oUvYFhC^Abm08(}w%ECk8NbG3s*YihwN!5+(D@bIkhZ1p|eh zIh^@m!cS(JM1B9+6b%%1;c$Tqi>F-k;J0GU2MViks0qMSZz?@|LFd@#BA~DlhY{TD z{%hxhgmmxC0SX&)7)!!b|5C0!ctZc{ZlJIwhov-380gZRL=dOAD7ly$NHa0!%X*w; Ko^)v&0|NkSF;5Zz literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.84541DECAA7D5656.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.84541DECAA7D5656.idx new file mode 100644 index 0000000000000000000000000000000000000000..577ad8efe8c79f8a258fb9e32a5a878b48f6c793 GIT binary patch literal 1586 zcmbtTU1$?o6h4Wq(@e)Wb=un0F3yAFG{tl#DM1awib84Ex`?j&;6t5GChe?ACd^E1 zS`q&$>0&L_fZxlMVloy)}tbd~M-P?EJ=C0HD(5X2#~Oj(mSzDcnJ3dOY*n$+@TFnd8?`f!T{U zQDM4bCiOT@VGCW3jpinXtjzQyl7;3~2mGNft$&+j80~7*RP=6>ZHXLQ!>&3I2t}fr zWU>*%-nQYbe9-&9a49SAzuaqBOk4btznPdqQ7Nv)2Vz>%V9}J5vgr+l;A`s6xN0tN zZBND*cubJ|&?7>RALLL3z55}eMwO5t2%AH~PD9ZRVK5~N{hGedNJz5MEz5@4r>K$; zSl708eOQQU{RyO1YhO9gR0Wh55QCz%3Z|w-4MEmo3B;`nrs|V>O`jYPMX@^&Z1wwF z#n!H0b_i-*jwZv35R=S4i_lUV_G@YwQhpfl!|cPu`E&OdT$AD*1!ExA^DnyUy^R;n zg+JYFss<8(u69<}*alnx^#BgKGW53h@4?+KMK>%VfF|4oZ5ybv{}gz!YfGYKTjkGg zs6%0rBq`hAu!kGk_v_J3M<|Ps=4v_4HsD%Z;auiM^jF_+occIMOt^uv=t+XI4aPrv z`!e_8$c9&Ls6}BH>7s0d!^{-l)ZjdnaYHoq02JzO{);HiJ zJSxO%&8ft@f>=?;%X2)BnJBuMXfAe#hlv!mCRrkABpS;Je7t}O@Y$$yYq}V+&iAgX u-nj^U4PFJFm6)|+#SdLaF{U*r$b8m0$ZKP~bTYxXj-`8aT literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.CD2C4B20615A82E7.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/lowpass.h.CD2C4B20615A82E7.idx new file mode 100644 index 0000000000000000000000000000000000000000..061838baf249e8c52d5cc915153723dd2d3a744e GIT binary patch literal 1596 zcmbtTQEby@5Wa*KH?B$Dx$T_=-WbEUJ3 zh1)j@-z?>?d_nX3(~7Ai`8Z#`Dxu=-g~BJ(Yby(d*<9(vnQEq0&Mf6}g-^dLEnO_m z<@m0FNq;p(C1f*S7QR{{DS_VD0e<7)F9UFE>#OtY*JuBKUs*Cieq|y5{)P2B3;FY( z;RXxWZsNvF4Q0#}N#V;=&d(JWr|rz#_cRY(J5L8AL&o?K#j^VK1k%hX;&;c-bn`n; zha&NWp&&kPImcddRL}UI3zxO?{>|OZ6WYp~`k#qe992?AY9eW5EFNz;qauGK0{^5Q zOzCKoYdDkI!y?{S(c-ra8EGUBlirwaa7V%Y9bTUq@;qzY(iUiIA!QD$Od5|2y3^_mM(w0>4T|! ztzbPu#N72F(k|_i=FN6sk|2&akznQU>rljs|Q~l zdi~edKN#D=avUc(20Zm!TwD{bZfbGsv8$@W7J6g)joE-gfN+i=z<}( zC}jkO_$Z&J3K3rtcMu5Cs*c{!s8Xeq>a2x?#k~Z=uzt$#At&klg(qJ}C*O9_tgFG* zOlp!acH0UQ_vaz`hqtDFde6nMt!=Fx#7z{(UD$FHH^a75?KNHantaVQV>F8#DKl{Q z;l<*mW2>0At);D|p|DkoD*D0aj$RqI9kbh9VASNs0@W$HJq IY(-muXVtIU<^TWy literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.A351196A44ADCDD8.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/main.c.A351196A44ADCDD8.idx new file mode 100644 index 0000000000000000000000000000000000000000..48f836941e495866b32425046798b5774bbebb5e GIT binary patch literal 824 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/mcbsp.h.F8F8C35CCB8C7715.idx new file mode 100644 index 0000000000000000000000000000000000000000..5ed40df6cfc788e88c333c16caeeb4b5ecf4ab69 GIT binary patch literal 115374 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 HQ&Rdr3A(pq literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map_legacy.h.88A2DC44F63B02AD.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/pin_map_legacy.h.88A2DC44F63B02AD.idx new file mode 100644 index 0000000000000000000000000000000000000000..02517314ccdf521da4a7daac01e9970f9bc07335 GIT binary patch literal 752 zcmWIYbaQ*b#K7R3;#rZKT9U}Zz`!63#Kk2=ne%`&7^G$9q+03g>pNTNmt^WY8yOfF zgeMlI#+$_(7{nVG0!jUpqRg_?qMXbm{WK#BWAlm>B$0y5y!hP20=*0d>KGKClbW8G zTnRL1adKdZ4g2hqesNkZJLq!B!LQ?*Iz>aQMJgt6vbjnm^lgH&EDt!vQXAQ1{TD zecOU_Kw&!$JGgLk;o?nh`-;y4g>5)&;KEZmh5d!6Yy$~fa9F^FeL0@_&WSd>4ipaH z2!IP8_ch6##(nx0P&kGo2JXuT+t+Zn$QOJD3cGN)z*Rr|g*d6= literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sci.h.E64A437F6118C151.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sci.h.E64A437F6118C151.idx new file mode 100644 index 0000000000000000000000000000000000000000..c15825c4e7e5a6575910d7ec8d287bbd5fd95768 GIT binary patch literal 47856 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 F|3AOx@f837 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sdfm.h.32C80F3732C73C66.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sdfm.h.32C80F3732C73C66.idx new file mode 100644 index 0000000000000000000000000000000000000000..a581f2372b2061a0afc72a96401b04d0fa8115be GIT binary patch literal 32954 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.5893E44B82B216C6.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.5893E44B82B216C6.idx new file mode 100644 index 0000000000000000000000000000000000000000..ba78bb9d4757ae7734965f19f2de3b3a8c70eb2b GIT binary patch literal 2460 zcmbtWeQXp}5Pw&;AG>|~TH3wq-SxB|^lAZN1+>!h+M_MK_6m1t4)6mim+kIeyY2Ok z?k)w4Q89+_ks?MUkk&wAkOVOL2VzvBF^Wn;M8!lB5{WT>L=%ZXib_m;yUpxD;y=Yr zIyY~A^XAQ)`MpV#v1oKZi%_Q$+d8V65`z$`q<@B~Yi|@##rm4&qiEkcL(8s}1~MvI z8;f@(A4tX4B#|77AvqJ51|L;rlWKiKlA+pqTFa;*Q4~8v;yOds4e_b1vbZIuj~JUI zSxw2ZVGgO9BraXP?BNzg?Ce{&Bo$rVzNSYswi$AIP#nlfy0Ul(%`(uMXtG^2(z=vN zFI)P5whwOBQiiO_xzSN0rRdtYs%Nx;*+*2=aZOgmnV-Age)kE`0-CCx(&gD7p2=<5 zBpJr+H(Cu?WU7X_SVn1G9kVH+WlcmQ_R)wb3qv`FIl0@IvneBGO`w#$$g|3dy9C+o z)v}s7qnVO1lF~P4DQmZl4!q(*=tfB?8C%dH@W_J@VOf^gVusBKeR<+M4t34<@u-Z# z0WMHs3xID;{&;=gg9n>1nnU5CxkJ^(>%Hsi5$kfHa>i9$_}RN>uKf1x4xPZjw(zKs!hX(QX$yeaXM1)XPk#R#MpYDUE^H>Y0Ql_FryhFoy~aH} za#Og9tMb|c;0p)Jj;0gjeT=*mmI|c`TL7GT22&M!K3d-k}3#?9*3U`M7Apz+{!MDgfbrJ^k^H>6b;n ziy`C8xBwg(^iLjCZk!Czy980N49X9%i?jIyB{=`}R87aq(~Ao*Szfg~2xd$|-cTc~ zrd;=5Pspv!^rUP>whlr8>1dV~q}UZK~iVR&Be&DNf>E}Bk@yX8J`x_Ip7MDvj+ z6}xq6jxZ6&8)!`vus98|F^LJWdmtqI z(u-Tn1}9(eg^}UsJGRr1W~JExce;A^a@o(#KUrp#QEQ+fyILpSymG2}CpF8A?3@HI zgC<}-3y6(LREXBY!6&bFe)0L<$w|6bVU&9zWcL%D7at$oe}op*3JK;z%D%+H4Mne) zW8y&`7M=$tRj7)E^DyxuFAMC(#D{z=JOxbr$j?G)FsVk>EOZK!01B|cE{3!$Xo*0Y z3<)=eoARp_!iu{5s$FPzF2s9E5^Oh%Xy9%_q8hRHaq$NUp7 z^|Q~sMayE53Tg*+pzX3o37CP#bGSRE2PR=}xB*h3t!y-x!f{YK+8k@FKqO4MgsxiH za&$w%@BPPPAJHtVM+8nVc3kX#jvE@%nl<2!NsrLuFn(m?-UGKHC%&U06HLOH1^-;V z)=+==wJX%z#!|_Pg8T4346c{y`?8vV=I4Bx6tiSo6fI{WI={58!1aE rw#3YbK|zRf)H!5)s%h%nAO0Q1C8b<3=2=wYfT%RD@_Cj1F9zSgN$09V literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.EA6DA4E99BE72265.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.c.EA6DA4E99BE72265.idx new file mode 100644 index 0000000000000000000000000000000000000000..3e4b39e7dc3f4ac022522e2178772770db69035b GIT binary patch literal 2612 zcmbtWYitx%6uwiY?VahJmbSCo-R(*rY?nd{BM*xf+h)7$wuQEoWf$Zjo9XOqyX>}0 zXBKElqtXx}kRnDUU@?#wBmojltRyP&5yeMBM8!lB5{WTBB1RIxq7oDDOmk)-@eepj z&)##sbI&>VywXrdFj&tc52zWLMF^GBKRu%*KFFa5#BKIF6|svq#bE3sc)4P zHL56jre96S(xOKfFMTW~`FkP@qrpz!ns!Ma(Uo|g)SH&I*n)m^pN7^1Lq185Yx4Yz zs%I7`4}3owU%cplxR3U2OGI@gp`-@}^k_^=Y*)2ZqWAtS#?bPE?04$W&71yqI*<~Xj7#S<4PEK=Cc+wCR+`19FCQ{0h#UkM0y1+FBO zG{w{3F8$-YOGlT=f&*f}2}%S9Z9!L-3s;4`SuRo=nV;npn{t#NpVjGj95tdQ@Ko`3IQc z&HjQMT=@EEMeFjj3vvi3%F~Kd47B6r|nfjaEN>c;%HCi%S1*V`WX`Dt!f;Pdc z#no08AD_MAc2j#%fQHj-Yn}s2mrmXuZ#e#B7ZtB(*O$VpCjP8@@AT!9X)5LrhoJ;D zz30jPl6@K#2ic&d4Q)>YFnS(r6Wk;AJOn1;mp`rbOYu!anjxnWUj0awI z{rr`ppBsKMfE1gmfTHYe8h`!jWW%#myoKFj`GVP@AsB-L)(P$syQ;zU($VE}UUt}D zqIW&W!^1$Gx$ghsvjY)#%v^h%ihZoF7>u;7_g{LV@5SS^2u1*) zeI$0UyKZCNYsCcHk)4BiBDf5daS$EB4&>lq90+zICkL}bunW03NF~ALsGNh!66{89 z4*HSB&GVXDARZR`s(qd;=lA++vs|0lR+Z)2#da$hEM6(Dtjl8SYS&pd2_7yOwmO;M z5q3m?x)8jR-Dz>_T;tDg;+}egCdp_?$UCH#mcv+7Af}lt^;LpTNFD76V_ks~Ov()Y zo()B?-{H63X>^Nsj9COxLB6R&V|jrsf;+`d%i)QQIlpf@)$t(>c6wGp4b~gO{pVVv zMva{Y+61o>S6PFV+Sb8Hv^9p+>mcwl)U*IDaaQJc_aXa VP(k*{Wsf9#w5Aau`adFk{{raY(+U6p literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.h.8E824D412DF67181.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra-test.h.8E824D412DF67181.idx new file mode 100644 index 0000000000000000000000000000000000000000..68683dca7a3cb62e2f0e9a6de7bfbbca82017247 GIT binary patch literal 312 zcmWIYbaOLcWMFVk@vO*AElFfyU|Qb`c)Ol`sMjW*~JBk$*J+l$;BlZshNrTMi$2AmMQwhX+?>;C8@EMhCnF;R8xtcl z>-lN?OVj-LcJnZ>LgX2kSy)+w5DJP?(~4bzQZSPkIUy!MRX-|_KBeg1If0RjnURB0 o6e`L9GZv^CY#dCyC^aV$#4avMF6IW(Ow6JlF-`%(e!UC~0Nvh1Gynhq literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.0C3253801F259A0F.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.0C3253801F259A0F.idx new file mode 100644 index 0000000000000000000000000000000000000000..6dd6600a199beaa8f86d4918103c831609754bf9 GIT binary patch literal 7314 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 X`SUmKxpLF83#rRm)~_S$0tWdPRGPoX literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.3247C948FFD8A47A.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_f32.h.3247C948FFD8A47A.idx new file mode 100644 index 0000000000000000000000000000000000000000..178f81c75e0b997b517b56acb1b8e57eb8d7ea4a GIT binary patch literal 7442 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 mAW2ezSph$aBE} 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED1AE54E7A18FAD.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_gui_scicomms_driverlib.h.CED1AE54E7A18FAD.idx new file mode 100644 index 0000000000000000000000000000000000000000..7b9d968889374758064285a8638814bc70ccdd8a GIT binary patch literal 2880 zcmb_ePi)&%7Xssd{(s>5fFjR~w_ z!vLn;E=BqtXfw{j<1pK%h$PdVoyb&WfLcs`$yJ%!=C2Dl>@&m2LC~hX50zR+ac}|a9 z?-h7d2Oy8-8q|W|fNo1}n+*fRH5&#t>h%T;?d*;wUVJ%x~QMK(8|4VRC2LG-vb|QMYnMk*#<8BAKyBvVhzc)$GvdW zIw=Rsl&EBUIL@B3V_61~X&Dttt}Q!wP%AluS~4DwE6L%ZL}DmDv~VUbV^cF+9m&Me zX&2MO*^?Vx}+igzs3)O4;6qG$xG& zq+`;tfOK3s9*`!bNnc8z{qexHn_KY^buMLk>#6$Lhq`K6*YS^Tzwzs6|HyJUDjt=N z`c9(axHKM+PDm#L(u6b-kfx+5U%Gtf=})%5+Oj&LVou8Wa8#UsY<|Gw=fca^C+_Ur zJ|F59dn3J%co}-zG(%2X9ZyHLe+mEb!+TWwaOAMBef{It^V469Y*V-=($nKPSxCKw zSAYNP7KQsFeUEzZv)|lU-udv)pDBDWa`1o$pL+Ai+ZQi?`4@!`MGige!8S5fwkEbl m#@HgtZnbN#w-AJVjb*pL>=57iVCT{cx8B|C+_yK{E&L6Ww2(yr literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.1AEF57FD49B949EB.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.1AEF57FD49B949EB.idx new file mode 100644 index 0000000000000000000000000000000000000000..1764d493441f1cf69636b1c3838652eb2449007f GIT binary patch literal 2460 zcmbtWeQXp}5Pw&;AG>|~3hmzY?s`gFdbJc~1+=#3wMSce?G^6Q9N-63F5BI`cIox5 z-CYV8qhbsZND(6vNNXT5NCFuB12HPm7_CY|M8!lB5{WT>L=%ZXib_m;yUpxD;y=Yr zIyY~A^XAQ)`MpV#v1oKZi%_Q$+cu(_5`z$`pnry`Yi|@##rhf+qiElHL(8s{1~MvI z7mIf#?@z_nCXpP9AvqJ51|LynlWKiKlA+pqTFa;*Q4~8v;(9~X4e`lsvbZ&;4;!PB ztfpkyFo#r45|=lxc&J4YJNwozOGVeTuk8_y?S`Bl6bEvWt}Gowa}2aLnrs)1v@WI6 zE0+JC?Sosilp$+!Ze+wrDY`bU>KScd?hzGrT$5FC_UF#G-+2PGfTpUabb0QFXL4Id zCBvBeM!Nx~YM4u9l-AWTn-W^qL^NU_jhM19lyjJqyM;NU87XT5rR+tXRaV?($d0aM zHFH)oC1W_HZ^=^DZXX$V#f8xIl2S6(*dg%9gAid^me^vJ%?N#Y;v5cjE%x!KjKTpf zP;Lu=Z%+PrZQlb28!(zj;h_aXRmB^;8)^~ja-sQ*tGMv9ch6k@?b{zhJSw6NRa}+Z z7O?-9?aH=|o33uoWH^r0JG2Z>^h$O{#lGFDcn@pL~H@@^i!uEeDS^dJv?$# zxRR^%+5+J72g;776Xbo2ycCuSrE*&UoO<}}+QWL?86GX5aBzMwU<-gRjnyh??L37A z3VS$@#})veT~s#19@_mCkKpN(YFtgzoc(qfpA=mjnpi?}e)~NNc0y-3Mx6uHT)xzokg!}dM$2(_U7X2=U zj5Ff`aAeRwc~H52GC=PVM8PsBKfo@|<`0zM+}BeJJ64@uT7XG&WpfbBn1sBcdRR@l z?!A_fTbt-f+45`+gaXphEG@=?HzvJ8uT#VDqTU;=J!M@qofdb?J>YcV*o}#%BTvMs zImsj|;7*f&F8ScZ#bY^YW)WKg4G0cQ<2~iOb!v_<5yu;7O%t#<4Y4ta39-8%B>d8g zTg(P0U-0?i&Chl0pdrl)vkvZbW%^Rt&rLsBW|dJFLPK`7PP}>fRMQL8EHkom61)tW zfb}dOHYQOaS_=oCywdr_=X)n7>0X6V?uL-vk9S^pY;gY(T2w0}m=7uY5=%A~y*?ik z5Av|^JTR$5l`Ncxi5GcUU^gZ{CYwt)J6yzMm>K4wwwPp?jI(;wKk-sO z`}AA1EEcJtc2Eb}E^Cy48E8C@yKQ=46847cAQjrmdUH7(2c@IUvBnBS!lX;+s)j8` zHx~Tfe?0aP&BA&_-~?mG#s25Gp&_kV1KybQ2t5wthd1p#a5Hk^I~p>?o=HB6oT!@sk*q?9YhJc~F7L?wB(G_Ue`mHsaV-@oP#s&xPW literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CC8FF5B2CC920A3D.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.c.CC8FF5B2CC920A3D.idx new file mode 100644 index 0000000000000000000000000000000000000000..617172d4449c0576f7050e412ac6d9074f0d011a GIT binary patch literal 3636 zcmb_deNa@_6~7mD!MEJE7x{8QJ{Cm8uYC(affcY}BSHtPgV;7hKfKGy5+hJjl}1vgMTmag&LIh?*@Dte68D_liIF1M?`X@eB(@`ZZ* z0ZG;T!LaUIB=CeGj0}czmG%8duuCJese^Ah5>R_Wno1xr>me{k{*q3morI&+5Wc4x zy7jss-65q*!(uT8X1y4m1-pV8F}}JZuq*B&`_$f<>Dg`N*;SgNZjmEBT?Eq5pxPS_ z`k|`(I$MWg2>J8TapqaGI9=3ho#)x|k_<6Z?Sy>#uOAHTIhN|Qlgt>x-8MHj1j1cU zFPa#MJ(`<9azVQ&rYO-62!A>J@n-`idkYzXX2P%0x!34?VY6d%9uX)dsa7gj?e7aq zdd^L{M3M$eO5;oIhCmCSoEdGs^OM6RB3S@17kHu}5I%eC_?4TNKk|rV4#2s#+*Cs# z{N?^p_nof>JMAPL*h@A^Gz7w*_W8FpxBPRfNa8`;X>%qU0%75)+FeH)C!b~{2jFIF zvprF;3U-5gejH7-&f9sQzT@?SyF@Y%7L@RkY(t>_=_kil{QRwg=S7kYaF#90VF-lF z`wo=`>aHFUNeaN;crP~u!m+oL|9j!Luf4^H6W}pw9i#JSU%2F*L4K%ho&9%==Wxq?TiZu~K4f_f-hvRg0@!xHsdcsPhzEh=+^y14?@Fpzn;A zkP6Y#3Yf2!>Cn)?fa5u(JQuy67K1IQc=ol*$?CIr+_V&?bpRMy%u7vR2qDi-CF0#gw zh4Ab3it8C4rjB8{0K5jI1w?O!cokxTyiA_fyM$nvCnQ)FG03 zottJWmsh$`Tld9zk}g2shQC;P;^=!LVX(#tpM$Q9OnnibV0~PJ=_;`*4Yjdd0CT-p zm|MI;9k0+_WP)!9h~6`BS^B~sZ`u4z^-eH4MU$s!J_h9W=@0m|m7nOqB(+S^9L(Qc zmHofGGPd$L0M1j(c^cgj6T@P=uirqLJ1Q0-TgEH1Dwmm~s`RQt9AReyPxQ8g6d8Y+ zI$ov)=)ve4CEMq;_q_=DR7y(YP@8ct@y22M8olj3|A!Zbhk@k;wM@`#q`&r2@5S%8 zzjzQbV1_;dL;itvOPk|fPh>okWD3}W7|$YE0#ai#g1l`2bBHFq7wd8U4E-6MpzBh~`Y$ z;KFws>i$z0v-S-DT2fmU;WTD4B-_jtfdB>@fSHQ{0qj>$DEf7P(~K()CExUJiWW@K zV)O>j2-xeFgsC)09fLHg_Ueuw9avlb;oCs6oRvpA?xE(GTaO*7I|trYbi{g(If zqj49`0kDd#imu0N2Po=y4z7m$F08mGqfb!h37U@)*z)hwuO{z!@{eH4!#pW?=6FX@ z;s4%E;E;YXnOh7|$B@~D+OJ&|2QNN*6^vGjl^JOC^6>W0S6Ad-hr&2UEyt)GNicqv z&N)kya6GZ%Qg8lup85yq4^YbhoreK_``fGQ8~&Pl7XZbgq~SE?JJ8ZEM3dHD>ey>$ zNyBp`KkFa9^c83yrYVPMw7EwDAw^eGBR*BuKj!LU=83juLK1L}#PTyA4sCn>z}%1G ZS)$D@&P^aJ3X*8(35j-8LTu)O{{aX&9FhP4 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.1C76397F76896143.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/sfra_test.h.1C76397F76896143.idx new file mode 100644 index 0000000000000000000000000000000000000000..b71750d073b3779fefb4c2fd552239a0c6dac6ac GIT binary patch literal 1552 zcmWIYbaUfiV_p1VQ=oBAH}nIgaTyxw7!*K4EE43t}ISYOV>}zPb^B&%OKxKA5SN+(K(q( z#c4%}lo*wgT9%odst=*4VNg+KS!xl`VU(B!@)S4(^^(aCB!nTrkOt*|kbGdaFl7M7 zDhL}Jf%yzzWtn-IB@k9gVsUnSQE47SS$<{;Lvdwp(sE$t`da-fu1eC?ga?%Ggv^A@ zWWfXjCmR!|2sfh;D`&k&=c=HG4Ll5D3=D#ytf72DoUELD44f=13=%v*1zL62mRQVM zvxtX56lj8&keCdZVBlnD<^Y>;ej5MMG(W!GJPhJM6P7WuE@KoD;$r0zLYQ%VcGXvV z8^xDA3|v4nc!hao!2|;*DRD@Xr^E4wD#IsQ4FJHI@FT3bw4HRbNUblv_UpUBE1Bql4S0{5?wBa0(9%qSiqM+rxH1kZ`Z2}#aL!U--13s6Q*NI*hu zff>up1qnW=FprQIx0fiwTz?^d85pl5CdcNjw&5}+9w7%72PEqp#2jQ{ieRA+v<@8R zP;+5H0rV>Qb`c)Ol`sMjW*~JBk$*J+l$;BlZshNrTMi$2AmMQwhX+??gC8@f$iXNIRSdU)krQGt mR2*h3P#A0+OnFgiP9lh1T$EhQ4WyZvMLlAi0)+i~85jUbh(!+o literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/spi.h.3FDB82D9CF0119F5.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/spi.h.3FDB82D9CF0119F5.idx new file mode 100644 index 0000000000000000000000000000000000000000..2054914be7447a75dea0a7f61c59a621eb1e3344 GIT binary patch literal 51042 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 W4w_iXA?a@@GX8xk{r!pg_x}USVS&K_ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdarg.h.A61B4A3DD19995EB.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdarg.h.A61B4A3DD19995EB.idx new file mode 100644 index 0000000000000000000000000000000000000000..3cad95b97d9e766ce80d7bbc86df037177311d1b GIT binary patch literal 588 zcmWIYbaQiIVqkDi@vO*AElFfyU|t^h+}Jlaq^$ z3``9`w0=o`eonD|a(-?BP)QL`RyR4lL^s*Uz`!8h$W+hJP|rZmCnQ)uGcP%(G$mC( zz9cg~IX^EgGhHu(ipCa~q$Czm*~rRbpld4&Qj38uElZ5g$t*5mD6Y&+QUnIbFXOc-VzP#9zvO!)nph956Yva5i?(Hzlm z)$3kss;bR3u4Uw5vf{83glWF??rK-<)61`bsx3Jz;fC;jvfjVy#F2MEVKojlxJ!ys ma}q)J6c;5ID}xx!AOZ}Sm;@D87R+C{_5~9oGXpG*0Hpw9KbsN& literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdbool.h.6D5F9834DD64C05A.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdbool.h.6D5F9834DD64C05A.idx new file mode 100644 index 0000000000000000000000000000000000000000..0aa054320b63bccfeed3700336df9085720bff69 GIT binary patch literal 422 zcmWIYbaR`>$iU#7;#rZKT9U}Zz`!63#Kk2=nHzvK7^G$9q+03g>pNTNmt^WECl?zT zm>Pg+{gV9roMQdt{M-Vdk|Ln2ZgP5wZnBYqfkC{Hsh**so`IfENU(lpUUE)pN~(T* zNoIU8vxA@L!R0j}}!Kz_Khhhq>zAT2W|)k3Q)b3&)~@=-!C>H#+cJ5WKmNVq(h zfGJ>PWhhEbD_#kVIaa$C{_sgF7#X?P)Hu}m!EOW+YN0|5^P-NcGxD$*a~Si$grD@* zr7b&uR0Aj+!V@9}6aLZr=6kk~r7i~#n-+r>T$qPVn?W0ir^BFw#M5QaMdC#>L?iKH z7-EokSqxc7yaI*-IB(PH4!Z-(zncPGZ^dCH0dvod+49fVpPpm^6n5cok%S4uVupze z5+hJ?9yWUpdvO!nBV0EsqeM6^m~iy}WAX>;P2x*}+XRa=pfD)LU`E2C3MdSUCzvoS zf`B%GVh1M7!{*81DFM?1izJ|4Pz=Eo3Euws()AbH6QFPyN0=;37#L$Yi6BmKQF5_3 XkY-|g*FAN{W}7{%!02R!D`NlvJtNGR literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.2B221F242309F99E.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.2B221F242309F99E.idx new file mode 100644 index 0000000000000000000000000000000000000000..3fcd16e59a36a23adde00748b536f2becf0f232c GIT binary patch literal 2470 zcmcJR{ZE@!6vuB_p?5rG@-q4o3GAho@Yd&PX=`6LK)dliCNh|BS;tC&h5}1lGMSq? zhBG4?RD6MHNI(;1W`fb_BuivjVvIkD$y_i~=Q1TKniw}k3F^7Gp6BTwfH&#ko^wC< z+|$eX-t_*O%F6MLg!tNO9_aiaj@U6YOFzc1DcL<>NnvCzzo0xWECZ-4o@Gy4Q` z2LJ_z0uwh1ka8^d!j=Vli$FF3P;4wVbE5!DbT+eppt4gSn*k7wVm>ztaK3%??~9c= zA%Ua<;50Z*+$exoH$Qx7dQ(IoIsmLjYd$v$aCPIaw|Yi@dQ~8q0Cf#?CS7%gUQ6d?Kd z*r?{s?#~4x08pwg-NuaqWM%&{HThb`vOqEb@EAR2ZWQ3)lRLf`e{6nDU=N|jWpJ6e zQGf_YDgz$M$?TD}=E(t-N~`fwuO7cWwu>q?-X^?D2>IsPLHgCM3#kyUrL}N&d|>ZD zm^BWDYd^Y~J}B+YfZQJH(PPoy-nRVk_`{joAuLhJfSa+uAPH+OOj5NnT|V7+qyWN= zv{62C<=Le_x-#7*DO$}=vJ?K7@uAg}k+KADH`$%wRgtO$ubNaRc=e=S_U8V&a_Ehz zy$-0*O05R$nc)Lt>ct_`-B3y$t&>Z6@pQ)A(r``<&~ED1V}GC=fM#023O}$7UeWl5 z_5fW(i}ZNWs12Z*Fpx$?K$yt^!`Du|Fu!$1+7C&JX|W!u{g<}hcxWp35ePe}Q-@+e z)j$#^8BBu95N1NbFn(JIGkIY6!y9iu@#ET1Kjbc;1v;$vevxN%7%7a`fxvlg4L&_EDc4#;$`f6CBcK`k(LeyN4$riGwT;Jek$_F2eXN=vg*adnr6T2`A!FG5(Pq5*I2oL)2V zz}4ByNm@;XsltLu!1Gn?K`*cMzPBa@{`?g7+NoWK{fw!h0H$Q5S3a>7F0^c00NO$= zdMxv->7C`x?v|SnE~JHeY@&`VRl|X&URq=YXe;2^h!61W73JtXUDq(<`|ady*z2M$ z9limmJ1Bs?6iDMTgxULmVG;?3TbUD$1fo@JqGl#Ol5s*viZb0GPm?t2m9(5Y%cZ&G Oq?F_hYJ$JMfcO_!QD>_F literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.C8EE9E4CF97EC8C9.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdint.h.C8EE9E4CF97EC8C9.idx new file mode 100644 index 0000000000000000000000000000000000000000..f0cbb12ca9a5cbf66afc613bedef6f3e3bdd3ff4 GIT binary patch literal 550 zcmWIYbaRtqVqkDi@vO*AElFfyU|0|e4Cb5gDJ_4S>t^h+}Jlaq^$ z3``9`w0=o`eonD|a(-?BP)QL`RyR4lL^s*Uz`!8h$W+hJP|rZmCnQ)uGcP%(G$mC( zzPKbMGq1$NKre%urj}&JC+Fv-Wu{ZrScqGxYh-1yKHS*i%G@MS@D`<}6-NQ-AH8qB zXA4>CvhXl#GH8l{q(Fd&S&KmniKoq=jl^qaVQ6N7^Aj1)Ew|ssZN|vOtjeJ(1Tg?) rLrx-yU0ei=Ga${xtn=Z+JqG2kOPQG%Sr}mP43q)IKNJ8{1q=WH@!^Wd literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdio.h.57070E279D9CC442.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/stdio.h.57070E279D9CC442.idx new file mode 100644 index 0000000000000000000000000000000000000000..e7bae5a66d69086480cc9a2cd5fedf918f30cc97 GIT binary patch literal 14234 zcmd5?dt4P&9zW-oI0KHb`RbZ?pa_x$6FHo0(h+Kv#?8UMRId08KH!ynq!CwOXH{D`E75^WK7XYRD{ zt6xOgf~WS2cjc%VHhYfK>2`RgX|MXnXQ>{WJ=c?`re-^?XNCrL)Vfi-tHS3wv`o{` z!PSYil6W&r%S_F)MVNw#lbo%yGDYa^`Zhx2JX3NVy5@j*ch=JmttHy?N8LJebKIyb zB!e&7w&IE8sBVv~brT|O(b3U2ZN&!1Zl5?Q%jL;Z?fI#8SC-qu9eHC!@VI)XwTjf1 z0(07?E4wqxWps(x*q-A`Zxz6VSdWE$;V%a(A-XZGGYPi)X zvtqv5p%&Zg&Rh34XQS7>UI*S%xltdyM}BOmTW9+NR=TKv{ErMZZya+pNp)vssE%}- zKBKi8bCdRy^13N^dZYnAkg$+K>zWhq>)i>&Tin)djuRrah)aJ{`tJZNFF2&9p*JK%J z-=0XD_}RIRi#9(t*XUwWZIrA&hi+K+n({?U?_w3f+sqwa^O}7+3=93MVIursa2MLQ z!W7_$nZRxQ6b3>2IB;9@wN{srwriK>HauX6o6*z@NgJ0NGWy|uZ@tuCPxt!$&f6Pl zyLP%?&l_$kuIYrEv2QaQp|*??X!TC4J}tZ;G#kNEYg6`PVNEYL@4Ib_>qqo1UTt?; zTLa-OLu|HQJ88UdybFl_&b!98UB=vQvhky}gP)pB#I3sgY_<`Pj7}JvG-kAIc;bkp z(Mj6R6q_x|Hf(fClI_MXzgv}3#4YqR=HbNTVcr&D1GTZlru~%b*5yQQT|Xs^9F{yR zVQgZuEot<_kBp5O^T=3y7z29aP5ni-Zg^61V#3&;+cX^PUu5eNlat3JM~xgddiX<0 zqaXMQW5%oa7uh;})f|?PkeHJ4Gn)2G9Xq{s506RF*UFzWdcVxE8H(P}M7#9~ip4jbUlkA@CT-;B(5x8|F_Kc4wcBdzGqRT;2 z-MM-A$#xRl)NB78YP$At+TEU z;s%W;X)Z@5dq?C(DjIB4<`cG={omZn5`M^KQ9IZ9s2jl2hE+emr`)Z@JsF zbca*->PpSP;qs2HP81R+D=BC0ByC*rjtY5>RIGtKhgZ>^ma1YIxE+qCy!RaK;nBz6 z<8Zl%Q@i8Kg1jt`gXjgK-SD`s0XM;#B^uj9^y4nc^%j(7&w}f*wVP(5r;z8!&dGO> zJco9~!bd?C*19(l46W5aKJxXa%AD}Y;r6QGbkYilc&8Par0RKHyG17X#x(95;w@*9bRr=p&6F)xP?~#rQnQJK3Q)|8Esh>Yn zdMt6p@4G!cAV49n7)oovvPScCPgkb2cT1Gd+2V7Z6td7zS_GCwno@i>ru6qG3l{%l zWO)~b6!5%{gY`J{BEAm<{dS3-cgsi5?uZ>y*;OG63`d1vErcNA+gD=_l@1$dg>B3anM$j7E8N27UER$s2p;-K&u2jbM#nZ3J{Q;8$chwPS(!guvl_ zDFMGxNFI08M6FE}2V=;u$?wLYN^@D!y}@_)9VhtLRCqKG9z+_%eFx zrEv;**-$zJ)`BgzISz$9 z%M&^Y){~l_`+E{^bsRqS>D)WlHDoAcrQv5aSXM(%VPwCZLMQ)W#<47g%rlhcgJnMa zn)nXw&N5o@V0yzl#XFz$C$lKl(1flNEc%Vt(7L#iZ>FR>Tnd?QIBB8Q7Hu#h+Os~K zQCFIACHpH?A(MH^&D7dVaZm@|?(M?~S2l&68aK_OkSSbc4p`=B2}k*|T-rB3bE#m& zo2XN4#M%$m{aWvg=*^TC{rA9sm*f>sR>(B&=qy;zYGV;X$zSxz(|l=K*IlK*v~FVK&|h+Zq&d;*>n3r~`Qzv&p<8vxk1; z*^Ke&ziRMr%f|Q>D`XPSW*1m@X-zUJXU6T1z5K!6lf@m#a~Mf2q#X-sC-&f;RG-Z~ z-uy5&_II-t@{*Cy60j`My7|5yEa}j1-oJg+(Cu^m$>TWU6T43Aso(gBm%To`dymk^ z7AvIG@KFwya%~kIz;>(k3RlHYSjHMDyT z#gRaqJPt=|?V#aDr}-~^O(9Qll}fNyYHsf8?44IdZ%pknG4kSCg=BJ-nP8pChRVBQ z6iq8X|L{ld^$M9|q;n9g2ig4eDs5eQmw(_#E6WwK%urehmX%ru8I|$h|6O@tz=fwb zD#XL16@jHl(~0sO?RAt_{PyGv+qzaLWU=9>ky;zIxrOVKz8Zubin%LjT*o&QlEM8n zfVH7j)_pQpywX1O(d`P!;yOFPy2CpqlDx4zkI(z8YFp+Gg*?i2HiKoe*07ikdOxc^ z^Sb$b^1!$Y`xNpF*Et8)b1c?#IJH!tUCw)p7o0uymOpt6izl^fY7hO!i)Y#PCsO(h z$o`u`9NfiaYQ3zrXt+%)3)LrP;q;4Y=&U0OnaWkF!CI|F3A>GDGBDxjwBe6-JE0IK z*Qp0ppJi>0U?$-KjP$w4Qi{vStqk}Gd*@3um$`y1h=&axPbi>U>%I>>& zZb@%a$kW`(8L*zwoP+{%69211E4D8!Xi-R!F~}ugDbc3nU<*^it(Vh1?G8dVoOt8Y zQ>z2pQ9t!E$d@62`875>)R*sZn56dc@+0F@-foW;l~k^zw{we%s_LqgXIdl_9HjC= zYPcHj>2S|mS;zcPaD>W7=&!g1-z#AZwnbtRzCS_%+ZHjw^ziVI@{~#b=xQC6*HM4& zs;*$`<3sj@1)v~9&gjlx^F0(gVp}IB;rk{Ou zwH*=v7Vymw>a#r%)2~!q9WtXwc1QgRDp#1@!FNVz!8Sz9qOtwN4a3rASOXOti=aB% zhrK5Xc27`!Ydo-?#+&jc+PjH{nfMazeM!VuXwVhWzL^F$({NM&TN?bWh>O8i3?Zic z1qgfr7g%;FY6%3EhpE!dL0zworIv1AdFuv1lNMl-;EH|Xvzx)FWndY_w_a`m5o&1Xih1Dp9f{93EsuUF>TC#@ z4R@M&E(FXK@jM8aC*lPVut3BwLBLBQei;H@7V%#p;IATH0RbyS{0aoTBH~ve;8hX7 z1_7^$cr66174ZfL*dXFf5U@$aTOeSIh_^z(Ruf;E`(@Kpo$iV9Rn%A#%m145HGDtvok-G%6_%^cmHUsk$42~!}xUeCKxqRWJ1&6bv zaYT1gd8fIK#J#)My<+FzG{Jf*uQyldFP=V@UV7={7!>TK@?LZGiq^Of6=_e#2k=y-#@+GKCO0CjDr0Tagh$-0tJ(cX`=U-_!5n|B;qSH z_KLXhHq*FfdatSfEsgtD#NW|w-%*<>Z=n$_V!ZEZ#P=dDguaC^(A1v}eW#1K2*QdW z&XgBJR59Qm>Ul3kodcnB#D(ewh zm6}9+nM#*M+)Slr5w}pOMZ|?56@rk@Ops=ZxCo>o5zhf>j)+S@DiQH~kmiecAxH~F zya=R4B3=U05)m&0X_<&ug0xb^r684xcr{3?MZ5;2H6mUI(mD~BgH$f!%^+f zBHjVg4iQ&^R4L+JAng+IZjg41cn?T>M7$TIy&~QR(moOI2Wh{E4}f$)#0Nn-DB?pP z9TM?zkdBM^BuFPkTm@2Dq3_KL@<}C!OZtZhG$pKPDfWwAUBz3G|t?i1!L@(MZ??yg*{tNJJF(?%H`&_ zlk<3J!RR|?QP}Bm`e1@jCR)5h<#)_avJtnyF$0rY^wPgPZ9lcKF*Ug;z z`klDVn*5d~SWD%#W=^k9I(jVfZ|CzsQERAFBd#yCRH`-cXJHrrv8d@z4|;IPF5?Ir zbzjQHBcEhzueVcqyXlzIjF=;%7g>&+TSNh)6q%rAaK{rz%Q6aX^Ha}I`HbmGORZOp zcsQ%2p|v!U*%3}eqDMwRGKv4!?YDLg&zXYB&7krOYJ7G6eUY9DEm=23R@CKi|8ht& zI7W393|$3@2D5}m)M2GClAl=>td9Fu!vnlr6txWQFM}k0oL1EJ5Vjto4K_{P2tzkQ zqCw^1&g`BFxQ}nuo}BlkBYV@RshDAi9AfOtcm?3TOyf*>LlreMAhR21G5c+Znf~tf zo-=R@`VO>v2Rd=JcE{&__5J4Pzo65PsQi&x1)OZfj$$M$GvUog0b^E~fYYidU~DQA z@FaTsc_~!(S{te^HPph1LPc$$T^gvxU@39?7<7?_@qM+neeBXiEqt@9sF!J%%hY19 zS6JX(nyH0XyrO4_i8HDf-QPh=STM5BtJ?wzqJ0R2``qZ7!ekb@Dtf#sQB6dNvK_shh zLhm;r)F8Q#&*`-XLO8*r;2a3w4^ezlD7f_XJp?g)EmYJGq5X&8$H^B(Jq1ChAdD|? z3Z5o{tDp}*UMT7r=zRu44L(e*hM;N)GpIg16$jTqAAU?$aK`jLi~5|)SIN+Lr0WVY(FixBc z7$J@V#)C5fFHICM?wbjCjiZ1O-b}#RZWJ(*n+f=+p@31_Ou)+>1&q&T0#0V5fRWft zz=sP3jJallfB&m_*tfk;9KvDRPv!mQ8JzRkDA34kK7M>9Ku3(fW{&;?EfcyATl^mC zZ=mu9^K-!~2Q3(#%`AA4qJVMOOuz|jbfvM^JTxb+@wLWU^VfVXqZ>w4GdItDHpmrt zuB;aIcTjnUnUSycj>|8ddQTI41M)W}#l(4SoCO-G&HUgTI1Rz4A;O&1wGdGYv3%CP zeR^W2r#4KjM}M2ByvYm{^Xl}1yf;RjN5N4lA2nD02|4r6JVZbJ1_f_X`7PR!hswKb z-`DPt{UQoBQ+cy#!B-G$C1cW=$-=5VQ=fXg`z5q^kIL_v7F9OKE5C0UstG=z@(0u) z4>|FUt{C6WT#bagk0fo|^gUV}rt)F49mvAFQZ*%aUYc9y3S7(tA35gFT=QqP@e|bi SP1&=jM4k$1=gQ8_A^!(Eu+WqM literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/string.h.9E28FAFBAB9F1BE8.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/string.h.9E28FAFBAB9F1BE8.idx new file mode 100644 index 0000000000000000000000000000000000000000..bb862779d4f1d0adeaee01f14768e26477b71f37 GIT binary patch literal 4784 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 Po!dIMc0SViMCbnpBp~oE literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/upp.h.BCE80B45D7E726CE.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/upp.h.BCE80B45D7E726CE.idx new file mode 100644 index 0000000000000000000000000000000000000000..277b9d0700f2753c06435eecfb13c1bb9f0b6108 GIT binary patch literal 49892 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 E0%nN?eEN+NJ0|}z4u;~E)Z%! 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 DRSn!* literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/compile_commands.json b/28379d_test_SFRA/CPU1_FLASH/.clangd/compile_commands.json new file mode 100644 index 0000000..db4ab1e --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/.clangd/compile_commands.json @@ -0,0 +1,47 @@ +[ + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg/board.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg/c2000ware_libraries.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/F2837xD_CodeStartBranch.asm" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/main.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/sfra_test.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra.c" + }, + { + "directory" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH", + "command" : "clang++ -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA\" -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device\" -I\"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/\" -I\"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -D_FLASH -DCPU1 -D_LAUNCHXL_F28379D -I\"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/CPU1_FLASH/syscfg\" -DF2837xD=1 -xc", + "file" : "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.c" + } +] diff --git a/28379d_test_SFRA/CPU1_FLASH/28379d.map b/28379d_test_SFRA/CPU1_FLASH/28379d.map new file mode 100644 index 0000000..bf7754d --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/28379d.map @@ -0,0 +1,783 @@ +****************************************************************************** + TMS320C2000 Linker PC v25.11.0 +****************************************************************************** +>> Linked Tue May 19 14:32:29 2026 + +OUTPUT FILE NAME: <28379d.out> +ENTRY POINT SYMBOL: "code_start" address: 00080000 + + +MEMORY CONFIGURATION + + name origin length used unused attr fill +---------------------- -------- --------- -------- -------- ---- -------- +PAGE 0: + RAMM0 00000123 000002dd 00000000 000002dd RWIX + RAMLS0 00008000 00000800 00000128 000006d8 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 00000000 00000800 RWIX + RAMGS14 0001a000 00001000 00000000 00001000 RWIX + RAMGS15 0001b000 00000ff8 00000000 00000ff8 RWIX + BEGIN 00080000 00000002 00000002 00000000 RWIX + FLASHA 00080002 00001ffe 00000000 00001ffe RWIX + FLASHB 00082000 00002000 00001b63 0000049d RWIX + FLASHC 00084000 00002000 00000000 00002000 RWIX + FLASHD 00086000 00002000 00000128 00001ed8 RWIX + FLASHE 00088000 00008000 00000000 00008000 RWIX + FLASHF 00090000 00008000 0000046f 00007b91 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 00000022 000000ff RWIX + RAMM1 00000400 000003f8 00000100 000002f8 RWIX + RAMLS5 0000a800 00000800 000006d5 0000012b 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 + CPU2TOCPU1RAM 0003f800 00000400 00000000 00000400 RWIX + CPU1TOCPU2RAM 0003fc00 00000400 00000000 00000400 RWIX + + +SECTION ALLOCATION MAP + + output attributes/ +section page origin length input sections +-------- ---- ---------- ---------- ---------------- +codestart +* 0 00080000 00000002 + 00080000 00000002 F2837xD_CodeStartBranch.obj (codestart) + +.cinit 0 00083b40 00000028 + 00083b40 0000000d (.cinit..data.load) [load image, compression = lzss] + 00083b4d 00000001 --HOLE-- [fill = 0] + 00083b4e 00000006 (__TI_handler_table) + 00083b54 00000004 (.cinit..bss.load) [load image, compression = zero_init] + 00083b58 00000004 (.cinit.SFRA_F32_Data.load) [load image, compression = zero_init] + 00083b5c 0000000c (__TI_cinit_table) + +.stack 1 00000400 00000100 UNINITIALIZED + 00000400 00000100 --HOLE-- + +.reset 0 003fffc0 00000000 DSECT + +.init_array +* 0 00082000 00000000 UNINITIALIZED + +.bss 1 0000a800 000006c2 UNINITIALIZED + 0000a800 000000c8 sfra_test.obj (.bss:clMagVect) + 0000a8c8 000000c8 sfra_test.obj (.bss:clPhaseVect) + 0000a990 000000c8 sfra_test.obj (.bss:freqVect) + 0000aa58 000000c8 sfra_test.obj (.bss:olMagVect) + 0000ab20 000000c8 sfra_test.obj (.bss:olPhaseVect) + 0000abe8 000000c8 sfra_test.obj (.bss:plantMagVect) + 0000acb0 000000c8 sfra_test.obj (.bss:plantPhaseVect) + 0000ad78 00000006 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdPacket) + 0000ad7e 00000002 --HOLE-- + 0000ad80 0000002a sfra_test.obj (.bss) + 0000adaa 00000016 --HOLE-- + 0000adc0 00000022 sfra_gui_scicomms_driverlib.obj (.bss) + 0000ade2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_arrayGetList) + 0000ae02 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdDispatcher) + 0000ae22 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_dataSetList) + 0000ae42 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varGetList) + 0000ae62 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetBtnList) + 0000ae82 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetSldrList) + 0000aea2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetTxtList) + +.data 1 0000aec2 00000013 UNINITIALIZED + 0000aec2 00000006 device.obj (.data) + 0000aec8 00000006 rts2800_fpu32_eabi.lib : exit.c.obj (.data) + 0000aece 00000002 : _lock.c.obj (.data:_lock) + 0000aed0 00000002 : _lock.c.obj (.data:_unlock) + 0000aed2 00000002 sfra_test.obj (.data) + 0000aed4 00000001 rts2800_fpu32_eabi.lib : errno.c.obj (.data) + +.const 0 00090000 0000046f + 00090000 000000c2 driverlib_eabi.lib : sysctl.obj (.const:.string) + 000900c2 000000bf : flash.obj (.const:.string) + 00090181 00000001 --HOLE-- [fill = 0] + 00090182 000000bc : gpio.obj (.const:.string) + 0009023e 000000bb : sci.obj (.const:.string) + 000902f9 00000001 --HOLE-- [fill = 0] + 000902fa 0000007b sfra_gui_scicomms_driverlib.obj (.const:.string) + 00090375 00000001 --HOLE-- [fill = 0] + 00090376 00000062 driverlib_eabi.lib : cputimer.obj (.const:.string) + 000903d8 00000042 board.obj (.const:.string) + 0009041a 00000042 sfra_test.obj (.const:.string) + 0009045c 00000013 device.obj (.const:.string) + +.TI.ramfunc +* 0 00086000 00000128 RUN ADDR = 00008000 + 00086000 00000043 driverlib_eabi.lib : flash.obj (.TI.ramfunc:Flash_initModule) + 00086043 0000002c : flash.obj (.TI.ramfunc:Flash_setBankPowerMode) + 0008606f 00000024 : flash.obj (.TI.ramfunc:Flash_setWaitstates) + 00086093 0000001d : flash.obj (.TI.ramfunc:Flash_setPumpPowerMode) + 000860b0 00000018 : flash.obj (.TI.ramfunc:Flash_disableCache) + 000860c8 00000018 : flash.obj (.TI.ramfunc:Flash_disablePrefetch) + 000860e0 00000017 : flash.obj (.TI.ramfunc:Flash_enableCache) + 000860f7 00000017 : flash.obj (.TI.ramfunc:Flash_enablePrefetch) + 0008610e 00000016 : flash.obj (.TI.ramfunc:Flash_enableECC) + 00086124 00000004 : sysctl.obj (.TI.ramfunc) + +GETBUFFER +* 0 0003f800 00000000 DSECT + +GETWRITEIDX +* 0 0003f800 00000000 DSECT + +PUTREADIDX +* 0 0003f800 00000000 DSECT + +.text 0 00082000 00001b3b + 00082000 0000052e sfra_gui_scicomms_driverlib.obj (.text) + 0008252e 000003fe device.obj (.text) + 0008292c 00000209 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_setClock) + 00082b35 000001fa sfra_f32_tmu_eabi.lib : sfra_f32_tmu_background.obj (.text) + 00082d2f 000001c2 : sfra_f32_tmu_config_reset.obj (.text) + 00082ef1 00000142 sfra_test.obj (.text) + 00083033 0000012b rts2800_fpu32_eabi.lib : e_logf.c.obj (.text) + 0008315e 000000e3 board.obj (.text) + 00083241 00000090 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_selectXTAL) + 000832d1 00000088 rts2800_fpu32_eabi.lib : fs_div28.asm.obj (.text) + 00083359 00000068 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getDeviceParametric) + 000833c1 00000067 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_collect.obj (.text) + 00083428 00000062 rts2800_fpu32_eabi.lib : s_tanf.c.obj (.text) + 0008348a 00000052 driverlib_eabi.lib : gpio.obj (.text:GPIO_setPadConfig) + 000834dc 00000051 : sysctl.obj (.text:SysCtl_getClock) + 0008352d 00000048 : sysctl.obj (.text:SysCtl_selectOscSource) + 00083575 00000046 sfra_test.obj (.text:retain) + 000835bb 00000045 driverlib_eabi.lib : sci.obj (.text:SCI_clearInterruptStatus) + 00083600 00000044 : sci.obj (.text:SCI_enableInterrupt) + 00083644 0000003e : sci.obj (.text:SCI_setConfig) + 00083682 0000003d : interrupt.obj (.text:Interrupt_initModule) + 000836bf 00000037 : gpio.obj (.text:GPIO_setControllerCore) + 000836f6 00000037 : gpio.obj (.text:GPIO_setPinConfig) + 0008372d 00000037 : gpio.obj (.text:GPIO_setQualificationMode) + 00083764 00000037 : interrupt.obj (.text:Interrupt_enable) + 0008379b 00000031 : gpio.obj (.text:GPIO_setDirectionMode) + 000837cc 0000002e rts2800_fpu32_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss) + 000837fa 0000002b : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit) + 00083825 00000029 : exit.c.obj (.text) + 0008384e 00000028 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_selectClockSource) + 00083876 00000026 : flash.obj (.text:Flash_setBankPowerUpDelay) + 0008389c 00000026 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_inject.obj (.text) + 000838c2 00000020 rts2800_fpu32_eabi.lib : memcpy.c.obj (.text) + 000838e2 0000001f driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_getTimerOverflowStatus) + 00083901 0000001e : interrupt.obj (.text:Interrupt_initVectorTable) + 0008391f 0000001b : sci.obj (.text:SCI_isBaseValid) + 0008393a 0000001a : sysctl.obj (.text:CPUTimer_startTimer) + 00083954 0000001a : sysctl.obj (.text:SysCtl_getLowSpeedClock) + 0008396e 00000018 : sci.obj (.text:SCI_disableModule) + 00083986 00000018 : sci.obj (.text:SCI_performSoftwareReset) + 0008399e 00000017 : cputimer.obj (.text:CPUTimer_isBaseValid) + 000839b5 00000017 : sysctl.obj (.text:CPUTimer_isBaseValid) + 000839cc 00000017 rts2800_fpu32_eabi.lib : boot28.asm.obj (.text) + 000839e3 00000016 driverlib_eabi.lib : interrupt.obj (.text:Interrupt_defaultHandler) + 000839f9 00000014 : sysctl.obj (.text:CPUTimer_stopTimer) + 00083a0d 00000013 : cputimer.obj (.text:CPUTimer_setEmulationMode) + 00083a20 00000013 : sci.obj (.text:SCI_enableModule) + 00083a33 00000012 : sysctl.obj (.text:CPUTimer_clearOverflowFlag) + 00083a45 00000012 : sysctl.obj (.text:CPUTimer_disableInterrupt) + 00083a57 00000012 main.obj (.text) + 00083a69 00000012 rts2800_fpu32_eabi.lib : args_main.c.obj (.text) + 00083a7b 00000011 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_setPeriod) + 00083a8c 00000010 : flash.obj (.text:Flash_isCtrlBaseValid) + 00083a9c 00000010 : flash.obj (.text:Flash_isECCBaseValid) + 00083aac 0000000f : sysctl.obj (.text:SysCtl_pollCpuTimer) + 00083abb 0000000e : gpio.obj (.text:GPIO_isPinValid) + 00083ac9 0000000d : interrupt.obj (.text:Interrupt_disableGlobal) + 00083ad6 0000000d : interrupt.obj (.text:Interrupt_enableGlobal) + 00083ae3 0000000b : sysctl.obj (.text:SysCtl_isMCDClockFailureDetected) + 00083aee 0000000a : interrupt.obj (.text:Interrupt_illegalOperationHandler) + 00083af8 0000000a : interrupt.obj (.text:Interrupt_nmiHandler) + 00083b02 00000009 : sysctl.obj (.text:SysCtl_serviceWatchdog) + 00083b0b 00000009 rts2800_fpu32_eabi.lib : _lock.c.obj (.text) + 00083b14 00000008 F2837xD_CodeStartBranch.obj (.text) + 00083b1c 00000008 rts2800_fpu32_eabi.lib : copy_decompress_none.c.obj (.text:decompress:none) + 00083b24 00000007 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_resetMCD) + 00083b2b 00000007 rts2800_fpu32_eabi.lib : memset.c.obj (.text) + 00083b32 00000006 : copy_zero_init.c.obj (.text:decompress:ZI) + 00083b38 00000002 : pre_init.c.obj (.text) + 00083b3a 00000001 : startup.c.obj (.text) + +SFRA_F32_Data +* 1 00000002 00000022 UNINITIALIZED + 00000002 00000022 sfra_f32_tmu_eabi.lib : sfra_f32_tmu_config_reset.obj (SFRA_F32_Data) + +MODULE SUMMARY + + Module code ro data rw data + ------ ---- ------- ------- + .\ + sfra_test.obj 392 66 1444 + main.obj 18 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 410 66 1444 + + .\SFRA\ + sfra_gui_scicomms_driverlib.obj 1326 123 264 + +--+---------------------------------+------+---------+---------+ + Total: 1326 123 264 + + .\device\ + device.obj 1022 19 6 + F2837xD_CodeStartBranch.obj 10 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1032 19 6 + + .\syscfg\ + board.obj 227 66 0 + +--+---------------------------------+------+---------+---------+ + Total: 227 66 0 + + ../SFRA/sfra_f32_tmu_eabi.lib + sfra_f32_tmu_background.obj 506 0 0 + sfra_f32_tmu_config_reset.obj 450 0 34 + sfra_f32_tmu_collect.obj 103 0 0 + sfra_f32_tmu_inject.obj 38 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1097 0 34 + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_eabi.lib + sysctl.obj 1191 194 0 + flash.obj 654 191 0 + gpio.obj 310 188 0 + sci.obj 293 187 0 + interrupt.obj 214 0 0 + cputimer.obj 42 98 0 + +--+---------------------------------+------+---------+---------+ + Total: 2704 858 0 + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\rts2800_fpu32_eabi.lib + e_logf.c.obj 299 0 0 + fs_div28.asm.obj 136 0 0 + s_tanf.c.obj 98 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 + memset.c.obj 7 0 0 + copy_zero_init.c.obj 6 0 0 + pre_init.c.obj 2 0 0 + errno.c.obj 0 0 1 + startup.c.obj 1 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 769 0 11 + + Stack: 0 0 256 + Linker Generated: 0 39 0 + +--+---------------------------------+------+---------+---------+ + Grand Total: 7565 1171 2015 + + +LINKER GENERATED COPY TABLES + +__TI_cinit_table @ 00083b5c records: 3, size/record: 4, table size: 12 + .data: load addr=00083b40, load size=0000000d bytes, run addr=0000aec2, run size=00000013 bytes, compression=lzss + .bss: load addr=00083b54, load size=00000004 bytes, run addr=0000a800, run size=000006c2 bytes, compression=zero_init + SFRA_F32_Data: load addr=00083b58, load size=00000004 bytes, run addr=00000002, run size=00000022 bytes, compression=zero_init + + +LINKER GENERATED HANDLER TABLE + +__TI_handler_table @ 00083b4e records: 3, size/record: 2, table size: 6 + index: 0, handler: __TI_zero_init + index: 1, handler: __TI_decompress_lzss + index: 2, handler: __TI_decompress_none + + +GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE + +address data page name +-------- ---------------- ---- +00000002 0 (00000000) _SFRA_F32_state +00000003 0 (00000000) _SFRA_F32_stateSlew +00000004 0 (00000000) _SFRA_F32_rSinSum +00000006 0 (00000000) _SFRA_F32_rCosSum +00000008 0 (00000000) _SFRA_F32_uSinSum +0000000a 0 (00000000) _SFRA_F32_uCosSum +0000000c 0 (00000000) _SFRA_F32_ySinSum +0000000e 0 (00000000) _SFRA_F32_yCosSum +00000010 0 (00000000) _SFRA_F32_pointerStart +00000012 0 (00000000) _SFRA_F32_reference +00000014 0 (00000000) _SFRA_F32_amplitude +00000016 0 (00000000) _SFRA_F32_scalar +00000018 0 (00000000) _SFRA_F32_step +0000001a 0 (00000000) _SFRA_F32_pointer +0000001c 0 (00000000) _SFRA_F32_preCount +0000001e 0 (00000000) _SFRA_F32_count +00000020 0 (00000000) _SFRA_F32_windowSamples +00000022 0 (00000000) _SFRA_F32_angle + +00000400 10 (00000400) __stack + +0000a800 2a0 (0000a800) clMagVect + +0000a8c8 2a3 (0000a8c0) clPhaseVect + +0000a990 2a6 (0000a980) freqVect + +0000aa58 2a9 (0000aa40) olMagVect + +0000ab20 2ac (0000ab00) olPhaseVect + +0000abe8 2af (0000abc0) plantMagVect + +0000acb0 2b2 (0000ac80) plantPhaseVect + +0000ad78 2b5 (0000ad40) SFRA_GUI_cmdPacket + +0000ad80 2b6 (0000ad80) lowPass_test +0000ad8a 2b6 (0000ad80) sfra1 + +0000adc0 2b7 (0000adc0) SFRA_GUI_commsOKflg +0000adc1 2b7 (0000adc0) SFRA_GUI_serialCommsTimer +0000adc2 2b7 (0000adc0) SFRA_GUI_lowByteFlag +0000adc3 2b7 (0000adc0) SFRA_GUI_sendTaskPtr +0000adc4 2b7 (0000adc0) SFRA_GUI_rxChar +0000adc5 2b7 (0000adc0) SFRA_GUI_rxWord +0000adc6 2b7 (0000adc0) SFRA_GUI_taskDoneFlag +0000adc7 2b7 (0000adc0) SFRA_GUI_numWords +0000adc8 2b7 (0000adc0) SFRA_GUI_wordsLeftToGet +0000adc9 2b7 (0000adc0) SFRA_GUI_dataOut16 +0000adca 2b7 (0000adc0) SFRA_GUI_rcvTskPtrShdw +0000adcb 2b7 (0000adc0) SFRA_GUI_delayer +0000adcc 2b7 (0000adc0) SFRA_GUI_memGetPtr +0000adcd 2b7 (0000adc0) SFRA_GUI_memGetAmount +0000adce 2b7 (0000adc0) SFRA_GUI_memSetPtr +0000adcf 2b7 (0000adc0) SFRA_GUI_led_flag +0000add0 2b7 (0000adc0) SFRA_GUI_led_gpio +0000add1 2b7 (0000adc0) SFRA_GUI_sweep_start +0000add2 2b7 (0000adc0) SFRA_GUI_rcvTaskPointer +0000add4 2b7 (0000adc0) SFRA_GUI_sci_base_addr +0000add6 2b7 (0000adc0) SFRA_GUI_dataOut32 +0000add8 2b7 (0000adc0) SFRA_GUI_memDataPtr16 +0000adda 2b7 (0000adc0) SFRA_GUI_memDataPtr32 +0000addc 2b7 (0000adc0) SFRA_GUI_memGetAddress +0000adde 2b7 (0000adc0) SFRA_GUI_memSetValue +0000ade0 2b7 (0000adc0) SFRA_GUI_temp +0000ade2 2b7 (0000adc0) SFRA_GUI_arrayGetList + +0000ae02 2b8 (0000ae00) SFRA_GUI_cmdDispatcher +0000ae22 2b8 (0000ae00) SFRA_GUI_dataSetList + +0000ae42 2b9 (0000ae40) SFRA_GUI_varGetList +0000ae62 2b9 (0000ae40) SFRA_GUI_varSetBtnList + +0000ae82 2ba (0000ae80) SFRA_GUI_varSetSldrList +0000aea2 2ba (0000ae80) SFRA_GUI_varSetTxtList + +0000aec2 2bb (0000aec0) Example_Result +0000aec4 2bb (0000aec0) Example_PassCount +0000aec6 2bb (0000aec0) Example_Fail +0000aec8 2bb (0000aec0) __TI_enable_exit_profile_output +0000aeca 2bb (0000aec0) __TI_cleanup_ptr +0000aecc 2bb (0000aec0) __TI_dtors_ptr +0000aece 2bb (0000aec0) _lock +0000aed0 2bb (0000aec0) _unlock +0000aed4 2bb (0000aec0) errno + + +GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name + +page address name +---- ------- ---- +0 000831e9 Board_init +0 00083825 C$$EXIT +0 000831fa CPUTIMER_init +0 00083a0d CPUTimer_setEmulationMode +0 000827a0 Device_bootCPU2 +0 0008276f Device_configureTMXAnalogTrim +0 0008261d Device_enableAllPeripherals +0 00082759 Device_enableUnbondedGPIOPullups +0 0008273c Device_enableUnbondedGPIOPullupsFor100Pin +0 00082729 Device_enableUnbondedGPIOPullupsFor176Pin +0 000825c8 Device_init +0 00082708 Device_initGPIO +1 0000aec6 Example_Fail +1 0000aec4 Example_PassCount +1 0000aec2 Example_Result +0 0008292b Example_done +0 00082926 Example_setResultFail +0 00082921 Example_setResultPass +0 00008000 Flash_initModule +0 0008321d GPIO_init +0 000836bf GPIO_setControllerCore +0 0008379b GPIO_setDirectionMode +0 0008348a GPIO_setPadConfig +0 000836f6 GPIO_setPinConfig +0 0008372d GPIO_setQualificationMode +0 00083234 INTERRUPT_init +0 000839e3 Interrupt_defaultHandler +0 00083764 Interrupt_enable +0 00083aee Interrupt_illegalOperationHandler +0 00083682 Interrupt_initModule +0 00083901 Interrupt_initVectorTable +0 00083af8 Interrupt_nmiHandler +0 00083220 LED_Blue_init +0 000831f4 PinMux_init +0 00086128 RamfuncsLoadEnd +abs 00000128 RamfuncsLoadSize +0 00086000 RamfuncsLoadStart +0 00008128 RamfuncsRunEnd +abs 00000128 RamfuncsRunSize +0 00008000 RamfuncsRunStart +0 000835bb SCI_clearInterruptStatus +0 00083600 SCI_enableInterrupt +0 00083644 SCI_setConfig +0 00082e93 SFRA_F32_config +0 00082e69 SFRA_F32_initFreqArrayWithLogSteps +0 00082e40 SFRA_F32_reset +0 00082d37 SFRA_F32_resetFreqRespArray +0 00082b35 SFRA_F32_runBackgroundTask +0 00082d2f SFRA_F32_updateInjectionAmplitude +1 0000ade2 SFRA_GUI_arrayGetList +1 0000ae02 SFRA_GUI_cmdDispatcher +0 00082350 SFRA_GUI_cmdInterpreter +1 0000ad78 SFRA_GUI_cmdPacket +1 0000adc0 SFRA_GUI_commsOKflg +0 00082143 SFRA_GUI_config +1 0000adc9 SFRA_GUI_dataOut16 +1 0000add6 SFRA_GUI_dataOut32 +1 0000ae22 SFRA_GUI_dataSetList +1 0000adcb SFRA_GUI_delayer +0 000822ab SFRA_GUI_echoCmdByte +0 0008231f SFRA_GUI_echoDataByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000823e2 SFRA_GUI_getArray +0 00082269 SFRA_GUI_getCmdByte +0 000823e5 SFRA_GUI_getData +0 000822ff SFRA_GUI_getDataByte +0 000822c5 SFRA_GUI_getSizeByte +0 000823df SFRA_GUI_getVariable +1 0000adcf SFRA_GUI_led_flag +1 0000add0 SFRA_GUI_led_gpio +0 00082370 SFRA_GUI_lifePulseTsk +1 0000adc2 SFRA_GUI_lowByteFlag +1 0000add8 SFRA_GUI_memDataPtr16 +1 0000adda SFRA_GUI_memDataPtr32 +1 0000addc SFRA_GUI_memGetAddress +1 0000adcd SFRA_GUI_memGetAmount +1 0000adcc SFRA_GUI_memGetPtr +1 0000adce SFRA_GUI_memSetPtr +1 0000adde SFRA_GUI_memSetValue +1 0000adc7 SFRA_GUI_numWords +0 00082332 SFRA_GUI_packWord +1 0000add2 SFRA_GUI_rcvTaskPointer +1 0000adca SFRA_GUI_rcvTskPtrShdw +0 00082255 SFRA_GUI_runSerialHostComms +1 0000adc4 SFRA_GUI_rxChar +1 0000adc5 SFRA_GUI_rxWord +1 0000add4 SFRA_GUI_sci_base_addr +0 00082448 SFRA_GUI_sendData +1 0000adc3 SFRA_GUI_sendTaskPtr +1 0000adc1 SFRA_GUI_serialCommsTimer +0 000823b9 SFRA_GUI_setButton +0 00082414 SFRA_GUI_setData32 +0 000823cc SFRA_GUI_setSlider +0 000823a6 SFRA_GUI_setText +0 00082443 SFRA_GUI_spareTsk08 +1 0000add1 SFRA_GUI_sweep_start +1 0000adc6 SFRA_GUI_taskDoneFlag +1 0000ade0 SFRA_GUI_temp +1 0000ae42 SFRA_GUI_varGetList +1 0000ae62 SFRA_GUI_varSetBtnList +1 0000ae82 SFRA_GUI_varSetSldrList +1 0000aea2 SFRA_GUI_varSetTxtList +1 0000adc8 SFRA_GUI_wordsLeftToGet +0 00008124 SysCtl_delay +0 000834dc SysCtl_getClock +0 00083359 SysCtl_getDeviceParametric +0 00083954 SysCtl_getLowSpeedClock +0 0008352d SysCtl_selectOscSource +0 00083241 SysCtl_selectXTAL +0 0008292c SysCtl_setClock +0 00083575 TIMER0_ISR +1 00000014 _SFRA_F32_amplitude +1 00000022 _SFRA_F32_angle +1 0000001e _SFRA_F32_count +1 0000001a _SFRA_F32_pointer +1 00000010 _SFRA_F32_pointerStart +1 0000001c _SFRA_F32_preCount +1 00000006 _SFRA_F32_rCosSum +1 00000004 _SFRA_F32_rSinSum +1 00000012 _SFRA_F32_reference +1 00000016 _SFRA_F32_scalar +1 00000002 _SFRA_F32_state +1 00000003 _SFRA_F32_stateSlew +1 00000018 _SFRA_F32_step +1 0000000a _SFRA_F32_uCosSum +1 00000008 _SFRA_F32_uSinSum +1 00000020 _SFRA_F32_windowSamples +1 0000000e _SFRA_F32_yCosSum +1 0000000c _SFRA_F32_ySinSum +0 000833c1 __SFRA_F32_collect +0 0008389c __SFRA_F32_inject +0 00083b5c __TI_CINIT_Base +0 00083b68 __TI_CINIT_Limit +0 00083b68 __TI_CINIT_Warm +0 00083b4e __TI_Handler_Table_Base +0 00083b54 __TI_Handler_Table_Limit +1 00000500 __TI_STACK_END +abs 00000100 __TI_STACK_SIZE +0 000837fa __TI_auto_init_nobinit_nopinit +1 0000aeca __TI_cleanup_ptr +0 000837cc __TI_decompress_lzss +0 00083b1c __TI_decompress_none +1 0000aecc __TI_dtors_ptr +1 0000aec8 __TI_enable_exit_profile_output +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +0 00083b32 __TI_zero_init +0 000832d1 __c28xabi_divf +abs ffffffff __c_args__ +0 0008291a __error__ +1 00000400 __stack +0 00083a69 _args_main +0 000839cc _c_int00 +1 0000aece _lock +0 00083b13 _nop +0 00083b0f _register_lock +0 00083b0b _register_unlock +0 00083b3a _system_post_cinit +0 00083b38 _system_pre_init +1 0000aed0 _unlock +0 00083825 abort +1 0000a800 clMagVect +1 0000a8c8 clPhaseVect +0 00080000 code_start +1 0000aed4 errno +0 00083827 exit +1 0000a990 freqVect +0 00083033 logf +1 0000ad80 lowPass_test +0 00083a57 main +0 000838c2 memcpy +0 00083b2b memset +0 000831fd myCPUTIMER0_init +1 0000aa58 olMagVect +1 0000ab20 olPhaseVect +1 0000abe8 plantMagVect +1 0000acb0 plantPhaseVect +1 0000ad8a sfra1 +0 00082fb0 sfra_init +0 00083026 sfra_task_run +0 00083428 tanf + + +GLOBAL SYMBOLS: SORTED BY Symbol Address + +page address name +---- ------- ---- +0 00008000 Flash_initModule +0 00008000 RamfuncsRunStart +0 00008124 SysCtl_delay +0 00008128 RamfuncsRunEnd +0 00080000 code_start +0 00082143 SFRA_GUI_config +0 00082255 SFRA_GUI_runSerialHostComms +0 00082269 SFRA_GUI_getCmdByte +0 000822ab SFRA_GUI_echoCmdByte +0 000822c5 SFRA_GUI_getSizeByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000822ff SFRA_GUI_getDataByte +0 0008231f SFRA_GUI_echoDataByte +0 00082332 SFRA_GUI_packWord +0 00082350 SFRA_GUI_cmdInterpreter +0 00082370 SFRA_GUI_lifePulseTsk +0 000823a6 SFRA_GUI_setText +0 000823b9 SFRA_GUI_setButton +0 000823cc SFRA_GUI_setSlider +0 000823df SFRA_GUI_getVariable +0 000823e2 SFRA_GUI_getArray +0 000823e5 SFRA_GUI_getData +0 00082414 SFRA_GUI_setData32 +0 00082443 SFRA_GUI_spareTsk08 +0 00082448 SFRA_GUI_sendData +0 000825c8 Device_init +0 0008261d Device_enableAllPeripherals +0 00082708 Device_initGPIO +0 00082729 Device_enableUnbondedGPIOPullupsFor176Pin +0 0008273c Device_enableUnbondedGPIOPullupsFor100Pin +0 00082759 Device_enableUnbondedGPIOPullups +0 0008276f Device_configureTMXAnalogTrim +0 000827a0 Device_bootCPU2 +0 0008291a __error__ +0 00082921 Example_setResultPass +0 00082926 Example_setResultFail +0 0008292b Example_done +0 0008292c SysCtl_setClock +0 00082b35 SFRA_F32_runBackgroundTask +0 00082d2f SFRA_F32_updateInjectionAmplitude +0 00082d37 SFRA_F32_resetFreqRespArray +0 00082e40 SFRA_F32_reset +0 00082e69 SFRA_F32_initFreqArrayWithLogSteps +0 00082e93 SFRA_F32_config +0 00082fb0 sfra_init +0 00083026 sfra_task_run +0 00083033 logf +0 000831e9 Board_init +0 000831f4 PinMux_init +0 000831fa CPUTIMER_init +0 000831fd myCPUTIMER0_init +0 0008321d GPIO_init +0 00083220 LED_Blue_init +0 00083234 INTERRUPT_init +0 00083241 SysCtl_selectXTAL +0 000832d1 __c28xabi_divf +0 00083359 SysCtl_getDeviceParametric +0 000833c1 __SFRA_F32_collect +0 00083428 tanf +0 0008348a GPIO_setPadConfig +0 000834dc SysCtl_getClock +0 0008352d SysCtl_selectOscSource +0 00083575 TIMER0_ISR +0 000835bb SCI_clearInterruptStatus +0 00083600 SCI_enableInterrupt +0 00083644 SCI_setConfig +0 00083682 Interrupt_initModule +0 000836bf GPIO_setControllerCore +0 000836f6 GPIO_setPinConfig +0 0008372d GPIO_setQualificationMode +0 00083764 Interrupt_enable +0 0008379b GPIO_setDirectionMode +0 000837cc __TI_decompress_lzss +0 000837fa __TI_auto_init_nobinit_nopinit +0 00083825 C$$EXIT +0 00083825 abort +0 00083827 exit +0 0008389c __SFRA_F32_inject +0 000838c2 memcpy +0 00083901 Interrupt_initVectorTable +0 00083954 SysCtl_getLowSpeedClock +0 000839cc _c_int00 +0 000839e3 Interrupt_defaultHandler +0 00083a0d CPUTimer_setEmulationMode +0 00083a57 main +0 00083a69 _args_main +0 00083aee Interrupt_illegalOperationHandler +0 00083af8 Interrupt_nmiHandler +0 00083b0b _register_unlock +0 00083b0f _register_lock +0 00083b13 _nop +0 00083b1c __TI_decompress_none +0 00083b2b memset +0 00083b32 __TI_zero_init +0 00083b38 _system_pre_init +0 00083b3a _system_post_cinit +0 00083b4e __TI_Handler_Table_Base +0 00083b54 __TI_Handler_Table_Limit +0 00083b5c __TI_CINIT_Base +0 00083b68 __TI_CINIT_Limit +0 00083b68 __TI_CINIT_Warm +0 00086000 RamfuncsLoadStart +0 00086128 RamfuncsLoadEnd +1 00000002 _SFRA_F32_state +1 00000003 _SFRA_F32_stateSlew +1 00000004 _SFRA_F32_rSinSum +1 00000006 _SFRA_F32_rCosSum +1 00000008 _SFRA_F32_uSinSum +1 0000000a _SFRA_F32_uCosSum +1 0000000c _SFRA_F32_ySinSum +1 0000000e _SFRA_F32_yCosSum +1 00000010 _SFRA_F32_pointerStart +1 00000012 _SFRA_F32_reference +1 00000014 _SFRA_F32_amplitude +1 00000016 _SFRA_F32_scalar +1 00000018 _SFRA_F32_step +1 0000001a _SFRA_F32_pointer +1 0000001c _SFRA_F32_preCount +1 0000001e _SFRA_F32_count +1 00000020 _SFRA_F32_windowSamples +1 00000022 _SFRA_F32_angle +1 00000400 __stack +1 00000500 __TI_STACK_END +1 0000a800 clMagVect +1 0000a8c8 clPhaseVect +1 0000a990 freqVect +1 0000aa58 olMagVect +1 0000ab20 olPhaseVect +1 0000abe8 plantMagVect +1 0000acb0 plantPhaseVect +1 0000ad78 SFRA_GUI_cmdPacket +1 0000ad80 lowPass_test +1 0000ad8a sfra1 +1 0000adc0 SFRA_GUI_commsOKflg +1 0000adc1 SFRA_GUI_serialCommsTimer +1 0000adc2 SFRA_GUI_lowByteFlag +1 0000adc3 SFRA_GUI_sendTaskPtr +1 0000adc4 SFRA_GUI_rxChar +1 0000adc5 SFRA_GUI_rxWord +1 0000adc6 SFRA_GUI_taskDoneFlag +1 0000adc7 SFRA_GUI_numWords +1 0000adc8 SFRA_GUI_wordsLeftToGet +1 0000adc9 SFRA_GUI_dataOut16 +1 0000adca SFRA_GUI_rcvTskPtrShdw +1 0000adcb SFRA_GUI_delayer +1 0000adcc SFRA_GUI_memGetPtr +1 0000adcd SFRA_GUI_memGetAmount +1 0000adce SFRA_GUI_memSetPtr +1 0000adcf SFRA_GUI_led_flag +1 0000add0 SFRA_GUI_led_gpio +1 0000add1 SFRA_GUI_sweep_start +1 0000add2 SFRA_GUI_rcvTaskPointer +1 0000add4 SFRA_GUI_sci_base_addr +1 0000add6 SFRA_GUI_dataOut32 +1 0000add8 SFRA_GUI_memDataPtr16 +1 0000adda SFRA_GUI_memDataPtr32 +1 0000addc SFRA_GUI_memGetAddress +1 0000adde SFRA_GUI_memSetValue +1 0000ade0 SFRA_GUI_temp +1 0000ade2 SFRA_GUI_arrayGetList +1 0000ae02 SFRA_GUI_cmdDispatcher +1 0000ae22 SFRA_GUI_dataSetList +1 0000ae42 SFRA_GUI_varGetList +1 0000ae62 SFRA_GUI_varSetBtnList +1 0000ae82 SFRA_GUI_varSetSldrList +1 0000aea2 SFRA_GUI_varSetTxtList +1 0000aec2 Example_Result +1 0000aec4 Example_PassCount +1 0000aec6 Example_Fail +1 0000aec8 __TI_enable_exit_profile_output +1 0000aeca __TI_cleanup_ptr +1 0000aecc __TI_dtors_ptr +1 0000aece _lock +1 0000aed0 _unlock +1 0000aed4 errno +abs 00000100 __TI_STACK_SIZE +abs 00000128 RamfuncsLoadSize +abs 00000128 RamfuncsRunSize +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +abs ffffffff __c_args__ + +[182 symbols] diff --git a/28379d_test_SFRA/CPU1_FLASH/28379d.out b/28379d_test_SFRA/CPU1_FLASH/28379d.out new file mode 100644 index 0000000000000000000000000000000000000000..461985e0f55be3787968e41636eff5cba93d8895 GIT binary patch literal 120388 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

    O}Mr{^XNiMfqe4g}!`PJ`E<%rv#Z2(;zQW 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 Dw$D7D literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/28379d_linkInfo.xml b/28379d_test_SFRA/CPU1_FLASH/28379d_linkInfo.xml new file mode 100644 index 0000000..d7ff5c4 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/28379d_linkInfo.xml @@ -0,0 +1,9226 @@ + + + TMS320C2000 Linker PC v25.11.0.LTS + Copyright (c) 1996-2018 Texas Instruments Incorporated + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\bin\lnk2000.exe -lC:\\Users\\zxc\\AppData\\Local\\Temp\\{D798AD38-CFDB-4682-B572-1D689FD57673} + 0x6a0c03fd + 0x0 + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\28379d.out + + code_start +

    0x80000
    + + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\syscfg\ + object + board.obj + board.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\syscfg\ + object + c2000ware_libraries.obj + c2000ware_libraries.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\ + object + main.obj + main.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\ + object + sfra_test.obj + sfra_test.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\SFRA\ + object + sfra_gui_scicomms_driverlib.obj + sfra_gui_scicomms_driverlib.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\device\ + object + F2837xD_CodeStartBranch.obj + F2837xD_CodeStartBranch.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\.\device\ + object + device.obj + device.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\ + object + <internal> + <internal> + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + cputimer.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + flash.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + gpio.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + interrupt.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sci.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sysctl.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_background.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_collect.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_config_reset.obj + + + C:\Users\zxc\workspace_ccstheia\28379d\CPU1_FLASH\..\SFRA\ + archive + sfra_f32_tmu_eabi.lib + sfra_f32_tmu_inject.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + e_logf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_tanf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + boot28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_cmp28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memcpy.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + pre_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + autoinit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_zero_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_none.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_lzss.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + exit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + _lock.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + args_main.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memset.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + errno.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + cpy_tbl.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + startup.c.obj + + + + + .cinit..data.load + 0x83b40 + true + 0x83b40 + 0xd + 0x1 + + + __TI_handler_table + 0x83b4e + true + 0x83b4e + 0x6 + 0x2 + + + .cinit..bss.load + 0x83b54 + true + 0x83b54 + 0x4 + 0x2 + + + .cinit.SFRA_F32_Data.load + 0x83b58 + true + 0x83b58 + 0x4 + 0x2 + + + __TI_cinit_table + 0x83b5c + true + 0x83b5c + 0xc + 0x2 + + + .text + 0x82000 + true + true + 0x82000 + 0x52e + 0x1 + + + + .text + 0x8252e + true + true + 0x8252e + 0x3fe + 0x1 + + + + .text:SysCtl_setClock + 0x8292c + true + true + 0x8292c + 0x209 + 0x1 + + + + .text + 0x82b35 + true + true + 0x82b35 + 0x1fa + 0x1 + + + + .text + 0x82d2f + true + true + 0x82d2f + 0x1c2 + 0x1 + + + + .text + 0x82ef1 + true + true + 0x82ef1 + 0x142 + 0x1 + + + + .text + 0x83033 + true + true + 0x83033 + 0x12b + 0x1 + + + + .text + 0x8315e + true + true + 0x8315e + 0xe3 + 0x1 + + + + .text:SysCtl_selectXTAL + 0x83241 + true + true + 0x83241 + 0x90 + 0x1 + + + + .text + 0x832d1 + true + true + 0x832d1 + 0x88 + 0x1 + + + + .text:SysCtl_getDeviceParametric + 0x83359 + true + true + 0x83359 + 0x68 + 0x1 + + + + .text + 0x833c1 + true + true + 0x833c1 + 0x67 + 0x1 + + + + .text + 0x83428 + true + true + 0x83428 + 0x62 + 0x1 + + + + .text:GPIO_setPadConfig + 0x8348a + true + true + 0x8348a + 0x52 + 0x1 + + + + .text:SysCtl_getClock + 0x834dc + true + true + 0x834dc + 0x51 + 0x1 + + + + .text:SysCtl_selectOscSource + 0x8352d + true + true + 0x8352d + 0x48 + 0x1 + + + + .text:retain + 0x83575 + true + true + 0x83575 + 0x46 + 0x1 + + + + .text:SCI_clearInterruptStatus + 0x835bb + true + true + 0x835bb + 0x45 + 0x1 + + + + .text:SCI_enableInterrupt + 0x83600 + true + true + 0x83600 + 0x44 + 0x1 + + + + .text:SCI_setConfig + 0x83644 + true + true + 0x83644 + 0x3e + 0x1 + + + + .text:Interrupt_initModule + 0x83682 + true + true + 0x83682 + 0x3d + 0x1 + + + + .text:GPIO_setControllerCore + 0x836bf + true + true + 0x836bf + 0x37 + 0x1 + + + + .text:GPIO_setPinConfig + 0x836f6 + true + true + 0x836f6 + 0x37 + 0x1 + + + + .text:GPIO_setQualificationMode + 0x8372d + true + true + 0x8372d + 0x37 + 0x1 + + + + .text:Interrupt_enable + 0x83764 + true + true + 0x83764 + 0x37 + 0x1 + + + + .text:GPIO_setDirectionMode + 0x8379b + true + true + 0x8379b + 0x31 + 0x1 + + + + .text:decompress:lzss + 0x837cc + true + true + 0x837cc + 0x2e + 0x1 + + + + .text:__TI_auto_init_nobinit_nopinit + 0x837fa + true + true + 0x837fa + 0x2b + 0x1 + + + + .text + 0x83825 + true + true + 0x83825 + 0x29 + 0x1 + + + + .text:CPUTimer_selectClockSource + 0x8384e + true + true + 0x8384e + 0x28 + 0x1 + + + + .text:Flash_setBankPowerUpDelay + 0x83876 + true + true + 0x83876 + 0x26 + 0x1 + + + + .text + 0x8389c + true + true + 0x8389c + 0x26 + 0x1 + + + + .text + 0x838c2 + true + true + 0x838c2 + 0x20 + 0x1 + + + + .text:CPUTimer_getTimerOverflowStatus + 0x838e2 + true + true + 0x838e2 + 0x1f + 0x1 + + + + .text:Interrupt_initVectorTable + 0x83901 + true + true + 0x83901 + 0x1e + 0x1 + + + + .text:SCI_isBaseValid + 0x8391f + true + true + 0x8391f + 0x1b + 0x1 + + + + .text:CPUTimer_startTimer + 0x8393a + true + true + 0x8393a + 0x1a + 0x1 + + + + .text:SysCtl_getLowSpeedClock + 0x83954 + true + true + 0x83954 + 0x1a + 0x1 + + + + .text:SCI_disableModule + 0x8396e + true + true + 0x8396e + 0x18 + 0x1 + + + + .text:SCI_performSoftwareReset + 0x83986 + true + true + 0x83986 + 0x18 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x8399e + true + true + 0x8399e + 0x17 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x839b5 + true + true + 0x839b5 + 0x17 + 0x1 + + + + .text + 0x839cc + true + true + 0x839cc + 0x17 + 0x1 + + + + .text:Interrupt_defaultHandler + 0x839e3 + true + true + 0x839e3 + 0x16 + 0x1 + + + + .text:CPUTimer_stopTimer + 0x839f9 + true + true + 0x839f9 + 0x14 + 0x1 + + + + .text:CPUTimer_setEmulationMode + 0x83a0d + true + true + 0x83a0d + 0x13 + 0x1 + + + + .text:SCI_enableModule + 0x83a20 + true + true + 0x83a20 + 0x13 + 0x1 + + + + .text:CPUTimer_clearOverflowFlag + 0x83a33 + true + true + 0x83a33 + 0x12 + 0x1 + + + + .text:CPUTimer_disableInterrupt + 0x83a45 + true + true + 0x83a45 + 0x12 + 0x1 + + + + .text + 0x83a57 + true + true + 0x83a57 + 0x12 + 0x1 + + + + .text + 0x83a69 + true + true + 0x83a69 + 0x12 + 0x1 + + + + .text:CPUTimer_setPeriod + 0x83a7b + true + true + 0x83a7b + 0x11 + 0x1 + + + + .text:Flash_isCtrlBaseValid + 0x83a8c + true + true + 0x83a8c + 0x10 + 0x1 + + + + .text:Flash_isECCBaseValid + 0x83a9c + true + true + 0x83a9c + 0x10 + 0x1 + + + + .text:SysCtl_pollCpuTimer + 0x83aac + true + true + 0x83aac + 0xf + 0x1 + + + + .text:GPIO_isPinValid + 0x83abb + true + true + 0x83abb + 0xe + 0x1 + + + + .text:Interrupt_disableGlobal + 0x83ac9 + true + true + 0x83ac9 + 0xd + 0x1 + + + + .text:Interrupt_enableGlobal + 0x83ad6 + true + true + 0x83ad6 + 0xd + 0x1 + + + + .text:SysCtl_isMCDClockFailureDetected + 0x83ae3 + true + true + 0x83ae3 + 0xb + 0x1 + + + + .text:Interrupt_illegalOperationHandler + 0x83aee + true + true + 0x83aee + 0xa + 0x1 + + + + .text:Interrupt_nmiHandler + 0x83af8 + true + true + 0x83af8 + 0xa + 0x1 + + + + .text:SysCtl_serviceWatchdog + 0x83b02 + true + true + 0x83b02 + 0x9 + 0x1 + + + + .text + 0x83b0b + true + true + 0x83b0b + 0x9 + 0x1 + + + + .text + 0x83b14 + true + true + 0x83b14 + 0x8 + 0x1 + + + + .text:decompress:none + 0x83b1c + true + true + 0x83b1c + 0x8 + 0x1 + + + + .text:SysCtl_resetMCD + 0x83b24 + true + true + 0x83b24 + 0x7 + 0x1 + + + + .text + 0x83b2b + true + true + 0x83b2b + 0x7 + 0x1 + + + + .text:decompress:ZI + 0x83b32 + true + true + 0x83b32 + 0x6 + 0x1 + + + + .text + 0x83b38 + true + true + 0x83b38 + 0x2 + 0x1 + + + + .text + 0x83b3a + true + true + 0x83b3a + 0x1 + 0x1 + + + + codestart + 0x80000 + true + true + 0x80000 + 0x2 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x2 + + + .bss + true + true + 0xad80 + 0x2a + 0x2 + + + + .bss:plantMagVect + true + true + 0xabe8 + 0xc8 + 0x2 + + + + .bss:plantPhaseVect + true + true + 0xacb0 + 0xc8 + 0x2 + + + + .bss:olMagVect + true + true + 0xaa58 + 0xc8 + 0x2 + + + + .bss:olPhaseVect + true + true + 0xab20 + 0xc8 + 0x2 + + + + .bss:clMagVect + true + true + 0xa800 + 0xc8 + 0x2 + + + + .bss:clPhaseVect + true + true + 0xa8c8 + 0xc8 + 0x2 + + + + .bss:freqVect + true + true + 0xa990 + 0xc8 + 0x2 + + + + .bss + true + true + 0xadc0 + 0x22 + 0x2 + + + + .bss:SFRA_GUI_cmdPacket + true + true + 0xad78 + 0x6 + 0x1 + + + + .bss:SFRA_GUI_cmdDispatcher + true + true + 0xae02 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetTxtList + true + true + 0xaea2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetBtnList + true + true + 0xae62 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetSldrList + true + true + 0xae82 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varGetList + true + true + 0xae42 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_arrayGetList + true + true + 0xade2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_dataSetList + true + true + 0xae22 + 0x20 + 0x2 + + + + .data + 0xaed2 + true + 0xaed2 + 0x2 + 0x2 + + + + .data + 0xaec2 + true + 0xaec2 + 0x6 + 0x2 + + + + .data + 0xaec8 + true + 0xaec8 + 0x6 + 0x2 + + + + .data:_lock + 0xaece + true + 0xaece + 0x2 + 0x2 + + + + .data:_unlock + 0xaed0 + true + 0xaed0 + 0x2 + 0x2 + + + + .data + 0xaed4 + true + 0xaed4 + 0x1 + 0x1 + + + + .const:.string + 0x90000 + true + 0x90000 + 0xc2 + 0x2 + + + + .const:.string + 0x900c2 + true + 0x900c2 + 0xbf + 0x2 + + + + .const:.string + 0x90182 + true + 0x90182 + 0xbc + 0x2 + + + + .const:.string + 0x9023e + true + 0x9023e + 0xbb + 0x2 + + + + .const:.string + 0x902fa + true + 0x902fa + 0x7b + 0x2 + + + + .const:.string + 0x90376 + true + 0x90376 + 0x62 + 0x2 + + + + .const:.string + 0x903d8 + true + 0x903d8 + 0x42 + 0x2 + + + + .const:.string + 0x9041a + true + 0x9041a + 0x42 + 0x2 + + + + .const:.string + 0x9045c + true + 0x9045c + 0x13 + 0x2 + + + + .TI.ramfunc:Flash_initModule + 0x86000 + true + true + 0x8000 + 0x43 + 0x1 + + + + .TI.ramfunc:Flash_setBankPowerMode + 0x86043 + true + true + 0x8043 + 0x2c + 0x1 + + + + .TI.ramfunc:Flash_setWaitstates + 0x8606f + true + true + 0x806f + 0x24 + 0x1 + + + + .TI.ramfunc:Flash_setPumpPowerMode + 0x86093 + true + true + 0x8093 + 0x1d + 0x1 + + + + .TI.ramfunc:Flash_disableCache + 0x860b0 + true + true + 0x80b0 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_disablePrefetch + 0x860c8 + true + true + 0x80c8 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_enableCache + 0x860e0 + true + true + 0x80e0 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enablePrefetch + 0x860f7 + true + true + 0x80f7 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enableECC + 0x8610e + true + true + 0x810e + 0x16 + 0x1 + + + + .TI.ramfunc + 0x86124 + true + true + 0x8124 + 0x4 + 0x1 + + + + .debug_types + 0x0 + 0x0 + 0x767 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x767 + 0x767 + 0x520 + 0x0 + + + + .debug_types + 0xc87 + 0xc87 + 0x29b + 0x0 + + + + .debug_types + 0xf22 + 0xf22 + 0xdc7 + 0x0 + + + + .debug_types + 0x1ce9 + 0x1ce9 + 0x6e + 0x0 + + + + .debug_types + 0x1d57 + 0x1d57 + 0x1d7 + 0x0 + + + + .debug_types + 0x1f2e + 0x1f2e + 0x2c4 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x21f2 + 0x21f2 + 0x425 + 0x0 + + + + .debug_types + 0x2617 + 0x2617 + 0x21d + 0x0 + + + + .debug_types + 0x2834 + 0x2834 + 0x8d + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x28c1 + 0x28c1 + 0x142 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2a03 + 0x2a03 + 0x470 + 0x0 + + + + .debug_types + 0x2e73 + 0x2e73 + 0x194 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x3007 + 0x3007 + 0x191 + 0x0 + + + + .debug_types + 0x3198 + 0x3198 + 0xbf + 0x0 + + + + .debug_types + 0x3257 + 0x3257 + 0x2f + 0x0 + + + + .debug_types + 0x3286 + 0x3286 + 0xe1 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_info + 0x0 + 0x0 + 0xaa5 + 0x0 + + + + .debug_info + 0xaa5 + 0xaa5 + 0x177 + 0x0 + + + + .debug_info + 0xc1c + 0xc1c + 0x105 + 0x0 + + + + .debug_info + 0xd21 + 0xd21 + 0xe7 + 0x0 + + + + .debug_info + 0xe08 + 0xe08 + 0xeb + 0x0 + + + + .debug_info + 0xef3 + 0xef3 + 0xe1 + 0x0 + + + + .debug_info + 0xfd4 + 0xfd4 + 0xe5 + 0x0 + + + + .debug_info + 0x10b9 + 0x10b9 + 0xe1 + 0x0 + + + + .debug_info + 0x119a + 0x119a + 0xe5 + 0x0 + + + + .debug_info + 0x127f + 0x127f + 0xdf + 0x0 + + + + .debug_info + 0x135e + 0x135e + 0x705 + 0x0 + + + + .debug_info + 0x1a63 + 0x1a63 + 0x1b8 + 0x0 + + + + .debug_info + 0x1c1b + 0x1c1b + 0x6c6 + 0x0 + + + + .debug_info + 0x22e1 + 0x22e1 + 0x10a + 0x0 + + + + .debug_info + 0x23eb + 0x23eb + 0x112 + 0x0 + + + + .debug_info + 0x24fd + 0x24fd + 0x112 + 0x0 + + + + .debug_info + 0x260f + 0x260f + 0x112 + 0x0 + + + + .debug_info + 0x2721 + 0x2721 + 0x114 + 0x0 + + + + .debug_info + 0x2835 + 0x2835 + 0x10c + 0x0 + + + + .debug_info + 0x2941 + 0x2941 + 0x110 + 0x0 + + + + .debug_info + 0x2a51 + 0x2a51 + 0x10e + 0x0 + + + + .debug_info + 0x2b5f + 0x2b5f + 0x1ad7 + 0x0 + + + + .debug_info + 0x4636 + 0x4636 + 0x106 + 0x0 + + + + .debug_info + 0x473c + 0x473c + 0x107 + 0x0 + + + + .debug_info + 0x4843 + 0x4843 + 0x151 + 0x0 + + + + .debug_info + 0x4994 + 0x4994 + 0x1c32 + 0x0 + + + + .debug_info + 0x65c6 + 0x65c6 + 0x219 + 0x0 + + + + .debug_info + 0x67df + 0x67df + 0x265 + 0x0 + + + + .debug_info + 0x6a44 + 0x6a44 + 0x21d + 0x0 + + + + .debug_info + 0x6c61 + 0x6c61 + 0x219 + 0x0 + + + + .debug_info + 0x6e7a + 0x6e7a + 0x279 + 0x0 + + + + .debug_info + 0x70f3 + 0x70f3 + 0x28f + 0x0 + + + + .debug_info + 0x7382 + 0x7382 + 0x26e + 0x0 + + + + .debug_info + 0x75f0 + 0x75f0 + 0x23f + 0x0 + + + + .debug_info + 0x782f + 0x782f + 0x241 + 0x0 + + + + .debug_info + 0x7a70 + 0x7a70 + 0x239 + 0x0 + + + + .debug_info + 0x7ca9 + 0x7ca9 + 0x23b + 0x0 + + + + .debug_info + 0x7ee4 + 0x7ee4 + 0x232 + 0x0 + + + + .debug_info + 0x8116 + 0x8116 + 0x27b + 0x0 + + + + .debug_info + 0x8391 + 0x8391 + 0x397 + 0x0 + + + + .debug_info + 0x8728 + 0x8728 + 0x205 + 0x0 + + + + .debug_info + 0x892d + 0x892d + 0x27d + 0x0 + + + + .debug_info + 0x8baa + 0x8baa + 0x266 + 0x0 + + + + .debug_info + 0x8e10 + 0x8e10 + 0x2ae + 0x0 + + + + .debug_info + 0x90be + 0x90be + 0x296 + 0x0 + + + + .debug_info + 0x9354 + 0x9354 + 0x24f + 0x0 + + + + .debug_info + 0x95a3 + 0x95a3 + 0x1fe + 0x0 + + + + .debug_info + 0x97a1 + 0x97a1 + 0x200 + 0x0 + + + + .debug_info + 0x99a1 + 0x99a1 + 0x20f + 0x0 + + + + .debug_info + 0x9bb0 + 0x9bb0 + 0x21c + 0x0 + + + + .debug_info + 0x9dcc + 0x9dcc + 0x202 + 0x0 + + + + .debug_info + 0x9fce + 0x9fce + 0x1e8 + 0x0 + + + + .debug_info + 0xa1b6 + 0xa1b6 + 0x20c + 0x0 + + + + .debug_info + 0xa3c2 + 0xa3c2 + 0x2b3 + 0x0 + + + + .debug_info + 0xa675 + 0xa675 + 0x205 + 0x0 + + + + .debug_info + 0xa87a + 0xa87a + 0x225 + 0x0 + + + + .debug_info + 0xaa9f + 0xaa9f + 0x227 + 0x0 + + + + .debug_info + 0xacc6 + 0xacc6 + 0x235 + 0x0 + + + + .debug_info + 0xaefb + 0xaefb + 0x2b5 + 0x0 + + + + .debug_info + 0xb1b0 + 0xb1b0 + 0x23e + 0x0 + + + + .debug_info + 0xb3ee + 0xb3ee + 0x268 + 0x0 + + + + .debug_info + 0xb656 + 0xb656 + 0x1f2 + 0x0 + + + + .debug_info + 0xb848 + 0xb848 + 0x20e + 0x0 + + + + .debug_info + 0xba56 + 0xba56 + 0x1e4 + 0x0 + + + + .debug_info + 0xbc3a + 0xbc3a + 0x217 + 0x0 + + + + .debug_info + 0xbe51 + 0xbe51 + 0x244 + 0x0 + + + + .debug_info + 0xc095 + 0xc095 + 0x242 + 0x0 + + + + .debug_info + 0xc2d7 + 0xc2d7 + 0x24a + 0x0 + + + + .debug_info + 0xc521 + 0xc521 + 0x24d + 0x0 + + + + .debug_info + 0xc76e + 0xc76e + 0x24e + 0x0 + + + + .debug_info + 0xc9bc + 0xc9bc + 0x258 + 0x0 + + + + .debug_info + 0xcc14 + 0xcc14 + 0x27c + 0x0 + + + + .debug_info + 0xce90 + 0xce90 + 0x241 + 0x0 + + + + .debug_info + 0xd0d1 + 0xd0d1 + 0x277 + 0x0 + + + + .debug_info + 0xd348 + 0xd348 + 0x519 + 0x0 + + + + .debug_info + 0xd861 + 0xd861 + 0x3ba + 0x0 + + + + .debug_info + 0xdc1b + 0xdc1b + 0x243 + 0x0 + + + + .debug_info + 0xde5e + 0xde5e + 0x251 + 0x0 + + + + .debug_info + 0xe0af + 0xe0af + 0x241 + 0x0 + + + + .debug_info + 0xe2f0 + 0xe2f0 + 0x1d8 + 0x0 + + + + .debug_info + 0xe4c8 + 0xe4c8 + 0x179 + 0x0 + + + + .debug_info + 0xe641 + 0xe641 + 0x141 + 0x0 + + + + .debug_info + 0xe782 + 0xe782 + 0x110 + 0x0 + + + + .debug_info + 0xe892 + 0xe892 + 0x184 + 0x0 + + + + .debug_info + 0xea16 + 0xea16 + 0x136 + 0x0 + + + + .debug_info + 0xeb4c + 0xeb4c + 0x1a8 + 0x0 + + + + .debug_info + 0xecf4 + 0xecf4 + 0x188 + 0x0 + + + + .debug_info + 0xee7c + 0xee7c + 0x1a0 + 0x0 + + + + .debug_info + 0xf01c + 0xf01c + 0x1f5 + 0x0 + + + + .debug_info + 0xf211 + 0xf211 + 0x187 + 0x0 + + + + .debug_info + 0xf398 + 0xf398 + 0x192 + 0x0 + + + + .debug_info + 0xf52a + 0xf52a + 0xf0 + 0x0 + + + + .debug_info + 0xf61a + 0xf61a + 0xf4 + 0x0 + + + + .debug_info + 0xf70e + 0xf70e + 0x1ec + 0x0 + + + + .debug_info + 0xf8fa + 0xf8fa + 0x156 + 0x0 + + + + .debug_info + 0xfa50 + 0xfa50 + 0x1db + 0x0 + + + + .debug_info + 0xfc2b + 0xfc2b + 0xef + 0x0 + + + + .debug_info + 0xfd1a + 0xfd1a + 0x130 + 0x0 + + + + .debug_info + 0xfe4a + 0xfe4a + 0xa6 + 0x0 + + + .debug_line + 0x0 + 0x0 + 0x254 + 0x0 + + + + .debug_line + 0x254 + 0x254 + 0xe9 + 0x0 + + + + .debug_line + 0x33d + 0x33d + 0x50 + 0x0 + + + + .debug_line + 0x38d + 0x38d + 0x21 + 0x0 + + + + .debug_line + 0x3ae + 0x3ae + 0x33 + 0x0 + + + + .debug_line + 0x3e1 + 0x3e1 + 0x33 + 0x0 + + + + .debug_line + 0x414 + 0x414 + 0x33 + 0x0 + + + + .debug_line + 0x447 + 0x447 + 0x33 + 0x0 + + + + .debug_line + 0x47a + 0x47a + 0x33 + 0x0 + + + + .debug_line + 0x4ad + 0x4ad + 0x33 + 0x0 + + + + .debug_line + 0x4e0 + 0x4e0 + 0x33 + 0x0 + + + + .debug_line + 0x513 + 0x513 + 0x33 + 0x0 + + + + .debug_line + 0x546 + 0x546 + 0x1ca + 0x0 + + + + .debug_line + 0x710 + 0x710 + 0x4c + 0x0 + + + + .debug_line + 0x75c + 0x75c + 0x9d + 0x0 + + + + .debug_line + 0x7f9 + 0x7f9 + 0x4a + 0x0 + + + + .debug_line + 0x843 + 0x843 + 0x4a + 0x0 + + + + .debug_line + 0x88d + 0x88d + 0x4a + 0x0 + + + + .debug_line + 0x8d7 + 0x8d7 + 0x4a + 0x0 + + + + .debug_line + 0x921 + 0x921 + 0x4a + 0x0 + + + + .debug_line + 0x96b + 0x96b + 0x4a + 0x0 + + + + .debug_line + 0x9b5 + 0x9b5 + 0x4a + 0x0 + + + + .debug_line + 0x9ff + 0x9ff + 0x4a + 0x0 + + + + .debug_line + 0xa49 + 0xa49 + 0x4a + 0x0 + + + + .debug_line + 0xa93 + 0xa93 + 0x69f + 0x0 + + + + .debug_line + 0x1132 + 0x1132 + 0xa4 + 0x0 + + + + .debug_line + 0x11d6 + 0x11d6 + 0x55 + 0x0 + + + + .debug_line + 0x122b + 0x122b + 0x5d + 0x0 + + + + .debug_line + 0x1288 + 0x1288 + 0x37 + 0x0 + + + + .debug_line + 0x12bf + 0x12bf + 0x3e1 + 0x0 + + + + .debug_line + 0x16a0 + 0x16a0 + 0xfd + 0x0 + + + + .debug_line + 0x179d + 0x179d + 0x9c + 0x0 + + + + .debug_line + 0x1839 + 0x1839 + 0x9e + 0x0 + + + + .debug_line + 0x18d7 + 0x18d7 + 0xe8 + 0x0 + + + + .debug_line + 0x19bf + 0x19bf + 0x99 + 0x0 + + + + .debug_line + 0x1a58 + 0x1a58 + 0x99 + 0x0 + + + + .debug_line + 0x1af1 + 0x1af1 + 0x9d + 0x0 + + + + .debug_line + 0x1b8e + 0x1b8e + 0x9c + 0x0 + + + + .debug_line + 0x1c2a + 0x1c2a + 0x9c + 0x0 + + + + .debug_line + 0x1cc6 + 0x1cc6 + 0x9c + 0x0 + + + + .debug_line + 0x1d62 + 0x1d62 + 0x9c + 0x0 + + + + .debug_line + 0x1dfe + 0x1dfe + 0x9c + 0x0 + + + + .debug_line + 0x1e9a + 0x1e9a + 0x9c + 0x0 + + + + .debug_line + 0x1f36 + 0x1f36 + 0x9c + 0x0 + + + + .debug_line + 0x1fd2 + 0x1fd2 + 0x9d + 0x0 + + + + .debug_line + 0x206f + 0x206f + 0xa4 + 0x0 + + + + .debug_line + 0x2113 + 0x2113 + 0xe5 + 0x0 + + + + .debug_line + 0x21f8 + 0x21f8 + 0x98 + 0x0 + + + + .debug_line + 0x2290 + 0x2290 + 0xa2 + 0x0 + + + + .debug_line + 0x2332 + 0x2332 + 0xb1 + 0x0 + + + + .debug_line + 0x23e3 + 0x23e3 + 0x9f + 0x0 + + + + .debug_line + 0x2482 + 0x2482 + 0x9f + 0x0 + + + + .debug_line + 0x2521 + 0x2521 + 0x9f + 0x0 + + + + .debug_line + 0x25c0 + 0x25c0 + 0xe4 + 0x0 + + + + .debug_line + 0x26a4 + 0x26a4 + 0x9d + 0x0 + + + + .debug_line + 0x2741 + 0x2741 + 0x9d + 0x0 + + + + .debug_line + 0x27de + 0x27de + 0xb8 + 0x0 + + + + .debug_line + 0x2896 + 0x2896 + 0xa3 + 0x0 + + + + .debug_line + 0x2939 + 0x2939 + 0x9b + 0x0 + + + + .debug_line + 0x29d4 + 0x29d4 + 0x9b + 0x0 + + + + .debug_line + 0x2a6f + 0x2a6f + 0xb1 + 0x0 + + + + .debug_line + 0x2b20 + 0x2b20 + 0xb1 + 0x0 + + + + .debug_line + 0x2bd1 + 0x2bd1 + 0x21 + 0x0 + + + + .debug_line + 0x2bf2 + 0x2bf2 + 0x97 + 0x0 + + + + .debug_line + 0x2c89 + 0x2c89 + 0x98 + 0x0 + + + + .debug_line + 0x2d21 + 0x2d21 + 0x99 + 0x0 + + + + .debug_line + 0x2dba + 0x2dba + 0x99 + 0x0 + + + + .debug_line + 0x2e53 + 0x2e53 + 0x9e + 0x0 + + + + .debug_line + 0x2ef1 + 0x2ef1 + 0xb3 + 0x0 + + + + .debug_line + 0x2fa4 + 0x2fa4 + 0xa7 + 0x0 + + + + .debug_line + 0x304b + 0x304b + 0xe3 + 0x0 + + + + .debug_line + 0x312e + 0x312e + 0x9d + 0x0 + + + + .debug_line + 0x31cb + 0x31cb + 0x9a + 0x0 + + + + .debug_line + 0x3265 + 0x3265 + 0x9c + 0x0 + + + + .debug_line + 0x3301 + 0x3301 + 0x9c + 0x0 + + + + .debug_line + 0x339d + 0x339d + 0x9d + 0x0 + + + + .debug_line + 0x343a + 0x343a + 0x9d + 0x0 + + + + .debug_line + 0x34d7 + 0x34d7 + 0xa1 + 0x0 + + + + .debug_line + 0x3578 + 0x3578 + 0xa2 + 0x0 + + + + .debug_line + 0x361a + 0x361a + 0x9d + 0x0 + + + + .debug_line + 0x36b7 + 0x36b7 + 0x9d + 0x0 + + + + .debug_line + 0x3754 + 0x3754 + 0xa7 + 0x0 + + + + .debug_line + 0x37fb + 0x37fb + 0xa1 + 0x0 + + + + .debug_line + 0x389c + 0x389c + 0xb4 + 0x0 + + + + .debug_line + 0x3950 + 0x3950 + 0x19e + 0x0 + + + + .debug_line + 0x3aee + 0x3aee + 0xd2 + 0x0 + + + + .debug_line + 0x3bc0 + 0x3bc0 + 0xbe + 0x0 + + + + .debug_line + 0x3c7e + 0x3c7e + 0xa1 + 0x0 + + + + .debug_line + 0x3d1f + 0x3d1f + 0xc7 + 0x0 + + + + .debug_line + 0x3de6 + 0x3de6 + 0x14b + 0x0 + + + + .debug_line + 0x3f31 + 0x3f31 + 0xd5 + 0x0 + + + + .debug_line + 0x4006 + 0x4006 + 0x21 + 0x0 + + + + .debug_line + 0x4027 + 0x4027 + 0x68 + 0x0 + + + + .debug_line + 0x408f + 0x408f + 0x21 + 0x0 + + + + .debug_line + 0x40b0 + 0x40b0 + 0x4f + 0x0 + + + + .debug_line + 0x40ff + 0x40ff + 0xae + 0x0 + + + + .debug_line + 0x41ad + 0x41ad + 0x57 + 0x0 + + + + .debug_line + 0x4204 + 0x4204 + 0x21 + 0x0 + + + + .debug_line + 0x4225 + 0x4225 + 0x3f + 0x0 + + + + .debug_line + 0x4264 + 0x4264 + 0x21 + 0x0 + + + + .debug_line + 0x4285 + 0x4285 + 0x74 + 0x0 + + + + .debug_line + 0x42f9 + 0x42f9 + 0x21 + 0x0 + + + + .debug_line + 0x431a + 0x431a + 0x52 + 0x0 + + + + .debug_line + 0x436c + 0x436c + 0x21 + 0x0 + + + + .debug_line + 0x438d + 0x438d + 0x57 + 0x0 + + + + .debug_line + 0x43e4 + 0x43e4 + 0x21 + 0x0 + + + + .debug_line + 0x4405 + 0x4405 + 0x9a + 0x0 + + + + .debug_line + 0x449f + 0x449f + 0x21 + 0x0 + + + + .debug_line + 0x44c0 + 0x44c0 + 0x2b + 0x0 + + + + .debug_line + 0x44eb + 0x44eb + 0x66 + 0x0 + + + + .debug_line + 0x4551 + 0x4551 + 0x21 + 0x0 + + + + .debug_line + 0x4572 + 0x4572 + 0x2c + 0x0 + + + + .debug_line + 0x459e + 0x459e + 0x2c + 0x0 + + + + .debug_line + 0x45ca + 0x45ca + 0x5f + 0x0 + + + + .debug_line + 0x4629 + 0x4629 + 0x21 + 0x0 + + + + .debug_line + 0x464a + 0x464a + 0x50 + 0x0 + + + + .debug_line + 0x469a + 0x469a + 0x30 + 0x0 + + + + .debug_line + 0x46ca + 0x46ca + 0x99 + 0x0 + + + + .debug_line + 0x4763 + 0x4763 + 0x21 + 0x0 + + + + .debug_line + 0x4784 + 0x4784 + 0x2c + 0x0 + + + + .debug_line + 0x47b0 + 0x47b0 + 0x21 + 0x0 + + + + .debug_line + 0x47d1 + 0x47d1 + 0x3b + 0x0 + + + + .debug_line + 0x480c + 0x480c + 0x21 + 0x0 + + + + .debug_frame + 0x0 + 0x0 + 0x19c + 0x4 + + + + .debug_frame + 0x19c + 0x19c + 0x40 + 0x4 + + + + .debug_frame + 0x1dc + 0x1dc + 0x104 + 0x4 + + + + .debug_frame + 0x2e0 + 0x2e0 + 0xb4 + 0x4 + + + + .debug_frame + 0x394 + 0x394 + 0x384 + 0x4 + + + + .debug_frame + 0x718 + 0x718 + 0x21c + 0x4 + + + + .debug_frame + 0x934 + 0x934 + 0x44 + 0x4 + + + + .debug_frame + 0x978 + 0x978 + 0x44 + 0x4 + + + + .debug_frame + 0x9bc + 0x9bc + 0x44 + 0x4 + + + + .debug_frame + 0xa00 + 0xa00 + 0x44 + 0x4 + + + + .debug_frame + 0xa44 + 0xa44 + 0x44 + 0x4 + + + + .debug_frame + 0xa88 + 0xa88 + 0x44 + 0x4 + + + + .debug_frame + 0xacc + 0xacc + 0x44 + 0x4 + + + + .debug_frame + 0xb10 + 0xb10 + 0x44 + 0x4 + + + + .debug_frame + 0xb54 + 0xb54 + 0x44 + 0x4 + + + + .debug_frame + 0xb98 + 0xb98 + 0x44 + 0x4 + + + + .debug_frame + 0xbdc + 0xbdc + 0x44 + 0x4 + + + + .debug_frame + 0xc20 + 0xc20 + 0x44 + 0x4 + + + + .debug_frame + 0xc64 + 0xc64 + 0x44 + 0x4 + + + + .debug_frame + 0xca8 + 0xca8 + 0x44 + 0x4 + + + + .debug_frame + 0xcec + 0xcec + 0x44 + 0x4 + + + + .debug_frame + 0xd30 + 0xd30 + 0x44 + 0x4 + + + + .debug_frame + 0xd74 + 0xd74 + 0x44 + 0x4 + + + + .debug_frame + 0xdb8 + 0xdb8 + 0x44 + 0x4 + + + + .debug_frame + 0xdfc + 0xdfc + 0x44 + 0x4 + + + + .debug_frame + 0xe40 + 0xe40 + 0x44 + 0x4 + + + + .debug_frame + 0xe84 + 0xe84 + 0x40 + 0x4 + + + + .debug_frame + 0xec4 + 0xec4 + 0x40 + 0x4 + + + + .debug_frame + 0xf04 + 0xf04 + 0x40 + 0x4 + + + + .debug_frame + 0xf44 + 0xf44 + 0x4c + 0x4 + + + + .debug_frame + 0xf90 + 0xf90 + 0x48 + 0x4 + + + + .debug_frame + 0xfd8 + 0xfd8 + 0x48 + 0x4 + + + + .debug_frame + 0x1020 + 0x1020 + 0x44 + 0x4 + + + + .debug_frame + 0x1064 + 0x1064 + 0x44 + 0x4 + + + + .debug_frame + 0x10a8 + 0x10a8 + 0x44 + 0x4 + + + + .debug_frame + 0x10ec + 0x10ec + 0x44 + 0x4 + + + + .debug_frame + 0x1130 + 0x1130 + 0x44 + 0x4 + + + + .debug_frame + 0x1174 + 0x1174 + 0x44 + 0x4 + + + + .debug_frame + 0x11b8 + 0x11b8 + 0x44 + 0x4 + + + + .debug_frame + 0x11fc + 0x11fc + 0x44 + 0x4 + + + + .debug_frame + 0x1240 + 0x1240 + 0x44 + 0x4 + + + + .debug_frame + 0x1284 + 0x1284 + 0x40 + 0x4 + + + + .debug_frame + 0x12c4 + 0x12c4 + 0x40 + 0x4 + + + + .debug_frame + 0x1304 + 0x1304 + 0x40 + 0x4 + + + + .debug_frame + 0x1344 + 0x1344 + 0x44 + 0x4 + + + + .debug_frame + 0x1388 + 0x1388 + 0x44 + 0x4 + + + + .debug_frame + 0x13cc + 0x13cc + 0x44 + 0x4 + + + + .debug_frame + 0x1410 + 0x1410 + 0x44 + 0x4 + + + + .debug_frame + 0x1454 + 0x1454 + 0x44 + 0x4 + + + + .debug_frame + 0x1498 + 0x1498 + 0x44 + 0x4 + + + + .debug_frame + 0x14dc + 0x14dc + 0x44 + 0x4 + + + + .debug_frame + 0x1520 + 0x1520 + 0x44 + 0x4 + + + + .debug_frame + 0x1564 + 0x1564 + 0x40 + 0x4 + + + + .debug_frame + 0x15a4 + 0x15a4 + 0x44 + 0x4 + + + + .debug_frame + 0x15e8 + 0x15e8 + 0x50 + 0x4 + + + + .debug_frame + 0x1638 + 0x1638 + 0x44 + 0x4 + + + + .debug_frame + 0x167c + 0x167c + 0x44 + 0x4 + + + + .debug_frame + 0x16c0 + 0x16c0 + 0x44 + 0x4 + + + + .debug_frame + 0x1704 + 0x1704 + 0x44 + 0x4 + + + + .debug_frame + 0x1748 + 0x1748 + 0x80 + 0x4 + + + + .debug_frame + 0x17c8 + 0x17c8 + 0x50 + 0x4 + + + + .debug_frame + 0x1818 + 0x1818 + 0x40 + 0x4 + + + + .debug_frame + 0x1858 + 0x1858 + 0x40 + 0x4 + + + + .debug_frame + 0x1898 + 0x1898 + 0x58 + 0x4 + + + + .debug_frame + 0x18f0 + 0x18f0 + 0x40 + 0x4 + + + + .debug_frame + 0x1930 + 0x1930 + 0x40 + 0x4 + + + + .debug_frame + 0x1970 + 0x1970 + 0x40 + 0x4 + + + + .debug_frame + 0x19b0 + 0x19b0 + 0x60 + 0x4 + + + + .debug_frame + 0x1a10 + 0x1a10 + 0x70 + 0x4 + + + + .debug_frame + 0x1a80 + 0x1a80 + 0x40 + 0x4 + + + + .debug_frame + 0x1ac0 + 0x1ac0 + 0x40 + 0x4 + + + + .debug_frame + 0x1b00 + 0x1b00 + 0x40 + 0x4 + + + + .debug_abbrev + 0x0 + 0x0 + 0xf0 + 0x0 + + + + .debug_abbrev + 0xf0 + 0xf0 + 0x76 + 0x0 + + + + .debug_abbrev + 0x166 + 0x166 + 0x48 + 0x0 + + + + .debug_abbrev + 0x1ae + 0x1ae + 0x1c + 0x0 + + + + .debug_abbrev + 0x1ca + 0x1ca + 0x28 + 0x0 + + + + .debug_abbrev + 0x1f2 + 0x1f2 + 0x28 + 0x0 + + + + .debug_abbrev + 0x21a + 0x21a + 0x28 + 0x0 + + + + .debug_abbrev + 0x242 + 0x242 + 0x28 + 0x0 + + + + .debug_abbrev + 0x26a + 0x26a + 0x28 + 0x0 + + + + .debug_abbrev + 0x292 + 0x292 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2ba + 0x2ba + 0x28 + 0x0 + + + + .debug_abbrev + 0x2e2 + 0x2e2 + 0x28 + 0x0 + + + + .debug_abbrev + 0x30a + 0x30a + 0xcf + 0x0 + + + + .debug_abbrev + 0x3d9 + 0x3d9 + 0x6f + 0x0 + + + + .debug_abbrev + 0x448 + 0x448 + 0x90 + 0x0 + + + + .debug_abbrev + 0x4d8 + 0x4d8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x500 + 0x500 + 0x28 + 0x0 + + + + .debug_abbrev + 0x528 + 0x528 + 0x28 + 0x0 + + + + .debug_abbrev + 0x550 + 0x550 + 0x28 + 0x0 + + + + .debug_abbrev + 0x578 + 0x578 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5a0 + 0x5a0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5c8 + 0x5c8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x5f0 + 0x5f0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x618 + 0x618 + 0x28 + 0x0 + + + + .debug_abbrev + 0x640 + 0x640 + 0x103 + 0x0 + + + + .debug_abbrev + 0x743 + 0x743 + 0xb3 + 0x0 + + + + .debug_abbrev + 0x7f6 + 0x7f6 + 0x25 + 0x0 + + + + .debug_abbrev + 0x81b + 0x81b + 0x25 + 0x0 + + + + .debug_abbrev + 0x840 + 0x840 + 0x28 + 0x0 + + + + .debug_abbrev + 0x868 + 0x868 + 0xf4 + 0x0 + + + + .debug_abbrev + 0x95c + 0x95c + 0xa5 + 0x0 + + + + .debug_abbrev + 0xa01 + 0xa01 + 0x5c + 0x0 + + + + .debug_abbrev + 0xa5d + 0xa5d + 0x6a + 0x0 + + + + .debug_abbrev + 0xac7 + 0xac7 + 0x71 + 0x0 + + + + .debug_abbrev + 0xb38 + 0xb38 + 0x5c + 0x0 + + + + .debug_abbrev + 0xb94 + 0xb94 + 0x5c + 0x0 + + + + .debug_abbrev + 0xbf0 + 0xbf0 + 0x68 + 0x0 + + + + .debug_abbrev + 0xc58 + 0xc58 + 0x68 + 0x0 + + + + .debug_abbrev + 0xcc0 + 0xcc0 + 0x68 + 0x0 + + + + .debug_abbrev + 0xd28 + 0xd28 + 0x68 + 0x0 + + + + .debug_abbrev + 0xd90 + 0xd90 + 0x68 + 0x0 + + + + .debug_abbrev + 0xdf8 + 0xdf8 + 0x68 + 0x0 + + + + .debug_abbrev + 0xe60 + 0xe60 + 0x68 + 0x0 + + + + .debug_abbrev + 0xec8 + 0xec8 + 0x68 + 0x0 + + + + .debug_abbrev + 0xf30 + 0xf30 + 0x68 + 0x0 + + + + .debug_abbrev + 0xf98 + 0xf98 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1002 + 0x1002 + 0x62 + 0x0 + + + + .debug_abbrev + 0x1064 + 0x1064 + 0x5c + 0x0 + + + + .debug_abbrev + 0x10c0 + 0x10c0 + 0x6a + 0x0 + + + + .debug_abbrev + 0x112a + 0x112a + 0x6a + 0x0 + + + + .debug_abbrev + 0x1194 + 0x1194 + 0x6a + 0x0 + + + + .debug_abbrev + 0x11fe + 0x11fe + 0x6a + 0x0 + + + + .debug_abbrev + 0x1268 + 0x1268 + 0x5c + 0x0 + + + + .debug_abbrev + 0x12c4 + 0x12c4 + 0x69 + 0x0 + + + + .debug_abbrev + 0x132d + 0x132d + 0x46 + 0x0 + + + + .debug_abbrev + 0x1373 + 0x1373 + 0x46 + 0x0 + + + + .debug_abbrev + 0x13b9 + 0x13b9 + 0x54 + 0x0 + + + + .debug_abbrev + 0x140d + 0x140d + 0x48 + 0x0 + + + + .debug_abbrev + 0x1455 + 0x1455 + 0x3b + 0x0 + + + + .debug_abbrev + 0x1490 + 0x1490 + 0x3b + 0x0 + + + + .debug_abbrev + 0x14cb + 0x14cb + 0x51 + 0x0 + + + + .debug_abbrev + 0x151c + 0x151c + 0x6a + 0x0 + + + + .debug_abbrev + 0x1586 + 0x1586 + 0x44 + 0x0 + + + + .debug_abbrev + 0x15ca + 0x15ca + 0x5c + 0x0 + + + + .debug_abbrev + 0x1626 + 0x1626 + 0x68 + 0x0 + + + + .debug_abbrev + 0x168e + 0x168e + 0x68 + 0x0 + + + + .debug_abbrev + 0x16f6 + 0x16f6 + 0x68 + 0x0 + + + + .debug_abbrev + 0x175e + 0x175e + 0x6a + 0x0 + + + + .debug_abbrev + 0x17c8 + 0x17c8 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1832 + 0x1832 + 0x6a + 0x0 + + + + .debug_abbrev + 0x189c + 0x189c + 0x62 + 0x0 + + + + .debug_abbrev + 0x18fe + 0x18fe + 0x44 + 0x0 + + + + .debug_abbrev + 0x1942 + 0x1942 + 0x46 + 0x0 + + + + .debug_abbrev + 0x1988 + 0x1988 + 0x44 + 0x0 + + + + .debug_abbrev + 0x19cc + 0x19cc + 0x5c + 0x0 + + + + .debug_abbrev + 0x1a28 + 0x1a28 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1a90 + 0x1a90 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1af8 + 0x1af8 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1b60 + 0x1b60 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1bc8 + 0x1bc8 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1c30 + 0x1c30 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1c9a + 0x1c9a + 0x68 + 0x0 + + + + .debug_abbrev + 0x1d02 + 0x1d02 + 0x52 + 0x0 + + + + .debug_abbrev + 0x1d54 + 0x1d54 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1dc0 + 0x1dc0 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1e2c + 0x1e2c + 0x5f + 0x0 + + + + .debug_abbrev + 0x1e8b + 0x1e8b + 0x6a + 0x0 + + + + .debug_abbrev + 0x1ef5 + 0x1ef5 + 0x6c + 0x0 + + + + .debug_abbrev + 0x1f61 + 0x1f61 + 0x5e + 0x0 + + + + .debug_abbrev + 0x1fbf + 0x1fbf + 0x8f + 0x0 + + + + .debug_abbrev + 0x204e + 0x204e + 0x6f + 0x0 + + + + .debug_abbrev + 0x20bd + 0x20bd + 0x44 + 0x0 + + + + .debug_abbrev + 0x2101 + 0x2101 + 0x6f + 0x0 + + + + .debug_abbrev + 0x2170 + 0x2170 + 0x35 + 0x0 + + + + .debug_abbrev + 0x21a5 + 0x21a5 + 0x3d + 0x0 + + + + .debug_abbrev + 0x21e2 + 0x21e2 + 0x3b + 0x0 + + + + .debug_abbrev + 0x221d + 0x221d + 0x61 + 0x0 + + + + .debug_abbrev + 0x227e + 0x227e + 0x44 + 0x0 + + + + .debug_abbrev + 0x22c2 + 0x22c2 + 0x4b + 0x0 + + + + .debug_abbrev + 0x230d + 0x230d + 0x1c + 0x0 + + + + .debug_abbrev + 0x2329 + 0x2329 + 0x71 + 0x0 + + + + .debug_abbrev + 0x239a + 0x239a + 0xb3 + 0x0 + + + + .debug_abbrev + 0x244d + 0x244d + 0x6d + 0x0 + + + + .debug_abbrev + 0x24ba + 0x24ba + 0x44 + 0x0 + + + + .debug_abbrev + 0x24fe + 0x24fe + 0x6d + 0x0 + + + + .debug_abbrev + 0x256b + 0x256b + 0x44 + 0x0 + + + + .debug_abbrev + 0x25af + 0x25af + 0x5f + 0x0 + + + + .debug_abbrev + 0x260e + 0x260e + 0x44 + 0x0 + + + + .debug_abbrev + 0x2652 + 0x2652 + 0x28 + 0x0 + + + + .debug_abbrev + 0x267a + 0x267a + 0xa0 + 0x0 + + + + .debug_abbrev + 0x271a + 0x271a + 0x57 + 0x0 + + + + .debug_abbrev + 0x2771 + 0x2771 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2799 + 0x2799 + 0x28 + 0x0 + + + + .debug_abbrev + 0x27c1 + 0x27c1 + 0x5f + 0x0 + + + + .debug_abbrev + 0x2820 + 0x2820 + 0x3a + 0x0 + + + + .debug_abbrev + 0x285a + 0x285a + 0x64 + 0x0 + + + + .debug_abbrev + 0x28be + 0x28be + 0x79 + 0x0 + + + + .debug_abbrev + 0x2937 + 0x2937 + 0x61 + 0x0 + + + + .debug_abbrev + 0x2998 + 0x2998 + 0x44 + 0x0 + + + + .debug_abbrev + 0x29dc + 0x29dc + 0x26 + 0x0 + + + + .debug_abbrev + 0x2a02 + 0x2a02 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2a1e + 0x2a1e + 0x49 + 0x0 + + + + .debug_abbrev + 0x2a67 + 0x2a67 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2a83 + 0x2a83 + 0xf + 0x0 + + + .debug_str + 0x0 + 0x0 + 0x68 + 0x0 + + + + .debug_str + 0x68 + 0x68 + 0x68 + 0x0 + + + + .debug_str + 0xd0 + 0xd0 + 0x68 + 0x0 + + + + .debug_str + 0x138 + 0x138 + 0x68 + 0x0 + + + + .debug_str + 0x1a0 + 0x1a0 + 0x68 + 0x0 + + + + .debug_str + 0x208 + 0x208 + 0x69 + 0x0 + + + + .debug_str + 0x271 + 0x271 + 0x69 + 0x0 + + + + .debug_str + 0x2da + 0x2da + 0x69 + 0x0 + + + + .debug_str + 0x343 + 0x343 + 0x69 + 0x0 + + + + .debug_str + 0x3ac + 0x3ac + 0x69 + 0x0 + + + + .debug_str + 0x415 + 0x415 + 0x69 + 0x0 + + + + .debug_str + 0x47e + 0x47e + 0x68 + 0x0 + + + + .debug_str + 0x4e6 + 0x4e6 + 0x68 + 0x0 + + + + .debug_str + 0x54e + 0x54e + 0x68 + 0x0 + + + + .debug_str + 0x5b6 + 0x5b6 + 0x68 + 0x0 + + + + .debug_str + 0x61e + 0x61e + 0x68 + 0x0 + + + + .debug_str + 0x686 + 0x686 + 0x68 + 0x0 + + + + .debug_str + 0x6ee + 0x6ee + 0x68 + 0x0 + + + + .debug_str + 0x756 + 0x756 + 0x68 + 0x0 + + + + .debug_str + 0x7be + 0x7be + 0x68 + 0x0 + + + + .debug_str + 0x826 + 0x826 + 0x68 + 0x0 + + + + .debug_str + 0x88e + 0x88e + 0x68 + 0x0 + + + + .debug_str + 0x8f6 + 0x8f6 + 0x68 + 0x0 + + + + .debug_str + 0x95e + 0x95e + 0x68 + 0x0 + + + + .debug_str + 0x9c6 + 0x9c6 + 0x68 + 0x0 + + + + .debug_aranges + 0x0 + 0x0 + 0x88 + 0x0 + + + + .debug_aranges + 0x88 + 0x88 + 0x20 + 0x0 + + + + .debug_aranges + 0xa8 + 0xa8 + 0x58 + 0x0 + + + + .debug_aranges + 0x100 + 0x100 + 0x20 + 0x0 + + + + .debug_aranges + 0x120 + 0x120 + 0x120 + 0x0 + + + + .debug_aranges + 0x240 + 0x240 + 0x20 + 0x0 + + + + .debug_aranges + 0x260 + 0x260 + 0x20 + 0x0 + + + + .debug_aranges + 0x280 + 0x280 + 0xb0 + 0x0 + + + + .debug_aranges + 0x330 + 0x330 + 0x20 + 0x0 + + + + .debug_aranges + 0x350 + 0x350 + 0x20 + 0x0 + + + + .debug_aranges + 0x370 + 0x370 + 0x20 + 0x0 + + + + .debug_aranges + 0x390 + 0x390 + 0x20 + 0x0 + + + + .debug_aranges + 0x3b0 + 0x3b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x3d0 + 0x3d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x3f0 + 0x3f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x410 + 0x410 + 0x20 + 0x0 + + + + .debug_aranges + 0x430 + 0x430 + 0x20 + 0x0 + + + + .debug_aranges + 0x450 + 0x450 + 0x20 + 0x0 + + + + .debug_aranges + 0x470 + 0x470 + 0x20 + 0x0 + + + + .debug_aranges + 0x490 + 0x490 + 0x20 + 0x0 + + + + .debug_aranges + 0x4b0 + 0x4b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x4d0 + 0x4d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x4f0 + 0x4f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x510 + 0x510 + 0x20 + 0x0 + + + + .debug_aranges + 0x530 + 0x530 + 0x20 + 0x0 + + + + .debug_aranges + 0x550 + 0x550 + 0x20 + 0x0 + + + + .debug_aranges + 0x570 + 0x570 + 0x20 + 0x0 + + + + .debug_aranges + 0x590 + 0x590 + 0x20 + 0x0 + + + + .debug_aranges + 0x5b0 + 0x5b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5d0 + 0x5d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5f0 + 0x5f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x610 + 0x610 + 0x20 + 0x0 + + + + .debug_aranges + 0x630 + 0x630 + 0x20 + 0x0 + + + + .debug_aranges + 0x650 + 0x650 + 0x20 + 0x0 + + + + .debug_aranges + 0x670 + 0x670 + 0x20 + 0x0 + + + + .debug_aranges + 0x690 + 0x690 + 0x20 + 0x0 + + + + .debug_aranges + 0x6b0 + 0x6b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6d0 + 0x6d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6f0 + 0x6f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x710 + 0x710 + 0x20 + 0x0 + + + + .debug_aranges + 0x730 + 0x730 + 0x20 + 0x0 + + + + .debug_aranges + 0x750 + 0x750 + 0x20 + 0x0 + + + + .debug_aranges + 0x770 + 0x770 + 0x20 + 0x0 + + + + .debug_aranges + 0x790 + 0x790 + 0x20 + 0x0 + + + + .debug_aranges + 0x7b0 + 0x7b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7d0 + 0x7d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7f0 + 0x7f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x810 + 0x810 + 0x20 + 0x0 + + + + .debug_aranges + 0x830 + 0x830 + 0x20 + 0x0 + + + + .debug_aranges + 0x850 + 0x850 + 0x20 + 0x0 + + + + .debug_aranges + 0x870 + 0x870 + 0x20 + 0x0 + + + + .debug_aranges + 0x890 + 0x890 + 0x20 + 0x0 + + + + .debug_aranges + 0x8b0 + 0x8b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8d0 + 0x8d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8f0 + 0x8f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x910 + 0x910 + 0x20 + 0x0 + + + + .debug_aranges + 0x930 + 0x930 + 0x20 + 0x0 + + + + .debug_aranges + 0x950 + 0x950 + 0x20 + 0x0 + + + + .debug_aranges + 0x970 + 0x970 + 0x20 + 0x0 + + + + .debug_aranges + 0x990 + 0x990 + 0x20 + 0x0 + + + + .debug_aranges + 0x9b0 + 0x9b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9d0 + 0x9d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9f0 + 0x9f0 + 0x20 + 0x0 + + + + .debug_aranges + 0xa10 + 0xa10 + 0x20 + 0x0 + + + + .debug_aranges + 0xa30 + 0xa30 + 0x20 + 0x0 + + + + .debug_aranges + 0xa50 + 0xa50 + 0x20 + 0x0 + + + + .debug_aranges + 0xa70 + 0xa70 + 0x20 + 0x0 + + + + .debug_aranges + 0xa90 + 0xa90 + 0x20 + 0x0 + + + + .debug_aranges + 0xab0 + 0xab0 + 0x20 + 0x0 + + + + .debug_aranges + 0xad0 + 0xad0 + 0x20 + 0x0 + + + + .debug_aranges + 0xaf0 + 0xaf0 + 0x20 + 0x0 + + + + .debug_aranges + 0xb10 + 0xb10 + 0x28 + 0x0 + + + + .debug_aranges + 0xb38 + 0xb38 + 0x30 + 0x0 + + + + .debug_aranges + 0xb68 + 0xb68 + 0x20 + 0x0 + + + + .debug_aranges + 0xb88 + 0xb88 + 0x20 + 0x0 + + + + .debug_aranges + 0xba8 + 0xba8 + 0x20 + 0x0 + + + + .debug_pubnames + 0x0 + 0x0 + 0x140 + 0x0 + + + + .debug_pubnames + 0x140 + 0x140 + 0x1b + 0x0 + + + + .debug_pubnames + 0x15b + 0x15b + 0x2d + 0x0 + + + + .debug_pubnames + 0x188 + 0x188 + 0x23 + 0x0 + + + + .debug_pubnames + 0x1ab + 0x1ab + 0x25 + 0x0 + + + + .debug_pubnames + 0x1d0 + 0x1d0 + 0x20 + 0x0 + + + + .debug_pubnames + 0x1f0 + 0x1f0 + 0x22 + 0x0 + + + + .debug_pubnames + 0x212 + 0x212 + 0x20 + 0x0 + + + + .debug_pubnames + 0x232 + 0x232 + 0x22 + 0x0 + + + + .debug_pubnames + 0x254 + 0x254 + 0x1f + 0x0 + + + + .debug_pubnames + 0x273 + 0x273 + 0xc3 + 0x0 + + + + .debug_pubnames + 0x336 + 0x336 + 0x21 + 0x0 + + + + .debug_pubnames + 0x357 + 0x357 + 0x28a + 0x0 + + + + .debug_pubnames + 0x5e1 + 0x5e1 + 0x29 + 0x0 + + + + .debug_pubnames + 0x60a + 0x60a + 0x2d + 0x0 + + + + .debug_pubnames + 0x637 + 0x637 + 0x2d + 0x0 + + + + .debug_pubnames + 0x664 + 0x664 + 0x2d + 0x0 + + + + .debug_pubnames + 0x691 + 0x691 + 0x2e + 0x0 + + + + .debug_pubnames + 0x6bf + 0x6bf + 0x2a + 0x0 + + + + .debug_pubnames + 0x6e9 + 0x6e9 + 0x2c + 0x0 + + + + .debug_pubnames + 0x715 + 0x715 + 0x2b + 0x0 + + + + .debug_pubnames + 0x740 + 0x740 + 0x33e + 0x0 + + + + .debug_pubnames + 0xa7e + 0xa7e + 0x44 + 0x0 + + + + .debug_pubnames + 0xac2 + 0xac2 + 0x45 + 0x0 + + + + .debug_pubnames + 0xb07 + 0xb07 + 0x4c + 0x0 + + + + .debug_pubnames + 0xb53 + 0xb53 + 0x224 + 0x0 + + + + .debug_pubnames + 0xd77 + 0xd77 + 0x2b + 0x0 + + + + .debug_pubnames + 0xda2 + 0xda2 + 0x30 + 0x0 + + + + .debug_pubnames + 0xdd2 + 0xdd2 + 0x2c + 0x0 + + + + .debug_pubnames + 0xdfe + 0xdfe + 0x2b + 0x0 + + + + .debug_pubnames + 0xe29 + 0xe29 + 0x2a + 0x0 + + + + .debug_pubnames + 0xe53 + 0xe53 + 0x2d + 0x0 + + + + .debug_pubnames + 0xe80 + 0xe80 + 0x2d + 0x0 + + + + .debug_pubnames + 0xead + 0xead + 0x2b + 0x0 + + + + .debug_pubnames + 0xed8 + 0xed8 + 0x2c + 0x0 + + + + .debug_pubnames + 0xf04 + 0xf04 + 0x28 + 0x0 + + + + .debug_pubnames + 0xf2c + 0xf2c + 0x29 + 0x0 + + + + .debug_pubnames + 0xf55 + 0xf55 + 0x26 + 0x0 + + + + .debug_pubnames + 0xf7b + 0xf7b + 0x30 + 0x0 + + + + .debug_pubnames + 0xfab + 0xfab + 0x27 + 0x0 + + + + .debug_pubnames + 0xfd2 + 0xfd2 + 0x26 + 0x0 + + + + .debug_pubnames + 0xff8 + 0xff8 + 0x2c + 0x0 + + + + .debug_pubnames + 0x1024 + 0x1024 + 0x28 + 0x0 + + + + .debug_pubnames + 0x104c + 0x104c + 0x30 + 0x0 + + + + .debug_pubnames + 0x107c + 0x107c + 0x2d + 0x0 + + + + .debug_pubnames + 0x10a9 + 0x10a9 + 0x28 + 0x0 + + + + .debug_pubnames + 0x10d1 + 0x10d1 + 0x2d + 0x0 + + + + .debug_pubnames + 0x10fe + 0x10fe + 0x2e + 0x0 + + + + .debug_pubnames + 0x112c + 0x112c + 0x2b + 0x0 + + + + .debug_pubnames + 0x1157 + 0x1157 + 0x2f + 0x0 + + + + .debug_pubnames + 0x1186 + 0x1186 + 0x38 + 0x0 + + + + .debug_pubnames + 0x11be + 0x11be + 0x2b + 0x0 + + + + .debug_pubnames + 0x11e9 + 0x11e9 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1219 + 0x1219 + 0x27 + 0x0 + + + + .debug_pubnames + 0x1240 + 0x1240 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1266 + 0x1266 + 0x27 + 0x0 + + + + .debug_pubnames + 0x128d + 0x128d + 0x28 + 0x0 + + + + .debug_pubnames + 0x12b5 + 0x12b5 + 0x2f + 0x0 + + + + .debug_pubnames + 0x12e4 + 0x12e4 + 0x24 + 0x0 + + + + .debug_pubnames + 0x1308 + 0x1308 + 0x2a + 0x0 + + + + .debug_pubnames + 0x1332 + 0x1332 + 0x2f + 0x0 + + + + .debug_pubnames + 0x1361 + 0x1361 + 0x2d + 0x0 + + + + .debug_pubnames + 0x138e + 0x138e + 0x37 + 0x0 + + + + .debug_pubnames + 0x13c5 + 0x13c5 + 0x26 + 0x0 + + + + .debug_pubnames + 0x13eb + 0x13eb + 0x2b + 0x0 + + + + .debug_pubnames + 0x1416 + 0x1416 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1447 + 0x1447 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1477 + 0x1477 + 0x29 + 0x0 + + + + .debug_pubnames + 0x14a0 + 0x14a0 + 0x2a + 0x0 + + + + .debug_pubnames + 0x14ca + 0x14ca + 0x29 + 0x0 + + + + .debug_pubnames + 0x14f3 + 0x14f3 + 0x36 + 0x0 + + + + .debug_pubnames + 0x1529 + 0x1529 + 0x31 + 0x0 + + + + .debug_pubnames + 0x155a + 0x155a + 0x2a + 0x0 + + + + .debug_pubnames + 0x1584 + 0x1584 + 0x26 + 0x0 + + + + .debug_pubnames + 0x15aa + 0x15aa + 0x26 + 0x0 + + + + .debug_pubnames + 0x15d0 + 0x15d0 + 0x28 + 0x0 + + + + .debug_pubnames + 0x15f8 + 0x15f8 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1625 + 0x1625 + 0x2e + 0x0 + + + + .debug_pubnames + 0x1653 + 0x1653 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1684 + 0x1684 + 0x1b + 0x0 + + + + .debug_pubnames + 0x169f + 0x169f + 0x1b + 0x0 + + + + .debug_pubnames + 0x16ba + 0x16ba + 0x1f + 0x0 + + + + .debug_pubnames + 0x16d9 + 0x16d9 + 0x25 + 0x0 + + + + .debug_pubnames + 0x16fe + 0x16fe + 0x1d + 0x0 + + + + .debug_pubnames + 0x171b + 0x171b + 0x27 + 0x0 + + + + .debug_pubnames + 0x1742 + 0x1742 + 0x35 + 0x0 + + + + .debug_pubnames + 0x1777 + 0x1777 + 0x25 + 0x0 + + + + .debug_pubnames + 0x179c + 0x179c + 0x2b + 0x0 + + + + .debug_pubnames + 0x17c7 + 0x17c7 + 0x2b + 0x0 + + + + .debug_pubnames + 0x17f2 + 0x17f2 + 0x5e + 0x0 + + + + .debug_pubnames + 0x1850 + 0x1850 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1875 + 0x1875 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1891 + 0x1891 + 0x1e + 0x0 + + + + .debug_pubnames + 0x18af + 0x18af + 0x43 + 0x0 + + + + .debug_pubnames + 0x18f2 + 0x18f2 + 0x21 + 0x0 + + + + .debug_pubnames + 0x1913 + 0x1913 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1930 + 0x1930 + 0x1c + 0x0 + + + + .debug_pubnames + 0x194c + 0x194c + 0x29 + 0x0 + + + + SFRA_F32_Data + true + true + 0x2 + 0x22 + 0x2 + + + + + + .cinit + 0x83b40 + 0x83b40 + 0x28 + + + + + + + + + + .text + 0x82000 + 0x82000 + 0x1b3b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .text + + + + + + codestart + 0x80000 + 0x80000 + 0x2 + + + + + + .stack + 0x400 + 0x100 + + + + + + + .switch + 0x0 + 0x0 + + + + + .reset + 0x3fffc0 + 0x0 + + + + + .init_array + 0x0 + 0x0 + + + + + .bss + 0xa800 + 0x6c2 + + + + + + + + + + + + + + + + + + + + + + .bss:output + 0x0 + 0x0 + + + + + .bss:cio + 0x0 + 0x0 + + + + + .data + 0xaec2 + 0x13 + + + + + + + + + + + .sysmem + 0x0 + 0x0 + + + + + .const + 0x90000 + 0x90000 + 0x46f + + + + + + + + + + + + + + Filter_RegsFile + 0x0 + 0x0 + + + + + SHARERAMGS0 + 0x0 + 0x0 + + + + + SHARERAMGS1 + 0x0 + 0x0 + + + + + SHARERAMGS2 + 0x0 + 0x0 + + + + + ramgs0 + 0x0 + 0x0 + + + + + ramgs1 + 0x0 + 0x0 + + + + + .TI.ramfunc + 0x86000 + 0x8000 + 0x128 + + + + + + + + + + + + + + + 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 + 0x3367 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_info + 0x0 + 0x0 + 0xfef0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_line + 0x0 + 0x0 + 0x482d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_frame + 0x0 + 0x0 + 0x1b40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_abbrev + 0x0 + 0x0 + 0x2a92 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_str + 0x0 + 0x0 + 0xa2e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_aranges + 0x0 + 0x0 + 0xbc8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_pubnames + 0x0 + 0x0 + 0x1975 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SFRA_F32_Data + 0x2 + 0x22 + + + + + + SEGMENT_0 + 0x80000 + 0x80000 + 0x2 + 0x5 + + + + + + SEGMENT_1 + 0x82000 + 0x82000 + 0x1b3b + 0x5 + + + + + + SEGMENT_2 + 0x83b40 + 0x83b40 + 0x28 + 0x4 + + + + + + SEGMENT_3 + 0x86000 + 0x8000 + 0x128 + 0x5 + + + + + + SEGMENT_4 + 0x90000 + 0x90000 + 0x46f + 0x4 + + + + + + SEGMENT_5 + 0x2 + 0x22 + 0x6 + + + + + + SEGMENT_6 + 0x400 + 0x100 + 0x6 + + + + + + SEGMENT_7 + 0xa800 + 0x6d5 + 0x6 + + + + + + + + + RAMM0 + 0x0 + 0x123 + 0x2dd + 0x0 + 0x2dd + RWIX + + + + + RAMLS0 + 0x0 + 0x8000 + 0x800 + 0x128 + 0x6d8 + RWIX + + + 0x8000 + 0x128 + + + + 0x8128 + 0x6d8 + + + + + 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 + 0x0 + 0x800 + RWIX + + + + + RAMGS14 + 0x0 + 0x1a000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS15 + 0x0 + 0x1b000 + 0xff8 + 0x0 + 0xff8 + RWIX + + + + + BEGIN + 0x0 + 0x80000 + 0x2 + 0x2 + 0x0 + RWIX + + + 0x80000 + 0x2 + + + + + + FLASHA + 0x0 + 0x80002 + 0x1ffe + 0x0 + 0x1ffe + RWIX + + + + + FLASHB + 0x0 + 0x82000 + 0x2000 + 0x1b63 + 0x49d + RWIX + + + 0x82000 + 0x1b3b + + + + 0x83b3b + 0x5 + + + 0x83b40 + 0x28 + + + + 0x83b68 + 0x498 + + + + + FLASHC + 0x0 + 0x84000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHD + 0x0 + 0x86000 + 0x2000 + 0x128 + 0x1ed8 + RWIX + + + 0x86000 + 0x128 + + + + 0x86128 + 0x1ed8 + + + + + FLASHE + 0x0 + 0x88000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHF + 0x0 + 0x90000 + 0x8000 + 0x46f + 0x7b91 + RWIX + + + 0x90000 + 0x46f + + + + 0x9046f + 0x7b91 + + + + + 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 + 0x22 + 0xff + RWIX + + + 0x2 + 0x22 + + + + 0x24 + 0xff + + + + + RAMM1 + 0x1 + 0x400 + 0x3f8 + 0x100 + 0x2f8 + RWIX + + + 0x400 + 0x100 + + + + 0x500 + 0x2f8 + + + + + RAMLS5 + 0x1 + 0xa800 + 0x800 + 0x6d5 + 0x12b + RWIX + + + 0xa800 + 0x6c2 + + + + 0xaec2 + 0x13 + + + + 0xaed5 + 0x12b + + + + + 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 + + + + + CPU2TOCPU1RAM + 0x1 + 0x3f800 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CPU1TOCPU2RAM + 0x1 + 0x3fc00 + 0x400 + 0x0 + 0x400 + RWIX + + + + + + + __TI_cinit_table + + .data + 0x83b40 + 0xd + 0xaec2 + 0x13 + lzss + + + .bss + 0x83b54 + 0x4 + 0xa800 + 0x6c2 + zero_init + + + SFRA_F32_Data + 0x83b58 + 0x4 + 0x2 + 0x22 + zero_init + + + + + __TI_handler_table + + 0x0 + __TI_zero_init + + + 0x1 + __TI_decompress_lzss + + + 0x2 + __TI_decompress_none + + + + + RamfuncsLoadStart + 0x86000 + + + RamfuncsLoadSize + 0x128 + + + RamfuncsLoadEnd + 0x86128 + + + RamfuncsRunStart + 0x8000 + + + RamfuncsRunSize + 0x128 + + + RamfuncsRunEnd + 0x8128 + + + __TI_CINIT_Base + 0x83b5c + + + __TI_CINIT_Limit + 0x83b68 + + + __TI_CINIT_Warm + 0x83b68 + + + __TI_Handler_Table_Base + 0x83b4e + + + __TI_Handler_Table_Limit + 0x83b54 + + + __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 + + + INTERRUPT_init + 0x83234 + + + + PinMux_init + 0x831f4 + + + + Board_init + 0x831e9 + + + + GPIO_init + 0x8321d + + + + CPUTIMER_init + 0x831fa + + + + myCPUTIMER0_init + 0x831fd + + + + LED_Blue_init + 0x83220 + + + + main + 0x83a57 + + + + plantPhaseVect + 0xacb0 + + + + clPhaseVect + 0xa8c8 + + + + sfra_task_run + 0x83026 + + + + olPhaseVect + 0xab20 + + + + sfra_init + 0x82fb0 + + + + lowPass_test + 0xad80 + + + + plantMagVect + 0xabe8 + + + + sfra1 + 0xad8a + + + + freqVect + 0xa990 + + + + olMagVect + 0xaa58 + + + + clMagVect + 0xa800 + + + + TIMER0_ISR + 0x83575 + + + + SFRA_GUI_varGetList + 0xae42 + + + + SFRA_GUI_rcvTaskPointer + 0xadd2 + + + + SFRA_GUI_cmdInterpreter + 0x82350 + + + + SFRA_GUI_commsOKflg + 0xadc0 + + + + SFRA_GUI_memDataPtr16 + 0xadd8 + + + + SFRA_GUI_getVariable + 0x823df + + + + SFRA_GUI_runSerialHostComms + 0x82255 + + + + SFRA_GUI_rxChar + 0xadc4 + + + + SFRA_GUI_lowByteFlag + 0xadc2 + + + + SFRA_GUI_memDataPtr32 + 0xadda + + + + SFRA_GUI_varSetBtnList + 0xae62 + + + + SFRA_GUI_getData + 0x823e5 + + + + SFRA_GUI_config + 0x82143 + + + + SFRA_GUI_led_gpio + 0xadd0 + + + + SFRA_GUI_delayer + 0xadcb + + + + SFRA_GUI_sendTaskPtr + 0xadc3 + + + + SFRA_GUI_getCmdByte + 0x82269 + + + + SFRA_GUI_echoCmdByte + 0x822ab + + + + SFRA_GUI_sendData + 0x82448 + + + + SFRA_GUI_cmdPacket + 0xad78 + + + + SFRA_GUI_rxWord + 0xadc5 + + + + SFRA_GUI_led_flag + 0xadcf + + + + SFRA_GUI_memGetAmount + 0xadcd + + + + SFRA_GUI_arrayGetList + 0xade2 + + + + SFRA_GUI_echoSizeByte + 0x822e5 + + + + SFRA_GUI_setData32 + 0x82414 + + + + SFRA_GUI_dataOut32 + 0xadd6 + + + + SFRA_GUI_memGetAddress + 0xaddc + + + + SFRA_GUI_getDataByte + 0x822ff + + + + SFRA_GUI_dataOut16 + 0xadc9 + + + + SFRA_GUI_getSizeByte + 0x822c5 + + + + SFRA_GUI_echoDataByte + 0x8231f + + + + SFRA_GUI_packWord + 0x82332 + + + + SFRA_GUI_setText + 0x823a6 + + + + SFRA_GUI_sweep_start + 0xadd1 + + + + SFRA_GUI_setSlider + 0x823cc + + + + SFRA_GUI_lifePulseTsk + 0x82370 + + + + SFRA_GUI_rcvTskPtrShdw + 0xadca + + + + SFRA_GUI_numWords + 0xadc7 + + + + SFRA_GUI_varSetSldrList + 0xae82 + + + + SFRA_GUI_spareTsk08 + 0x82443 + + + + SFRA_GUI_wordsLeftToGet + 0xadc8 + + + + SFRA_GUI_serialCommsTimer + 0xadc1 + + + + SFRA_GUI_dataSetList + 0xae22 + + + + SFRA_GUI_temp + 0xade0 + + + + SFRA_GUI_sci_base_addr + 0xadd4 + + + + SFRA_GUI_varSetTxtList + 0xaea2 + + + + SFRA_GUI_memSetValue + 0xadde + + + + SFRA_GUI_memSetPtr + 0xadce + + + + SFRA_GUI_memGetPtr + 0xadcc + + + + SFRA_GUI_taskDoneFlag + 0xadc6 + + + + SFRA_GUI_cmdDispatcher + 0xae02 + + + + SFRA_GUI_getArray + 0x823e2 + + + + SFRA_GUI_setButton + 0x823b9 + + + + code_start + 0x80000 + + + + Device_enableAllPeripherals + 0x8261d + + + + Device_initGPIO + 0x82708 + + + + Example_Fail + 0xaec6 + + + + Example_setResultFail + 0x82926 + + + + Device_bootCPU2 + 0x827a0 + + + + Device_init + 0x825c8 + + + + Example_Result + 0xaec2 + + + + Device_enableUnbondedGPIOPullups + 0x82759 + + + + __error__ + 0x8291a + + + + Example_setResultPass + 0x82921 + + + + Device_configureTMXAnalogTrim + 0x8276f + + + + Device_enableUnbondedGPIOPullupsFor176Pin + 0x82729 + + + + Example_done + 0x8292b + + + + Example_PassCount + 0xaec4 + + + + Device_enableUnbondedGPIOPullupsFor100Pin + 0x8273c + + + + CPUTimer_setEmulationMode + 0x83a0d + + + + Flash_initModule + 0x8000 + + + + GPIO_setQualificationMode + 0x8372d + + + + GPIO_setPadConfig + 0x8348a + + + + GPIO_setDirectionMode + 0x8379b + + + + GPIO_setPinConfig + 0x836f6 + + + + GPIO_setControllerCore + 0x836bf + + + + Interrupt_defaultHandler + 0x839e3 + + + + Interrupt_initModule + 0x83682 + + + + Interrupt_nmiHandler + 0x83af8 + + + + Interrupt_enable + 0x83764 + + + + Interrupt_initVectorTable + 0x83901 + + + + Interrupt_illegalOperationHandler + 0x83aee + + + + SCI_clearInterruptStatus + 0x835bb + + + + SCI_setConfig + 0x83644 + + + + SCI_enableInterrupt + 0x83600 + + + + SysCtl_delay + 0x8124 + + + + SysCtl_getDeviceParametric + 0x83359 + + + + SysCtl_selectXTAL + 0x83241 + + + + SysCtl_selectOscSource + 0x8352d + + + + SysCtl_getLowSpeedClock + 0x83954 + + + + SysCtl_setClock + 0x8292c + + + + SysCtl_getClock + 0x834dc + + + + SFRA_F32_runBackgroundTask + 0x82b35 + + + + __SFRA_F32_collect + 0x833c1 + + + + _SFRA_F32_state + 0x2 + + + + SFRA_F32_updateInjectionAmplitude + 0x82d2f + + + + SFRA_F32_resetFreqRespArray + 0x82d37 + + + + _SFRA_F32_yCosSum + 0xe + + + + _SFRA_F32_ySinSum + 0xc + + + + _SFRA_F32_pointerStart + 0x10 + + + + _SFRA_F32_step + 0x18 + + + + _SFRA_F32_preCount + 0x1c + + + + _SFRA_F32_scalar + 0x16 + + + + _SFRA_F32_pointer + 0x1a + + + + SFRA_F32_config + 0x82e93 + + + + _SFRA_F32_reference + 0x12 + + + + _SFRA_F32_windowSamples + 0x20 + + + + _SFRA_F32_amplitude + 0x14 + + + + SFRA_F32_initFreqArrayWithLogSteps + 0x82e69 + + + + SFRA_F32_reset + 0x82e40 + + + + _SFRA_F32_uCosSum + 0xa + + + + _SFRA_F32_uSinSum + 0x8 + + + + _SFRA_F32_rCosSum + 0x6 + + + + _SFRA_F32_rSinSum + 0x4 + + + + _SFRA_F32_count + 0x1e + + + + _SFRA_F32_stateSlew + 0x3 + + + + _SFRA_F32_angle + 0x22 + + + + __SFRA_F32_inject + 0x8389c + + + + logf + 0x83033 + + + + tanf + 0x83428 + + + + _c_int00 + 0x839cc + + + + __stack + 0x400 + + + + __c28xabi_divf + 0x832d1 + + + + memcpy + 0x838c2 + + + + _system_pre_init + 0x83b38 + + + + __TI_auto_init_nobinit_nopinit + 0x837fa + + + + __TI_zero_init + 0x83b32 + + + + __TI_decompress_none + 0x83b1c + + + + __TI_decompress_lzss + 0x837cc + + + + C$$EXIT + 0x83825 + + + + abort + 0x83825 + + + + exit + 0x83827 + + + + __TI_dtors_ptr + 0xaecc + + + + __TI_cleanup_ptr + 0xaeca + + + + __TI_enable_exit_profile_output + 0xaec8 + + + + _nop + 0x83b13 + + + + _lock + 0xaece + + + + _unlock + 0xaed0 + + + + _register_lock + 0x83b0f + + + + _register_unlock + 0x83b0b + + + + _args_main + 0x83a69 + + + + memset + 0x83b2b + + + + errno + 0xaed4 + + + + _system_post_cinit + 0x83b3a + + + + Link successful + diff --git a/28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.map b/28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.map new file mode 100644 index 0000000..3f865bd --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.map @@ -0,0 +1,785 @@ +****************************************************************************** + TMS320C2000 Linker PC v25.11.0 +****************************************************************************** +>> Linked Fri Jun 12 14:12:09 2026 + +OUTPUT FILE NAME: <28379d_test_SFRA.out> +ENTRY POINT SYMBOL: "code_start" address: 00080000 + + +MEMORY CONFIGURATION + + name origin length used unused attr fill +---------------------- -------- --------- -------- -------- ---- -------- +PAGE 0: + RAMM0 00000123 000002dd 00000000 000002dd RWIX + RAMLS0 00008000 00000800 00000128 000006d8 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 00000000 00000800 RWIX + RAMGS14 0001a000 00001000 00000000 00001000 RWIX + RAMGS15 0001b000 00000ff8 00000000 00000ff8 RWIX + BEGIN 00080000 00000002 00000002 00000000 RWIX + FLASHA 00080002 00001ffe 00000000 00001ffe RWIX + FLASHB 00082000 00002000 00001ee1 0000011f RWIX + FLASHC 00084000 00002000 00000030 00001fd0 RWIX + FLASHD 00086000 00002000 00000128 00001ed8 RWIX + FLASHE 00088000 00008000 00000000 00008000 RWIX + FLASHF 00090000 00008000 00000513 00007aed 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 00000047 000007b9 RWIX + RAMD1 0000b800 00000800 00000000 00000800 RWIX + RAMGS0 0000c000 00001000 00000982 0000067e 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 + CPU2TOCPU1RAM 0003f800 00000400 00000000 00000400 RWIX + CPU1TOCPU2RAM 0003fc00 00000400 00000000 00000400 RWIX + + +SECTION ALLOCATION MAP + + output attributes/ +section page origin length input sections +-------- ---- ---------- ---------- ---------------- +codestart +* 0 00080000 00000002 + 00080000 00000002 F2837xD_CodeStartBranch.obj (codestart) + +.cinit 0 00084000 00000030 + 00084000 0000001d (.cinit..data.load) [load image, compression = lzss] + 0008401d 00000001 --HOLE-- [fill = 0] + 0008401e 00000006 (__TI_handler_table) + 00084024 00000004 (.cinit..bss.load) [load image, compression = zero_init] + 00084028 00000008 (__TI_cinit_table) + +.stack 1 00000400 00000100 UNINITIALIZED + 00000400 00000100 --HOLE-- + +.reset 0 003fffc0 00000000 DSECT + +.init_array +* 0 00082000 00000000 UNINITIALIZED + +.bss 1 0000c000 00000982 UNINITIALIZED + 0000c000 000002d8 sfra_test.obj (.bss) + 0000c2d8 000000c8 sfra_test.obj (.bss:clMagVect) + 0000c3a0 000000c8 sfra_test.obj (.bss:clPhaseVect) + 0000c468 000000c8 sfra_test.obj (.bss:freqVect) + 0000c530 000000c8 sfra_test.obj (.bss:olMagVect) + 0000c5f8 000000c8 sfra_test.obj (.bss:olPhaseVect) + 0000c6c0 000000c8 sfra_test.obj (.bss:plantMagVect) + 0000c788 000000c8 sfra_test.obj (.bss:plantPhaseVect) + 0000c850 00000022 libsfra_ti_hal.obj (.bss) + 0000c872 00000006 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdPacket) + 0000c878 00000008 --HOLE-- + 0000c880 00000022 sfra_gui_scicomms_driverlib.obj (.bss) + 0000c8a2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_arrayGetList) + 0000c8c2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_cmdDispatcher) + 0000c8e2 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_dataSetList) + 0000c902 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varGetList) + 0000c922 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetBtnList) + 0000c942 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetSldrList) + 0000c962 00000020 sfra_gui_scicomms_driverlib.obj (.bss:SFRA_GUI_varSetTxtList) + +.data 1 0000a800 00000047 UNINITIALIZED + 0000a800 00000032 sfra_test.obj (.data) + 0000a832 00000006 device.obj (.data) + 0000a838 00000006 rts2800_fpu32_eabi.lib : exit.c.obj (.data) + 0000a83e 00000002 : _lock.c.obj (.data:_lock) + 0000a840 00000004 libsfra_ti_hal.obj (.data) + 0000a844 00000002 rts2800_fpu32_eabi.lib : _lock.c.obj (.data:_unlock) + 0000a846 00000001 : errno.c.obj (.data) + +.const 0 00090000 00000513 + 00090000 000000c2 driverlib_eabi.lib : sysctl.obj (.const:.string) + 000900c2 000000bf : flash.obj (.const:.string) + 00090181 00000001 --HOLE-- [fill = 0] + 00090182 000000bc : gpio.obj (.const:.string) + 0009023e 000000bb : sci.obj (.const:.string) + 000902f9 00000001 --HOLE-- [fill = 0] + 000902fa 000000a8 sfra_test.obj (.const:.string) + 000903a2 0000007f board.obj (.const:.string) + 00090421 00000001 --HOLE-- [fill = 0] + 00090422 0000007b sfra_gui_scicomms_driverlib.obj (.const:.string) + 0009049d 00000001 --HOLE-- [fill = 0] + 0009049e 00000062 driverlib_eabi.lib : cputimer.obj (.const:.string) + 00090500 00000013 device.obj (.const:.string) + +.TI.ramfunc +* 0 00086000 00000128 RUN ADDR = 00008000 + 00086000 00000043 driverlib_eabi.lib : flash.obj (.TI.ramfunc:Flash_initModule) + 00086043 0000002c : flash.obj (.TI.ramfunc:Flash_setBankPowerMode) + 0008606f 00000024 : flash.obj (.TI.ramfunc:Flash_setWaitstates) + 00086093 0000001d : flash.obj (.TI.ramfunc:Flash_setPumpPowerMode) + 000860b0 00000018 : flash.obj (.TI.ramfunc:Flash_disableCache) + 000860c8 00000018 : flash.obj (.TI.ramfunc:Flash_disablePrefetch) + 000860e0 00000017 : flash.obj (.TI.ramfunc:Flash_enableCache) + 000860f7 00000017 : flash.obj (.TI.ramfunc:Flash_enablePrefetch) + 0008610e 00000016 : flash.obj (.TI.ramfunc:Flash_enableECC) + 00086124 00000004 : sysctl.obj (.TI.ramfunc) + +GETBUFFER +* 0 0003f800 00000000 DSECT + +GETWRITEIDX +* 0 0003f800 00000000 DSECT + +PUTREADIDX +* 0 0003f800 00000000 DSECT + +.text 0 00082000 00001ee1 + 00082000 0000052e sfra_gui_scicomms_driverlib.obj (.text) + 0008252e 000003fc device.obj (.text) + 0008292a 000002dc sfra_test.obj (.text) + 00082c06 0000028c libsfra.obj (.text) + 00082e92 0000020c board.obj (.text) + 0008309e 00000209 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_setClock) + 000832a7 00000116 libsfra_ti_hal.obj (.text) + 000833bd 00000107 rts2800_fpu32_eabi.lib : ll_div28.asm.obj (.text) + 000834c4 000000d8 : e_log10f.c.obj (.text) + 0008359c 00000090 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_selectXTAL) + 0008362c 00000088 rts2800_fpu32_eabi.lib : fs_div28.asm.obj (.text) + 000836b4 00000068 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getDeviceParametric) + 0008371c 00000062 rts2800_fpu32_eabi.lib : s_tanf.c.obj (.text) + 0008377e 00000058 : s_ceilf.c.obj (.text) + 000837d6 00000052 driverlib_eabi.lib : gpio.obj (.text:GPIO_setPadConfig) + 00083828 00000051 : sysctl.obj (.text:SysCtl_getClock) + 00083879 00000048 : sysctl.obj (.text:SysCtl_selectOscSource) + 000838c1 00000046 sfra_test.obj (.text:retain) + 00083907 00000045 driverlib_eabi.lib : sci.obj (.text:SCI_clearInterruptStatus) + 0008394c 00000044 : sci.obj (.text:SCI_enableInterrupt) + 00083990 0000003e : sci.obj (.text:SCI_setConfig) + 000839ce 0000003d : interrupt.obj (.text:Interrupt_initModule) + 00083a0b 00000037 : gpio.obj (.text:GPIO_setControllerCore) + 00083a42 00000037 : gpio.obj (.text:GPIO_setPinConfig) + 00083a79 00000037 : gpio.obj (.text:GPIO_setQualificationMode) + 00083ab0 00000037 : interrupt.obj (.text:Interrupt_enable) + 00083ae7 00000031 : gpio.obj (.text:GPIO_setDirectionMode) + 00083b18 0000002e rts2800_fpu32_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss) + 00083b46 0000002b : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit) + 00083b71 0000002a : l_div28.asm.obj (.text) + 00083b9b 00000029 : exit.c.obj (.text) + 00083bc4 00000028 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_selectClockSource) + 00083bec 00000026 : flash.obj (.text:Flash_setBankPowerUpDelay) + 00083c12 00000026 rts2800_fpu32_eabi.lib : fs_tollfpu32.asm.obj (.text) + 00083c38 00000020 : memcpy.c.obj (.text) + 00083c58 0000001f driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_getTimerOverflowStatus) + 00083c77 0000001e : interrupt.obj (.text:Interrupt_initVectorTable) + 00083c95 0000001b : sci.obj (.text:SCI_isBaseValid) + 00083cb0 0000001a : sysctl.obj (.text:CPUTimer_startTimer) + 00083cca 0000001a : sysctl.obj (.text:SysCtl_getLowSpeedClock) + 00083ce4 0000001a main.obj (.text:__relaxed_atanf) + 00083cfe 00000018 driverlib_eabi.lib : sci.obj (.text:SCI_disableModule) + 00083d16 00000018 : sci.obj (.text:SCI_performSoftwareReset) + 00083d2e 00000017 : cputimer.obj (.text:CPUTimer_isBaseValid) + 00083d45 00000017 : sysctl.obj (.text:CPUTimer_isBaseValid) + 00083d5c 00000017 rts2800_fpu32_eabi.lib : boot28.asm.obj (.text) + 00083d73 00000016 driverlib_eabi.lib : interrupt.obj (.text:Interrupt_defaultHandler) + 00083d89 00000014 : sysctl.obj (.text:CPUTimer_stopTimer) + 00083d9d 00000013 : cputimer.obj (.text:CPUTimer_setEmulationMode) + 00083db0 00000013 : sci.obj (.text:SCI_enableModule) + 00083dc3 00000012 : sysctl.obj (.text:CPUTimer_clearOverflowFlag) + 00083dd5 00000012 : sysctl.obj (.text:CPUTimer_disableInterrupt) + 00083de7 00000012 main.obj (.text) + 00083df9 00000012 rts2800_fpu32_eabi.lib : args_main.c.obj (.text) + 00083e0b 00000011 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_setPeriod) + 00083e1c 00000010 : flash.obj (.text:Flash_isCtrlBaseValid) + 00083e2c 00000010 : flash.obj (.text:Flash_isECCBaseValid) + 00083e3c 0000000f : sysctl.obj (.text:SysCtl_pollCpuTimer) + 00083e4b 0000000e : gpio.obj (.text:GPIO_isPinValid) + 00083e59 0000000d : interrupt.obj (.text:Interrupt_disableGlobal) + 00083e66 0000000d : interrupt.obj (.text:Interrupt_enableGlobal) + 00083e73 0000000b : sysctl.obj (.text:SysCtl_isMCDClockFailureDetected) + 00083e7e 0000000b main.obj (.text:__relaxed_cosf) + 00083e89 0000000b main.obj (.text:__relaxed_sinf) + 00083e94 0000000a driverlib_eabi.lib : interrupt.obj (.text:Interrupt_illegalOperationHandler) + 00083e9e 0000000a : interrupt.obj (.text:Interrupt_nmiHandler) + 00083ea8 00000009 : sysctl.obj (.text:SysCtl_serviceWatchdog) + 00083eb1 00000009 rts2800_fpu32_eabi.lib : _lock.c.obj (.text) + 00083eba 00000008 F2837xD_CodeStartBranch.obj (.text) + 00083ec2 00000008 rts2800_fpu32_eabi.lib : copy_decompress_none.c.obj (.text:decompress:none) + 00083eca 00000007 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_resetMCD) + 00083ed1 00000007 rts2800_fpu32_eabi.lib : memset.c.obj (.text) + 00083ed8 00000006 : copy_zero_init.c.obj (.text:decompress:ZI) + 00083ede 00000002 : pre_init.c.obj (.text) + 00083ee0 00000001 : startup.c.obj (.text) + +MODULE SUMMARY + + Module code ro data rw data + ------ ---- ------- ------- + .\ + sfra_test.obj 802 168 2178 + main.obj 66 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 868 168 2178 + + .\LIBSFRA\ + libsfra.obj 652 0 0 + libsfra_ti_hal.obj 278 0 38 + +--+---------------------------------+------+---------+---------+ + Total: 930 0 38 + + .\SFRA\ + sfra_gui_scicomms_driverlib.obj 1326 123 264 + +--+---------------------------------+------+---------+---------+ + Total: 1326 123 264 + + .\device\ + device.obj 1020 19 6 + F2837xD_CodeStartBranch.obj 10 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1030 19 6 + + .\syscfg\ + board.obj 524 127 0 + +--+---------------------------------+------+---------+---------+ + Total: 524 127 0 + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_eabi.lib + sysctl.obj 1191 194 0 + flash.obj 654 191 0 + gpio.obj 310 188 0 + sci.obj 293 187 0 + interrupt.obj 214 0 0 + cputimer.obj 42 98 0 + +--+---------------------------------+------+---------+---------+ + Total: 2704 858 0 + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\rts2800_fpu32_eabi.lib + ll_div28.asm.obj 263 0 0 + e_log10f.c.obj 216 0 0 + fs_div28.asm.obj 136 0 0 + s_tanf.c.obj 98 0 0 + s_ceilf.c.obj 88 0 0 + exit.c.obj 41 0 6 + copy_decompress_lzss.c.obj 46 0 0 + autoinit.c.obj 43 0 0 + l_div28.asm.obj 42 0 0 + fs_tollfpu32.asm.obj 38 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 + memset.c.obj 7 0 0 + copy_zero_init.c.obj 6 0 0 + pre_init.c.obj 2 0 0 + errno.c.obj 0 0 1 + startup.c.obj 1 0 0 + +--+---------------------------------+------+---------+---------+ + Total: 1117 0 11 + + Stack: 0 0 256 + Linker Generated: 0 47 0 + +--+---------------------------------+------+---------+---------+ + Grand Total: 8499 1342 2753 + + +LINKER GENERATED COPY TABLES + +__TI_cinit_table @ 00084028 records: 2, size/record: 4, table size: 8 + .data: load addr=00084000, load size=0000001d bytes, run addr=0000a800, run size=00000047 bytes, compression=lzss + .bss: load addr=00084024, load size=00000004 bytes, run addr=0000c000, run size=00000982 bytes, compression=zero_init + + +LINKER GENERATED HANDLER TABLE + +__TI_handler_table @ 0008401e records: 3, size/record: 2, table size: 6 + index: 0, handler: __TI_zero_init + index: 1, handler: __TI_decompress_lzss + index: 2, handler: __TI_decompress_none + + +GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE + +address data page name +-------- ---------------- ---- +00000400 10 (00000400) __stack + +0000a802 2a0 (0000a800) libsfra +0000a832 2a0 (0000a800) Example_Result +0000a834 2a0 (0000a800) Example_PassCount +0000a836 2a0 (0000a800) Example_Fail +0000a838 2a0 (0000a800) __TI_enable_exit_profile_output +0000a83a 2a0 (0000a800) __TI_cleanup_ptr +0000a83c 2a0 (0000a800) __TI_dtors_ptr +0000a83e 2a0 (0000a800) _lock + +0000a844 2a1 (0000a840) _unlock +0000a846 2a1 (0000a840) errno + +0000c000 300 (0000c000) lowPass_test +0000c00a 300 (0000c000) ti_sfra + +0000c040 301 (0000c040) hal_sfra + +0000c080 302 (0000c080) libsfra_results + +0000c2d8 30b (0000c2c0) clMagVect + +0000c3a0 30e (0000c380) clPhaseVect + +0000c468 311 (0000c440) freqVect + +0000c530 314 (0000c500) olMagVect + +0000c5f8 317 (0000c5c0) olPhaseVect + +0000c6c0 31b (0000c6c0) plantMagVect + +0000c788 31e (0000c780) plantPhaseVect + +0000c872 321 (0000c840) SFRA_GUI_cmdPacket + +0000c880 322 (0000c880) SFRA_GUI_commsOKflg +0000c881 322 (0000c880) SFRA_GUI_serialCommsTimer +0000c882 322 (0000c880) SFRA_GUI_lowByteFlag +0000c883 322 (0000c880) SFRA_GUI_sendTaskPtr +0000c884 322 (0000c880) SFRA_GUI_rxChar +0000c885 322 (0000c880) SFRA_GUI_rxWord +0000c886 322 (0000c880) SFRA_GUI_taskDoneFlag +0000c887 322 (0000c880) SFRA_GUI_numWords +0000c888 322 (0000c880) SFRA_GUI_wordsLeftToGet +0000c889 322 (0000c880) SFRA_GUI_dataOut16 +0000c88a 322 (0000c880) SFRA_GUI_rcvTskPtrShdw +0000c88b 322 (0000c880) SFRA_GUI_delayer +0000c88c 322 (0000c880) SFRA_GUI_memGetPtr +0000c88d 322 (0000c880) SFRA_GUI_memGetAmount +0000c88e 322 (0000c880) SFRA_GUI_memSetPtr +0000c88f 322 (0000c880) SFRA_GUI_led_flag +0000c890 322 (0000c880) SFRA_GUI_led_gpio +0000c891 322 (0000c880) SFRA_GUI_sweep_start +0000c892 322 (0000c880) SFRA_GUI_rcvTaskPointer +0000c894 322 (0000c880) SFRA_GUI_sci_base_addr +0000c896 322 (0000c880) SFRA_GUI_dataOut32 +0000c898 322 (0000c880) SFRA_GUI_memDataPtr16 +0000c89a 322 (0000c880) SFRA_GUI_memDataPtr32 +0000c89c 322 (0000c880) SFRA_GUI_memGetAddress +0000c89e 322 (0000c880) SFRA_GUI_memSetValue +0000c8a0 322 (0000c880) SFRA_GUI_temp +0000c8a2 322 (0000c880) SFRA_GUI_arrayGetList + +0000c8c2 323 (0000c8c0) SFRA_GUI_cmdDispatcher +0000c8e2 323 (0000c8c0) SFRA_GUI_dataSetList + +0000c902 324 (0000c900) SFRA_GUI_varGetList +0000c922 324 (0000c900) SFRA_GUI_varSetBtnList + +0000c942 325 (0000c940) SFRA_GUI_varSetSldrList +0000c962 325 (0000c940) SFRA_GUI_varSetTxtList + + +GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name + +page address name +---- ------- ---- +0 00082fec Board_init +0 00083b9b C$$EXIT +0 0008301d CPUTIMER_init +0 00083d9d CPUTimer_setEmulationMode +0 0008279e Device_bootCPU2 +0 0008276d Device_configureTMXAnalogTrim +0 0008261b Device_enableAllPeripherals +0 00082757 Device_enableUnbondedGPIOPullups +0 0008273a Device_enableUnbondedGPIOPullupsFor100Pin +0 00082727 Device_enableUnbondedGPIOPullupsFor176Pin +0 000825c8 Device_init +0 00082706 Device_initGPIO +1 0000a836 Example_Fail +1 0000a834 Example_PassCount +1 0000a832 Example_Result +0 00082929 Example_done +0 00082924 Example_setResultFail +0 0008291f Example_setResultPass +0 00008000 Flash_initModule +0 00083040 GPIO_init +0 00083a0b GPIO_setControllerCore +0 00083ae7 GPIO_setDirectionMode +0 000837d6 GPIO_setPadConfig +0 00083a42 GPIO_setPinConfig +0 00083a79 GPIO_setQualificationMode +0 00083057 INTERRUPT_init +0 00083d73 Interrupt_defaultHandler +0 00083ab0 Interrupt_enable +0 00083e94 Interrupt_illegalOperationHandler +0 000839ce Interrupt_initModule +0 00083c77 Interrupt_initVectorTable +0 00083e9e Interrupt_nmiHandler +0 00083043 LED_Blue_init +0 00082ff9 PinMux_init +0 00086128 RamfuncsLoadEnd +abs 00000128 RamfuncsLoadSize +0 00086000 RamfuncsLoadStart +0 00008128 RamfuncsRunEnd +abs 00000128 RamfuncsRunSize +0 00008000 RamfuncsRunStart +0 00083907 SCI_clearInterruptStatus +0 0008394c SCI_enableInterrupt +0 00083064 SCI_init +0 00083990 SCI_setConfig +0 0008334a SFRA_F32_runBackgroundTask +1 0000c8a2 SFRA_GUI_arrayGetList +1 0000c8c2 SFRA_GUI_cmdDispatcher +0 00082350 SFRA_GUI_cmdInterpreter +1 0000c872 SFRA_GUI_cmdPacket +1 0000c880 SFRA_GUI_commsOKflg +0 00082143 SFRA_GUI_config +1 0000c889 SFRA_GUI_dataOut16 +1 0000c896 SFRA_GUI_dataOut32 +1 0000c8e2 SFRA_GUI_dataSetList +1 0000c88b SFRA_GUI_delayer +0 000822ab SFRA_GUI_echoCmdByte +0 0008231f SFRA_GUI_echoDataByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000823e2 SFRA_GUI_getArray +0 00082269 SFRA_GUI_getCmdByte +0 000823e5 SFRA_GUI_getData +0 000822ff SFRA_GUI_getDataByte +0 000822c5 SFRA_GUI_getSizeByte +0 000823df SFRA_GUI_getVariable +1 0000c88f SFRA_GUI_led_flag +1 0000c890 SFRA_GUI_led_gpio +0 00082370 SFRA_GUI_lifePulseTsk +1 0000c882 SFRA_GUI_lowByteFlag +1 0000c898 SFRA_GUI_memDataPtr16 +1 0000c89a SFRA_GUI_memDataPtr32 +1 0000c89c SFRA_GUI_memGetAddress +1 0000c88d SFRA_GUI_memGetAmount +1 0000c88c SFRA_GUI_memGetPtr +1 0000c88e SFRA_GUI_memSetPtr +1 0000c89e SFRA_GUI_memSetValue +1 0000c887 SFRA_GUI_numWords +0 00082332 SFRA_GUI_packWord +1 0000c892 SFRA_GUI_rcvTaskPointer +1 0000c88a SFRA_GUI_rcvTskPtrShdw +0 00082255 SFRA_GUI_runSerialHostComms +1 0000c884 SFRA_GUI_rxChar +1 0000c885 SFRA_GUI_rxWord +1 0000c894 SFRA_GUI_sci_base_addr +0 00082448 SFRA_GUI_sendData +1 0000c883 SFRA_GUI_sendTaskPtr +1 0000c881 SFRA_GUI_serialCommsTimer +0 000823b9 SFRA_GUI_setButton +0 00082414 SFRA_GUI_setData32 +0 000823cc SFRA_GUI_setSlider +0 000823a6 SFRA_GUI_setText +0 00082443 SFRA_GUI_spareTsk08 +1 0000c891 SFRA_GUI_sweep_start +1 0000c886 SFRA_GUI_taskDoneFlag +1 0000c8a0 SFRA_GUI_temp +1 0000c902 SFRA_GUI_varGetList +1 0000c922 SFRA_GUI_varSetBtnList +1 0000c942 SFRA_GUI_varSetSldrList +1 0000c962 SFRA_GUI_varSetTxtList +1 0000c888 SFRA_GUI_wordsLeftToGet +0 00008124 SysCtl_delay +0 00083828 SysCtl_getClock +0 000836b4 SysCtl_getDeviceParametric +0 00083cca SysCtl_getLowSpeedClock +0 00083879 SysCtl_selectOscSource +0 0008359c SysCtl_selectXTAL +0 0008309e SysCtl_setClock +0 000838c1 TIMER0_ISR +0 0008333a __SFRA_F32_collect +0 00083322 __SFRA_F32_inject +0 00084028 __TI_CINIT_Base +0 00084030 __TI_CINIT_Limit +0 00084030 __TI_CINIT_Warm +0 0008401e __TI_Handler_Table_Base +0 00084024 __TI_Handler_Table_Limit +1 00000500 __TI_STACK_END +abs 00000100 __TI_STACK_SIZE +0 00083b46 __TI_auto_init_nobinit_nopinit +1 0000a83a __TI_cleanup_ptr +0 00083b18 __TI_decompress_lzss +0 00083ec2 __TI_decompress_none +1 0000a83c __TI_dtors_ptr +1 0000a838 __TI_enable_exit_profile_output +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +0 00083ed8 __TI_zero_init +0 0008362c __c28xabi_divf +0 00083b71 __c28xabi_divl +0 000833bd __c28xabi_divll +0 00083b8e __c28xabi_divul +0 00083433 __c28xabi_divull +0 00083c12 __c28xabi_ftoll +0 00083b80 __c28xabi_modl +0 000833f9 __c28xabi_modll +0 00083b95 __c28xabi_modul +0 00083462 __c28xabi_modull +abs ffffffff __c_args__ +0 00082918 __error__ +0 00083ce4 __relaxed_atanf +0 00083e7e __relaxed_cosf +0 00083e89 __relaxed_sinf +1 00000400 __stack +0 00083df9 _args_main +0 00083d5c _c_int00 +1 0000a83e _lock +0 00083eb9 _nop +0 00083eb5 _register_lock +0 00083eb1 _register_unlock +0 00083ee0 _system_post_cinit +0 00083ede _system_pre_init +1 0000a844 _unlock +0 00083b9b abort +0 0008377e ceilf +1 0000c2d8 clMagVect +1 0000c3a0 clPhaseVect +0 00080000 code_start +1 0000a846 errno +0 00083b9d exit +1 0000c468 freqVect +1 0000c040 hal_sfra +1 0000a802 libsfra +1 0000c080 libsfra_results +0 000833ba libsfra_ti_hal_get_adapter +0 00083357 libsfra_ti_hal_init +0 000834c4 log10f +1 0000c000 lowPass_test +0 00083de7 main +0 00083c38 memcpy +0 00083ed1 memset +0 00083020 myCPUTIMER0_init +0 00083067 mySCI0_init +1 0000c530 olMagVect +1 0000c5f8 olPhaseVect +1 0000c6c0 plantMagVect +1 0000c788 plantPhaseVect +0 00082d88 sfra_background_task +0 00082c20 sfra_clear_done +0 00082b1e sfra_init +0 00082c06 sfra_init_all +0 00082df8 sfra_inject +0 00082c18 sfra_is_done +0 00082c10 sfra_is_running +0 00082e27 sfra_monitor +0 00082b81 sfra_print_results_csv +0 00082c07 sfra_start +0 00082bf8 sfra_task_run +0 0008371c tanf +1 0000c00a ti_sfra + + +GLOBAL SYMBOLS: SORTED BY Symbol Address + +page address name +---- ------- ---- +0 00008000 Flash_initModule +0 00008000 RamfuncsRunStart +0 00008124 SysCtl_delay +0 00008128 RamfuncsRunEnd +0 00080000 code_start +0 00082143 SFRA_GUI_config +0 00082255 SFRA_GUI_runSerialHostComms +0 00082269 SFRA_GUI_getCmdByte +0 000822ab SFRA_GUI_echoCmdByte +0 000822c5 SFRA_GUI_getSizeByte +0 000822e5 SFRA_GUI_echoSizeByte +0 000822ff SFRA_GUI_getDataByte +0 0008231f SFRA_GUI_echoDataByte +0 00082332 SFRA_GUI_packWord +0 00082350 SFRA_GUI_cmdInterpreter +0 00082370 SFRA_GUI_lifePulseTsk +0 000823a6 SFRA_GUI_setText +0 000823b9 SFRA_GUI_setButton +0 000823cc SFRA_GUI_setSlider +0 000823df SFRA_GUI_getVariable +0 000823e2 SFRA_GUI_getArray +0 000823e5 SFRA_GUI_getData +0 00082414 SFRA_GUI_setData32 +0 00082443 SFRA_GUI_spareTsk08 +0 00082448 SFRA_GUI_sendData +0 000825c8 Device_init +0 0008261b Device_enableAllPeripherals +0 00082706 Device_initGPIO +0 00082727 Device_enableUnbondedGPIOPullupsFor176Pin +0 0008273a Device_enableUnbondedGPIOPullupsFor100Pin +0 00082757 Device_enableUnbondedGPIOPullups +0 0008276d Device_configureTMXAnalogTrim +0 0008279e Device_bootCPU2 +0 00082918 __error__ +0 0008291f Example_setResultPass +0 00082924 Example_setResultFail +0 00082929 Example_done +0 00082b1e sfra_init +0 00082b81 sfra_print_results_csv +0 00082bf8 sfra_task_run +0 00082c06 sfra_init_all +0 00082c07 sfra_start +0 00082c10 sfra_is_running +0 00082c18 sfra_is_done +0 00082c20 sfra_clear_done +0 00082d88 sfra_background_task +0 00082df8 sfra_inject +0 00082e27 sfra_monitor +0 00082fec Board_init +0 00082ff9 PinMux_init +0 0008301d CPUTIMER_init +0 00083020 myCPUTIMER0_init +0 00083040 GPIO_init +0 00083043 LED_Blue_init +0 00083057 INTERRUPT_init +0 00083064 SCI_init +0 00083067 mySCI0_init +0 0008309e SysCtl_setClock +0 00083322 __SFRA_F32_inject +0 0008333a __SFRA_F32_collect +0 0008334a SFRA_F32_runBackgroundTask +0 00083357 libsfra_ti_hal_init +0 000833ba libsfra_ti_hal_get_adapter +0 000833bd __c28xabi_divll +0 000833f9 __c28xabi_modll +0 00083433 __c28xabi_divull +0 00083462 __c28xabi_modull +0 000834c4 log10f +0 0008359c SysCtl_selectXTAL +0 0008362c __c28xabi_divf +0 000836b4 SysCtl_getDeviceParametric +0 0008371c tanf +0 0008377e ceilf +0 000837d6 GPIO_setPadConfig +0 00083828 SysCtl_getClock +0 00083879 SysCtl_selectOscSource +0 000838c1 TIMER0_ISR +0 00083907 SCI_clearInterruptStatus +0 0008394c SCI_enableInterrupt +0 00083990 SCI_setConfig +0 000839ce Interrupt_initModule +0 00083a0b GPIO_setControllerCore +0 00083a42 GPIO_setPinConfig +0 00083a79 GPIO_setQualificationMode +0 00083ab0 Interrupt_enable +0 00083ae7 GPIO_setDirectionMode +0 00083b18 __TI_decompress_lzss +0 00083b46 __TI_auto_init_nobinit_nopinit +0 00083b71 __c28xabi_divl +0 00083b80 __c28xabi_modl +0 00083b8e __c28xabi_divul +0 00083b95 __c28xabi_modul +0 00083b9b C$$EXIT +0 00083b9b abort +0 00083b9d exit +0 00083c12 __c28xabi_ftoll +0 00083c38 memcpy +0 00083c77 Interrupt_initVectorTable +0 00083cca SysCtl_getLowSpeedClock +0 00083ce4 __relaxed_atanf +0 00083d5c _c_int00 +0 00083d73 Interrupt_defaultHandler +0 00083d9d CPUTimer_setEmulationMode +0 00083de7 main +0 00083df9 _args_main +0 00083e7e __relaxed_cosf +0 00083e89 __relaxed_sinf +0 00083e94 Interrupt_illegalOperationHandler +0 00083e9e Interrupt_nmiHandler +0 00083eb1 _register_unlock +0 00083eb5 _register_lock +0 00083eb9 _nop +0 00083ec2 __TI_decompress_none +0 00083ed1 memset +0 00083ed8 __TI_zero_init +0 00083ede _system_pre_init +0 00083ee0 _system_post_cinit +0 0008401e __TI_Handler_Table_Base +0 00084024 __TI_Handler_Table_Limit +0 00084028 __TI_CINIT_Base +0 00084030 __TI_CINIT_Limit +0 00084030 __TI_CINIT_Warm +0 00086000 RamfuncsLoadStart +0 00086128 RamfuncsLoadEnd +1 00000400 __stack +1 00000500 __TI_STACK_END +1 0000a802 libsfra +1 0000a832 Example_Result +1 0000a834 Example_PassCount +1 0000a836 Example_Fail +1 0000a838 __TI_enable_exit_profile_output +1 0000a83a __TI_cleanup_ptr +1 0000a83c __TI_dtors_ptr +1 0000a83e _lock +1 0000a844 _unlock +1 0000a846 errno +1 0000c000 lowPass_test +1 0000c00a ti_sfra +1 0000c040 hal_sfra +1 0000c080 libsfra_results +1 0000c2d8 clMagVect +1 0000c3a0 clPhaseVect +1 0000c468 freqVect +1 0000c530 olMagVect +1 0000c5f8 olPhaseVect +1 0000c6c0 plantMagVect +1 0000c788 plantPhaseVect +1 0000c872 SFRA_GUI_cmdPacket +1 0000c880 SFRA_GUI_commsOKflg +1 0000c881 SFRA_GUI_serialCommsTimer +1 0000c882 SFRA_GUI_lowByteFlag +1 0000c883 SFRA_GUI_sendTaskPtr +1 0000c884 SFRA_GUI_rxChar +1 0000c885 SFRA_GUI_rxWord +1 0000c886 SFRA_GUI_taskDoneFlag +1 0000c887 SFRA_GUI_numWords +1 0000c888 SFRA_GUI_wordsLeftToGet +1 0000c889 SFRA_GUI_dataOut16 +1 0000c88a SFRA_GUI_rcvTskPtrShdw +1 0000c88b SFRA_GUI_delayer +1 0000c88c SFRA_GUI_memGetPtr +1 0000c88d SFRA_GUI_memGetAmount +1 0000c88e SFRA_GUI_memSetPtr +1 0000c88f SFRA_GUI_led_flag +1 0000c890 SFRA_GUI_led_gpio +1 0000c891 SFRA_GUI_sweep_start +1 0000c892 SFRA_GUI_rcvTaskPointer +1 0000c894 SFRA_GUI_sci_base_addr +1 0000c896 SFRA_GUI_dataOut32 +1 0000c898 SFRA_GUI_memDataPtr16 +1 0000c89a SFRA_GUI_memDataPtr32 +1 0000c89c SFRA_GUI_memGetAddress +1 0000c89e SFRA_GUI_memSetValue +1 0000c8a0 SFRA_GUI_temp +1 0000c8a2 SFRA_GUI_arrayGetList +1 0000c8c2 SFRA_GUI_cmdDispatcher +1 0000c8e2 SFRA_GUI_dataSetList +1 0000c902 SFRA_GUI_varGetList +1 0000c922 SFRA_GUI_varSetBtnList +1 0000c942 SFRA_GUI_varSetSldrList +1 0000c962 SFRA_GUI_varSetTxtList +abs 00000100 __TI_STACK_SIZE +abs 00000128 RamfuncsLoadSize +abs 00000128 RamfuncsRunSize +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +abs ffffffff __c_args__ + +[188 symbols] diff --git a/28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.out b/28379d_test_SFRA/CPU1_FLASH/28379d_test_SFRA.out new file mode 100644 index 0000000000000000000000000000000000000000..0c24f117b36ef801721f5eddf0c9840144e2adea GIT binary patch literal 206700 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
    0x80000
    + + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\syscfg\ + object + board.obj + board.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\syscfg\ + object + c2000ware_libraries.obj + c2000ware_libraries.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\ + object + main.obj + main.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\ + object + sfra_test.obj + sfra_test.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\LIBSFRA\ + object + libsfra.obj + libsfra.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\LIBSFRA\ + object + libsfra_ti_hal.obj + libsfra_ti_hal.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\SFRA\ + object + sfra_gui_scicomms_driverlib.obj + sfra_gui_scicomms_driverlib.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\device\ + object + F2837xD_CodeStartBranch.obj + F2837xD_CodeStartBranch.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\.\device\ + object + device.obj + device.obj + + + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\ + object + <internal> + <internal> + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + cputimer.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + flash.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + gpio.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + interrupt.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sci.obj + + + C:\ti\C2000Ware_6_00_01_00\driverlib\f2837xd\driverlib\ccs\Debug\ + archive + driverlib_eabi.lib + sysctl.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + e_log10f.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_ceilf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + s_tanf.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + boot28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_cmp28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + ll_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + l_div28.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + fs_tollfpu32.asm.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memcpy.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + pre_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + autoinit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_zero_init.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_none.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + copy_decompress_lzss.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + exit.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + _lock.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + args_main.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + memset.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + errno.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + cpy_tbl.c.obj + + + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\lib\ + archive + rts2800_fpu32_eabi.lib + startup.c.obj + + + + + .cinit..data.load + 0x84000 + true + 0x84000 + 0x1d + 0x1 + + + __TI_handler_table + 0x8401e + true + 0x8401e + 0x6 + 0x2 + + + .cinit..bss.load + 0x84024 + true + 0x84024 + 0x4 + 0x2 + + + __TI_cinit_table + 0x84028 + true + 0x84028 + 0x8 + 0x2 + + + .text + 0x82000 + true + true + 0x82000 + 0x52e + 0x1 + + + + .text + 0x8252e + true + true + 0x8252e + 0x3fc + 0x1 + + + + .text + 0x8292a + true + true + 0x8292a + 0x2dc + 0x1 + + + + .text + 0x82c06 + true + true + 0x82c06 + 0x28c + 0x1 + + + + .text + 0x82e92 + true + true + 0x82e92 + 0x20c + 0x1 + + + + .text:SysCtl_setClock + 0x8309e + true + true + 0x8309e + 0x209 + 0x1 + + + + .text + 0x832a7 + true + true + 0x832a7 + 0x116 + 0x1 + + + + .text + 0x833bd + true + true + 0x833bd + 0x107 + 0x1 + + + + .text + 0x834c4 + true + true + 0x834c4 + 0xd8 + 0x1 + + + + .text:SysCtl_selectXTAL + 0x8359c + true + true + 0x8359c + 0x90 + 0x1 + + + + .text + 0x8362c + true + true + 0x8362c + 0x88 + 0x1 + + + + .text:SysCtl_getDeviceParametric + 0x836b4 + true + true + 0x836b4 + 0x68 + 0x1 + + + + .text + 0x8371c + true + true + 0x8371c + 0x62 + 0x1 + + + + .text + 0x8377e + true + true + 0x8377e + 0x58 + 0x1 + + + + .text:GPIO_setPadConfig + 0x837d6 + true + true + 0x837d6 + 0x52 + 0x1 + + + + .text:SysCtl_getClock + 0x83828 + true + true + 0x83828 + 0x51 + 0x1 + + + + .text:SysCtl_selectOscSource + 0x83879 + true + true + 0x83879 + 0x48 + 0x1 + + + + .text:retain + 0x838c1 + true + true + 0x838c1 + 0x46 + 0x1 + + + + .text:SCI_clearInterruptStatus + 0x83907 + true + true + 0x83907 + 0x45 + 0x1 + + + + .text:SCI_enableInterrupt + 0x8394c + true + true + 0x8394c + 0x44 + 0x1 + + + + .text:SCI_setConfig + 0x83990 + true + true + 0x83990 + 0x3e + 0x1 + + + + .text:Interrupt_initModule + 0x839ce + true + true + 0x839ce + 0x3d + 0x1 + + + + .text:GPIO_setControllerCore + 0x83a0b + true + true + 0x83a0b + 0x37 + 0x1 + + + + .text:GPIO_setPinConfig + 0x83a42 + true + true + 0x83a42 + 0x37 + 0x1 + + + + .text:GPIO_setQualificationMode + 0x83a79 + true + true + 0x83a79 + 0x37 + 0x1 + + + + .text:Interrupt_enable + 0x83ab0 + true + true + 0x83ab0 + 0x37 + 0x1 + + + + .text:GPIO_setDirectionMode + 0x83ae7 + true + true + 0x83ae7 + 0x31 + 0x1 + + + + .text:decompress:lzss + 0x83b18 + true + true + 0x83b18 + 0x2e + 0x1 + + + + .text:__TI_auto_init_nobinit_nopinit + 0x83b46 + true + true + 0x83b46 + 0x2b + 0x1 + + + + .text + 0x83b71 + true + true + 0x83b71 + 0x2a + 0x1 + + + + .text + 0x83b9b + true + true + 0x83b9b + 0x29 + 0x1 + + + + .text:CPUTimer_selectClockSource + 0x83bc4 + true + true + 0x83bc4 + 0x28 + 0x1 + + + + .text:Flash_setBankPowerUpDelay + 0x83bec + true + true + 0x83bec + 0x26 + 0x1 + + + + .text + 0x83c12 + true + true + 0x83c12 + 0x26 + 0x1 + + + + .text + 0x83c38 + true + true + 0x83c38 + 0x20 + 0x1 + + + + .text:CPUTimer_getTimerOverflowStatus + 0x83c58 + true + true + 0x83c58 + 0x1f + 0x1 + + + + .text:Interrupt_initVectorTable + 0x83c77 + true + true + 0x83c77 + 0x1e + 0x1 + + + + .text:SCI_isBaseValid + 0x83c95 + true + true + 0x83c95 + 0x1b + 0x1 + + + + .text:CPUTimer_startTimer + 0x83cb0 + true + true + 0x83cb0 + 0x1a + 0x1 + + + + .text:SysCtl_getLowSpeedClock + 0x83cca + true + true + 0x83cca + 0x1a + 0x1 + + + + .text:__relaxed_atanf + 0x83ce4 + true + true + 0x83ce4 + 0x1a + 0x1 + + + + .text:SCI_disableModule + 0x83cfe + true + true + 0x83cfe + 0x18 + 0x1 + + + + .text:SCI_performSoftwareReset + 0x83d16 + true + true + 0x83d16 + 0x18 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x83d2e + true + true + 0x83d2e + 0x17 + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x83d45 + true + true + 0x83d45 + 0x17 + 0x1 + + + + .text + 0x83d5c + true + true + 0x83d5c + 0x17 + 0x1 + + + + .text:Interrupt_defaultHandler + 0x83d73 + true + true + 0x83d73 + 0x16 + 0x1 + + + + .text:CPUTimer_stopTimer + 0x83d89 + true + true + 0x83d89 + 0x14 + 0x1 + + + + .text:CPUTimer_setEmulationMode + 0x83d9d + true + true + 0x83d9d + 0x13 + 0x1 + + + + .text:SCI_enableModule + 0x83db0 + true + true + 0x83db0 + 0x13 + 0x1 + + + + .text:CPUTimer_clearOverflowFlag + 0x83dc3 + true + true + 0x83dc3 + 0x12 + 0x1 + + + + .text:CPUTimer_disableInterrupt + 0x83dd5 + true + true + 0x83dd5 + 0x12 + 0x1 + + + + .text + 0x83de7 + true + true + 0x83de7 + 0x12 + 0x1 + + + + .text + 0x83df9 + true + true + 0x83df9 + 0x12 + 0x1 + + + + .text:CPUTimer_setPeriod + 0x83e0b + true + true + 0x83e0b + 0x11 + 0x1 + + + + .text:Flash_isCtrlBaseValid + 0x83e1c + true + true + 0x83e1c + 0x10 + 0x1 + + + + .text:Flash_isECCBaseValid + 0x83e2c + true + true + 0x83e2c + 0x10 + 0x1 + + + + .text:SysCtl_pollCpuTimer + 0x83e3c + true + true + 0x83e3c + 0xf + 0x1 + + + + .text:GPIO_isPinValid + 0x83e4b + true + true + 0x83e4b + 0xe + 0x1 + + + + .text:Interrupt_disableGlobal + 0x83e59 + true + true + 0x83e59 + 0xd + 0x1 + + + + .text:Interrupt_enableGlobal + 0x83e66 + true + true + 0x83e66 + 0xd + 0x1 + + + + .text:SysCtl_isMCDClockFailureDetected + 0x83e73 + true + true + 0x83e73 + 0xb + 0x1 + + + + .text:__relaxed_cosf + 0x83e7e + true + true + 0x83e7e + 0xb + 0x1 + + + + .text:__relaxed_sinf + 0x83e89 + true + true + 0x83e89 + 0xb + 0x1 + + + + .text:Interrupt_illegalOperationHandler + 0x83e94 + true + true + 0x83e94 + 0xa + 0x1 + + + + .text:Interrupt_nmiHandler + 0x83e9e + true + true + 0x83e9e + 0xa + 0x1 + + + + .text:SysCtl_serviceWatchdog + 0x83ea8 + true + true + 0x83ea8 + 0x9 + 0x1 + + + + .text + 0x83eb1 + true + true + 0x83eb1 + 0x9 + 0x1 + + + + .text + 0x83eba + true + true + 0x83eba + 0x8 + 0x1 + + + + .text:decompress:none + 0x83ec2 + true + true + 0x83ec2 + 0x8 + 0x1 + + + + .text:SysCtl_resetMCD + 0x83eca + true + true + 0x83eca + 0x7 + 0x1 + + + + .text + 0x83ed1 + true + true + 0x83ed1 + 0x7 + 0x1 + + + + .text:decompress:ZI + 0x83ed8 + true + true + 0x83ed8 + 0x6 + 0x1 + + + + .text + 0x83ede + true + true + 0x83ede + 0x2 + 0x1 + + + + .text + 0x83ee0 + true + true + 0x83ee0 + 0x1 + 0x1 + + + + codestart + 0x80000 + true + true + 0x80000 + 0x2 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x2 + + + .bss + true + true + 0xc000 + 0x2d8 + 0x2 + + + + .bss:plantMagVect + true + true + 0xc6c0 + 0xc8 + 0x2 + + + + .bss:plantPhaseVect + true + true + 0xc788 + 0xc8 + 0x2 + + + + .bss:olMagVect + true + true + 0xc530 + 0xc8 + 0x2 + + + + .bss:olPhaseVect + true + true + 0xc5f8 + 0xc8 + 0x2 + + + + .bss:clMagVect + true + true + 0xc2d8 + 0xc8 + 0x2 + + + + .bss:clPhaseVect + true + true + 0xc3a0 + 0xc8 + 0x2 + + + + .bss:freqVect + true + true + 0xc468 + 0xc8 + 0x2 + + + + .bss + true + true + 0xc850 + 0x22 + 0x2 + + + + .bss + true + true + 0xc880 + 0x22 + 0x2 + + + + .bss:SFRA_GUI_cmdPacket + true + true + 0xc872 + 0x6 + 0x1 + + + + .bss:SFRA_GUI_cmdDispatcher + true + true + 0xc8c2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetTxtList + true + true + 0xc962 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetBtnList + true + true + 0xc922 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varSetSldrList + true + true + 0xc942 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_varGetList + true + true + 0xc902 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_arrayGetList + true + true + 0xc8a2 + 0x20 + 0x2 + + + + .bss:SFRA_GUI_dataSetList + true + true + 0xc8e2 + 0x20 + 0x2 + + + + .data + 0xa800 + true + 0xa800 + 0x32 + 0x2 + + + + .data + 0xa840 + true + 0xa840 + 0x4 + 0x2 + + + + .data + 0xa832 + true + 0xa832 + 0x6 + 0x2 + + + + .data + 0xa838 + true + 0xa838 + 0x6 + 0x2 + + + + .data:_lock + 0xa83e + true + 0xa83e + 0x2 + 0x2 + + + + .data:_unlock + 0xa844 + true + 0xa844 + 0x2 + 0x2 + + + + .data + 0xa846 + true + 0xa846 + 0x1 + 0x1 + + + + .const:.string + 0x90000 + true + 0x90000 + 0xc2 + 0x2 + + + + .const:.string + 0x900c2 + true + 0x900c2 + 0xbf + 0x2 + + + + .const:.string + 0x90182 + true + 0x90182 + 0xbc + 0x2 + + + + .const:.string + 0x9023e + true + 0x9023e + 0xbb + 0x2 + + + + .const:.string + 0x902fa + true + 0x902fa + 0xa8 + 0x2 + + + + .const:.string + 0x903a2 + true + 0x903a2 + 0x7f + 0x2 + + + + .const:.string + 0x90422 + true + 0x90422 + 0x7b + 0x2 + + + + .const:.string + 0x9049e + true + 0x9049e + 0x62 + 0x2 + + + + .const:.string + 0x90500 + true + 0x90500 + 0x13 + 0x2 + + + + .TI.ramfunc:Flash_initModule + 0x86000 + true + true + 0x8000 + 0x43 + 0x1 + + + + .TI.ramfunc:Flash_setBankPowerMode + 0x86043 + true + true + 0x8043 + 0x2c + 0x1 + + + + .TI.ramfunc:Flash_setWaitstates + 0x8606f + true + true + 0x806f + 0x24 + 0x1 + + + + .TI.ramfunc:Flash_setPumpPowerMode + 0x86093 + true + true + 0x8093 + 0x1d + 0x1 + + + + .TI.ramfunc:Flash_disableCache + 0x860b0 + true + true + 0x80b0 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_disablePrefetch + 0x860c8 + true + true + 0x80c8 + 0x18 + 0x1 + + + + .TI.ramfunc:Flash_enableCache + 0x860e0 + true + true + 0x80e0 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enablePrefetch + 0x860f7 + true + true + 0x80f7 + 0x17 + 0x1 + + + + .TI.ramfunc:Flash_enableECC + 0x8610e + true + true + 0x810e + 0x16 + 0x1 + + + + .TI.ramfunc + 0x86124 + true + true + 0x8124 + 0x4 + 0x1 + + + + .debug_types + 0x0 + 0x0 + 0x767 + 0x0 + + + + .debug_types + 0x767 + 0x767 + 0x56 + 0x0 + + + + .debug_types + 0x7bd + 0x7bd + 0xf09 + 0x0 + + + + .debug_types + 0x16c6 + 0x16c6 + 0x2b + 0x0 + + + + .debug_types + 0x16f1 + 0x16f1 + 0x34 + 0x0 + + + + .debug_types + 0x1725 + 0x1725 + 0x22f + 0x0 + + + + .debug_types + 0x1954 + 0x1954 + 0xdc7 + 0x0 + + + + .debug_types + 0x271b + 0x271b + 0x6e + 0x0 + + + + .debug_types + 0x2789 + 0x2789 + 0x1d7 + 0x0 + + + + .debug_types + 0x2960 + 0x2960 + 0x2c4 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x2c24 + 0x2c24 + 0x284 + 0x0 + + + + .debug_types + 0x2ea8 + 0x2ea8 + 0x21d + 0x0 + + + + .debug_types + 0x30c5 + 0x30c5 + 0x8d + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x3152 + 0x3152 + 0xb8 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x320a + 0x320a + 0x470 + 0x0 + + + + .debug_types + 0x367a + 0x367a + 0x194 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x380e + 0x380e + 0x191 + 0x0 + + + + .debug_types + 0x399f + 0x399f + 0xbf + 0x0 + + + + .debug_types + 0x3a5e + 0x3a5e + 0x2f + 0x0 + + + + .debug_types + 0x3a8d + 0x3a8d + 0xe1 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_info + 0x0 + 0x0 + 0x1387 + 0x0 + + + + .debug_info + 0x1387 + 0x1387 + 0x16e + 0x0 + + + + .debug_info + 0x14f5 + 0x14f5 + 0x16e + 0x0 + + + + .debug_info + 0x1663 + 0x1663 + 0x170 + 0x0 + + + + .debug_info + 0x17d3 + 0x17d3 + 0x181 + 0x0 + + + + .debug_info + 0x1954 + 0x1954 + 0x169 + 0x0 + + + + .debug_info + 0x1abd + 0x1abd + 0xe7 + 0x0 + + + + .debug_info + 0x1ba4 + 0x1ba4 + 0xf1 + 0x0 + + + + .debug_info + 0x1c95 + 0x1c95 + 0xf5 + 0x0 + + + + .debug_info + 0x1d8a + 0x1d8a + 0xeb + 0x0 + + + + .debug_info + 0x1e75 + 0x1e75 + 0xef + 0x0 + + + + .debug_info + 0x1f64 + 0x1f64 + 0xeb + 0x0 + + + + .debug_info + 0x204f + 0x204f + 0xef + 0x0 + + + + .debug_info + 0x213e + 0x213e + 0xe9 + 0x0 + + + + .debug_info + 0x2227 + 0x2227 + 0xde2 + 0x0 + + + + .debug_info + 0x3009 + 0x3009 + 0x1c3 + 0x0 + + + + .debug_info + 0x31cc + 0x31cc + 0x963 + 0x0 + + + + .debug_info + 0x3b2f + 0x3b2f + 0x124 + 0x0 + + + + .debug_info + 0x3c53 + 0x3c53 + 0x136 + 0x0 + + + + .debug_info + 0x3d89 + 0x3d89 + 0x72c + 0x0 + + + + .debug_info + 0x44b5 + 0x44b5 + 0x6d0 + 0x0 + + + + .debug_info + 0x4b85 + 0x4b85 + 0x114 + 0x0 + + + + .debug_info + 0x4c99 + 0x4c99 + 0x11c + 0x0 + + + + .debug_info + 0x4db5 + 0x4db5 + 0x11c + 0x0 + + + + .debug_info + 0x4ed1 + 0x4ed1 + 0x11c + 0x0 + + + + .debug_info + 0x4fed + 0x4fed + 0x11e + 0x0 + + + + .debug_info + 0x510b + 0x510b + 0x116 + 0x0 + + + + .debug_info + 0x5221 + 0x5221 + 0x11a + 0x0 + + + + .debug_info + 0x533b + 0x533b + 0x118 + 0x0 + + + + .debug_info + 0x5453 + 0x5453 + 0x1ae1 + 0x0 + + + + .debug_info + 0x6f34 + 0x6f34 + 0x110 + 0x0 + + + + .debug_info + 0x7044 + 0x7044 + 0x111 + 0x0 + + + + .debug_info + 0x7155 + 0x7155 + 0x15b + 0x0 + + + + .debug_info + 0x72b0 + 0x72b0 + 0x1c3c + 0x0 + + + + .debug_info + 0x8eec + 0x8eec + 0x219 + 0x0 + + + + .debug_info + 0x9105 + 0x9105 + 0x265 + 0x0 + + + + .debug_info + 0x936a + 0x936a + 0x21d + 0x0 + + + + .debug_info + 0x9587 + 0x9587 + 0x219 + 0x0 + + + + .debug_info + 0x97a0 + 0x97a0 + 0x279 + 0x0 + + + + .debug_info + 0x9a19 + 0x9a19 + 0x28f + 0x0 + + + + .debug_info + 0x9ca8 + 0x9ca8 + 0x26e + 0x0 + + + + .debug_info + 0x9f16 + 0x9f16 + 0x23f + 0x0 + + + + .debug_info + 0xa155 + 0xa155 + 0x241 + 0x0 + + + + .debug_info + 0xa396 + 0xa396 + 0x239 + 0x0 + + + + .debug_info + 0xa5cf + 0xa5cf + 0x23b + 0x0 + + + + .debug_info + 0xa80a + 0xa80a + 0x232 + 0x0 + + + + .debug_info + 0xaa3c + 0xaa3c + 0x27b + 0x0 + + + + .debug_info + 0xacb7 + 0xacb7 + 0x397 + 0x0 + + + + .debug_info + 0xb04e + 0xb04e + 0x205 + 0x0 + + + + .debug_info + 0xb253 + 0xb253 + 0x27d + 0x0 + + + + .debug_info + 0xb4d0 + 0xb4d0 + 0x266 + 0x0 + + + + .debug_info + 0xb736 + 0xb736 + 0x2ae + 0x0 + + + + .debug_info + 0xb9e4 + 0xb9e4 + 0x296 + 0x0 + + + + .debug_info + 0xbc7a + 0xbc7a + 0x24f + 0x0 + + + + .debug_info + 0xbec9 + 0xbec9 + 0x1fe + 0x0 + + + + .debug_info + 0xc0c7 + 0xc0c7 + 0x200 + 0x0 + + + + .debug_info + 0xc2c7 + 0xc2c7 + 0x20f + 0x0 + + + + .debug_info + 0xc4d6 + 0xc4d6 + 0x21c + 0x0 + + + + .debug_info + 0xc6f2 + 0xc6f2 + 0x202 + 0x0 + + + + .debug_info + 0xc8f4 + 0xc8f4 + 0x1e8 + 0x0 + + + + .debug_info + 0xcadc + 0xcadc + 0x20c + 0x0 + + + + .debug_info + 0xcce8 + 0xcce8 + 0x2b3 + 0x0 + + + + .debug_info + 0xcf9b + 0xcf9b + 0x205 + 0x0 + + + + .debug_info + 0xd1a0 + 0xd1a0 + 0x225 + 0x0 + + + + .debug_info + 0xd3c5 + 0xd3c5 + 0x227 + 0x0 + + + + .debug_info + 0xd5ec + 0xd5ec + 0x235 + 0x0 + + + + .debug_info + 0xd821 + 0xd821 + 0x2b5 + 0x0 + + + + .debug_info + 0xdad6 + 0xdad6 + 0x23e + 0x0 + + + + .debug_info + 0xdd14 + 0xdd14 + 0x268 + 0x0 + + + + .debug_info + 0xdf7c + 0xdf7c + 0x1f2 + 0x0 + + + + .debug_info + 0xe16e + 0xe16e + 0x20e + 0x0 + + + + .debug_info + 0xe37c + 0xe37c + 0x1e4 + 0x0 + + + + .debug_info + 0xe560 + 0xe560 + 0x217 + 0x0 + + + + .debug_info + 0xe777 + 0xe777 + 0x244 + 0x0 + + + + .debug_info + 0xe9bb + 0xe9bb + 0x242 + 0x0 + + + + .debug_info + 0xebfd + 0xebfd + 0x24a + 0x0 + + + + .debug_info + 0xee47 + 0xee47 + 0x24d + 0x0 + + + + .debug_info + 0xf094 + 0xf094 + 0x24e + 0x0 + + + + .debug_info + 0xf2e2 + 0xf2e2 + 0x258 + 0x0 + + + + .debug_info + 0xf53a + 0xf53a + 0x27c + 0x0 + + + + .debug_info + 0xf7b6 + 0xf7b6 + 0x241 + 0x0 + + + + .debug_info + 0xf9f7 + 0xf9f7 + 0x277 + 0x0 + + + + .debug_info + 0xfc6e + 0xfc6e + 0x519 + 0x0 + + + + .debug_info + 0x10187 + 0x10187 + 0x3ba + 0x0 + + + + .debug_info + 0x10541 + 0x10541 + 0x243 + 0x0 + + + + .debug_info + 0x10784 + 0x10784 + 0x251 + 0x0 + + + + .debug_info + 0x109d5 + 0x109d5 + 0x241 + 0x0 + + + + .debug_info + 0x10c16 + 0x10c16 + 0x1a8 + 0x0 + + + + .debug_info + 0x10dbe + 0x10dbe + 0x163 + 0x0 + + + + .debug_info + 0x10f21 + 0x10f21 + 0x179 + 0x0 + + + + .debug_info + 0x1109a + 0x1109a + 0x141 + 0x0 + + + + .debug_info + 0x111db + 0x111db + 0x110 + 0x0 + + + + .debug_info + 0x112eb + 0x112eb + 0x24a + 0x0 + + + + .debug_info + 0x11535 + 0x11535 + 0x1ca + 0x0 + + + + .debug_info + 0x116ff + 0x116ff + 0x120 + 0x0 + + + + .debug_info + 0x1181f + 0x1181f + 0x184 + 0x0 + + + + .debug_info + 0x119a3 + 0x119a3 + 0x136 + 0x0 + + + + .debug_info + 0x11ad9 + 0x11ad9 + 0x1a8 + 0x0 + + + + .debug_info + 0x11c81 + 0x11c81 + 0x188 + 0x0 + + + + .debug_info + 0x11e09 + 0x11e09 + 0x1a0 + 0x0 + + + + .debug_info + 0x11fa9 + 0x11fa9 + 0x1f5 + 0x0 + + + + .debug_info + 0x1219e + 0x1219e + 0x187 + 0x0 + + + + .debug_info + 0x12325 + 0x12325 + 0x192 + 0x0 + + + + .debug_info + 0x124b7 + 0x124b7 + 0xf0 + 0x0 + + + + .debug_info + 0x125a7 + 0x125a7 + 0xf4 + 0x0 + + + + .debug_info + 0x1269b + 0x1269b + 0x1ec + 0x0 + + + + .debug_info + 0x12887 + 0x12887 + 0x156 + 0x0 + + + + .debug_info + 0x129dd + 0x129dd + 0x1db + 0x0 + + + + .debug_info + 0x12bb8 + 0x12bb8 + 0xef + 0x0 + + + + .debug_info + 0x12ca7 + 0x12ca7 + 0x130 + 0x0 + + + + .debug_info + 0x12dd7 + 0x12dd7 + 0xb0 + 0x0 + + + .debug_line + 0x0 + 0x0 + 0x3dc + 0x0 + + + + .debug_line + 0x3dc + 0x3dc + 0xe9 + 0x0 + + + + .debug_line + 0x4c5 + 0x4c5 + 0x83 + 0x0 + + + + .debug_line + 0x548 + 0x548 + 0x83 + 0x0 + + + + .debug_line + 0x5cb + 0x5cb + 0x83 + 0x0 + + + + .debug_line + 0x64e + 0x64e + 0x50 + 0x0 + + + + .debug_line + 0x69e + 0x69e + 0x21 + 0x0 + + + + .debug_line + 0x6bf + 0x6bf + 0x33 + 0x0 + + + + .debug_line + 0x6f2 + 0x6f2 + 0x33 + 0x0 + + + + .debug_line + 0x725 + 0x725 + 0x33 + 0x0 + + + + .debug_line + 0x758 + 0x758 + 0x33 + 0x0 + + + + .debug_line + 0x78b + 0x78b + 0x33 + 0x0 + + + + .debug_line + 0x7be + 0x7be + 0x33 + 0x0 + + + + .debug_line + 0x7f1 + 0x7f1 + 0x33 + 0x0 + + + + .debug_line + 0x824 + 0x824 + 0x33 + 0x0 + + + + .debug_line + 0x857 + 0x857 + 0x33 + 0x0 + + + + .debug_line + 0x88a + 0x88a + 0x39c + 0x0 + + + + .debug_line + 0xc26 + 0xc26 + 0x4e + 0x0 + + + + .debug_line + 0xc74 + 0xc74 + 0x304 + 0x0 + + + + .debug_line + 0xf78 + 0xf78 + 0x1d7 + 0x0 + + + + .debug_line + 0x114f + 0x114f + 0xea + 0x0 + + + + .debug_line + 0x1239 + 0x1239 + 0x40 + 0x0 + + + + .debug_line + 0x1279 + 0x1279 + 0x40 + 0x0 + + + + .debug_line + 0x12b9 + 0x12b9 + 0x146 + 0x0 + + + + .debug_line + 0x13ff + 0x13ff + 0x39 + 0x0 + + + + .debug_line + 0x1438 + 0x1438 + 0x4a + 0x0 + + + + .debug_line + 0x1482 + 0x1482 + 0x4a + 0x0 + + + + .debug_line + 0x14cc + 0x14cc + 0x4a + 0x0 + + + + .debug_line + 0x1516 + 0x1516 + 0x4a + 0x0 + + + + .debug_line + 0x1560 + 0x1560 + 0x4a + 0x0 + + + + .debug_line + 0x15aa + 0x15aa + 0x4a + 0x0 + + + + .debug_line + 0x15f4 + 0x15f4 + 0x4a + 0x0 + + + + .debug_line + 0x163e + 0x163e + 0x4a + 0x0 + + + + .debug_line + 0x1688 + 0x1688 + 0x4a + 0x0 + + + + .debug_line + 0x16d2 + 0x16d2 + 0x69f + 0x0 + + + + .debug_line + 0x1d71 + 0x1d71 + 0xa4 + 0x0 + + + + .debug_line + 0x1e15 + 0x1e15 + 0x55 + 0x0 + + + + .debug_line + 0x1e6a + 0x1e6a + 0x5d + 0x0 + + + + .debug_line + 0x1ec7 + 0x1ec7 + 0x37 + 0x0 + + + + .debug_line + 0x1efe + 0x1efe + 0x3e1 + 0x0 + + + + .debug_line + 0x22df + 0x22df + 0xfd + 0x0 + + + + .debug_line + 0x23dc + 0x23dc + 0x9c + 0x0 + + + + .debug_line + 0x2478 + 0x2478 + 0x9e + 0x0 + + + + .debug_line + 0x2516 + 0x2516 + 0xe8 + 0x0 + + + + .debug_line + 0x25fe + 0x25fe + 0x99 + 0x0 + + + + .debug_line + 0x2697 + 0x2697 + 0x99 + 0x0 + + + + .debug_line + 0x2730 + 0x2730 + 0x9d + 0x0 + + + + .debug_line + 0x27cd + 0x27cd + 0x9c + 0x0 + + + + .debug_line + 0x2869 + 0x2869 + 0x9c + 0x0 + + + + .debug_line + 0x2905 + 0x2905 + 0x9c + 0x0 + + + + .debug_line + 0x29a1 + 0x29a1 + 0x9c + 0x0 + + + + .debug_line + 0x2a3d + 0x2a3d + 0x9c + 0x0 + + + + .debug_line + 0x2ad9 + 0x2ad9 + 0x9c + 0x0 + + + + .debug_line + 0x2b75 + 0x2b75 + 0x9c + 0x0 + + + + .debug_line + 0x2c11 + 0x2c11 + 0x9d + 0x0 + + + + .debug_line + 0x2cae + 0x2cae + 0xa4 + 0x0 + + + + .debug_line + 0x2d52 + 0x2d52 + 0xe5 + 0x0 + + + + .debug_line + 0x2e37 + 0x2e37 + 0x98 + 0x0 + + + + .debug_line + 0x2ecf + 0x2ecf + 0xa2 + 0x0 + + + + .debug_line + 0x2f71 + 0x2f71 + 0xb1 + 0x0 + + + + .debug_line + 0x3022 + 0x3022 + 0x9f + 0x0 + + + + .debug_line + 0x30c1 + 0x30c1 + 0x9f + 0x0 + + + + .debug_line + 0x3160 + 0x3160 + 0x9f + 0x0 + + + + .debug_line + 0x31ff + 0x31ff + 0xe4 + 0x0 + + + + .debug_line + 0x32e3 + 0x32e3 + 0x9d + 0x0 + + + + .debug_line + 0x3380 + 0x3380 + 0x9d + 0x0 + + + + .debug_line + 0x341d + 0x341d + 0xb8 + 0x0 + + + + .debug_line + 0x34d5 + 0x34d5 + 0xa3 + 0x0 + + + + .debug_line + 0x3578 + 0x3578 + 0x9b + 0x0 + + + + .debug_line + 0x3613 + 0x3613 + 0x9b + 0x0 + + + + .debug_line + 0x36ae + 0x36ae + 0xb1 + 0x0 + + + + .debug_line + 0x375f + 0x375f + 0xb1 + 0x0 + + + + .debug_line + 0x3810 + 0x3810 + 0x21 + 0x0 + + + + .debug_line + 0x3831 + 0x3831 + 0x97 + 0x0 + + + + .debug_line + 0x38c8 + 0x38c8 + 0x98 + 0x0 + + + + .debug_line + 0x3960 + 0x3960 + 0x99 + 0x0 + + + + .debug_line + 0x39f9 + 0x39f9 + 0x99 + 0x0 + + + + .debug_line + 0x3a92 + 0x3a92 + 0x9e + 0x0 + + + + .debug_line + 0x3b30 + 0x3b30 + 0xb3 + 0x0 + + + + .debug_line + 0x3be3 + 0x3be3 + 0xa7 + 0x0 + + + + .debug_line + 0x3c8a + 0x3c8a + 0xe3 + 0x0 + + + + .debug_line + 0x3d6d + 0x3d6d + 0x9d + 0x0 + + + + .debug_line + 0x3e0a + 0x3e0a + 0x9a + 0x0 + + + + .debug_line + 0x3ea4 + 0x3ea4 + 0x9c + 0x0 + + + + .debug_line + 0x3f40 + 0x3f40 + 0x9c + 0x0 + + + + .debug_line + 0x3fdc + 0x3fdc + 0x9d + 0x0 + + + + .debug_line + 0x4079 + 0x4079 + 0x9d + 0x0 + + + + .debug_line + 0x4116 + 0x4116 + 0xa1 + 0x0 + + + + .debug_line + 0x41b7 + 0x41b7 + 0xa2 + 0x0 + + + + .debug_line + 0x4259 + 0x4259 + 0x9d + 0x0 + + + + .debug_line + 0x42f6 + 0x42f6 + 0x9d + 0x0 + + + + .debug_line + 0x4393 + 0x4393 + 0xa7 + 0x0 + + + + .debug_line + 0x443a + 0x443a + 0xa1 + 0x0 + + + + .debug_line + 0x44db + 0x44db + 0xb4 + 0x0 + + + + .debug_line + 0x458f + 0x458f + 0x19e + 0x0 + + + + .debug_line + 0x472d + 0x472d + 0xd2 + 0x0 + + + + .debug_line + 0x47ff + 0x47ff + 0xbe + 0x0 + + + + .debug_line + 0x48bd + 0x48bd + 0xa1 + 0x0 + + + + .debug_line + 0x495e + 0x495e + 0xc7 + 0x0 + + + + .debug_line + 0x4a25 + 0x4a25 + 0x14b + 0x0 + + + + .debug_line + 0x4b70 + 0x4b70 + 0xb9 + 0x0 + + + + .debug_line + 0x4c29 + 0x4c29 + 0x21 + 0x0 + + + + .debug_line + 0x4c4a + 0x4c4a + 0x7e + 0x0 + + + + .debug_line + 0x4cc8 + 0x4cc8 + 0x21 + 0x0 + + + + .debug_line + 0x4ce9 + 0x4ce9 + 0x68 + 0x0 + + + + .debug_line + 0x4d51 + 0x4d51 + 0x21 + 0x0 + + + + .debug_line + 0x4d72 + 0x4d72 + 0x4f + 0x0 + + + + .debug_line + 0x4dc1 + 0x4dc1 + 0xae + 0x0 + + + + .debug_line + 0x4e6f + 0x4e6f + 0x16c + 0x0 + + + + .debug_line + 0x4fdb + 0x4fdb + 0x8f + 0x0 + + + + .debug_line + 0x506a + 0x506a + 0x63 + 0x0 + + + + .debug_line + 0x50cd + 0x50cd + 0x57 + 0x0 + + + + .debug_line + 0x5124 + 0x5124 + 0x21 + 0x0 + + + + .debug_line + 0x5145 + 0x5145 + 0x3f + 0x0 + + + + .debug_line + 0x5184 + 0x5184 + 0x21 + 0x0 + + + + .debug_line + 0x51a5 + 0x51a5 + 0x74 + 0x0 + + + + .debug_line + 0x5219 + 0x5219 + 0x21 + 0x0 + + + + .debug_line + 0x523a + 0x523a + 0x52 + 0x0 + + + + .debug_line + 0x528c + 0x528c + 0x21 + 0x0 + + + + .debug_line + 0x52ad + 0x52ad + 0x57 + 0x0 + + + + .debug_line + 0x5304 + 0x5304 + 0x21 + 0x0 + + + + .debug_line + 0x5325 + 0x5325 + 0x9a + 0x0 + + + + .debug_line + 0x53bf + 0x53bf + 0x21 + 0x0 + + + + .debug_line + 0x53e0 + 0x53e0 + 0x2b + 0x0 + + + + .debug_line + 0x540b + 0x540b + 0x66 + 0x0 + + + + .debug_line + 0x5471 + 0x5471 + 0x21 + 0x0 + + + + .debug_line + 0x5492 + 0x5492 + 0x2c + 0x0 + + + + .debug_line + 0x54be + 0x54be + 0x2c + 0x0 + + + + .debug_line + 0x54ea + 0x54ea + 0x5f + 0x0 + + + + .debug_line + 0x5549 + 0x5549 + 0x21 + 0x0 + + + + .debug_line + 0x556a + 0x556a + 0x50 + 0x0 + + + + .debug_line + 0x55ba + 0x55ba + 0x30 + 0x0 + + + + .debug_line + 0x55ea + 0x55ea + 0x99 + 0x0 + + + + .debug_line + 0x5683 + 0x5683 + 0x21 + 0x0 + + + + .debug_line + 0x56a4 + 0x56a4 + 0x2c + 0x0 + + + + .debug_line + 0x56d0 + 0x56d0 + 0x21 + 0x0 + + + + .debug_line + 0x56f1 + 0x56f1 + 0x3b + 0x0 + + + + .debug_line + 0x572c + 0x572c + 0x21 + 0x0 + + + + .debug_frame + 0x0 + 0x0 + 0x2d0 + 0x4 + + + + .debug_frame + 0x2d0 + 0x2d0 + 0x44 + 0x4 + + + + .debug_frame + 0x314 + 0x314 + 0x44 + 0x4 + + + + .debug_frame + 0x358 + 0x358 + 0x44 + 0x4 + + + + .debug_frame + 0x39c + 0x39c + 0x40 + 0x4 + + + + .debug_frame + 0x3dc + 0x3dc + 0x1d4 + 0x4 + + + + .debug_frame + 0x5b0 + 0x5b0 + 0xb4 + 0x4 + + + + .debug_frame + 0x664 + 0x664 + 0x19c + 0x4 + + + + .debug_frame + 0x800 + 0x800 + 0xfc + 0x4 + + + + .debug_frame + 0x8fc + 0x8fc + 0x384 + 0x4 + + + + .debug_frame + 0xc80 + 0xc80 + 0x21c + 0x4 + + + + .debug_frame + 0xe9c + 0xe9c + 0x44 + 0x4 + + + + .debug_frame + 0xee0 + 0xee0 + 0x44 + 0x4 + + + + .debug_frame + 0xf24 + 0xf24 + 0x44 + 0x4 + + + + .debug_frame + 0xf68 + 0xf68 + 0x44 + 0x4 + + + + .debug_frame + 0xfac + 0xfac + 0x44 + 0x4 + + + + .debug_frame + 0xff0 + 0xff0 + 0x44 + 0x4 + + + + .debug_frame + 0x1034 + 0x1034 + 0x44 + 0x4 + + + + .debug_frame + 0x1078 + 0x1078 + 0x44 + 0x4 + + + + .debug_frame + 0x10bc + 0x10bc + 0x44 + 0x4 + + + + .debug_frame + 0x1100 + 0x1100 + 0x44 + 0x4 + + + + .debug_frame + 0x1144 + 0x1144 + 0x44 + 0x4 + + + + .debug_frame + 0x1188 + 0x1188 + 0x44 + 0x4 + + + + .debug_frame + 0x11cc + 0x11cc + 0x44 + 0x4 + + + + .debug_frame + 0x1210 + 0x1210 + 0x44 + 0x4 + + + + .debug_frame + 0x1254 + 0x1254 + 0x44 + 0x4 + + + + .debug_frame + 0x1298 + 0x1298 + 0x44 + 0x4 + + + + .debug_frame + 0x12dc + 0x12dc + 0x44 + 0x4 + + + + .debug_frame + 0x1320 + 0x1320 + 0x44 + 0x4 + + + + .debug_frame + 0x1364 + 0x1364 + 0x44 + 0x4 + + + + .debug_frame + 0x13a8 + 0x13a8 + 0x44 + 0x4 + + + + .debug_frame + 0x13ec + 0x13ec + 0x40 + 0x4 + + + + .debug_frame + 0x142c + 0x142c + 0x40 + 0x4 + + + + .debug_frame + 0x146c + 0x146c + 0x40 + 0x4 + + + + .debug_frame + 0x14ac + 0x14ac + 0x4c + 0x4 + + + + .debug_frame + 0x14f8 + 0x14f8 + 0x48 + 0x4 + + + + .debug_frame + 0x1540 + 0x1540 + 0x48 + 0x4 + + + + .debug_frame + 0x1588 + 0x1588 + 0x44 + 0x4 + + + + .debug_frame + 0x15cc + 0x15cc + 0x44 + 0x4 + + + + .debug_frame + 0x1610 + 0x1610 + 0x44 + 0x4 + + + + .debug_frame + 0x1654 + 0x1654 + 0x44 + 0x4 + + + + .debug_frame + 0x1698 + 0x1698 + 0x44 + 0x4 + + + + .debug_frame + 0x16dc + 0x16dc + 0x44 + 0x4 + + + + .debug_frame + 0x1720 + 0x1720 + 0x44 + 0x4 + + + + .debug_frame + 0x1764 + 0x1764 + 0x44 + 0x4 + + + + .debug_frame + 0x17a8 + 0x17a8 + 0x44 + 0x4 + + + + .debug_frame + 0x17ec + 0x17ec + 0x40 + 0x4 + + + + .debug_frame + 0x182c + 0x182c + 0x40 + 0x4 + + + + .debug_frame + 0x186c + 0x186c + 0x40 + 0x4 + + + + .debug_frame + 0x18ac + 0x18ac + 0x44 + 0x4 + + + + .debug_frame + 0x18f0 + 0x18f0 + 0x44 + 0x4 + + + + .debug_frame + 0x1934 + 0x1934 + 0x44 + 0x4 + + + + .debug_frame + 0x1978 + 0x1978 + 0x44 + 0x4 + + + + .debug_frame + 0x19bc + 0x19bc + 0x44 + 0x4 + + + + .debug_frame + 0x1a00 + 0x1a00 + 0x44 + 0x4 + + + + .debug_frame + 0x1a44 + 0x1a44 + 0x44 + 0x4 + + + + .debug_frame + 0x1a88 + 0x1a88 + 0x44 + 0x4 + + + + .debug_frame + 0x1acc + 0x1acc + 0x40 + 0x4 + + + + .debug_frame + 0x1b0c + 0x1b0c + 0x44 + 0x4 + + + + .debug_frame + 0x1b50 + 0x1b50 + 0x50 + 0x4 + + + + .debug_frame + 0x1ba0 + 0x1ba0 + 0x44 + 0x4 + + + + .debug_frame + 0x1be4 + 0x1be4 + 0x44 + 0x4 + + + + .debug_frame + 0x1c28 + 0x1c28 + 0x44 + 0x4 + + + + .debug_frame + 0x1c6c + 0x1c6c + 0x44 + 0x4 + + + + .debug_frame + 0x1cb0 + 0x1cb0 + 0x70 + 0x4 + + + + .debug_frame + 0x1d20 + 0x1d20 + 0x44 + 0x4 + + + + .debug_frame + 0x1d64 + 0x1d64 + 0x50 + 0x4 + + + + .debug_frame + 0x1db4 + 0x1db4 + 0x40 + 0x4 + + + + .debug_frame + 0x1df4 + 0x1df4 + 0x40 + 0x4 + + + + .debug_frame + 0x1e34 + 0x1e34 + 0x58 + 0x4 + + + + .debug_frame + 0x1e8c + 0x1e8c + 0x40 + 0x4 + + + + .debug_frame + 0x1ecc + 0x1ecc + 0x40 + 0x4 + + + + .debug_frame + 0x1f0c + 0x1f0c + 0x40 + 0x4 + + + + .debug_frame + 0x1f4c + 0x1f4c + 0x60 + 0x4 + + + + .debug_frame + 0x1fac + 0x1fac + 0x70 + 0x4 + + + + .debug_frame + 0x201c + 0x201c + 0x40 + 0x4 + + + + .debug_frame + 0x205c + 0x205c + 0x40 + 0x4 + + + + .debug_frame + 0x209c + 0x209c + 0x40 + 0x4 + + + + .debug_abbrev + 0x0 + 0x0 + 0xf0 + 0x0 + + + + .debug_abbrev + 0xf0 + 0xf0 + 0x76 + 0x0 + + + + .debug_abbrev + 0x166 + 0x166 + 0x5e + 0x0 + + + + .debug_abbrev + 0x1c4 + 0x1c4 + 0x5e + 0x0 + + + + .debug_abbrev + 0x222 + 0x222 + 0x5e + 0x0 + + + + .debug_abbrev + 0x280 + 0x280 + 0x48 + 0x0 + + + + .debug_abbrev + 0x2c8 + 0x2c8 + 0x25 + 0x0 + + + + .debug_abbrev + 0x2ed + 0x2ed + 0x28 + 0x0 + + + + .debug_abbrev + 0x315 + 0x315 + 0x28 + 0x0 + + + + .debug_abbrev + 0x33d + 0x33d + 0x28 + 0x0 + + + + .debug_abbrev + 0x365 + 0x365 + 0x28 + 0x0 + + + + .debug_abbrev + 0x38d + 0x38d + 0x28 + 0x0 + + + + .debug_abbrev + 0x3b5 + 0x3b5 + 0x28 + 0x0 + + + + .debug_abbrev + 0x3dd + 0x3dd + 0x28 + 0x0 + + + + .debug_abbrev + 0x405 + 0x405 + 0x28 + 0x0 + + + + .debug_abbrev + 0x42d + 0x42d + 0x28 + 0x0 + + + + .debug_abbrev + 0x455 + 0x455 + 0xfd + 0x0 + + + + .debug_abbrev + 0x552 + 0x552 + 0x6f + 0x0 + + + + .debug_abbrev + 0x5c1 + 0x5c1 + 0xbd + 0x0 + + + + .debug_abbrev + 0x67e + 0x67e + 0xde + 0x0 + + + + .debug_abbrev + 0x75c + 0x75c + 0x77 + 0x0 + + + + .debug_abbrev + 0x7d3 + 0x7d3 + 0x26 + 0x0 + + + + .debug_abbrev + 0x7f9 + 0x7f9 + 0x26 + 0x0 + + + + .debug_abbrev + 0x81f + 0x81f + 0xb0 + 0x0 + + + + .debug_abbrev + 0x8cf + 0x8cf + 0x77 + 0x0 + + + + .debug_abbrev + 0x946 + 0x946 + 0x28 + 0x0 + + + + .debug_abbrev + 0x96e + 0x96e + 0x28 + 0x0 + + + + .debug_abbrev + 0x996 + 0x996 + 0x28 + 0x0 + + + + .debug_abbrev + 0x9be + 0x9be + 0x28 + 0x0 + + + + .debug_abbrev + 0x9e6 + 0x9e6 + 0x28 + 0x0 + + + + .debug_abbrev + 0xa0e + 0xa0e + 0x28 + 0x0 + + + + .debug_abbrev + 0xa36 + 0xa36 + 0x28 + 0x0 + + + + .debug_abbrev + 0xa5e + 0xa5e + 0x28 + 0x0 + + + + .debug_abbrev + 0xa86 + 0xa86 + 0x28 + 0x0 + + + + .debug_abbrev + 0xaae + 0xaae + 0x103 + 0x0 + + + + .debug_abbrev + 0xbb1 + 0xbb1 + 0xb3 + 0x0 + + + + .debug_abbrev + 0xc64 + 0xc64 + 0x25 + 0x0 + + + + .debug_abbrev + 0xc89 + 0xc89 + 0x25 + 0x0 + + + + .debug_abbrev + 0xcae + 0xcae + 0x28 + 0x0 + + + + .debug_abbrev + 0xcd6 + 0xcd6 + 0xf4 + 0x0 + + + + .debug_abbrev + 0xdca + 0xdca + 0xa5 + 0x0 + + + + .debug_abbrev + 0xe6f + 0xe6f + 0x5c + 0x0 + + + + .debug_abbrev + 0xecb + 0xecb + 0x6a + 0x0 + + + + .debug_abbrev + 0xf35 + 0xf35 + 0x71 + 0x0 + + + + .debug_abbrev + 0xfa6 + 0xfa6 + 0x5c + 0x0 + + + + .debug_abbrev + 0x1002 + 0x1002 + 0x5c + 0x0 + + + + .debug_abbrev + 0x105e + 0x105e + 0x68 + 0x0 + + + + .debug_abbrev + 0x10c6 + 0x10c6 + 0x68 + 0x0 + + + + .debug_abbrev + 0x112e + 0x112e + 0x68 + 0x0 + + + + .debug_abbrev + 0x1196 + 0x1196 + 0x68 + 0x0 + + + + .debug_abbrev + 0x11fe + 0x11fe + 0x68 + 0x0 + + + + .debug_abbrev + 0x1266 + 0x1266 + 0x68 + 0x0 + + + + .debug_abbrev + 0x12ce + 0x12ce + 0x68 + 0x0 + + + + .debug_abbrev + 0x1336 + 0x1336 + 0x68 + 0x0 + + + + .debug_abbrev + 0x139e + 0x139e + 0x68 + 0x0 + + + + .debug_abbrev + 0x1406 + 0x1406 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1470 + 0x1470 + 0x62 + 0x0 + + + + .debug_abbrev + 0x14d2 + 0x14d2 + 0x5c + 0x0 + + + + .debug_abbrev + 0x152e + 0x152e + 0x6a + 0x0 + + + + .debug_abbrev + 0x1598 + 0x1598 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1602 + 0x1602 + 0x6a + 0x0 + + + + .debug_abbrev + 0x166c + 0x166c + 0x6a + 0x0 + + + + .debug_abbrev + 0x16d6 + 0x16d6 + 0x5c + 0x0 + + + + .debug_abbrev + 0x1732 + 0x1732 + 0x69 + 0x0 + + + + .debug_abbrev + 0x179b + 0x179b + 0x46 + 0x0 + + + + .debug_abbrev + 0x17e1 + 0x17e1 + 0x46 + 0x0 + + + + .debug_abbrev + 0x1827 + 0x1827 + 0x54 + 0x0 + + + + .debug_abbrev + 0x187b + 0x187b + 0x48 + 0x0 + + + + .debug_abbrev + 0x18c3 + 0x18c3 + 0x3b + 0x0 + + + + .debug_abbrev + 0x18fe + 0x18fe + 0x3b + 0x0 + + + + .debug_abbrev + 0x1939 + 0x1939 + 0x51 + 0x0 + + + + .debug_abbrev + 0x198a + 0x198a + 0x6a + 0x0 + + + + .debug_abbrev + 0x19f4 + 0x19f4 + 0x44 + 0x0 + + + + .debug_abbrev + 0x1a38 + 0x1a38 + 0x5c + 0x0 + + + + .debug_abbrev + 0x1a94 + 0x1a94 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1afc + 0x1afc + 0x68 + 0x0 + + + + .debug_abbrev + 0x1b64 + 0x1b64 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1bcc + 0x1bcc + 0x6a + 0x0 + + + + .debug_abbrev + 0x1c36 + 0x1c36 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1ca0 + 0x1ca0 + 0x6a + 0x0 + + + + .debug_abbrev + 0x1d0a + 0x1d0a + 0x62 + 0x0 + + + + .debug_abbrev + 0x1d6c + 0x1d6c + 0x44 + 0x0 + + + + .debug_abbrev + 0x1db0 + 0x1db0 + 0x46 + 0x0 + + + + .debug_abbrev + 0x1df6 + 0x1df6 + 0x44 + 0x0 + + + + .debug_abbrev + 0x1e3a + 0x1e3a + 0x5c + 0x0 + + + + .debug_abbrev + 0x1e96 + 0x1e96 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1efe + 0x1efe + 0x68 + 0x0 + + + + .debug_abbrev + 0x1f66 + 0x1f66 + 0x68 + 0x0 + + + + .debug_abbrev + 0x1fce + 0x1fce + 0x68 + 0x0 + + + + .debug_abbrev + 0x2036 + 0x2036 + 0x68 + 0x0 + + + + .debug_abbrev + 0x209e + 0x209e + 0x6a + 0x0 + + + + .debug_abbrev + 0x2108 + 0x2108 + 0x68 + 0x0 + + + + .debug_abbrev + 0x2170 + 0x2170 + 0x52 + 0x0 + + + + .debug_abbrev + 0x21c2 + 0x21c2 + 0x6c + 0x0 + + + + .debug_abbrev + 0x222e + 0x222e + 0x6c + 0x0 + + + + .debug_abbrev + 0x229a + 0x229a + 0x5f + 0x0 + + + + .debug_abbrev + 0x22f9 + 0x22f9 + 0x6a + 0x0 + + + + .debug_abbrev + 0x2363 + 0x2363 + 0x6c + 0x0 + + + + .debug_abbrev + 0x23cf + 0x23cf + 0x5e + 0x0 + + + + .debug_abbrev + 0x242d + 0x242d + 0x8f + 0x0 + + + + .debug_abbrev + 0x24bc + 0x24bc + 0x6f + 0x0 + + + + .debug_abbrev + 0x252b + 0x252b + 0x44 + 0x0 + + + + .debug_abbrev + 0x256f + 0x256f + 0x61 + 0x0 + + + + .debug_abbrev + 0x25d0 + 0x25d0 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2614 + 0x2614 + 0x6f + 0x0 + + + + .debug_abbrev + 0x2683 + 0x2683 + 0x35 + 0x0 + + + + .debug_abbrev + 0x26b8 + 0x26b8 + 0x3d + 0x0 + + + + .debug_abbrev + 0x26f5 + 0x26f5 + 0x3b + 0x0 + + + + .debug_abbrev + 0x2730 + 0x2730 + 0x61 + 0x0 + + + + .debug_abbrev + 0x2791 + 0x2791 + 0x3b + 0x0 + + + + .debug_abbrev + 0x27cc + 0x27cc + 0x3b + 0x0 + + + + .debug_abbrev + 0x2807 + 0x2807 + 0x61 + 0x0 + + + + .debug_abbrev + 0x2868 + 0x2868 + 0x44 + 0x0 + + + + .debug_abbrev + 0x28ac + 0x28ac + 0x4b + 0x0 + + + + .debug_abbrev + 0x28f7 + 0x28f7 + 0x1c + 0x0 + + + + .debug_abbrev + 0x2913 + 0x2913 + 0x71 + 0x0 + + + + .debug_abbrev + 0x2984 + 0x2984 + 0xb3 + 0x0 + + + + .debug_abbrev + 0x2a37 + 0x2a37 + 0x6d + 0x0 + + + + .debug_abbrev + 0x2aa4 + 0x2aa4 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2ae8 + 0x2ae8 + 0x6d + 0x0 + + + + .debug_abbrev + 0x2b55 + 0x2b55 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2b99 + 0x2b99 + 0x5f + 0x0 + + + + .debug_abbrev + 0x2bf8 + 0x2bf8 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2c3c + 0x2c3c + 0x28 + 0x0 + + + + .debug_abbrev + 0x2c64 + 0x2c64 + 0xa0 + 0x0 + + + + .debug_abbrev + 0x2d04 + 0x2d04 + 0x57 + 0x0 + + + + .debug_abbrev + 0x2d5b + 0x2d5b + 0x28 + 0x0 + + + + .debug_abbrev + 0x2d83 + 0x2d83 + 0x28 + 0x0 + + + + .debug_abbrev + 0x2dab + 0x2dab + 0x5f + 0x0 + + + + .debug_abbrev + 0x2e0a + 0x2e0a + 0x3a + 0x0 + + + + .debug_abbrev + 0x2e44 + 0x2e44 + 0x64 + 0x0 + + + + .debug_abbrev + 0x2ea8 + 0x2ea8 + 0x79 + 0x0 + + + + .debug_abbrev + 0x2f21 + 0x2f21 + 0x61 + 0x0 + + + + .debug_abbrev + 0x2f82 + 0x2f82 + 0x44 + 0x0 + + + + .debug_abbrev + 0x2fc6 + 0x2fc6 + 0x26 + 0x0 + + + + .debug_abbrev + 0x2fec + 0x2fec + 0x1c + 0x0 + + + + .debug_abbrev + 0x3008 + 0x3008 + 0x49 + 0x0 + + + + .debug_abbrev + 0x3051 + 0x3051 + 0x1c + 0x0 + + + + .debug_abbrev + 0x306d + 0x306d + 0xf + 0x0 + + + .debug_str + 0x0 + 0x0 + 0x68 + 0x0 + + + + .debug_str + 0x68 + 0x68 + 0x68 + 0x0 + + + + .debug_str + 0xd0 + 0xd0 + 0x68 + 0x0 + + + + .debug_str + 0x138 + 0x138 + 0x68 + 0x0 + + + + .debug_str + 0x1a0 + 0x1a0 + 0x68 + 0x0 + + + + .debug_str + 0x208 + 0x208 + 0x68 + 0x0 + + + + .debug_str + 0x270 + 0x270 + 0x68 + 0x0 + + + + .debug_str + 0x2d8 + 0x2d8 + 0x69 + 0x0 + + + + .debug_str + 0x341 + 0x341 + 0x69 + 0x0 + + + + .debug_str + 0x3aa + 0x3aa + 0x69 + 0x0 + + + + .debug_str + 0x413 + 0x413 + 0x69 + 0x0 + + + + .debug_str + 0x47c + 0x47c + 0x69 + 0x0 + + + + .debug_str + 0x4e5 + 0x4e5 + 0x69 + 0x0 + + + + .debug_str + 0x54e + 0x54e + 0x68 + 0x0 + + + + .debug_str + 0x5b6 + 0x5b6 + 0x68 + 0x0 + + + + .debug_str + 0x61e + 0x61e + 0x68 + 0x0 + + + + .debug_str + 0x686 + 0x686 + 0x68 + 0x0 + + + + .debug_str + 0x6ee + 0x6ee + 0x68 + 0x0 + + + + .debug_str + 0x756 + 0x756 + 0x68 + 0x0 + + + + .debug_str + 0x7be + 0x7be + 0x68 + 0x0 + + + + .debug_str + 0x826 + 0x826 + 0x68 + 0x0 + + + + .debug_str + 0x88e + 0x88e + 0x68 + 0x0 + + + + .debug_str + 0x8f6 + 0x8f6 + 0x68 + 0x0 + + + + .debug_str + 0x95e + 0x95e + 0x68 + 0x0 + + + + .debug_str + 0x9c6 + 0x9c6 + 0x68 + 0x0 + + + + .debug_str + 0xa2e + 0xa2e + 0x68 + 0x0 + + + + .debug_str + 0xa96 + 0xa96 + 0x68 + 0x0 + + + + .debug_str + 0xafe + 0xafe + 0x68 + 0x0 + + + + .debug_aranges + 0x0 + 0x0 + 0xe0 + 0x0 + + + + .debug_aranges + 0xe0 + 0xe0 + 0x20 + 0x0 + + + + .debug_aranges + 0x100 + 0x100 + 0x20 + 0x0 + + + + .debug_aranges + 0x120 + 0x120 + 0x20 + 0x0 + + + + .debug_aranges + 0x140 + 0x140 + 0x20 + 0x0 + + + + .debug_aranges + 0x160 + 0x160 + 0x90 + 0x0 + + + + .debug_aranges + 0x1f0 + 0x1f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x210 + 0x210 + 0x78 + 0x0 + + + + .debug_aranges + 0x288 + 0x288 + 0x58 + 0x0 + + + + .debug_aranges + 0x2e0 + 0x2e0 + 0x120 + 0x0 + + + + .debug_aranges + 0x400 + 0x400 + 0x20 + 0x0 + + + + .debug_aranges + 0x420 + 0x420 + 0x20 + 0x0 + + + + .debug_aranges + 0x440 + 0x440 + 0xb0 + 0x0 + + + + .debug_aranges + 0x4f0 + 0x4f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x510 + 0x510 + 0x20 + 0x0 + + + + .debug_aranges + 0x530 + 0x530 + 0x20 + 0x0 + + + + .debug_aranges + 0x550 + 0x550 + 0x20 + 0x0 + + + + .debug_aranges + 0x570 + 0x570 + 0x20 + 0x0 + + + + .debug_aranges + 0x590 + 0x590 + 0x20 + 0x0 + + + + .debug_aranges + 0x5b0 + 0x5b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5d0 + 0x5d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x5f0 + 0x5f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x610 + 0x610 + 0x20 + 0x0 + + + + .debug_aranges + 0x630 + 0x630 + 0x20 + 0x0 + + + + .debug_aranges + 0x650 + 0x650 + 0x20 + 0x0 + + + + .debug_aranges + 0x670 + 0x670 + 0x20 + 0x0 + + + + .debug_aranges + 0x690 + 0x690 + 0x20 + 0x0 + + + + .debug_aranges + 0x6b0 + 0x6b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6d0 + 0x6d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x6f0 + 0x6f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x710 + 0x710 + 0x20 + 0x0 + + + + .debug_aranges + 0x730 + 0x730 + 0x20 + 0x0 + + + + .debug_aranges + 0x750 + 0x750 + 0x20 + 0x0 + + + + .debug_aranges + 0x770 + 0x770 + 0x20 + 0x0 + + + + .debug_aranges + 0x790 + 0x790 + 0x20 + 0x0 + + + + .debug_aranges + 0x7b0 + 0x7b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7d0 + 0x7d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x7f0 + 0x7f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x810 + 0x810 + 0x20 + 0x0 + + + + .debug_aranges + 0x830 + 0x830 + 0x20 + 0x0 + + + + .debug_aranges + 0x850 + 0x850 + 0x20 + 0x0 + + + + .debug_aranges + 0x870 + 0x870 + 0x20 + 0x0 + + + + .debug_aranges + 0x890 + 0x890 + 0x20 + 0x0 + + + + .debug_aranges + 0x8b0 + 0x8b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8d0 + 0x8d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x8f0 + 0x8f0 + 0x20 + 0x0 + + + + .debug_aranges + 0x910 + 0x910 + 0x20 + 0x0 + + + + .debug_aranges + 0x930 + 0x930 + 0x20 + 0x0 + + + + .debug_aranges + 0x950 + 0x950 + 0x20 + 0x0 + + + + .debug_aranges + 0x970 + 0x970 + 0x20 + 0x0 + + + + .debug_aranges + 0x990 + 0x990 + 0x20 + 0x0 + + + + .debug_aranges + 0x9b0 + 0x9b0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9d0 + 0x9d0 + 0x20 + 0x0 + + + + .debug_aranges + 0x9f0 + 0x9f0 + 0x20 + 0x0 + + + + .debug_aranges + 0xa10 + 0xa10 + 0x20 + 0x0 + + + + .debug_aranges + 0xa30 + 0xa30 + 0x20 + 0x0 + + + + .debug_aranges + 0xa50 + 0xa50 + 0x20 + 0x0 + + + + .debug_aranges + 0xa70 + 0xa70 + 0x20 + 0x0 + + + + .debug_aranges + 0xa90 + 0xa90 + 0x20 + 0x0 + + + + .debug_aranges + 0xab0 + 0xab0 + 0x20 + 0x0 + + + + .debug_aranges + 0xad0 + 0xad0 + 0x20 + 0x0 + + + + .debug_aranges + 0xaf0 + 0xaf0 + 0x20 + 0x0 + + + + .debug_aranges + 0xb10 + 0xb10 + 0x20 + 0x0 + + + + .debug_aranges + 0xb30 + 0xb30 + 0x20 + 0x0 + + + + .debug_aranges + 0xb50 + 0xb50 + 0x20 + 0x0 + + + + .debug_aranges + 0xb70 + 0xb70 + 0x20 + 0x0 + + + + .debug_aranges + 0xb90 + 0xb90 + 0x20 + 0x0 + + + + .debug_aranges + 0xbb0 + 0xbb0 + 0x20 + 0x0 + + + + .debug_aranges + 0xbd0 + 0xbd0 + 0x20 + 0x0 + + + + .debug_aranges + 0xbf0 + 0xbf0 + 0x20 + 0x0 + + + + .debug_aranges + 0xc10 + 0xc10 + 0x20 + 0x0 + + + + .debug_aranges + 0xc30 + 0xc30 + 0x40 + 0x0 + + + + .debug_aranges + 0xc70 + 0xc70 + 0x38 + 0x0 + + + + .debug_aranges + 0xca8 + 0xca8 + 0x20 + 0x0 + + + + .debug_aranges + 0xcc8 + 0xcc8 + 0x20 + 0x0 + + + + .debug_aranges + 0xce8 + 0xce8 + 0x20 + 0x0 + + + + .debug_aranges + 0xd08 + 0xd08 + 0x20 + 0x0 + + + + .debug_aranges + 0xd28 + 0xd28 + 0x20 + 0x0 + + + + .debug_aranges + 0xd48 + 0xd48 + 0x20 + 0x0 + + + + .debug_aranges + 0xd68 + 0xd68 + 0x20 + 0x0 + + + + .debug_aranges + 0xd88 + 0xd88 + 0x28 + 0x0 + + + + .debug_aranges + 0xdb0 + 0xdb0 + 0x30 + 0x0 + + + + .debug_aranges + 0xde0 + 0xde0 + 0x20 + 0x0 + + + + .debug_aranges + 0xe00 + 0xe00 + 0x20 + 0x0 + + + + .debug_aranges + 0xe20 + 0xe20 + 0x20 + 0x0 + + + + .debug_pubnames + 0x0 + 0x0 + 0x228 + 0x0 + + + + .debug_pubnames + 0x228 + 0x228 + 0x25 + 0x0 + + + + .debug_pubnames + 0x24d + 0x24d + 0x25 + 0x0 + + + + .debug_pubnames + 0x272 + 0x272 + 0x26 + 0x0 + + + + .debug_pubnames + 0x298 + 0x298 + 0x1b + 0x0 + + + + .debug_pubnames + 0x2b3 + 0x2b3 + 0x50 + 0x0 + + + + .debug_pubnames + 0x303 + 0x303 + 0x1e + 0x0 + + + + .debug_pubnames + 0x321 + 0x321 + 0x23 + 0x0 + + + + .debug_pubnames + 0x344 + 0x344 + 0x25 + 0x0 + + + + .debug_pubnames + 0x369 + 0x369 + 0x20 + 0x0 + + + + .debug_pubnames + 0x389 + 0x389 + 0x22 + 0x0 + + + + .debug_pubnames + 0x3ab + 0x3ab + 0x20 + 0x0 + + + + .debug_pubnames + 0x3cb + 0x3cb + 0x22 + 0x0 + + + + .debug_pubnames + 0x3ed + 0x3ed + 0x1f + 0x0 + + + + .debug_pubnames + 0x40c + 0x40c + 0x156 + 0x0 + + + + .debug_pubnames + 0x562 + 0x562 + 0x21 + 0x0 + + + + .debug_pubnames + 0x583 + 0x583 + 0xf9 + 0x0 + + + + .debug_pubnames + 0x67c + 0x67c + 0x31 + 0x0 + + + + .debug_pubnames + 0x6ad + 0x6ad + 0x3a + 0x0 + + + + .debug_pubnames + 0x6e7 + 0x6e7 + 0xd0 + 0x0 + + + + .debug_pubnames + 0x7b7 + 0x7b7 + 0x28a + 0x0 + + + + .debug_pubnames + 0xa41 + 0xa41 + 0x29 + 0x0 + + + + .debug_pubnames + 0xa6a + 0xa6a + 0x2d + 0x0 + + + + .debug_pubnames + 0xa97 + 0xa97 + 0x2d + 0x0 + + + + .debug_pubnames + 0xac4 + 0xac4 + 0x2d + 0x0 + + + + .debug_pubnames + 0xaf1 + 0xaf1 + 0x2e + 0x0 + + + + .debug_pubnames + 0xb1f + 0xb1f + 0x2a + 0x0 + + + + .debug_pubnames + 0xb49 + 0xb49 + 0x2c + 0x0 + + + + .debug_pubnames + 0xb75 + 0xb75 + 0x2b + 0x0 + + + + .debug_pubnames + 0xba0 + 0xba0 + 0x33e + 0x0 + + + + .debug_pubnames + 0xede + 0xede + 0x44 + 0x0 + + + + .debug_pubnames + 0xf22 + 0xf22 + 0x45 + 0x0 + + + + .debug_pubnames + 0xf67 + 0xf67 + 0x4c + 0x0 + + + + .debug_pubnames + 0xfb3 + 0xfb3 + 0x224 + 0x0 + + + + .debug_pubnames + 0x11d7 + 0x11d7 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1202 + 0x1202 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1232 + 0x1232 + 0x2c + 0x0 + + + + .debug_pubnames + 0x125e + 0x125e + 0x2b + 0x0 + + + + .debug_pubnames + 0x1289 + 0x1289 + 0x2a + 0x0 + + + + .debug_pubnames + 0x12b3 + 0x12b3 + 0x2d + 0x0 + + + + .debug_pubnames + 0x12e0 + 0x12e0 + 0x2d + 0x0 + + + + .debug_pubnames + 0x130d + 0x130d + 0x2b + 0x0 + + + + .debug_pubnames + 0x1338 + 0x1338 + 0x2c + 0x0 + + + + .debug_pubnames + 0x1364 + 0x1364 + 0x28 + 0x0 + + + + .debug_pubnames + 0x138c + 0x138c + 0x29 + 0x0 + + + + .debug_pubnames + 0x13b5 + 0x13b5 + 0x26 + 0x0 + + + + .debug_pubnames + 0x13db + 0x13db + 0x30 + 0x0 + + + + .debug_pubnames + 0x140b + 0x140b + 0x27 + 0x0 + + + + .debug_pubnames + 0x1432 + 0x1432 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1458 + 0x1458 + 0x2c + 0x0 + + + + .debug_pubnames + 0x1484 + 0x1484 + 0x28 + 0x0 + + + + .debug_pubnames + 0x14ac + 0x14ac + 0x30 + 0x0 + + + + .debug_pubnames + 0x14dc + 0x14dc + 0x2d + 0x0 + + + + .debug_pubnames + 0x1509 + 0x1509 + 0x28 + 0x0 + + + + .debug_pubnames + 0x1531 + 0x1531 + 0x2d + 0x0 + + + + .debug_pubnames + 0x155e + 0x155e + 0x2e + 0x0 + + + + .debug_pubnames + 0x158c + 0x158c + 0x2b + 0x0 + + + + .debug_pubnames + 0x15b7 + 0x15b7 + 0x2f + 0x0 + + + + .debug_pubnames + 0x15e6 + 0x15e6 + 0x38 + 0x0 + + + + .debug_pubnames + 0x161e + 0x161e + 0x2b + 0x0 + + + + .debug_pubnames + 0x1649 + 0x1649 + 0x30 + 0x0 + + + + .debug_pubnames + 0x1679 + 0x1679 + 0x27 + 0x0 + + + + .debug_pubnames + 0x16a0 + 0x16a0 + 0x26 + 0x0 + + + + .debug_pubnames + 0x16c6 + 0x16c6 + 0x27 + 0x0 + + + + .debug_pubnames + 0x16ed + 0x16ed + 0x28 + 0x0 + + + + .debug_pubnames + 0x1715 + 0x1715 + 0x2f + 0x0 + + + + .debug_pubnames + 0x1744 + 0x1744 + 0x24 + 0x0 + + + + .debug_pubnames + 0x1768 + 0x1768 + 0x2a + 0x0 + + + + .debug_pubnames + 0x1792 + 0x1792 + 0x2f + 0x0 + + + + .debug_pubnames + 0x17c1 + 0x17c1 + 0x2d + 0x0 + + + + .debug_pubnames + 0x17ee + 0x17ee + 0x37 + 0x0 + + + + .debug_pubnames + 0x1825 + 0x1825 + 0x26 + 0x0 + + + + .debug_pubnames + 0x184b + 0x184b + 0x2b + 0x0 + + + + .debug_pubnames + 0x1876 + 0x1876 + 0x31 + 0x0 + + + + .debug_pubnames + 0x18a7 + 0x18a7 + 0x30 + 0x0 + + + + .debug_pubnames + 0x18d7 + 0x18d7 + 0x29 + 0x0 + + + + .debug_pubnames + 0x1900 + 0x1900 + 0x2a + 0x0 + + + + .debug_pubnames + 0x192a + 0x192a + 0x29 + 0x0 + + + + .debug_pubnames + 0x1953 + 0x1953 + 0x36 + 0x0 + + + + .debug_pubnames + 0x1989 + 0x1989 + 0x31 + 0x0 + + + + .debug_pubnames + 0x19ba + 0x19ba + 0x2a + 0x0 + + + + .debug_pubnames + 0x19e4 + 0x19e4 + 0x26 + 0x0 + + + + .debug_pubnames + 0x1a0a + 0x1a0a + 0x26 + 0x0 + + + + .debug_pubnames + 0x1a30 + 0x1a30 + 0x28 + 0x0 + + + + .debug_pubnames + 0x1a58 + 0x1a58 + 0x2d + 0x0 + + + + .debug_pubnames + 0x1a85 + 0x1a85 + 0x2e + 0x0 + + + + .debug_pubnames + 0x1ab3 + 0x1ab3 + 0x31 + 0x0 + + + + .debug_pubnames + 0x1ae4 + 0x1ae4 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1b01 + 0x1b01 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1b1d + 0x1b1d + 0x1b + 0x0 + + + + .debug_pubnames + 0x1b38 + 0x1b38 + 0x1f + 0x0 + + + + .debug_pubnames + 0x1b57 + 0x1b57 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1b7c + 0x1b7c + 0x70 + 0x0 + + + + .debug_pubnames + 0x1bec + 0x1bec + 0x60 + 0x0 + + + + .debug_pubnames + 0x1c4c + 0x1c4c + 0x26 + 0x0 + + + + .debug_pubnames + 0x1c72 + 0x1c72 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1c8f + 0x1c8f + 0x27 + 0x0 + + + + .debug_pubnames + 0x1cb6 + 0x1cb6 + 0x35 + 0x0 + + + + .debug_pubnames + 0x1ceb + 0x1ceb + 0x25 + 0x0 + + + + .debug_pubnames + 0x1d10 + 0x1d10 + 0x2b + 0x0 + + + + .debug_pubnames + 0x1d3b + 0x1d3b + 0x2b + 0x0 + + + + .debug_pubnames + 0x1d66 + 0x1d66 + 0x5e + 0x0 + + + + .debug_pubnames + 0x1dc4 + 0x1dc4 + 0x25 + 0x0 + + + + .debug_pubnames + 0x1de9 + 0x1de9 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1e05 + 0x1e05 + 0x1e + 0x0 + + + + .debug_pubnames + 0x1e23 + 0x1e23 + 0x43 + 0x0 + + + + .debug_pubnames + 0x1e66 + 0x1e66 + 0x21 + 0x0 + + + + .debug_pubnames + 0x1e87 + 0x1e87 + 0x1d + 0x0 + + + + .debug_pubnames + 0x1ea4 + 0x1ea4 + 0x1c + 0x0 + + + + .debug_pubnames + 0x1ec0 + 0x1ec0 + 0x29 + 0x0 + + + + + + .cinit + 0x84000 + 0x84000 + 0x30 + + + + + + + + + .text + 0x82000 + 0x82000 + 0x1ee1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .text + + + + + + codestart + 0x80000 + 0x80000 + 0x2 + + + + + + .stack + 0x400 + 0x100 + + + + + + + .switch + 0x0 + 0x0 + + + + + .reset + 0x3fffc0 + 0x0 + + + + + .init_array + 0x0 + 0x0 + + + + + .bss + 0xc000 + 0x982 + + + + + + + + + + + + + + + + + + + + + + + .bss:output + 0x0 + 0x0 + + + + + .bss:cio + 0x0 + 0x0 + + + + + .data + 0xa800 + 0x47 + + + + + + + + + + + + .sysmem + 0x0 + 0x0 + + + + + .const + 0x90000 + 0x90000 + 0x513 + + + + + + + + + + + + + + Filter_RegsFile + 0x0 + 0x0 + + + + + SHARERAMGS0 + 0x0 + 0x0 + + + + + SHARERAMGS1 + 0x0 + 0x0 + + + + + SHARERAMGS2 + 0x0 + 0x0 + + + + + ramgs0 + 0x0 + 0x0 + + + + + ramgs1 + 0x0 + 0x0 + + + + + .TI.ramfunc + 0x86000 + 0x8000 + 0x128 + + + + + + + + + + + + + + + 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 + 0x3b6e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_info + 0x0 + 0x0 + 0x12e87 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_line + 0x0 + 0x0 + 0x574d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_frame + 0x0 + 0x0 + 0x20dc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_abbrev + 0x0 + 0x0 + 0x307c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_str + 0x0 + 0x0 + 0xb66 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_aranges + 0x0 + 0x0 + 0xe40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_pubnames + 0x0 + 0x0 + 0x1ee9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SEGMENT_0 + 0x80000 + 0x80000 + 0x2 + 0x5 + + + + + + SEGMENT_1 + 0x82000 + 0x82000 + 0x1ee1 + 0x5 + + + + + + SEGMENT_2 + 0x84000 + 0x84000 + 0x30 + 0x4 + + + + + + SEGMENT_3 + 0x86000 + 0x8000 + 0x128 + 0x5 + + + + + + SEGMENT_4 + 0x90000 + 0x90000 + 0x513 + 0x4 + + + + + + SEGMENT_5 + 0x400 + 0x100 + 0x6 + + + + + + SEGMENT_6 + 0xa800 + 0x47 + 0x6 + + + + + + SEGMENT_7 + 0xc000 + 0x982 + 0x6 + + + + + + + + RAMM0 + 0x0 + 0x123 + 0x2dd + 0x0 + 0x2dd + RWIX + + + + + RAMLS0 + 0x0 + 0x8000 + 0x800 + 0x128 + 0x6d8 + RWIX + + + 0x8000 + 0x128 + + + + 0x8128 + 0x6d8 + + + + + 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 + 0x0 + 0x800 + RWIX + + + + + RAMGS14 + 0x0 + 0x1a000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS15 + 0x0 + 0x1b000 + 0xff8 + 0x0 + 0xff8 + RWIX + + + + + BEGIN + 0x0 + 0x80000 + 0x2 + 0x2 + 0x0 + RWIX + + + 0x80000 + 0x2 + + + + + + FLASHA + 0x0 + 0x80002 + 0x1ffe + 0x0 + 0x1ffe + RWIX + + + + + FLASHB + 0x0 + 0x82000 + 0x2000 + 0x1ee1 + 0x11f + RWIX + + + 0x82000 + 0x1ee1 + + + + 0x83ee1 + 0x11f + + + + + FLASHC + 0x0 + 0x84000 + 0x2000 + 0x30 + 0x1fd0 + RWIX + + + 0x84000 + 0x30 + + + + 0x84030 + 0x1fd0 + + + + + FLASHD + 0x0 + 0x86000 + 0x2000 + 0x128 + 0x1ed8 + RWIX + + + 0x86000 + 0x128 + + + + 0x86128 + 0x1ed8 + + + + + FLASHE + 0x0 + 0x88000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHF + 0x0 + 0x90000 + 0x8000 + 0x513 + 0x7aed + RWIX + + + 0x90000 + 0x513 + + + + 0x90513 + 0x7aed + + + + + 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 + 0x47 + 0x7b9 + RWIX + + + 0xa800 + 0x47 + + + + 0xa847 + 0x7b9 + + + + + RAMD1 + 0x1 + 0xb800 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMGS0 + 0x1 + 0xc000 + 0x1000 + 0x982 + 0x67e + RWIX + + + 0xc000 + 0x982 + + + + 0xc982 + 0x67e + + + + + 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 + + + + + CPU2TOCPU1RAM + 0x1 + 0x3f800 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CPU1TOCPU2RAM + 0x1 + 0x3fc00 + 0x400 + 0x0 + 0x400 + RWIX + + + + + + + __TI_cinit_table + + .data + 0x84000 + 0x1d + 0xa800 + 0x47 + lzss + + + .bss + 0x84024 + 0x4 + 0xc000 + 0x982 + zero_init + + + + + __TI_handler_table + + 0x0 + __TI_zero_init + + + 0x1 + __TI_decompress_lzss + + + 0x2 + __TI_decompress_none + + + + + RamfuncsLoadStart + 0x86000 + + + RamfuncsLoadSize + 0x128 + + + RamfuncsLoadEnd + 0x86128 + + + RamfuncsRunStart + 0x8000 + + + RamfuncsRunSize + 0x128 + + + RamfuncsRunEnd + 0x8128 + + + __TI_CINIT_Base + 0x84028 + + + __TI_CINIT_Limit + 0x84030 + + + __TI_CINIT_Warm + 0x84030 + + + __TI_Handler_Table_Base + 0x8401e + + + __TI_Handler_Table_Limit + 0x84024 + + + __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 + + + INTERRUPT_init + 0x83057 + + + + PinMux_init + 0x82ff9 + + + + SCI_init + 0x83064 + + + + Board_init + 0x82fec + + + + GPIO_init + 0x83040 + + + + mySCI0_init + 0x83067 + + + + CPUTIMER_init + 0x8301d + + + + myCPUTIMER0_init + 0x83020 + + + + LED_Blue_init + 0x83043 + + + + __relaxed_sinf + 0x83e89 + + + + __relaxed_atanf + 0x83ce4 + + + + main + 0x83de7 + + + + __relaxed_cosf + 0x83e7e + + + + plantPhaseVect + 0xc788 + + + + clPhaseVect + 0xc3a0 + + + + sfra_task_run + 0x82bf8 + + + + libsfra + 0xa802 + + + + olPhaseVect + 0xc5f8 + + + + sfra_init + 0x82b1e + + + + ti_sfra + 0xc00a + + + + lowPass_test + 0xc000 + + + + plantMagVect + 0xc6c0 + + + + freqVect + 0xc468 + + + + olMagVect + 0xc530 + + + + libsfra_results + 0xc080 + + + + sfra_print_results_csv + 0x82b81 + + + + clMagVect + 0xc2d8 + + + + TIMER0_ISR + 0x838c1 + + + + hal_sfra + 0xc040 + + + + sfra_is_running + 0x82c10 + + + + sfra_monitor + 0x82e27 + + + + sfra_is_done + 0x82c18 + + + + sfra_inject + 0x82df8 + + + + sfra_clear_done + 0x82c20 + + + + sfra_start + 0x82c07 + + + + sfra_background_task + 0x82d88 + + + + sfra_init_all + 0x82c06 + + + + libsfra_ti_hal_init + 0x83357 + + + + __SFRA_F32_inject + 0x83322 + + + + __SFRA_F32_collect + 0x8333a + + + + libsfra_ti_hal_get_adapter + 0x833ba + + + + SFRA_F32_runBackgroundTask + 0x8334a + + + + SFRA_GUI_varGetList + 0xc902 + + + + SFRA_GUI_rcvTaskPointer + 0xc892 + + + + SFRA_GUI_cmdInterpreter + 0x82350 + + + + SFRA_GUI_commsOKflg + 0xc880 + + + + SFRA_GUI_memDataPtr16 + 0xc898 + + + + SFRA_GUI_getVariable + 0x823df + + + + SFRA_GUI_runSerialHostComms + 0x82255 + + + + SFRA_GUI_rxChar + 0xc884 + + + + SFRA_GUI_lowByteFlag + 0xc882 + + + + SFRA_GUI_memDataPtr32 + 0xc89a + + + + SFRA_GUI_varSetBtnList + 0xc922 + + + + SFRA_GUI_getData + 0x823e5 + + + + SFRA_GUI_config + 0x82143 + + + + SFRA_GUI_led_gpio + 0xc890 + + + + SFRA_GUI_delayer + 0xc88b + + + + SFRA_GUI_sendTaskPtr + 0xc883 + + + + SFRA_GUI_getCmdByte + 0x82269 + + + + SFRA_GUI_echoCmdByte + 0x822ab + + + + SFRA_GUI_sendData + 0x82448 + + + + SFRA_GUI_cmdPacket + 0xc872 + + + + SFRA_GUI_rxWord + 0xc885 + + + + SFRA_GUI_led_flag + 0xc88f + + + + SFRA_GUI_memGetAmount + 0xc88d + + + + SFRA_GUI_arrayGetList + 0xc8a2 + + + + SFRA_GUI_echoSizeByte + 0x822e5 + + + + SFRA_GUI_setData32 + 0x82414 + + + + SFRA_GUI_dataOut32 + 0xc896 + + + + SFRA_GUI_memGetAddress + 0xc89c + + + + SFRA_GUI_getDataByte + 0x822ff + + + + SFRA_GUI_dataOut16 + 0xc889 + + + + SFRA_GUI_getSizeByte + 0x822c5 + + + + SFRA_GUI_echoDataByte + 0x8231f + + + + SFRA_GUI_packWord + 0x82332 + + + + SFRA_GUI_setText + 0x823a6 + + + + SFRA_GUI_sweep_start + 0xc891 + + + + SFRA_GUI_setSlider + 0x823cc + + + + SFRA_GUI_lifePulseTsk + 0x82370 + + + + SFRA_GUI_rcvTskPtrShdw + 0xc88a + + + + SFRA_GUI_numWords + 0xc887 + + + + SFRA_GUI_varSetSldrList + 0xc942 + + + + SFRA_GUI_spareTsk08 + 0x82443 + + + + SFRA_GUI_wordsLeftToGet + 0xc888 + + + + SFRA_GUI_serialCommsTimer + 0xc881 + + + + SFRA_GUI_dataSetList + 0xc8e2 + + + + SFRA_GUI_temp + 0xc8a0 + + + + SFRA_GUI_sci_base_addr + 0xc894 + + + + SFRA_GUI_varSetTxtList + 0xc962 + + + + SFRA_GUI_memSetValue + 0xc89e + + + + SFRA_GUI_memSetPtr + 0xc88e + + + + SFRA_GUI_memGetPtr + 0xc88c + + + + SFRA_GUI_taskDoneFlag + 0xc886 + + + + SFRA_GUI_cmdDispatcher + 0xc8c2 + + + + SFRA_GUI_getArray + 0x823e2 + + + + SFRA_GUI_setButton + 0x823b9 + + + + code_start + 0x80000 + + + + Device_enableAllPeripherals + 0x8261b + + + + Device_initGPIO + 0x82706 + + + + Example_Fail + 0xa836 + + + + Example_setResultFail + 0x82924 + + + + Device_bootCPU2 + 0x8279e + + + + Device_init + 0x825c8 + + + + Example_Result + 0xa832 + + + + Device_enableUnbondedGPIOPullups + 0x82757 + + + + __error__ + 0x82918 + + + + Example_setResultPass + 0x8291f + + + + Device_configureTMXAnalogTrim + 0x8276d + + + + Device_enableUnbondedGPIOPullupsFor176Pin + 0x82727 + + + + Example_done + 0x82929 + + + + Example_PassCount + 0xa834 + + + + Device_enableUnbondedGPIOPullupsFor100Pin + 0x8273a + + + + CPUTimer_setEmulationMode + 0x83d9d + + + + Flash_initModule + 0x8000 + + + + GPIO_setQualificationMode + 0x83a79 + + + + GPIO_setPadConfig + 0x837d6 + + + + GPIO_setDirectionMode + 0x83ae7 + + + + GPIO_setPinConfig + 0x83a42 + + + + GPIO_setControllerCore + 0x83a0b + + + + Interrupt_defaultHandler + 0x83d73 + + + + Interrupt_initModule + 0x839ce + + + + Interrupt_nmiHandler + 0x83e9e + + + + Interrupt_enable + 0x83ab0 + + + + Interrupt_initVectorTable + 0x83c77 + + + + Interrupt_illegalOperationHandler + 0x83e94 + + + + SCI_clearInterruptStatus + 0x83907 + + + + SCI_setConfig + 0x83990 + + + + SCI_enableInterrupt + 0x8394c + + + + SysCtl_delay + 0x8124 + + + + SysCtl_getDeviceParametric + 0x836b4 + + + + SysCtl_selectXTAL + 0x8359c + + + + SysCtl_selectOscSource + 0x83879 + + + + SysCtl_getLowSpeedClock + 0x83cca + + + + SysCtl_setClock + 0x8309e + + + + SysCtl_getClock + 0x83828 + + + + log10f + 0x834c4 + + + + ceilf + 0x8377e + + + + tanf + 0x8371c + + + + _c_int00 + 0x83d5c + + + + __stack + 0x400 + + + + __c28xabi_divf + 0x8362c + + + + __c28xabi_modull + 0x83462 + + + + __c28xabi_divull + 0x83433 + + + + __c28xabi_divll + 0x833bd + + + + __c28xabi_modll + 0x833f9 + + + + __c28xabi_divul + 0x83b8e + + + + __c28xabi_modul + 0x83b95 + + + + __c28xabi_modl + 0x83b80 + + + + __c28xabi_divl + 0x83b71 + + + + __c28xabi_ftoll + 0x83c12 + + + + memcpy + 0x83c38 + + + + _system_pre_init + 0x83ede + + + + __TI_auto_init_nobinit_nopinit + 0x83b46 + + + + __TI_zero_init + 0x83ed8 + + + + __TI_decompress_none + 0x83ec2 + + + + __TI_decompress_lzss + 0x83b18 + + + + C$$EXIT + 0x83b9b + + + + abort + 0x83b9b + + + + exit + 0x83b9d + + + + __TI_dtors_ptr + 0xa83c + + + + __TI_cleanup_ptr + 0xa83a + + + + __TI_enable_exit_profile_output + 0xa838 + + + + _nop + 0x83eb9 + + + + _lock + 0xa83e + + + + _unlock + 0xa844 + + + + _register_lock + 0x83eb5 + + + + _register_unlock + 0x83eb1 + + + + _args_main + 0x83df9 + + + + memset + 0x83ed1 + + + + errno + 0xa846 + + + + _system_post_cinit + 0x83ee0 + + + + Link successful + diff --git a/28379d_test_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk b/28379d_test_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk new file mode 100644 index 0000000..64a3f46 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/LIBSFAR/subdir_rules.mk @@ -0,0 +1,14 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# Each subdirectory must supply rules for building sources it contributes +LIBSFAR/%.obj: ../LIBSFAR/%.c $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) + @echo 'C2000 Compiler - building file: "$<"' + "C:/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 --fp_mode=relaxed --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device" --include_path="C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/" --include_path="C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=_FLASH --define=CPU1 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="LIBSFAR/$(basename $(5G*l6bLF+c^7J0WF|6_DMKpFt@7 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 Vyl)Yv9tJ=^jko(jeDC7I`(L5~ZFT?v literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.d b/28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.d new file mode 100644 index 0000000..79177bd --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.d @@ -0,0 +1,66 @@ +# FIXED + +LIBSFRA/libsfra_ti_hal.obj: ../LIBSFRA/libsfra_ti_hal.c +LIBSFRA/libsfra_ti_hal.obj: ../LIBSFRA/libsfra_ti_hal.h +LIBSFRA/libsfra_ti_hal.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_f32.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h +LIBSFRA/libsfra_ti_hal.obj: ../LIBSFRA/libsfra.h +LIBSFRA/libsfra_ti_hal.obj: ../LIBSFRA/libsfra_config.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/string.h +LIBSFRA/libsfra_ti_hal.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/xlocale/_string.h + +../LIBSFRA/libsfra_ti_hal.c: + +../LIBSFRA/libsfra_ti_hal.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_f32.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h: + +../LIBSFRA/libsfra.h: + +../LIBSFRA/libsfra_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/string.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/xlocale/_string.h: + diff --git a/28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.obj b/28379d_test_SFRA/CPU1_FLASH/LIBSFRA/libsfra_ti_hal.obj new file mode 100644 index 0000000000000000000000000000000000000000..9f3da899b957debedfc7f5f68c45f9938af2269c GIT binary patch literal 61708 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 R14ZPnVKC|V07M|mKLM8z_^|*0 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/device/device.d b/28379d_test_SFRA/CPU1_FLASH/device/device.d new file mode 100644 index 0000000..3456a56 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/device/device.d @@ -0,0 +1,270 @@ +# FIXED + +device/device.obj: ../device/device.c +device/device.obj: ../device/device.h +device/device.obj: ../device/driverlib.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +device/device.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +device/device.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h + +../device/device.c: + +../device/device.h: + +../device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + diff --git a/28379d_test_SFRA/CPU1_FLASH/device/device.obj b/28379d_test_SFRA/CPU1_FLASH/device/device.obj new file mode 100644 index 0000000000000000000000000000000000000000..5d3f766ed64a86e096e259208ab2ad9c72d946b3 GIT binary patch literal 28436 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 bf=CF<#PQ(GL7KW504Hg@TX9j9;==ns4?8ny literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/makefile b/28379d_test_SFRA/CPU1_FLASH/makefile new file mode 100644 index 0000000..e40f0ab --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/makefile @@ -0,0 +1,163 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +CG_TOOL_ROOT := C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS + +GEN_OPTS__FLAG := --cmd_file="syscfg/board.opt" --cmd_file="syscfg/c2000ware_libraries.opt" +GEN_CMDS__FLAG := + +ORDERED_OBJS += \ +"./syscfg/board.obj" \ +"./syscfg/c2000ware_libraries.obj" \ +"./main.obj" \ +"./sfra_test.obj" \ +"./LIBSFRA/libsfra.obj" \ +"./LIBSFRA/libsfra_ti_hal.obj" \ +"./SFRA/sfra_gui_scicomms_driverlib.obj" \ +"./device/F2837xD_CodeStartBranch.obj" \ +"./device/device.obj" \ +"../2837xD_FLASH_lnk_cpu1.cmd" \ +"C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib" \ +$(GEN_CMDS__FLAG) \ +-llibc.a \ +-l"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_f32_tmu_eabi.lib" \ + +-include ../makefile.init + +RM := DEL /F +RMDIR := RMDIR /S/Q + +# All of the sources participating in the build are defined here +-include sources.mk +-include subdir_vars.mk +-include LIBSFRA/subdir_vars.mk +-include SFRA/subdir_vars.mk +-include device/subdir_vars.mk +-include subdir_rules.mk +-include LIBSFRA/subdir_rules.mk +-include SFRA/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 += \ +28379d_test_SFRA.out + +EXE_OUTPUTS__QUOTED += \ +"28379d_test_SFRA.out" + + +# All Target +all: $(OBJS) $(CMD_SRCS) $(LIB_SRCS) $(GEN_CMDS) + @$(MAKE) --no-print-directory -Onone "28379d_test_SFRA.out" + +# Tool invocations +28379d_test_SFRA.out: $(OBJS) $(CMD_SRCS) $(LIB_SRCS) $(GEN_CMDS) + @echo 'C2000 Linker - building target: "$@"' + "C:/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 --fp_mode=relaxed --define=DEBUG --define=_FLASH --define=CPU1 --define=_LAUNCHXL_F28379D --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi -z -m"28379d_test_SFRA.map" --stack_size=0x100 --warn_sections -i"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib" -i"C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --reread_libs --diag_wrap=off --display_error_number --xml_link_info="28379d_test_SFRA_linkInfo.xml" --entry_point=code_start --rom_model -o "28379d_test_SFRA.out" $(ORDERED_OBJS) + @echo 'Finished building target: "$@"' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(GEN_MISC_FILES__QUOTED)$(GEN_FILES__QUOTED)$(EXE_OUTPUTS__QUOTED) + -$(RM) "syscfg\board.obj" "syscfg\c2000ware_libraries.obj" "main.obj" "sfra_test.obj" "LIBSFRA\libsfra.obj" "LIBSFRA\libsfra_ti_hal.obj" "SFRA\sfra_gui_scicomms_driverlib.obj" "device\F2837xD_CodeStartBranch.obj" "device\device.obj" + -$(RM) "syscfg\board.d" "syscfg\c2000ware_libraries.d" "main.d" "sfra_test.d" "LIBSFRA\libsfra.d" "LIBSFRA\libsfra_ti_hal.d" "SFRA\sfra_gui_scicomms_driverlib.d" "device\device.d" + -$(RM) "device\F2837xD_CodeStartBranch.d" + -$(RMDIR) $(GEN_MISC_DIRS__QUOTED) + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include ../makefile.targets + diff --git a/28379d_test_SFRA/CPU1_FLASH/objects.mk b/28379d_test_SFRA/CPU1_FLASH/objects.mk new file mode 100644 index 0000000..cf0fec5 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -llibc.a -l"C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_f32_tmu_eabi.lib" + diff --git a/28379d_test_SFRA/CPU1_FLASH/sfra-test.d b/28379d_test_SFRA/CPU1_FLASH/sfra-test.d new file mode 100644 index 0000000..38ac37d --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/sfra-test.d @@ -0,0 +1,300 @@ +# FIXED + +sfra-test.obj: ../sfra-test.c +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_f32.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/driverlib.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +sfra-test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +sfra-test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/device.h +sfra-test.obj: syscfg/board.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/device.h +sfra-test.obj: ../filter_rc.h +sfra-test.obj: ../lowpass.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_gui_scicomms_driverlib.h +sfra-test.obj: C:/Users/zxc/workspace_ccstheia/28379d/device/device.h + +../sfra-test.c: + +C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_f32.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/device.h: + +syscfg/board.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/device.h: + +../filter_rc.h: + +../lowpass.h: + +C:/Users/zxc/workspace_ccstheia/28379d/SFRA/sfra_gui_scicomms_driverlib.h: + +C:/Users/zxc/workspace_ccstheia/28379d/device/device.h: + diff --git a/28379d_test_SFRA/CPU1_FLASH/sfra_test.d b/28379d_test_SFRA/CPU1_FLASH/sfra_test.d new file mode 100644 index 0000000..9abf70c --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/sfra_test.d @@ -0,0 +1,315 @@ +# FIXED + +sfra_test.obj: ../sfra_test.c +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_f32.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h +sfra_test.obj: ../sfra_test.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra_config.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/driverlib.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +sfra_test.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h +sfra_test.obj: syscfg/board.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h +sfra_test.obj: ../lowpass.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdio.h +sfra_test.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdarg.h +sfra_test.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h + +../sfra_test.c: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_f32.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/math.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_defs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_limits.h: + +../sfra_test.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra_config.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h: + +syscfg/board.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h: + +../lowpass.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdio.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdarg.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h: + diff --git a/28379d_test_SFRA/CPU1_FLASH/sfra_test.obj b/28379d_test_SFRA/CPU1_FLASH/sfra_test.obj new file mode 100644 index 0000000000000000000000000000000000000000..eaf30102b08f4d72ed8b3e668cfe57d4e3993777 GIT binary patch literal 77836 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/sources.mk b/28379d_test_SFRA/CPU1_FLASH/sources.mk new file mode 100644 index 0000000..9b80ec8 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/sources.mk @@ -0,0 +1,125 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C55_SRCS := +A_SRCS := +ASM_UPPER_SRCS := +PINMUX_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 := +SYSCFG_SRCS := +K_SRCS := +CLA_SRCS := +S55_SRCS := +LD_UPPER_SRCS := +OUT_SRCS := +LIB_SRCS := +ASM_SRCS := +S_UPPER_SRCS := +SYSCONFIG_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 := +GEN_CMDS := +GEN_FILES := +CLA_DEPS := +S55_DEPS := +SV7A_DEPS := +EXE_OUTPUTS := +C62_DEPS := +C67_DEPS := +GEN_MISC_DIRS := +K_DEPS := +C_DEPS := +CC_DEPS := +BIN_OUTPUTS := +GEN_OPTS := +C++_DEPS := +C43_DEPS := +S43_DEPS := +OBJS := +ASM_DEPS := +GEN_MISC_FILES := +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 := +GEN_MISC_DIRS__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 := +GEN_CMDS__QUOTED := +GEN_MISC_FILES__QUOTED := +C62_DEPS__QUOTED := +C_DEPS__QUOTED := +C_UPPER_DEPS__QUOTED := +C43_DEPS__QUOTED := +CPP_DEPS__QUOTED := +BIN_OUTPUTS__QUOTED := +GEN_FILES__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 := +GEN_OPTS__QUOTED := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ +LIBSFRA \ +SFRA \ +device \ + diff --git a/28379d_test_SFRA/CPU1_FLASH/subdir_rules.mk b/28379d_test_SFRA/CPU1_FLASH/subdir_rules.mk new file mode 100644 index 0000000..a3db5b4 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/subdir_rules.mk @@ -0,0 +1,39 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# Each subdirectory must supply rules for building sources it contributes +build-142458502: ../c2000.syscfg + @echo 'SysConfig - building file: "$<"' + "C:/ti/ccs2050/ccs/utils/sysconfig_1.27.0/sysconfig_cli.bat" -s "C:/ti/C2000Ware_6_00_01_00/.metadata/sdk.json" -d "F2837xD" -p "F2837xD_176PTP" -r "F2837xD_176PTP" --script "C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/c2000.syscfg" --context "CPU1" -o "syscfg" --compiler ccs + @echo 'Finished building: "$<"' + @echo ' ' + +syscfg/board.c: build-142458502 ../c2000.syscfg +syscfg/board.h: build-142458502 +syscfg/board.cmd.genlibs: build-142458502 +syscfg/board.opt: build-142458502 +syscfg/board.json: build-142458502 +syscfg/pinmux.csv: build-142458502 +syscfg/c2000ware_libraries.cmd.genlibs: build-142458502 +syscfg/c2000ware_libraries.opt: build-142458502 +syscfg/c2000ware_libraries.c: build-142458502 +syscfg/c2000ware_libraries.h: build-142458502 +syscfg/clocktree.h: build-142458502 +syscfg: build-142458502 + +syscfg/%.obj: ./syscfg/%.c $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) + @echo 'C2000 Compiler - building file: "$<"' + "C:/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 --fp_mode=relaxed --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/LIBSFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/SFRA" --include_path="C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device" --include_path="C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/" --include_path="C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=_FLASH --define=CPU1 --define=_LAUNCHXL_F28379D --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="syscfg/$(basename $( LED_Blue Pinmux + GPIO_setPinConfig(GPIO_31_GPIO31); + // + // SCIA -> mySCI0 Pinmux + // + GPIO_setPinConfig(mySCI0_SCIRX_PIN_CONFIG); + GPIO_setPadConfig(mySCI0_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP); + GPIO_setQualificationMode(mySCI0_SCIRX_GPIO, GPIO_QUAL_ASYNC); + + GPIO_setPinConfig(mySCI0_SCITX_PIN_CONFIG); + GPIO_setPadConfig(mySCI0_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP); + GPIO_setQualificationMode(mySCI0_SCITX_GPIO, GPIO_QUAL_ASYNC); + + +} + +//***************************************************************************** +// +// CPUTIMER Configurations +// +//***************************************************************************** +void CPUTIMER_init(){ + myCPUTIMER0_init(); +} + +void myCPUTIMER0_init(){ + CPUTimer_setEmulationMode(myCPUTIMER0_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT); + CPUTimer_setPreScaler(myCPUTIMER0_BASE, 0U); + CPUTimer_setPeriod(myCPUTIMER0_BASE, 10000U); + CPUTimer_enableInterrupt(myCPUTIMER0_BASE); + CPUTimer_stopTimer(myCPUTIMER0_BASE); + + CPUTimer_reloadTimerCounter(myCPUTIMER0_BASE); +} + +//***************************************************************************** +// +// GPIO Configurations +// +//***************************************************************************** +void GPIO_init(){ + LED_Blue_init(); +} + +void LED_Blue_init(){ + GPIO_setPadConfig(LED_Blue, GPIO_PIN_TYPE_STD); + GPIO_setQualificationMode(LED_Blue, GPIO_QUAL_SYNC); + GPIO_setDirectionMode(LED_Blue, GPIO_DIR_MODE_OUT); + GPIO_setControllerCore(LED_Blue, GPIO_CORE_CPU1); +} + +//***************************************************************************** +// +// INTERRUPT Configurations +// +//***************************************************************************** +void INTERRUPT_init(){ + + // Interrupt Settings for INT_myCPUTIMER0 + // ISR need to be defined for the registered interrupts + Interrupt_register(INT_myCPUTIMER0, &TIMER0_ISR); + Interrupt_enable(INT_myCPUTIMER0); +} +//***************************************************************************** +// +// SCI Configurations +// +//***************************************************************************** +void SCI_init(){ + mySCI0_init(); +} + +void mySCI0_init(){ + SCI_clearInterruptStatus(mySCI0_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY); + SCI_clearOverflowStatus(mySCI0_BASE); + SCI_resetTxFIFO(mySCI0_BASE); + SCI_resetRxFIFO(mySCI0_BASE); + SCI_resetChannels(mySCI0_BASE); + SCI_setConfig(mySCI0_BASE, DEVICE_LSPCLK_FREQ, mySCI0_BAUDRATE, (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE)); + SCI_disableLoopback(mySCI0_BASE); + SCI_performSoftwareReset(mySCI0_BASE); + SCI_enableFIFO(mySCI0_BASE); + SCI_enableModule(mySCI0_BASE); +} + diff --git a/28379d_test_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs new file mode 100644 index 0000000..4890daf --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.cmd.genlibs @@ -0,0 +1,20 @@ +/* + * ======== board.cmd.genlibs ======== + * Libraries needed to link this application's configuration + * + * NOTE, this feature requires software components configured in your + * system to correctly indicate their dependencies and report the + * libraries needed for your specific configuration. If you find + * errors, please report them on TI's E2E forums + * (https://e2e.ti.com/) so they can be addressed in a future + * release. + * + * This file allows one to portably link applications that use SysConfig + * _without_ having to make changes to build rules when moving to a new + * device OR when upgrading to a new version of a SysConfig enabled + * product. + * + * DO NOT EDIT - This file is generated by the SysConfig tool for the + * TI C/C++ toolchain + */ + diff --git a/28379d_test_SFRA/CPU1_FLASH/syscfg/board.d b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.d new file mode 100644 index 0000000..eba2053 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.d @@ -0,0 +1,273 @@ +# FIXED + +syscfg/board.obj: syscfg/board.c +syscfg/board.obj: syscfg/board.h +syscfg/board.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/driverlib.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h +syscfg/board.obj: C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h +syscfg/board.obj: C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h +syscfg/board.obj: C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h + +syscfg/board.c: + +syscfg/board.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/driverlib.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/adc.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cpu.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/debug.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sysctl.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/interrupt.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hrpwm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/memcfg.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/version.h: + +C:/ti/C2000Ware_6_00_01_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + +C:/Users/zxc/workspace_ccstheia/28379d_test_SFRA/device/device.h: + +C:/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stddef.h: + diff --git a/28379d_test_SFRA/CPU1_FLASH/syscfg/board.h b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.h new file mode 100644 index 0000000..d99c630 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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 BOARD_H +#define BOARD_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +// +// Included Files +// + +#include "driverlib.h" +#include "device.h" + +//***************************************************************************** +// +// PinMux Configurations +// +//***************************************************************************** +// +// GPIO31 - GPIO Settings +// +#define LED_Blue_GPIO_PIN_CONFIG GPIO_31_GPIO31 + +// +// SCIA -> mySCI0 Pinmux +// +// +// SCIRXDA - GPIO Settings +// +#define GPIO_PIN_SCIRXDA 43 +#define mySCI0_SCIRX_GPIO 43 +#define mySCI0_SCIRX_PIN_CONFIG GPIO_43_SCIRXDA +// +// SCITXDA - GPIO Settings +// +#define GPIO_PIN_SCITXDA 42 +#define mySCI0_SCITX_GPIO 42 +#define mySCI0_SCITX_PIN_CONFIG GPIO_42_SCITXDA + +//***************************************************************************** +// +// CPUTIMER Configurations +// +//***************************************************************************** +#define myCPUTIMER0_BASE CPUTIMER0_BASE +void myCPUTIMER0_init(); + +//***************************************************************************** +// +// GPIO Configurations +// +//***************************************************************************** +#define LED_Blue 31 +void LED_Blue_init(); + +//***************************************************************************** +// +// INTERRUPT Configurations +// +//***************************************************************************** + +// Interrupt Settings for INT_myCPUTIMER0 +// ISR need to be defined for the registered interrupts +#define INT_myCPUTIMER0 INT_TIMER0 +#define INT_myCPUTIMER0_INTERRUPT_ACK_GROUP INTERRUPT_ACK_GROUP1 +extern __interrupt void TIMER0_ISR(void); + +//***************************************************************************** +// +// SCI Configurations +// +//***************************************************************************** +#define mySCI0_BASE SCIA_BASE +#define mySCI0_BAUDRATE 115200 +#define mySCI0_CONFIG_WLEN SCI_CONFIG_WLEN_8 +#define mySCI0_CONFIG_STOP SCI_CONFIG_STOP_ONE +#define mySCI0_CONFIG_PAR SCI_CONFIG_PAR_NONE +void mySCI0_init(); + +//***************************************************************************** +// +// Board Configurations +// +//***************************************************************************** +void Board_init(); +void CPUTIMER_init(); +void GPIO_init(); +void INTERRUPT_init(); +void SCI_init(); +void PinMux_init(); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // end of BOARD_H definition diff --git a/28379d_test_SFRA/CPU1_FLASH/syscfg/board.json b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.json new file mode 100644 index 0000000..4490047 --- /dev/null +++ b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.json @@ -0,0 +1,8 @@ +{ + "interruptInfo" : [ + { + "interruptName": "INT_myCPUTIMER0", + "interruptHandler": "TIMER0_ISR" + } + ] +} diff --git a/28379d_test_SFRA/CPU1_FLASH/syscfg/board.obj b/28379d_test_SFRA/CPU1_FLASH/syscfg/board.obj new file mode 100644 index 0000000000000000000000000000000000000000..39fa1f824bdfd7b749b643a5758a45db31ca7f02 GIT binary patch literal 19920 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 + +void sfra_init_all(void) { +#if(SFRA_INT) + fast_tri_init(); +#endif +} + +void sfra_start(sfra_t* sfra) { + sfra->internal_state.start = 1; +} + +sfra_flag_t sfra_is_running(sfra_t* sfra) { + return sfra->internal_state.running; +} + +sfra_flag_t sfra_is_done(sfra_t* sfra) { + return sfra->internal_state.done; +} + +void sfra_clear_done(sfra_t* sfra) { + sfra->internal_state.done = 0; +} + + +static void set_float_if_nonnull(void* base, sfra_size_t offset, sfra_float_t value) { + if (base != 0) { + sfra_float_t* target = (sfra_float_t*) base; + target += offset; + *target = value; + } +} + +static void process_foi_data(sfra_t* sfra) { + sfra_size_t freqIndex = sfra->internal_state.freqIndex; + sfra_float_t dtft_real_num = sfra->internal_state.dtft_real_num; + sfra_float_t dtft_nimg_num = sfra->internal_state.dtft_nimg_num; + sfra_float_t dtft_real_den = sfra->internal_state.dtft_real_den; + sfra_float_t dtft_nimg_den = sfra->internal_state.dtft_nimg_den; + + set_float_if_nonnull(sfra->results.ctrl_real, freqIndex, dtft_real_den); + set_float_if_nonnull(sfra->results.ctrl_nimg, freqIndex, dtft_nimg_den); + set_float_if_nonnull(sfra->results.fb_real, freqIndex, dtft_real_num); + set_float_if_nonnull(sfra->results.fb_nimg, freqIndex, dtft_nimg_num); + + // Calculate gain in dB + sfra_float_t mag = 10.0F * log10f( + (dtft_real_num*dtft_real_num + dtft_nimg_num*dtft_nimg_num) / + (dtft_real_den*dtft_real_den + dtft_nimg_den*dtft_nimg_den) + ); + + // Calculate phase in degrees + sfra_float_t re = dtft_real_num*dtft_real_den + dtft_nimg_num*dtft_nimg_den; + sfra_float_t im = dtft_real_num*dtft_nimg_den - dtft_nimg_num*dtft_real_den; + sfra_float_t phase = atanf(im/re) * 180.0F / M_PI; + if (re < 0.0F) { + if (im < 0.0F) { + phase = phase - 180.0F; + } else { + phase = phase + 180.0F; + } + } + + set_float_if_nonnull(sfra->results.magnitudeVect, freqIndex, mag); + set_float_if_nonnull(sfra->results.phaseVect, freqIndex, phase); +} + +static sfra_size_t calc_cycles(sfra_float_t foi_hz, sfra_float_t isrFreq) { + if (foi_hz < 10.0) { + // DC - 10Hz, attempt to reduce time consumption + return 10; + } else if (foi_hz < 100.0) { + // 10Hz - 100Hz, approximately 1 seconds per foi + return ceilf(foi_hz); + } else { + // 100Hz and above, collect 100 cycles + return 100; + } +} + +static void setup_freq_point(sfra_t* sfra) { + sfra_float_t foi_hz = sfra->results.freqVect[sfra->internal_state.freqIndex]; + sfra_size_t cycles = calc_cycles(foi_hz, sfra->config.isrFreq); + + sfra->internal_state.data_count = ceilf(sfra->config.isrFreq * (float)cycles / foi_hz); + + sfra->internal_state.foi_rad = (float)cycles / (float)sfra->internal_state.data_count * +#if(SFRA_INT) + (float) FAST_SIN_MAPPED_PI * (float) (1 << SFRA_OMEGA_DEC_BITS) +#else + 2.0F * M_PI +#endif + ; + + sfra->internal_state.data_index = 0; + sfra->internal_state.dtft_real_num = 0; + sfra->internal_state.dtft_nimg_num = 0; + sfra->internal_state.dtft_real_den = 0; + sfra->internal_state.dtft_nimg_den = 0; + sfra->internal_state.dtft_running = 1; +} + +void sfra_background_task(sfra_t* sfra) { + if (!sfra->internal_state.running) { + if (sfra->internal_state.start) { + // Start a frequency sweep + sfra->internal_state.start = 0; + sfra->internal_state.running = 1; + sfra->internal_state.freqIndex = 0; + sfra->results.freqVect[0] = sfra->config.freqStart; + setup_freq_point(sfra); + } else { + return; + } + } + + if (sfra->internal_state.dtft_running) { + return; + } + + process_foi_data(sfra); + + sfra->internal_state.freqIndex++; + if (sfra->internal_state.freqIndex < sfra->config.vecLength) { + sfra->results.freqVect[sfra->internal_state.freqIndex] = + sfra->results.freqVect[sfra->internal_state.freqIndex - 1] * + sfra->config.freqStep; + setup_freq_point(sfra); + } else { + // End of frequency sweep + sfra->internal_state.running = 0; + sfra->internal_state.done = 1; + } +} + +#if (SFRA_INT) +SFRA_RAMFUNC(sfra_inject_int32) +fast_tri_ret_type sfra_inject_int32(sfra_t* sfra) { + if (sfra->internal_state.dtft_running) { + fast_tri_omega_type omega = sfra->internal_state.foi_rad * sfra->internal_state.data_index; + omega >>= SFRA_OMEGA_DEC_BITS-1; + fast_tri_ret_type foi_cos = fast_cos(omega); + sfra->internal_state.foi_sin = fast_sin(omega); + sfra->internal_state.foi_cos = foi_cos; + return foi_cos; + } else { + return 0; + } +} + +SFRA_RAMFUNC(sfra_monitor_int32) +void sfra_monitor_int32(sfra_t* sfra, sfra_signal_t input, sfra_signal_t output) { + if (!sfra->internal_state.dtft_running) + return; + + fast_tri_ret_type foi_cos = sfra->internal_state.foi_cos; + fast_tri_ret_type foi_sin = sfra->internal_state.foi_sin; + sfra->internal_state.dtft_real_num += (sfra_integral_t)output * (sfra_integral_t)foi_cos; + sfra->internal_state.dtft_nimg_num += (sfra_integral_t)output * (sfra_integral_t)foi_sin; + sfra->internal_state.dtft_real_den += (sfra_integral_t)input * (sfra_integral_t)foi_cos; + sfra->internal_state.dtft_nimg_den += (sfra_integral_t)input * (sfra_integral_t)foi_sin; + + sfra->internal_state.data_index++; + if (sfra->internal_state.data_index >= sfra->internal_state.data_count) { + sfra->internal_state.dtft_running = 0; + } +} +#else +SFRA_RAMFUNC(sfra_inject) +sfra_float_t sfra_inject(sfra_t* sfra) { + if (sfra->internal_state.dtft_running) { + sfra_float_t omega = sfra->internal_state.foi_rad * sfra->internal_state.data_index; + sfra_float_t foi_cos = SFRA_FLOAT_COS(omega); + sfra->internal_state.foi_sin = SFRA_FLOAT_SIN(omega); + sfra->internal_state.foi_cos = foi_cos; + return foi_cos; + } else { + return 0.0F; + } +} + +SFRA_RAMFUNC(sfra_monitor) +void sfra_monitor(sfra_t* sfra, sfra_float_t input, sfra_float_t output) { + if (!sfra->internal_state.dtft_running) + return; + + sfra_float_t foi_cos = sfra->internal_state.foi_cos; + sfra_float_t foi_sin = sfra->internal_state.foi_sin; + sfra->internal_state.dtft_real_num += output * foi_cos; + sfra->internal_state.dtft_nimg_num += output * foi_sin; + sfra->internal_state.dtft_real_den += input * foi_cos; + sfra->internal_state.dtft_nimg_den += input * foi_sin; + + sfra->internal_state.data_index++; + if (sfra->internal_state.data_index >= sfra->internal_state.data_count) { + sfra->internal_state.dtft_running = 0; + } +} +#endif diff --git a/28379d_test_SFRA/LIBSFRA/libsfra.h b/28379d_test_SFRA/LIBSFRA/libsfra.h new file mode 100644 index 0000000..b1c62d9 --- /dev/null +++ b/28379d_test_SFRA/LIBSFRA/libsfra.h @@ -0,0 +1,131 @@ +#ifndef INC_LIBSFRA_H_ +#define INC_LIBSFRA_H_ + +#include + +#include "libsfra_config.h" + +/* + * In some MCU/DSP, code runs much faster in RAM. + * This is particular for the ISR routine and the function it may call. + * Placing them in the memory yields short execution time and less penalty. + * + * On STM32 GCC + Makefile: + * 1. Declare macro in "libsfra_config.h": + * "#define SFRA_RAMFUNC(functionName) __attribute__ ((long_call, section (".ramfunc")))" + * 2. Add "*(.ramfunc)" to ".data" section. + * + */ +#ifndef SFRA_RAMFUNC +#define SFRA_RAMFUNC(functionName) +#endif + +#if(SFRA_INT) +#include "fast_tri.h" + +#define SFRA_OMEGA_DEC_BITS 8 + +typedef int32_t sfra_signal_t; +typedef int64_t sfra_integral_t; +#else // #if(SFRA_INT) +#include +// Use float accelerated trigonometric functions. +#define SFRA_FLOAT_SIN(omega) sinf(omega) +#define SFRA_FLOAT_COS(omega) cosf(omega) +#endif // #if(SFRA_INT) + +typedef float sfra_float_t; +typedef uint32_t sfra_size_t; +typedef int_least8_t sfra_flag_t; + +typedef struct { + sfra_float_t *ctrl_real; + sfra_float_t *ctrl_nimg; + sfra_float_t *fb_real; + sfra_float_t *fb_nimg; + sfra_float_t *magnitudeVect; + sfra_float_t *phaseVect; + sfra_float_t *freqVect; //!< Frequency Vector +} sfra_result; + +typedef struct { + sfra_float_t isrFreq; //!< SFRA ISR frequency + sfra_float_t freqStart; //!< Start frequency of SFRA sweep + sfra_float_t freqStep; //!< Log space between frequency points (optional) + sfra_size_t vecLength; //!< No. of Points in the SFRA +} sfra_setup; + +typedef struct { + // Outer loop & state machine + sfra_flag_t start; + sfra_flag_t running; + sfra_flag_t done; + sfra_size_t freqIndex; //!< Index of the frequency vector + + // Inner loop & state machine + volatile sfra_flag_t dtft_running; // Set and monitored by main(), clear by sfra_monitor() [in interrupt] + sfra_size_t data_count; // Set by main(), read by sfra_monitor() [in interrupt] + sfra_size_t data_index; // Clear by main(), read and write by sfra_monitor() [in interrupt] + +#if(SFRA_INT) + fast_tri_omega_type foi_rad; // Set by main(), read by sfra_inject() [in interrupt] + fast_tri_ret_type foi_sin; // Pass intermediate value from sfra_inject() to sfra_monitor() + fast_tri_ret_type foi_cos; // Pass intermediate value from sfra_inject() to sfra_monitor() + volatile sfra_integral_t dtft_real_num; // Real part of x_out + volatile sfra_integral_t dtft_nimg_num; // Negative of imaginary part of x_out + volatile sfra_integral_t dtft_real_den; // Real part of x_control + volatile sfra_integral_t dtft_nimg_den; // Negative of imaginary part of x_control +#else + sfra_float_t foi_rad; // Set by main(), read by sfra_inject() [in interrupt] + sfra_float_t foi_sin; // Pass intermediate value from sfra_inject() to sfra_monitor() + sfra_float_t foi_cos; // Pass intermediate value from sfra_inject() to sfra_monitor() + volatile sfra_float_t dtft_real_num; // Real part of x_out + volatile sfra_float_t dtft_nimg_num; // Negative of imaginary part of x_out + volatile sfra_float_t dtft_real_den; // Real part of x_control + volatile sfra_float_t dtft_nimg_den; // Negative of imaginary part of x_control +#endif +} sfra_internal_state; + +typedef struct { + sfra_result results; + sfra_setup config; + sfra_internal_state internal_state; +} sfra_t; + +void sfra_init_all(void); +void sfra_start(sfra_t* sfra); +sfra_flag_t sfra_is_running(sfra_t* sfra); +sfra_flag_t sfra_is_done(sfra_t* sfra); +void sfra_clear_done(sfra_t* sfra); +void sfra_background_task(sfra_t* sfra); + +#if(SFRA_INT) +/* + * Generate a sinusoidal perturbation with unit magnitude. + * + * @param sfra a pointer to an initialized sfra_t struct + * @return the sinusoidal perturbation, [-1,1] mapped to [-FAST_SIN_TABLE_SCALE, FAST_SIN_TABLE_SCALE] + */ +fast_tri_ret_type sfra_inject_int32(sfra_t* sfra); + +/* + * Pass the signals to the "bode plotter". When measuring the open-loop transfer function of a closed-loop system, + * "control" and "feedback" should use the same base as the return value of sfra_inject_int32(). + * + * @param sfra a pointer to an initialized sfra_t struct + * @param control the control output if measuring the open-loop transfer function of a closed-loop system. + * In a plant transfer function measurement, the perturbed reference signal (usually the duty-cycle) should be passed. + * @param feedback the feedback signal, usually is the ADC reading of the output voltage or current. + */ +void sfra_monitor_int32(sfra_t* sfra, sfra_signal_t control, sfra_signal_t feedback); +#else +sfra_float_t sfra_inject(sfra_t* sfra); +void sfra_monitor(sfra_t* sfra, sfra_float_t input, sfra_float_t output); +#endif + +#if(SFRA_HAS_TEST) +void sfra_test_run(void); +void sfra_test_background_task(void); +#endif + +#endif /* INC_LIBSFRA_H_ */ diff --git a/28379d_test_SFRA/LIBSFRA/libsfra_config.h b/28379d_test_SFRA/LIBSFRA/libsfra_config.h new file mode 100644 index 0000000..feb850d --- /dev/null +++ b/28379d_test_SFRA/LIBSFRA/libsfra_config.h @@ -0,0 +1,15 @@ +#ifndef INC_LIBSFRA_CONFIG_H_ +#define INC_LIBSFRA_CONFIG_H_ + +// 使用浮点模式 +#define SFRA_INT 0 + +// 不需要内置的测试代码 +#define SFRA_HAS_TEST 0 + + +#ifndef SFRA_RAMFUNC +#define SFRA_RAMFUNC(functionName) +#endif + +#endif /* INC_LIBSFRA_CONFIG_H_ */ diff --git a/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.c b/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.c new file mode 100644 index 0000000..409b5b5 --- /dev/null +++ b/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.c @@ -0,0 +1,145 @@ +#include "libsfra_ti_hal.h" +#include + +// 静态适配器实例 +static SFRA_F32 g_sfra_adapter; +static sfra_t *g_libsfra = NULL; + +// 标志,用于检测 start 边沿 +static int16_t g_last_start = 0; + +// 需要同步的参数(上位机通过命令修改) +static float32_t g_last_amplitude; + +// 内部函数:同步 libsfra 参数 +static void sync_parameters(void) { + + if (g_sfra_adapter.amplitude != g_last_amplitude) { + g_last_amplitude = g_sfra_adapter.amplitude; + } + + if(g_sfra_adapter.freqStart != g_libsfra->config.freqStart){ + g_libsfra->config.freqStart = g_sfra_adapter.freqStart; + } + + if(g_sfra_adapter.freqStep != g_libsfra->config.freqStep){ + g_libsfra->config.freqStep = g_sfra_adapter.freqStep; + } + +} + +// 检查 start 标志并启动扫频 +static void check_start_flag(void) { + + if (g_sfra_adapter.start == 1 && g_last_start == 0) { + sfra_start(g_libsfra); + g_sfra_adapter.start = 0; // 清除,避免重复触发 + } + g_last_start = g_sfra_adapter.start; +} + +// 更新状态和频率索引 +static void update_status(void) { + + g_sfra_adapter.freqIndex = g_libsfra->internal_state.freqIndex; + + if (sfra_is_running(g_libsfra)) { + g_sfra_adapter.status = 1; // 运行中 + } else if (sfra_is_done(g_libsfra)) { + g_sfra_adapter.status = 2; // 完成 + sfra_clear_done(g_libsfra); + } else { + g_sfra_adapter.status = 0; // 空闲 + } +} + + + +// 注入函数,返回 ref + 扰动 +float SFRA_F32_inject(float ref) { + + float perturb = sfra_inject(g_libsfra); // 返回 -1..1 + return ref + g_sfra_adapter.amplitude * perturb; +} + +// 收集函数 +void SFRA_F32_collect(float *control_output, float *feedback) { + + sfra_monitor(g_libsfra, *control_output, *feedback); +} + +// 后台任务 +void SFRA_F32_runBackgroundTask(SFRA_F32 *obj) { + (void)obj; // 不使用参数,直接用全局 + sync_parameters(); + check_start_flag(); + sfra_background_task(g_libsfra); + update_status(); +} + +// ------------------------------------------------------------ +// 初始化适配器 +// ------------------------------------------------------------ +void libsfra_ti_hal_init(sfra_t *libsfra, + float32_t isrFrequency, + float32_t injectionAmplitude, + int16_t noFreqPoints, + float32_t fraSweepStartFreq, + float32_t freqStep, + float32_t *h_magVect, + float32_t *h_phaseVect, + float32_t *gh_magVect, + float32_t *gh_phaseVect, + float32_t *cl_magVect, + float32_t *cl_phaseVect, + float32_t *freqVect + ) +{ + g_libsfra = libsfra; + g_libsfra->config.isrFreq = isrFrequency; + g_libsfra->config.freqStart = fraSweepStartFreq; + g_libsfra->config.freqStep = freqStep; + g_libsfra->config.vecLength = noFreqPoints; + + g_libsfra->results.freqVect = freqVect; + g_libsfra->results.magnitudeVect = h_magVect; + g_libsfra->results.phaseVect = h_phaseVect; + + + + // 清空适配器结构体 + memset(&g_sfra_adapter, 0, sizeof(SFRA_F32)); + + // 配置指针 + g_sfra_adapter.freqVect = freqVect; + g_sfra_adapter.h_magVect = h_magVect; + g_sfra_adapter.h_phaseVect = h_phaseVect; + // H(s) 和 G(s)H(s) 的数据存储在同一个数组中 + g_sfra_adapter.gh_magVect = h_magVect; + g_sfra_adapter.gh_phaseVect= h_phaseVect; + g_sfra_adapter.cl_magVect = cl_magVect; + g_sfra_adapter.cl_phaseVect= cl_phaseVect; + + g_sfra_adapter.vecLength = noFreqPoints; + g_sfra_adapter.isrFreq = isrFrequency; + g_sfra_adapter.amplitude = injectionAmplitude; + g_sfra_adapter.freqStart = fraSweepStartFreq; + g_sfra_adapter.freqStep = freqStep; + g_sfra_adapter.speed = 1; // 默认速度 + g_sfra_adapter.storeH = 1; // 存储 plant 数据 + g_sfra_adapter.storeGH = 0; + g_sfra_adapter.storeCL = 0; + + g_sfra_adapter.start = 0; + g_sfra_adapter.state = 0; + g_sfra_adapter.status = 0; + g_sfra_adapter.freqIndex = 0; + + // 同步内部影子变量 + g_last_amplitude = injectionAmplitude; + g_last_start = 0; +} + +SFRA_F32* libsfra_ti_hal_get_adapter(void) { + return &g_sfra_adapter; +} diff --git a/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h b/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h new file mode 100644 index 0000000..063cd0d --- /dev/null +++ b/28379d_test_SFRA/LIBSFRA/libsfra_ti_hal.h @@ -0,0 +1,36 @@ +#ifndef LIBSFRA_TI_HAL_H +#define LIBSFRA_TI_HAL_H + +#include "sfra_f32.h" +#include "libsfra.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +void libsfra_ti_hal_init(sfra_t *libsfra, + float32_t isrFrequency, + float32_t injectionAmplitude, + int16_t noFreqPoints, + float32_t fraSweepStartFreq, + float32_t freqStep, + float32_t *h_magVect, + float32_t *h_phaseVect, + float32_t *gh_magVect, + float32_t *gh_phaseVect, + float32_t *cl_magVect, + float32_t *cl_phaseVect, + float32_t *freqVect + ); + +/** + * 获取 TI 适配器结构体指针,用于传给 SFRA_GUI_config + */ +SFRA_F32* libsfra_ti_hal_get_adapter(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/28379d_test_SFRA/SFRA/sfra_f32.h b/28379d_test_SFRA/SFRA/sfra_f32.h new file mode 100644 index 0000000..108ccfe --- /dev/null +++ b/28379d_test_SFRA/SFRA/sfra_f32.h @@ -0,0 +1,182 @@ +//########################################################################### +// +// FILE: sfra_f32.h +// +// TITLE: Prototypes and Definitions for the C28x FPU SFRA Library +// +// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX) +// +//############################################################################# +// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $ +// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $ +// $Copyright: +// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/ +// +// ALL RIGHTS RESERVED +// $ +//############################################################################# + +#ifndef SFRA_F32_H +#define SFRA_F32_H + +#ifdef __cplusplus +extern "C" { +#endif + +//***************************************************************************** +// +//! \addtogroup SFRA +//! @{ +// +//***************************************************************************** + +// +// the includes & defines +// +#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}} + +#include +#include +#include + +#ifdef __TI_EABI__ +#define SFRA_F32_inject __SFRA_F32_inject +#define SFRA_F32_collect __SFRA_F32_collect +#else +#define SFRA_F32_inject _SFRA_F32_inject +#define SFRA_F32_collect _SFRA_F32_collect +#endif +//! \brief Defines the SFRA_F32 structure +//! +//! \details The SFRA_F32 can be used to run a software based +//! frequency response analysis on power converters +//! +typedef struct{ + float32_t *h_magVect; //!< Plant Mag SFRA Vector + float32_t *h_phaseVect; //!< Plant Phase SFRA Vector + float32_t *gh_magVect; //!< Open Loop Mag SFRA Vector + float32_t *gh_phaseVect; //!< Open Loop Phase SFRA Vector + float32_t *cl_magVect; //!< Closed Loop Mag SFRA Vector + float32_t *cl_phaseVect; //!< Closed Loop Phase SFRA Vector + float32_t *freqVect; //!< Frequency Vector + float32_t amplitude; //!< Injection Amplitude + float32_t isrFreq; //!< SFRA ISR frequency + float32_t freqStart; //!< Start frequency of SFRA sweep + float32_t freqStep; //!< Log space between frequency points (optional) + int16_t start; //!< Command to start SFRA + int16_t state; //!< State of SFRA + int16_t status; //!< Status of SFRA + int16_t vecLength; //!< No. of Points in the SFRA + int16_t freqIndex; //!< Index of the frequency vector + int16_t storeH; //!< Flag to indicate if H vector is stored + int16_t storeGH; //!< Flag to indicate if GH vector is stored + int16_t storeCL; //!< Flag to indicate if CL vector is stored + int16_t speed; //!< variable to change the speed of the sweep +}SFRA_F32; + +//! \brief Resets internal data of SFRA_F32 module +//! \param SFRA_F_obj Pointer to the SFRA_F32 structure +//! +extern void SFRA_F32_reset(SFRA_F32 *SFRA_F_obj); + +//! \brief Configures the SFRA_F32 module +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure +//! \param isrFrequency Frequency at which SFRA routine in called, +//! typically the control ISR rate +//! \param injectionAmplitude Per Unit (PU) injection amplitude +//! \param noFreqPoints Number of frequency points sweeped +//! \param fraSweepStartFreq Start frequency of SFRA sweep +//! \param freqStep Multiplier used to keep frequency points log step apart +//! \param *h_magVect Pointer to array that stores plant FRA magnitude data +//! \param *h_phaseVect Pointer to array that stores plant FRA phase data +//! \param *gh_magVect Pointer to array that stores OL FRA magnitude data +//! \param *gh_phaseVect Pointer to array that stores OL FRA phase data +//! \param *cl_magVect Pointer to array that stores OL FRA magnitude data +//! \param *cl_phaseVect Pointer to array that stores OL FRA phase data +//! \param *freqVect Pointer to array that stores the freq points for the sweep +//! \param speed indiactes the speed of the sweep +//! +extern void SFRA_F32_config(SFRA_F32 *SFRA_F_obj, + float32_t isrFrequency, + float32_t injectionAmplitude, + int16_t noFreqPoints, + float32_t fraSweepStartFreq, + float32_t freqStep, + float32_t *h_magVect, + float32_t *h_phaseVect, + float32_t *gh_magVect, + float32_t *gh_phaseVect, + float32_t *cl_magVect, + float32_t *cl_phaseVect, + float32_t *freqVect, + int16_t speed); + +//! \brief Initailizes the freq vectors with points that are log step apart +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure +//! \param fra_sweep_start_freq Start frequency of SFRA sweep +//! \param freqStep Multiplier used to keep frequency points log step apart +//! +extern void SFRA_F32_initFreqArrayWithLogSteps(SFRA_F32 *SFRA_F_obj, + float32_t fra_sweep_start_freq, + float32_t freqStep); + +//! \brief Resets the response data stored in the ol and plant +//! phase and mag vector +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure pointer +//! +extern void SFRA_F32_resetFreqRespArray(SFRA_F32 *SFRA_F_obj); + +//! \brief Updates injection amplitude +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure +//! \param new_injection_amplitude Injection amplitude +//! +extern void SFRA_F32_updateInjectionAmplitude(SFRA_F32 *SFRA_F_obj, + float32_t new_injection_amplitude); + +//! \brief Injects small signal disturbance into the control loop +//! \param ref refernce value on which the injection is added +//! \return Routine returns the reference plus the injection when SFRA sweep +//! is active, when SFRA sweep is not active that is if SFRA state is 0 +//! it returns the the refernce without any change +//! +extern float SFRA_F32_inject(float ref); + +//! \brief Collects the response of the loop because of small signal disturbance +//! injected +//! \param *control_output pointer to the variable where control output is saved +//! note though the parameter is passed by reference +//! it is unchanged by the module +//! \param *feedback pointer to the variable where control output is saved +//! note though the parameter is passed by reference +//! it is unchanged by the module +//! +extern void SFRA_F32_collect(float *control_output, float *feedback); + +//! \brief Runs the background task, this routine executes the state machine +//! when a frequency sweep is started and is responsible for changing +//! the frequency points and saving the measured results in an array +//! \param *SFRA_F_obj Pointer to the SFRA_F32 structure pointer +//! +extern void SFRA_F32_runBackgroundTask(SFRA_F32 *SFRA_F_obj); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#ifdef __cplusplus +} +#endif // extern "C" + +#endif // end of SFRA_F32_H definition diff --git a/28379d_test_SFRA/SFRA/sfra_f32_tmu_eabi.lib b/28379d_test_SFRA/SFRA/sfra_f32_tmu_eabi.lib new file mode 100644 index 0000000000000000000000000000000000000000..0ba7e64a7c25f6c6c4cafc153707ca02fc1c1036 GIT binary patch literal 25368 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

    YJj~|*Y7+NItF6?)+uz6#4kc#Xy9XzBL;p2 za=U?Fhx}y&zXSPO2Ik(-V+J08tk-myKmE@6kYpgH-}!$?=;BepNjMmo&h;Gqfdla* z;KfGz49Lq2OuzH{4NSjt?xSdX^gG{eVEPqy8<@7gW8fu_ziZ$tA^*t05hc@p5anCp z!)aoz52yRqkAm=Pz1NpM&MTX=H(qehMu#B$gkSLC38LSJGsT~Lc%m5P=&M=2NtR#w zWKrr%&k~D#c#62fho@S8>C?noU;1>h*@tI{ulevy@l7AL{nXDBhkWTd;w2x>6|ej7 zEWteh9fBA?Tya5g?1=MxI4I`&a7Zlh;W+U*AC7m|>ZA4(M7=LPQ8fGT5G*lk zHtRo0Z1CZsVv7$C6LC2a(I1 zn*SpR{JpR7^ANZ!tFhVM^xHSvn||-V29bMAns4^cFrGK>AYr*0)2tt}KZl)JzWzr) ze6#=2FWziles{pVCLQRfABdCBFP*>HU-?~u*?;KwelGZ2|Iqv#U@j$VTn0SXDDQIM z5e7ELTiD6*^&;~yHgSK}oFxTodz89FX#@)a=a6SHq!0d}U-JB1?m>v$d+rXJdI{Ql87Uj2(nDOnjXa!AQpl)of7(TJoUshS1Uy@UlUpgnJs60PEXMV|?qMX^4<)tO_^YV+!^2^TppSwQvr}>}LE5As3 zu@@QsB zPiJZTbsB9!yFx~tG_~e*j(O2p?{?!)V14Y~?fi2>-rqv{VD9d^z4c#CQvDEiJm+Ok zH2ucqzMR*W2mL!&9wXM@wek`_i1Yj)yLxB#sc);3e}~G;P4D`73jKGcJjI9E1^kQt zFqD_$N9@iY-9WW>65WQ2`B$IN=7#IB3I1B$_doXjE_b87MmjrV)6ZQ!pxm!@%;$mo z(T*?G;Oeh@qUlm&K0ee3LYflojL}@8y6A;b9X$~KKYkkU@ow|G@9@f%#eIt`!Z{H~ z0gkOW_-@JfX}-^!ybFLeuLH8?@i&6Wt1x(L4c<(Px7grqGI+%nZ>hn%*5H*{ysHh~ zH3shzi?`h1-C*!8vv_>n*Y~^5;C<2J@s(fm=<}uPWrfA#PX^7q$>8zlgIRx@4PL9k zV;M{ye@19~T#MED-fZ!@4BqVqkJp>_wi`T_UEBM*#oKA{8VnxwroH_JkN2eQJ!bJ9 zHF$Lf?~uiN+~ED4!8>a4dJJB~;Jsq;4ja7d4c_l99_{OTt~YppvUtY~UbDeV#EqNv z@~XjGW$;FV$2#I~dWJV}n173bX$)x)SRO1_xXbISLqb%zDe}bM=M4Of>)KNa@^WR8 zd)D^&+tcKI13a$d=%9IvEZ(Do*!#T2>jQ6?HilT+<8NEa`df)N!PEN%q-)-0i^p#z zV)5>?c*C(i!8u0aJ%iYrX7Tz4;gwjt+=STqF0go2;KjO+B^K`+;7y8g zAN3aRDe%U{;B{EMV}sb+V)0Iaw>O5p?G|qj2H(OMyoW8`+u+5r_Y8O#yQ{T{Z9`&z z+rV!E@ZSqZ!K2N2(9|j|$H8wvLXsDHu;2!o`#k6RD+BR=TD-#sPuC-PNhq9Y@2J6> zL}Li#Wm>#r22b}x@`^3qs|IfhjUkY?(Bi#e@TR#e$-C0xy=(BM8@yE(?>&R3=LP1= zb!hW`=?k0+eE|+VUy^sP#T#ev@{rCz-b3JFit<7cc<%wx9_=!4KKucA7-DJ#5dMv$ z{N*5z_I?T;rV5WY2Rz-b|3SYPh&~HgHQckOpSc%+Cwc$^@Kg&I zS$IA$+T0ENMxYjw9s|UDuhxNkbbL?Lfou3`iP%*UZ`X;4i66A^lNSDkh5HRmpZ-4@ znD*EYV)^i6suYRpq0T<4{n9y(v`;&ewVuBvv~N7;EUkCN^09Hf2SIe+MH0a%7J zt#$kS+tpu>j^*B7SX^3ITr#^LFONSifo9K{U67w=xVJC5^kRCqmzOOruaUCp-mX$V zpm)2qm^J9iRdjhL)=E`$Mau9oSAWPmdgWiGOS#*B*nYatb3DX)2Vj4~l&~6+8#dz1 z-+^`*4+XlV7rqaPJ`lWK&*AJ&98=~T{46+|q2sh8`;(l5^MK7ccrlD?J4kW^`*#@* na}MU;q>D8NF9DBvWa40Gp*@|URJr-vKIQx_tzM<;h?o5@0WaZK literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.c b/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.c new file mode 100644 index 0000000..28bed9e --- /dev/null +++ b/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.c @@ -0,0 +1,880 @@ +//########################################################################### +// +// FILE: sfra_gui_scicomms_driverlib.c +// +// TITLE: Comms kernel as an interface to SFRA GUI +// +// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX) +// +//############################################################################# +// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $ +// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $ +// $Copyright: +// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/ +// +// ALL RIGHTS RESERVED +// $ +//############################################################################# + +#include +#include "driverlib.h" +#include "device.h" +#include "sfra_gui_scicomms_driverlib.h" + +// +// Function prototypes for Command RECEIVE State machine +// ------------------------------------------------------------ +// +void SFRA_GUI_getCmdByte(void); +void SFRA_GUI_echoCmdByte(void); +void SFRA_GUI_getSizeByte(void); +void SFRA_GUI_echoSizeByte(void); +void SFRA_GUI_getDataByte(void); +void SFRA_GUI_echoDataByte(void); +void SFRA_GUI_packWord(void); +void SFRA_GUI_packArray(void); +void SFRA_GUI_cmdInterpreter(void); + +// +// Function prototypes for Command Interpreter and dispatcher +// +void SFRA_GUI_lifePulseTsk(void); // 0 +void SFRA_GUI_setText(void); // 1 +void SFRA_GUI_setButton(void); // 2 +void SFRA_GUI_setSlider(void); // 3 +void SFRA_GUI_getVariable(void); // 4 +void SFRA_GUI_getArray(void); // 5 +void SFRA_GUI_getData(void); // 6 +void SFRA_GUI_setData32(void); // 7 +void SFRA_GUI_spareTsk08(void); // 8 + +void SFRA_GUI_sendData(void); + +// +// Variable declarations +// State pointer for Command Packet Receive +// +void (*SFRA_GUI_rcvTaskPointer)(void); + +// +// Array of pointers to Function (that are tasks) +// +void (*SFRA_GUI_cmdDispatcher[SFRA_GUI_CMD_NUMBER])(void); + +volatile int16_t *SFRA_GUI_varSetTxtList[16]; +volatile int16_t *SFRA_GUI_varSetBtnList[16]; +volatile int16_t *SFRA_GUI_varSetSldrList[16]; +volatile int16_t *SFRA_GUI_varGetList[16]; +volatile int32_t *SFRA_GUI_arrayGetList[16]; +volatile int16_t *SFRA_GUI_dataGetList[16]; +volatile uint32_t *SFRA_GUI_dataSetList[16]; + +volatile int16_t SFRA_GUI_commsOKflg; +volatile int16_t SFRA_GUI_serialCommsTimer; + +volatile uint32_t SFRA_GUI_sci_base_addr; + +uint16_t SFRA_GUI_lowByteFlag; +uint16_t SFRA_GUI_sendTaskPtr; +uint16_t SFRA_GUI_rxChar; +uint16_t SFRA_GUI_rxWord; +uint16_t SFRA_GUI_cmdPacket[SFRA_GUI_PKT_SIZE]; +uint16_t SFRA_GUI_taskDoneFlag; +uint16_t SFRA_GUI_numWords; +uint16_t SFRA_GUI_wordsLeftToGet; + +uint16_t SFRA_GUI_dataOut16; +int32_t SFRA_GUI_dataOut32; + +int16_t *SFRA_GUI_memDataPtr16; +int32_t *SFRA_GUI_memDataPtr32; + +// +// for debug +// +int16_t SFRA_GUI_rcvTskPtrShdw; + +int16_t SFRA_GUI_delayer; + +int16_t SFRA_GUI_memGetPtr; +uint32_t SFRA_GUI_memGetAddress; +int16_t SFRA_GUI_memGetAmount; + +int16_t SFRA_GUI_memSetPtr; +uint32_t SFRA_GUI_memSetValue; + +uint32_t SFRA_GUI_temp; + +uint16_t SFRA_GUI_led_flag; +uint16_t SFRA_GUI_led_gpio; + +uint16_t SFRA_GUI_sweep_start; + +void SFRA_GUI_config(volatile uint32_t sci_base, + uint32_t vbus_clk, + uint32_t baudrate, + uint16_t scirx_gpio_pin, + uint32_t scirx_gpio_pin_config, + uint16_t scitx_gpio_pin, + uint32_t scitx_gpio_pin_config, + uint16_t led_indicator_flag, + uint16_t led_gpio_pin, + uint32_t led_gpio_pin_config, + SFRA_F32 *sfra, + uint16_t plot_option) +{ + int16_t j = 0; + + // + // setup Gpio for SCI comms for SFRA + // + + GPIO_setPinConfig(scirx_gpio_pin_config); + GPIO_setPinConfig(scitx_gpio_pin_config); + GPIO_setQualificationMode(scirx_gpio_pin, GPIO_QUAL_ASYNC); + GPIO_setQualificationMode(scitx_gpio_pin, GPIO_QUAL_ASYNC); + + // + // Note: Assumes Clocks to SCI are turned on in setupDevice()->Device_init() + // Note: Assumes GPIO pins for SCIA are configured to Primary function + // + + // + // 1 stop bit, No parity, 8 char bits, + // + SCI_setConfig(sci_base, + vbus_clk, baudrate, + (SCI_CONFIG_WLEN_8 | + SCI_CONFIG_STOP_ONE | + SCI_CONFIG_PAR_NONE)); + // + // No loopback + // + SCI_disableLoopback(sci_base); + + SCI_enableInterrupt(sci_base, SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY); + + // + // Relinquish SCI from Reset by SW Reset and setting TXE, and RXE bits + // + SCI_enableModule(sci_base); + SCI_performSoftwareReset(sci_base); + + HWREGH(sci_base + SCI_O_FFTX) = 0x8040; + HWREGH(sci_base + SCI_O_FFRX) = 0x204f; + HWREGH(sci_base + SCI_O_FFCT) = 0x0; + + // + // Disable RX ERR, SLEEP, TXWAKE + // + SCI_clearInterruptStatus(sci_base, + SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT ); + + // + // Initialize the CmdPacket Rcv Handler state machine ptr + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + // + // DEBUG + // + SFRA_GUI_rcvTskPtrShdw = 1; + // + // Init to 1st state + // + SFRA_GUI_sendTaskPtr = 0; + // + // Start with LSB during Byte-to-Word packing + // + SFRA_GUI_lowByteFlag = 1; + + SFRA_GUI_dataOut16 = 0; + SFRA_GUI_dataOut32 = 0; + + // + // for debug + // + SFRA_GUI_rcvTskPtrShdw = 0; + + SFRA_GUI_delayer = 0; + + SFRA_GUI_memGetPtr = 0; + SFRA_GUI_memGetAddress = 0x00000000; + SFRA_GUI_memGetAmount = 0; + + SFRA_GUI_memSetPtr = 0; + SFRA_GUI_memSetValue = 0x00000000; + + SFRA_GUI_sweep_start = 0; + SFRA_GUI_serialCommsTimer = 0; + SFRA_GUI_commsOKflg = 0; + + SFRA_GUI_sci_base_addr = sci_base; + + // + // clear Command Packet + // + for (j = 0; j < SFRA_GUI_PKT_SIZE; j++) + { + SFRA_GUI_cmdPacket[j] = 0x0; + } + + j = 0; + + // + // init all dispatch Tasks + // + SFRA_GUI_cmdDispatcher[0] = SFRA_GUI_lifePulseTsk; + SFRA_GUI_cmdDispatcher[1] = SFRA_GUI_setText; + SFRA_GUI_cmdDispatcher[2] = SFRA_GUI_setButton; + SFRA_GUI_cmdDispatcher[3] = SFRA_GUI_setSlider; + SFRA_GUI_cmdDispatcher[4] = SFRA_GUI_getVariable; + SFRA_GUI_cmdDispatcher[5] = SFRA_GUI_getArray; + SFRA_GUI_cmdDispatcher[6] = SFRA_GUI_getData; + SFRA_GUI_cmdDispatcher[7] = SFRA_GUI_setData32; + SFRA_GUI_cmdDispatcher[8] = SFRA_GUI_spareTsk08; + + + + SFRA_GUI_varSetBtnList[0] = (int16_t *)&(SFRA_GUI_sweep_start); + + SFRA_GUI_varGetList[0] = (int16_t *)&(sfra->vecLength); + SFRA_GUI_varGetList[1] = (int16_t *)&(sfra->status); + SFRA_GUI_varGetList[2] = (int16_t *)&(sfra->freqIndex); + + // + //"Setable" variables + // assign GUI "setable" by Text parameter address + // + SFRA_GUI_dataSetList[0] = (uint32_t *)&(sfra->freqStart); + SFRA_GUI_dataSetList[1] = (uint32_t *)&(sfra->amplitude); + SFRA_GUI_dataSetList[2] = (uint32_t *)&(sfra->freqStep); + + // + // assign a GUI "getable" parameter array address + // + SFRA_GUI_arrayGetList[0] = (int32_t *)sfra->freqVect; + + + if(plot_option == SFRA_GUI_PLOT_GH_CL) + { + SFRA_GUI_arrayGetList[1] = (int32_t *)sfra->gh_magVect; + SFRA_GUI_arrayGetList[2] = (int32_t *)sfra->gh_phaseVect; + + SFRA_GUI_arrayGetList[3] = (int32_t *)sfra->cl_magVect; + SFRA_GUI_arrayGetList[4] = (int32_t *)sfra->cl_phaseVect; + } + // + // default is to plot gh and h + // + else + { + SFRA_GUI_arrayGetList[1] = (int32_t *)sfra->gh_magVect; + SFRA_GUI_arrayGetList[2] = (int32_t *)sfra->gh_phaseVect; + + SFRA_GUI_arrayGetList[3] = (int32_t *)sfra->h_magVect; + SFRA_GUI_arrayGetList[4] = (int32_t *)sfra->h_phaseVect; + } + + + + SFRA_GUI_arrayGetList[5] = (int32_t *)&(sfra->freqStart); + SFRA_GUI_arrayGetList[6] = (int32_t *)&(sfra->amplitude); + SFRA_GUI_arrayGetList[7] = (int32_t *)&(sfra->freqStep); + + + if(led_indicator_flag == 1) + { + GPIO_setDirectionMode(led_gpio_pin, GPIO_DIR_MODE_OUT); + GPIO_setQualificationMode(led_gpio_pin, GPIO_QUAL_SYNC); + GPIO_setPinConfig(led_gpio_pin_config); + SFRA_GUI_led_flag = 1; + SFRA_GUI_led_gpio = led_gpio_pin; + } + else + { + SFRA_GUI_led_flag = 0; + } + +} + +// +// Host Command RECEIVE and DISPATCH State Machine +// + +// +// State Machine Entry Point +// +void SFRA_GUI_runSerialHostComms(SFRA_F32 *sfra) +{ + if(SFRA_GUI_sweep_start == 1) + { + SFRA_GUI_sweep_start = 0; + sfra->start = 1; + } + // + // Call routine pointed to by state pointer + // + (*SFRA_GUI_rcvTaskPointer)(); + + SFRA_GUI_serialCommsTimer++; +} + + +// +// Task 1 +// +void SFRA_GUI_getCmdByte(void) +{ + // + // check if a char has been received + // + if((SCI_getRxStatus(SFRA_GUI_sci_base_addr) & SCI_RXSTATUS_READY ) != 0) + { + SFRA_GUI_rxChar = SCI_readCharBlockingNonFIFO(SFRA_GUI_sci_base_addr); + // + // point to next state + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_echoCmdByte; + SFRA_GUI_serialCommsTimer = 0; + // + // DEBUG + //RcvTskPtrShdw = 2; + // + SFRA_GUI_echoCmdByte(); + } + // + //~2.5 s timeout, SFRA GUI function is called at 100Hz (recommended) + // hence 2500/100 = 2.5sec + // + else if((SCI_getRxStatus(SFRA_GUI_sci_base_addr)&SCI_RXSTATUS_BREAK) != 0 + || SFRA_GUI_serialCommsTimer > 2500) + { + + SCI_enableModule(SFRA_GUI_sci_base_addr); + + // + // If break detected or serialport times out, reset SCI + //--- Needed by some serialports when code is run with an emulator + // + SCI_performSoftwareReset(SFRA_GUI_sci_base_addr); + + SCI_clearInterruptStatus(SFRA_GUI_sci_base_addr, + SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT); + + asm(" RPT#8 || NOP"); + + // + // Init to 1st state + // + SFRA_GUI_sendTaskPtr = 0; + SFRA_GUI_serialCommsTimer = 0; + + // + // go back and wait for new CMD + // + SFRA_GUI_commsOKflg = 0; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + } + else + { + + } +} + +// +// Task 2 +// +void SFRA_GUI_echoCmdByte(void) +{ + // + // is TXBUF empty ?, that is TXRDY = 1 + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, SFRA_GUI_rxChar); + SFRA_GUI_cmdPacket[0] = SFRA_GUI_rxChar; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getSizeByte; + // + // DEBUG + // RcvTskPtrShdw = 3; + // Un-comment for simple echo test + // RcvTaskPointer = &GetCmdByte; + // Reset Time-out timer + // + SFRA_GUI_serialCommsTimer = 0; + } + +} + +// +// Task 3 +// +void SFRA_GUI_getSizeByte(void) +{ + // + // check if a char has been received + // + if((SCI_getRxStatus(SFRA_GUI_sci_base_addr) & SCI_RXSTATUS_READY ) != 0) + { + SFRA_GUI_rxChar = SCI_readCharBlockingNonFIFO(SFRA_GUI_sci_base_addr); + + // + // point to next state + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_echoSizeByte; + // + // DEBUG + //RcvTskPtrShdw = 4; + // + SFRA_GUI_echoSizeByte(); + } + + // + // 1000*1mS = 1.0 sec timeout, SFRA GUI function is called at 1ms + // + else if(SFRA_GUI_serialCommsTimer > 1000) + { + SFRA_GUI_commsOKflg = 0; + // + // Abort, go back wait for new CMD + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + SFRA_GUI_serialCommsTimer = 0; + } +} + +// +// Task 4 +// +void SFRA_GUI_echoSizeByte(void) +{ + // + // is TXBUF empty ?, that is TXRDY = 1 + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, SFRA_GUI_rxChar); + SFRA_GUI_cmdPacket[1] = SFRA_GUI_rxChar; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getDataByte; + // + // DEBUG + //RcvTskPtrShdw = 5; + // Un-comment for Test + //RcvTaskPointer = &GetCmdByte; + // Reset Time-out timer + // + SFRA_GUI_serialCommsTimer = 0; + } +} + +// +// Task 5 +// +void SFRA_GUI_getDataByte(void) +{ + // + // check if a char has been received + // + if((SCI_getRxStatus(SFRA_GUI_sci_base_addr) & SCI_RXSTATUS_READY ) != 0) + { + SFRA_GUI_rxChar = SCI_readCharBlockingNonFIFO(SFRA_GUI_sci_base_addr); + // + // point to next state + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_echoDataByte; + // + // DEBUG + //RcvTskPtrShdw = 6; + // + SFRA_GUI_echoDataByte(); + } + + // + // 1000*1mS = 1 sec timeout, SFRA GUI function is called at 1ms/100Hz + // + else if(SFRA_GUI_serialCommsTimer > 1000) + { + SFRA_GUI_commsOKflg = 0; + // + // Abort, go back wait for new CMD + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + SFRA_GUI_serialCommsTimer = 0; + } +} + +// +// Task 6 +// +void SFRA_GUI_echoDataByte(void) +{ + // + // is TXBUF empty ?, that is TXRDY = 1 + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, SFRA_GUI_rxChar); + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_packWord; + // + // DEBUG + //RcvTskPtrShdw = 7; + // + } +} + +// +// expects LSB first then MSB // Task 7 +// +void SFRA_GUI_packWord(void) +{ + if(SFRA_GUI_lowByteFlag == 1) + { + SFRA_GUI_rxWord = SFRA_GUI_rxChar; + SFRA_GUI_lowByteFlag = 0; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getDataByte; + // + // DEBUG + // RcvTskPtrShdw = 5; + // + SFRA_GUI_getDataByte(); + } + else + { + SFRA_GUI_rxWord = SFRA_GUI_rxWord | (SFRA_GUI_rxChar << 8); + SFRA_GUI_lowByteFlag = 1; + // + // store data in packet + // + SFRA_GUI_cmdPacket[2] = SFRA_GUI_rxWord; + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_cmdInterpreter; + // + // DEBUG + // RcvTskPtrShdw = 8; + // indicate new task underway + // + SFRA_GUI_taskDoneFlag = 0; + } +} + +// +// Task 8 +// +void SFRA_GUI_cmdInterpreter(void) +{ + if(SFRA_GUI_taskDoneFlag == 0) + { + // + // dispatch Task + // + (*SFRA_GUI_cmdDispatcher[SFRA_GUI_cmdPacket[0]])(); + } + + // + // Incase Task never finishes + // 2500*1mS = 2.5 sec timeout + // + if(SFRA_GUI_serialCommsTimer > 2500) + { + SFRA_GUI_commsOKflg = 0; + // + // Abort, go back wait for new CMD + // + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + SFRA_GUI_serialCommsTimer = 0; + } + if(SFRA_GUI_taskDoneFlag == 1) + { + SFRA_GUI_rcvTaskPointer = &SFRA_GUI_getCmdByte; + // + // DEBUG + //RcvTskPtrShdw = 1; + // + } +} + +// +// Slave Tasks commanded by Host +// + +// +// CmdPacket[0] = 0 +// +void SFRA_GUI_lifePulseTsk(void) +{ + if(SFRA_GUI_led_flag == 1) + { + // + // LED2-ON + // + if(SFRA_GUI_cmdPacket[2] == 0x0000 && SFRA_GUI_cmdPacket[1] == 0x00) + { + GPIO_togglePin(SFRA_GUI_led_gpio); + } + // + // LED2-OFF + // + if(SFRA_GUI_cmdPacket[2] == 0x0001 && SFRA_GUI_cmdPacket[1] == 0x00) + { + GPIO_togglePin(SFRA_GUI_led_gpio); + } + // + // LED2-Toggle + // + if(SFRA_GUI_cmdPacket[2] == 0x0002 && SFRA_GUI_cmdPacket[1] == 0x00) + { + GPIO_togglePin(SFRA_GUI_led_gpio); + } + } + + SFRA_GUI_commsOKflg = 1; + SFRA_GUI_serialCommsTimer = 0; + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 1 +// +void SFRA_GUI_setText(void) +{ + *SFRA_GUI_varSetTxtList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_cmdPacket[2]; + + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 2 +// +void SFRA_GUI_setButton(void) +{ + *SFRA_GUI_varSetBtnList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_cmdPacket[2]; + + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 3 +// +void SFRA_GUI_setSlider(void) +{ + *SFRA_GUI_varSetSldrList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_cmdPacket[2]; + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// CmdPacket[0] = 4 +// +void SFRA_GUI_getVariable(void) +{ + SFRA_GUI_sendData(); +} + +// +//Send a Uint16 array one element at a time +// CmdPacket[0] = 5 +// +void SFRA_GUI_getArray(void) +{ + SFRA_GUI_sendData(); +} + +// +// CmdPacket[0] = 6 +// +void SFRA_GUI_getData(void) +{ + switch(SFRA_GUI_memGetPtr) + { + case 0: + SFRA_GUI_memGetAddress = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memGetPtr = 1; + + SFRA_GUI_wordsLeftToGet = 1; + SFRA_GUI_sendTaskPtr = 1; + SFRA_GUI_taskDoneFlag = 1; + break; + + case 1: + SFRA_GUI_temp = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memGetAddress = SFRA_GUI_memGetAddress + + (SFRA_GUI_temp << 16); + SFRA_GUI_memDataPtr16 = (int16_t *)SFRA_GUI_memGetAddress; + SFRA_GUI_dataOut16 = *SFRA_GUI_memDataPtr16; + SFRA_GUI_sendData(); + + if(SFRA_GUI_taskDoneFlag == 1) + { + SFRA_GUI_memGetPtr = 0; + } + break; + } + + // + // indicate Task execution is complete + // TaskDoneFlag = 1; + // +} + +// +// CmdPacket[0] = 7 [Edited to get 32-bit set text and set label working] +// +void SFRA_GUI_setData32(void) +{ + switch(SFRA_GUI_memSetPtr) + { + case 0: + SFRA_GUI_memSetValue = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memSetPtr = 1; + + SFRA_GUI_taskDoneFlag = 1; + break; + + case 1: + SFRA_GUI_temp = SFRA_GUI_cmdPacket[2]; + SFRA_GUI_memSetValue = SFRA_GUI_memSetValue + (SFRA_GUI_temp << 16); + + *SFRA_GUI_dataSetList[SFRA_GUI_cmdPacket[1]] = SFRA_GUI_memSetValue; + + SFRA_GUI_memSetPtr = 0; + SFRA_GUI_taskDoneFlag = 1; + break; + } + +} + +// +// CmdPacket[0] = 8 +// +void SFRA_GUI_spareTsk08(void) +{ + // + // indicate Task execution is complete + // + SFRA_GUI_taskDoneFlag = 1; +} + +// +// +// +void SFRA_GUI_sendData(void) +{ + if(SFRA_GUI_cmdPacket[0] == 0x04 || SFRA_GUI_cmdPacket[0] == 0x06) + { + switch(SFRA_GUI_sendTaskPtr) + { + case 0: //initialization + + SFRA_GUI_memDataPtr16 = + (int16_t *) SFRA_GUI_varGetList[SFRA_GUI_cmdPacket[1]]; + SFRA_GUI_dataOut16 = *SFRA_GUI_memDataPtr16; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_cmdPacket[2]; + // + //Note that case 0 rolls into case 1 (no break) + // + + case 1: //send LSB + if(SFRA_GUI_wordsLeftToGet > 0) + { + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut16 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 2; + } + } + else + { + SFRA_GUI_sendTaskPtr = 0; + SFRA_GUI_taskDoneFlag = 1; + break; + } + + case 2: //send MSB + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut16 >> 8 & 0x000000FF); + + SFRA_GUI_memDataPtr16 = SFRA_GUI_memDataPtr16 + 1; + SFRA_GUI_dataOut16 = *SFRA_GUI_memDataPtr16; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_wordsLeftToGet - 1; + SFRA_GUI_sendTaskPtr = 1; + } + break; + } + } + else + { + switch(SFRA_GUI_sendTaskPtr) + { + case 0: //initialization + SFRA_GUI_memDataPtr32 = + (int32_t *) SFRA_GUI_arrayGetList[SFRA_GUI_cmdPacket[1]]; + SFRA_GUI_dataOut32 = *SFRA_GUI_memDataPtr32; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_cmdPacket[2]; + // + //Note that case 0 rolls into case 1 (no break) + // + case 1: //send LSB + if(SFRA_GUI_wordsLeftToGet > 0) + { + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 2; + } + } + else + { + SFRA_GUI_sendTaskPtr = 0; + SFRA_GUI_taskDoneFlag = 1; + break; + } + + case 2: + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 >> 8 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 3; + } + + case 3: + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 >> 16 & 0x000000FF); + SFRA_GUI_sendTaskPtr = 4; + } + + case 4: + // + // send MSB + // + if(SCI_isTransmitterBusy(SFRA_GUI_sci_base_addr) == 0) + { + SCI_writeCharBlockingNonFIFO(SFRA_GUI_sci_base_addr, + SFRA_GUI_dataOut32 >> 24 & 0x000000FF); + + SFRA_GUI_memDataPtr32 = SFRA_GUI_memDataPtr32 + 1; + SFRA_GUI_dataOut32 = *SFRA_GUI_memDataPtr32; + SFRA_GUI_wordsLeftToGet = SFRA_GUI_wordsLeftToGet - 1; + SFRA_GUI_sendTaskPtr = 1; + } + break; + default: + break; + } + } + +} + diff --git a/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.h b/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.h new file mode 100644 index 0000000..b4d59ef --- /dev/null +++ b/28379d_test_SFRA/SFRA/sfra_gui_scicomms_driverlib.h @@ -0,0 +1,86 @@ +//########################################################################### +// +// FILE: sfra_gui_scicomms_driverlib.h +// +// TITLE: Comms kernel as an interface to SFRA GUI header file +// +// AUTHOR: Manish Bhardwaj (C2000 Systems Solutions, Houston , TX) +// +//############################################################################# +// $TI Release: C2000 Software Frequency Response Analyzer Library v1.50.02.00 $ +// $Release Date: Tue Aug 26 14:08:13 CDT 2025 $ +// $Copyright: +// Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/ +// +// ALL RIGHTS RESERVED +// $ +//############################################################################# +#ifndef SFRA_GUI_H +#define SFRA_GUI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "driverlib.h" +#include "device.h" +#include "sfra_f32.h" + +#define SFRA_GUI_PKT_SIZE 6 +#define SFRA_GUI_CMD_NUMBER 16 +#define SFRA_GUI_MAX_CMD_NUM 8 + + +#define SFRA_GUI_PLOT_GH_H 1 +#define SFRA_GUI_PLOT_GH_CL 2 + +// +//! \brief Configures the SFRA_GUI module +//! \param sci_base Base address of the SCI module used by the SFRA GUI +//! \param vbus_clk Frequency of the VBUS, used by the SCI module +//! \param baudrate baudrate used by the SFRA GUI +//! \param scirx_gpio_pin GPIO pin used for SCI_RX +//! \param scirx_gpio_pin_config GPIO pin config used for SCI_RX +//! \param scitx_gpio_pin GPIO pin used for SCI_TX +//! \param scitx_gpio_pin_config GPIO pin config used for SCI_TX +//! \param led_indicator_flag Flag to indicate if LED toggle for SFRA_GUI is +//! enabled, 1 -> Enable , anything else Disable +//! \param led_gpio_pin GPIO pin used for LED, if led_flag_indicator is 1 +//! otherwise pass 0 +//! \param led_gpio_pin_config GPIO pin config value for LED, +//! if led_flag_indicator is 1 otherwise pass 0 +//! \param *sfra Pointer to sfra object +//! \param plot_option used to select what SFRA GUI will plot, +//! 1 - GH & H +//! 2 - CL & H +//! +void SFRA_GUI_config( volatile uint32_t sci_base, + uint32_t vbus_clk, + uint32_t baudrate, + uint16_t scirx_gpio_pin, + uint32_t scirx_gpio_pin_config, + uint16_t scitx_gpio_pin, + uint32_t scitx_gpio_pin_config, + uint16_t led_indicator_flag, + uint16_t led_gpio_pin, + uint32_t led_gpio_pin_config, + SFRA_F32 *sfra, + uint16_t plot_option); + +// +//! \brief Runs the serial host comms GUI , +//! needs to be called at ~100ms for proper function +//! \param *sfra Pointer to sfra object +//! +void SFRA_GUI_runSerialHostComms(SFRA_F32 *sfra); + + + +#ifdef __cplusplus +} +#endif // extern "C" + +#endif // end of SFRA_F32_H definition + + diff --git a/28379d_test_SFRA/c2000.syscfg b/28379d_test_SFRA/c2000.syscfg new file mode 100644 index 0000000..0b6de30 --- /dev/null +++ b/28379d_test_SFRA/c2000.syscfg @@ -0,0 +1,45 @@ +/** + * These arguments were used when this file was generated. They will be automatically applied on subsequent loads + * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. + * @cliArgs --device "F2837xD" --part "F2837xD_176PTP" --package "F2837xD_176PTP" --context "CPU1" --product "C2000WARE@6.00.01.00" + * @v2CliArgs --device "TMS320F28379D" --package "176PTP" --context "CPU1" --product "C2000WARE@6.00.01.00" + * @versions {"tool":"1.27.0+4565"} + */ + +/** + * Import the modules used in this configuration. + */ +const cputimer = scripting.addModule("/driverlib/cputimer.js", {}, false); +const cputimer1 = cputimer.addInstance(); +const gpio = scripting.addModule("/driverlib/gpio.js", {}, false); +const gpio1 = gpio.addInstance(); +const sci = scripting.addModule("/driverlib/sci.js", {}, false); +const sci1 = sci.addInstance(); + +/** + * Write custom configuration values to the imported modules. + */ +const mux6 = system.clockTree["OSCCLKSRCSEL"]; +mux6.inputSelect = "INTOSC1"; + +const pinFunction1 = system.clockTree["AUXCLK"]; +pinFunction1.XTAL_Freq = 10; + +cputimer1.$name = "myCPUTIMER0"; +cputimer1.timerPeriod = 10000; +cputimer1.enableInterrupt = true; +cputimer1.registerInterrupts = true; +cputimer1.timerInt.enableInterrupt = true; +cputimer1.timerInt.interruptHandler = "TIMER0_ISR"; + +gpio1.direction = "GPIO_DIR_MODE_OUT"; +gpio1.$name = "LED_Blue"; +gpio1.gpioPin.$assign = "GPIO31"; + +sci1.$name = "mySCI0"; +sci1.useInterrupts = false; +sci1.sci.$assign = "SCIA"; +sci1.sci.scirxdPin.$assign = "GPIO43"; +sci1.sci.scitxdPin.$assign = "GPIO42"; +sci1.rxQual.$name = "myGPIOQUAL0"; +sci1.txQual.$name = "myGPIOQUAL1"; diff --git a/28379d_test_SFRA/device/F2837xD_CodeStartBranch.asm b/28379d_test_SFRA/device/F2837xD_CodeStartBranch.asm new file mode 100644 index 0000000..c7c23be --- /dev/null +++ b/28379d_test_SFRA/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-2025 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/28379d_test_SFRA/device/device.c b/28379d_test_SFRA/device/device.c new file mode 100644 index 0000000..fbd6855 --- /dev/null +++ b/28379d_test_SFRA/device/device.c @@ -0,0 +1,706 @@ +//############################################################################# +// +// FILE: device.c +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2025 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/28379d_test_SFRA/device/device.h b/28379d_test_SFRA/device/device.h new file mode 100644 index 0000000..3ec6f79 --- /dev/null +++ b/28379d_test_SFRA/device/device.h @@ -0,0 +1,394 @@ +//############################################################################# +// +// FILE: device.h +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2025 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/28379d_test_SFRA/device/driverlib.h b/28379d_test_SFRA/device/driverlib.h new file mode 100644 index 0000000..5d5985e --- /dev/null +++ b/28379d_test_SFRA/device/driverlib.h @@ -0,0 +1,87 @@ +//############################################################################# +// +// FILE: driverlib.h +// +// TITLE: C28x Driverlib Header File +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2025 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/28379d_test_SFRA/device/driverlib/adc.c b/28379d_test_SFRA/device/driverlib/adc.c new file mode 100644 index 0000000..a4371c1 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/adc.c @@ -0,0 +1,342 @@ +//########################################################################### +// +// FILE: adc.c +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/adc.h b/28379d_test_SFRA/device/driverlib/adc.h new file mode 100644 index 0000000..2e5e442 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/adc.h @@ -0,0 +1,2098 @@ +//########################################################################### +// +// FILE: adc.h +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/asysctl.c b/28379d_test_SFRA/device/driverlib/asysctl.c new file mode 100644 index 0000000..029b5c5 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/asysctl.c @@ -0,0 +1,43 @@ +//########################################################################### +// +// FILE: asysctl.c +// +// TITLE: C28x Driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/asysctl.h b/28379d_test_SFRA/device/driverlib/asysctl.h new file mode 100644 index 0000000..dccba07 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/asysctl.h @@ -0,0 +1,160 @@ +//########################################################################### +// +// FILE: asysctl.h +// +// TITLE: C28x driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/can.c b/28379d_test_SFRA/device/driverlib/can.c new file mode 100644 index 0000000..af33864 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/can.c @@ -0,0 +1,1122 @@ +//########################################################################### +// +// FILE: can.c +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/can.h b/28379d_test_SFRA/device/driverlib/can.h new file mode 100644 index 0000000..9367593 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/can.h @@ -0,0 +1,1924 @@ +//########################################################################### +// +// FILE: can.h +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib.lib b/28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..84fe7d9b9322141d0f7c6f0be6bdc041e6556ec6 GIT binary patch literal 698 zcma)4O-sW-5S`stEm6diJqcUMK|LfUO=AxtRIm^zdg(o1P3S_klBC6(MLgu8i@P^)VjTXaV01Er6YzEQf133@c)qk$0?MaH8^ zk>p_7C{@9#32ax+5@`1qy)GdH>&`*o8E5*z(}Fs{kR3n;D0KFa3cW(kFTHhqjP3Rv zE*i)tI#sexwh8!t-}6iDzM|d8hk20|VT6hQh0s?4_+Gk$e(R5qg%Zpwm5VS(YY3u1 Y)GC$fde1xeF1uIe%0EDEkFh}e0-R-N)&Kwi literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib_coff.lib b/28379d_test_SFRA/device/driverlib/ccs/Debug/driverlib_coff.lib new file mode 100644 index 0000000000000000000000000000000000000000..6294eedf788a6bcc79ed64541ceae6523ee04ca5 GIT binary patch literal 575952 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∨g!$}R1Tl^AOAcb# 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

    ZTO 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

  • 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⋙5Nbds^RNCZcQ+@WGQAyoaqRm@2*>_hF(MRE* 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

    (c0cXw!5E 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/28379d_test_SFRA/device/driverlib/cla.c b/28379d_test_SFRA/device/driverlib/cla.c new file mode 100644 index 0000000..6f28d7b --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cla.c @@ -0,0 +1,89 @@ +//########################################################################### +// +// FILE: cla.c +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/cla.h b/28379d_test_SFRA/device/driverlib/cla.h new file mode 100644 index 0000000..e4ddc85 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cla.h @@ -0,0 +1,984 @@ +//########################################################################### +// +// FILE: cla.h +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/clb.c b/28379d_test_SFRA/device/driverlib/clb.c new file mode 100644 index 0000000..becb9ab --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/clb.c @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: clb.c +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/clb.h b/28379d_test_SFRA/device/driverlib/clb.h new file mode 100644 index 0000000..e750d19 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/clb.h @@ -0,0 +1,1290 @@ +//########################################################################### +// +// FILE: clb.h +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/cmpss.c b/28379d_test_SFRA/device/driverlib/cmpss.c new file mode 100644 index 0000000..70715c9 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cmpss.c @@ -0,0 +1,223 @@ +//########################################################################### +// +// FILE: cmpss.c +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/cmpss.h b/28379d_test_SFRA/device/driverlib/cmpss.h new file mode 100644 index 0000000..0bc5de3 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cmpss.h @@ -0,0 +1,1325 @@ +//########################################################################### +// +// FILE: cmpss.h +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/cpu.h b/28379d_test_SFRA/device/driverlib/cpu.h new file mode 100644 index 0000000..050e279 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cpu.h @@ -0,0 +1,172 @@ +//########################################################################### +// +// FILE: cpu.h +// +// TITLE: Useful C28x CPU defines. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/cputimer.c b/28379d_test_SFRA/device/driverlib/cputimer.c new file mode 100644 index 0000000..1f68c20 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cputimer.c @@ -0,0 +1,61 @@ +//############################################################################# +// +// FILE: cputimer.c +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/cputimer.h b/28379d_test_SFRA/device/driverlib/cputimer.h new file mode 100644 index 0000000..9fc9c64 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/cputimer.h @@ -0,0 +1,509 @@ +//############################################################################# +// +// FILE: cputimer.h +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/dac.h b/28379d_test_SFRA/device/driverlib/dac.h new file mode 100644 index 0000000..35c082c --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/dac.h @@ -0,0 +1,604 @@ +//########################################################################### +// +// FILE: dac.h +// +// TITLE: C28x DAC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/dcsm.c b/28379d_test_SFRA/device/driverlib/dcsm.c new file mode 100644 index 0000000..03f808a --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/dcsm.c @@ -0,0 +1,377 @@ +//############################################################################# +// +// FILE: dcsm.c +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/dcsm.h b/28379d_test_SFRA/device/driverlib/dcsm.h new file mode 100644 index 0000000..f6d2253 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/dcsm.h @@ -0,0 +1,669 @@ +//############################################################################# +// +// FILE: dcsm.h +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/debug.h b/28379d_test_SFRA/device/driverlib/debug.h new file mode 100644 index 0000000..8696954 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/debug.h @@ -0,0 +1,91 @@ +//########################################################################### +// +// FILE: debug.h +// +// TITLE: Assert definition macro for debug. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/dma.c b/28379d_test_SFRA/device/driverlib/dma.c new file mode 100644 index 0000000..bac3729 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/dma.c @@ -0,0 +1,370 @@ +//########################################################################### +// +// FILE: dma.c +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/dma.h b/28379d_test_SFRA/device/driverlib/dma.h new file mode 100644 index 0000000..7b253b1 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/dma.h @@ -0,0 +1,1171 @@ +//########################################################################### +// +// FILE: dma.h +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/driver_inclusive_terminology_mapping.h b/28379d_test_SFRA/device/driverlib/driver_inclusive_terminology_mapping.h new file mode 100644 index 0000000..00e9ac6 --- /dev/null +++ b/28379d_test_SFRA/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/28379d_test_SFRA/device/driverlib/ecap.c b/28379d_test_SFRA/device/driverlib/ecap.c new file mode 100644 index 0000000..957b0c5 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/ecap.c @@ -0,0 +1,61 @@ +//########################################################################### +// +// FILE: ecap.c +// +// TITLE: C28x ECAP driver +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/ecap.h b/28379d_test_SFRA/device/driverlib/ecap.h new file mode 100644 index 0000000..630c603 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/ecap.h @@ -0,0 +1,1164 @@ +//########################################################################### +// +// FILE: ecap.h +// +// TITLE: C28x ECAP driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/emif.c b/28379d_test_SFRA/device/driverlib/emif.c new file mode 100644 index 0000000..66a4c90 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/emif.c @@ -0,0 +1,46 @@ +//########################################################################### +// +// FILE: emif.c +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/emif.h b/28379d_test_SFRA/device/driverlib/emif.h new file mode 100644 index 0000000..16a85f1 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/emif.h @@ -0,0 +1,1369 @@ +//########################################################################### +// +// FILE: emif.h +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/epwm.c b/28379d_test_SFRA/device/driverlib/epwm.c new file mode 100644 index 0000000..cf1cfcf --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/epwm.c @@ -0,0 +1,363 @@ +//########################################################################### +// +// FILE: epwm.c +// +// TITLE: C28x EPWM driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/epwm.h b/28379d_test_SFRA/device/driverlib/epwm.h new file mode 100644 index 0000000..99605b8 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/epwm.h @@ -0,0 +1,7496 @@ +//############################################################################# +// +// FILE: epwm.h +// +// TITLE: C28x EPWM Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/eqep.c b/28379d_test_SFRA/device/driverlib/eqep.c new file mode 100644 index 0000000..134d52e --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/eqep.c @@ -0,0 +1,149 @@ +//########################################################################### +// +// FILE: eqep.c +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/eqep.h b/28379d_test_SFRA/device/driverlib/eqep.h new file mode 100644 index 0000000..082db20 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/eqep.h @@ -0,0 +1,1691 @@ +//########################################################################### +// +// FILE: eqep.h +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/flash.c b/28379d_test_SFRA/device/driverlib/flash.c new file mode 100644 index 0000000..3d683c2 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/flash.c @@ -0,0 +1,175 @@ +//########################################################################### +// +// FILE: flash.c +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/flash.h b/28379d_test_SFRA/device/driverlib/flash.h new file mode 100644 index 0000000..57ae8c0 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/flash.h @@ -0,0 +1,1671 @@ +//########################################################################### +// +// FILE: flash.h +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/gpio.c b/28379d_test_SFRA/device/driverlib/gpio.c new file mode 100644 index 0000000..6ffe086 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/gpio.c @@ -0,0 +1,489 @@ +//########################################################################### +// +// FILE: gpio.c +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/gpio.h b/28379d_test_SFRA/device/driverlib/gpio.h new file mode 100644 index 0000000..2b1b408 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/gpio.h @@ -0,0 +1,1047 @@ +//########################################################################### +// +// FILE: gpio.h +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/hrpwm.c b/28379d_test_SFRA/device/driverlib/hrpwm.c new file mode 100644 index 0000000..c43107f --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/hrpwm.c @@ -0,0 +1,47 @@ +//########################################################################### +// +// FILE: hrpwm.c +// +// TITLE: C28x HRPWM driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/hrpwm.h b/28379d_test_SFRA/device/driverlib/hrpwm.h new file mode 100644 index 0000000..f1bea62 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/hrpwm.h @@ -0,0 +1,1657 @@ +//############################################################################# +// +// FILE: hrpwm.h +// +// TITLE: C28x HRPWM Driver +// +//############################################################################# +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/hw_reg_inclusive_terminology.h b/28379d_test_SFRA/device/driverlib/hw_reg_inclusive_terminology.h new file mode 100644 index 0000000..d3dc018 --- /dev/null +++ b/28379d_test_SFRA/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/28379d_test_SFRA/device/driverlib/i2c.c b/28379d_test_SFRA/device/driverlib/i2c.c new file mode 100644 index 0000000..b6bc156 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/i2c.c @@ -0,0 +1,351 @@ +//########################################################################### +// +// FILE: i2c.c +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/i2c.h b/28379d_test_SFRA/device/driverlib/i2c.h new file mode 100644 index 0000000..46fa0b7 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/i2c.h @@ -0,0 +1,1386 @@ +//########################################################################### +// +// FILE: i2c.h +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_adc.h b/28379d_test_SFRA/device/driverlib/inc/hw_adc.h new file mode 100644 index 0000000..8d1578a --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_adc.h @@ -0,0 +1,911 @@ +//########################################################################### +// +// FILE: hw_adc.h +// +// TITLE: Definitions for the ADC registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_asysctl.h b/28379d_test_SFRA/device/driverlib/inc/hw_asysctl.h new file mode 100644 index 0000000..25ee807 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_asysctl.h @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: hw_asysctl.h +// +// TITLE: Definitions for the ASYSCTL registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_can.h b/28379d_test_SFRA/device/driverlib/inc/hw_can.h new file mode 100644 index 0000000..9b05495 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_can.h @@ -0,0 +1,514 @@ +//########################################################################### +// +// FILE: hw_can.h +// +// TITLE: Definitions for the CAN registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_cla.h b/28379d_test_SFRA/device/driverlib/inc/hw_cla.h new file mode 100644 index 0000000..3d90a64 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_cla.h @@ -0,0 +1,241 @@ +//########################################################################### +// +// FILE: hw_cla.h +// +// TITLE: Definitions for the CLA registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_clb.h b/28379d_test_SFRA/device/driverlib/inc/hw_clb.h new file mode 100644 index 0000000..f362bc9 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_clb.h @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: hw_clb.h +// +// TITLE: Definitions for the CLB registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_clbxbar.h b/28379d_test_SFRA/device/driverlib/inc/hw_clbxbar.h new file mode 100644 index 0000000..8518d84 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_clbxbar.h @@ -0,0 +1,1272 @@ +//########################################################################### +// +// FILE: hw_clbxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_cmpss.h b/28379d_test_SFRA/device/driverlib/inc/hw_cmpss.h new file mode 100644 index 0000000..46ae283 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_cmpss.h @@ -0,0 +1,235 @@ +//########################################################################### +// +// FILE: hw_cmpss.h +// +// TITLE: Definitions for the CMPSS registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_cputimer.h b/28379d_test_SFRA/device/driverlib/inc/hw_cputimer.h new file mode 100644 index 0000000..577a7b8 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_cputimer.h @@ -0,0 +1,112 @@ +//########################################################################### +// +// FILE: hw_cputimer.h +// +// TITLE: Definitions for the CPUTIMER registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_dac.h b/28379d_test_SFRA/device/driverlib/inc/hw_dac.h new file mode 100644 index 0000000..a43d0ce --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_dac.h @@ -0,0 +1,122 @@ +//########################################################################### +// +// FILE: hw_dac.h +// +// TITLE: Definitions for the DAC registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_dcsm.h b/28379d_test_SFRA/device/driverlib/inc/hw_dcsm.h new file mode 100644 index 0000000..df618e4 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_dcsm.h @@ -0,0 +1,442 @@ +//########################################################################### +// +// FILE: hw_dcsm.h +// +// TITLE: Definitions for the DCSM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_dma.h b/28379d_test_SFRA/device/driverlib/inc/hw_dma.h new file mode 100644 index 0000000..63d1d1e --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_dma.h @@ -0,0 +1,165 @@ +//########################################################################### +// +// FILE: hw_dma.h +// +// TITLE: Definitions for the DMA registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_ecap.h b/28379d_test_SFRA/device/driverlib/inc/hw_ecap.h new file mode 100644 index 0000000..2b624bb --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_ecap.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_ecap.h +// +// TITLE: Definitions for the ECAP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_emif.h b/28379d_test_SFRA/device/driverlib/inc/hw_emif.h new file mode 100644 index 0000000..b3f57f9 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_emif.h @@ -0,0 +1,259 @@ +//########################################################################### +// +// FILE: hw_emif.h +// +// TITLE: Definitions for the EMIF registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_epwm.h b/28379d_test_SFRA/device/driverlib/inc/hw_epwm.h new file mode 100644 index 0000000..89347dc --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_epwm.h @@ -0,0 +1,1050 @@ +//########################################################################### +// +// FILE: hw_epwm.h +// +// TITLE: Definitions for the EPWM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_epwmxbar.h b/28379d_test_SFRA/device/driverlib/inc/hw_epwmxbar.h new file mode 100644 index 0000000..d3dd068 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_epwmxbar.h @@ -0,0 +1,1192 @@ +//########################################################################### +// +// FILE: hw_epwmxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_eqep.h b/28379d_test_SFRA/device/driverlib/inc/hw_eqep.h new file mode 100644 index 0000000..bb82497 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_eqep.h @@ -0,0 +1,225 @@ +//########################################################################### +// +// FILE: hw_eqep.h +// +// TITLE: Definitions for the EQEP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_flash.h b/28379d_test_SFRA/device/driverlib/inc/hw_flash.h new file mode 100644 index 0000000..99b3cf0 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_flash.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_flash.h +// +// TITLE: Definitions for the FLASH registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_gpio.h b/28379d_test_SFRA/device/driverlib/inc/hw_gpio.h new file mode 100644 index 0000000..df5a00b --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_gpio.h @@ -0,0 +1,4018 @@ +//########################################################################### +// +// FILE: hw_gpio.h +// +// TITLE: Definitions for the GPIO registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_hic.h b/28379d_test_SFRA/device/driverlib/inc/hw_hic.h new file mode 100644 index 0000000..9e3e0fb --- /dev/null +++ b/28379d_test_SFRA/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 v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_hrpwm.h b/28379d_test_SFRA/device/driverlib/inc/hw_hrpwm.h new file mode 100644 index 0000000..9850368 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_hrpwm.h @@ -0,0 +1,1058 @@ +//########################################################################### +// +// FILE: hw_hrpwm.h +// +// TITLE: Definitions for the HRPWM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_i2c.h b/28379d_test_SFRA/device/driverlib/inc/hw_i2c.h new file mode 100644 index 0000000..e228836 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_i2c.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_i2c.h +// +// TITLE: Definitions for the I2C registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_inputxbar.h b/28379d_test_SFRA/device/driverlib/inc/hw_inputxbar.h new file mode 100644 index 0000000..14785ea --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_inputxbar.h @@ -0,0 +1,92 @@ +//########################################################################### +// +// FILE: hw_inputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_ints.h b/28379d_test_SFRA/device/driverlib/inc/hw_ints.h new file mode 100644 index 0000000..d49c58d --- /dev/null +++ b/28379d_test_SFRA/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/28379d_test_SFRA/device/driverlib/inc/hw_ipc.h b/28379d_test_SFRA/device/driverlib/inc/hw_ipc.h new file mode 100644 index 0000000..b80b187 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_ipc.h @@ -0,0 +1,323 @@ +//########################################################################### +// +// FILE: hw_ipc.h +// +// TITLE: Definitions for the IPC registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_mcbsp.h b/28379d_test_SFRA/device/driverlib/inc/hw_mcbsp.h new file mode 100644 index 0000000..4598bc2 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_mcbsp.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_mcbsp.h +// +// TITLE: Definitions for the MCBSP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_memcfg.h b/28379d_test_SFRA/device/driverlib/inc/hw_memcfg.h new file mode 100644 index 0000000..4673bcd --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_memcfg.h @@ -0,0 +1,870 @@ +//########################################################################### +// +// FILE: hw_memcfg.h +// +// TITLE: Definitions for the MEMCFG registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_memmap.h b/28379d_test_SFRA/device/driverlib/inc/hw_memmap.h new file mode 100644 index 0000000..45bfd0d --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_memmap.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_memmap.h +// +// TITLE: Macros defining the memory map of the C28x. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_nmi.h b/28379d_test_SFRA/device/driverlib/inc/hw_nmi.h new file mode 100644 index 0000000..4afb13a --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_nmi.h @@ -0,0 +1,134 @@ +//########################################################################### +// +// FILE: hw_nmi.h +// +// TITLE: Definitions for the NMI registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_otp.h b/28379d_test_SFRA/device/driverlib/inc/hw_otp.h new file mode 100644 index 0000000..c0721f4 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_otp.h @@ -0,0 +1,63 @@ +//########################################################################### +// +// FILE: hw_otp.h +// +// TITLE: Definitions for the OTP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_outputxbar.h b/28379d_test_SFRA/device/driverlib/inc/hw_outputxbar.h new file mode 100644 index 0000000..7d54b0a --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_outputxbar.h @@ -0,0 +1,1340 @@ +//########################################################################### +// +// FILE: hw_outputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_pie.h b/28379d_test_SFRA/device/driverlib/inc/hw_pie.h new file mode 100644 index 0000000..e7fdc30 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_pie.h @@ -0,0 +1,636 @@ +//########################################################################### +// +// FILE: hw_pie.h +// +// TITLE: Definitions for the PIE registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_sci.h b/28379d_test_SFRA/device/driverlib/inc/hw_sci.h new file mode 100644 index 0000000..e418165 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_sci.h @@ -0,0 +1,209 @@ +//########################################################################### +// +// FILE: hw_sci.h +// +// TITLE: Definitions for the SCI registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_sdfm.h b/28379d_test_SFRA/device/driverlib/inc/hw_sdfm.h new file mode 100644 index 0000000..1008154 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_sdfm.h @@ -0,0 +1,431 @@ +//########################################################################### +// +// FILE: hw_sdfm.h +// +// TITLE: Definitions for the SDFM registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_spi.h b/28379d_test_SFRA/device/driverlib/inc/hw_spi.h new file mode 100644 index 0000000..399ea31 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_spi.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_spi.h +// +// TITLE: Definitions for the SPI registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_sysctl.h b/28379d_test_SFRA/device/driverlib/inc/hw_sysctl.h new file mode 100644 index 0000000..3a2ca40 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_sysctl.h @@ -0,0 +1,1428 @@ +//########################################################################### +// +// FILE: hw_sysctl.h +// +// TITLE: Definitions for the SYSCTL registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_types.h b/28379d_test_SFRA/device/driverlib/inc/hw_types.h new file mode 100644 index 0000000..3fb031a --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_types.h @@ -0,0 +1,166 @@ +//########################################################################### +// +// FILE: hw_types.h +// +// TITLE: Type definitions used in driverlib functions. +// +//########################################################################### +// +// C2000Ware v6.00.01.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((int16_t *)(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/28379d_test_SFRA/device/driverlib/inc/hw_upp.h b/28379d_test_SFRA/device/driverlib/inc/hw_upp.h new file mode 100644 index 0000000..1a735d6 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_upp.h @@ -0,0 +1,306 @@ +//########################################################################### +// +// FILE: hw_upp.h +// +// TITLE: Definitions for the UPP registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_usb.h b/28379d_test_SFRA/device/driverlib/inc/hw_usb.h new file mode 100644 index 0000000..653f599 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_usb.h @@ -0,0 +1,4614 @@ +//########################################################################### +// +// FILE: hw_usb.h +// +// TITLE: Definitions for the USB registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_xbar.h b/28379d_test_SFRA/device/driverlib/inc/hw_xbar.h new file mode 100644 index 0000000..ca276e9 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_xbar.h @@ -0,0 +1,271 @@ +//########################################################################### +// +// FILE: hw_xbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/inc/hw_xint.h b/28379d_test_SFRA/device/driverlib/inc/hw_xint.h new file mode 100644 index 0000000..bab3b4e --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/inc/hw_xint.h @@ -0,0 +1,108 @@ +//########################################################################### +// +// FILE: hw_xint.h +// +// TITLE: Definitions for the XINT registers. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/interrupt.c b/28379d_test_SFRA/device/driverlib/interrupt.c new file mode 100644 index 0000000..aa41a92 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/interrupt.c @@ -0,0 +1,425 @@ +//########################################################################### +// +// FILE: interrupt.c +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/interrupt.h b/28379d_test_SFRA/device/driverlib/interrupt.h new file mode 100644 index 0000000..78760f7 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/interrupt.h @@ -0,0 +1,504 @@ +//########################################################################### +// +// FILE: interrupt.h +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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); + +//***************************************************************************** +// +// Extern compiler intrinsic prototypes. See compiler User's Guide for details. +// +//***************************************************************************** +extern uint16_t __disable_interrupts(void); +extern uint16_t __enable_interrupts(void); + +//***************************************************************************** +// +// 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/28379d_test_SFRA/device/driverlib/ipc.c b/28379d_test_SFRA/device/driverlib/ipc.c new file mode 100644 index 0000000..b6509d1 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/ipc.c @@ -0,0 +1,445 @@ +//########################################################################### +// +// FILE: ipc.c +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/ipc.h b/28379d_test_SFRA/device/driverlib/ipc.h new file mode 100644 index 0000000..5e95212 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/ipc.h @@ -0,0 +1,880 @@ +//########################################################################### +// +// FILE: ipc.h +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/mcbsp.c b/28379d_test_SFRA/device/driverlib/mcbsp.c new file mode 100644 index 0000000..0c10160 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/mcbsp.c @@ -0,0 +1,1621 @@ +//########################################################################### +// +// FILE: mcbsp.c +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/mcbsp.h b/28379d_test_SFRA/device/driverlib/mcbsp.h new file mode 100644 index 0000000..e003224 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/mcbsp.h @@ -0,0 +1,3340 @@ +//########################################################################### +// +// FILE: mcbsp.h +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/memcfg.c b/28379d_test_SFRA/device/driverlib/memcfg.c new file mode 100644 index 0000000..a9fa1a7 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/memcfg.c @@ -0,0 +1,701 @@ +//########################################################################### +// +// FILE: memcfg.c +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/memcfg.h b/28379d_test_SFRA/device/driverlib/memcfg.h new file mode 100644 index 0000000..b5185f9 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/memcfg.h @@ -0,0 +1,1266 @@ +//########################################################################### +// +// FILE: memcfg.h +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/pin_map.h b/28379d_test_SFRA/device/driverlib/pin_map.h new file mode 100644 index 0000000..884f3f8 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/pin_map.h @@ -0,0 +1,894 @@ +//########################################################################### +// +// FILE: pin_map.h +// +// TITLE: Definitions of pin mux info for gpio.c. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/pin_map_legacy.h b/28379d_test_SFRA/device/driverlib/pin_map_legacy.h new file mode 100644 index 0000000..2ae6218 --- /dev/null +++ b/28379d_test_SFRA/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 v6.00.01.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/28379d_test_SFRA/device/driverlib/sci.c b/28379d_test_SFRA/device/driverlib/sci.c new file mode 100644 index 0000000..2458227 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/sci.c @@ -0,0 +1,421 @@ +//########################################################################### +// +// FILE: sci.c +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/sci.h b/28379d_test_SFRA/device/driverlib/sci.h new file mode 100644 index 0000000..27013e5 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/sci.h @@ -0,0 +1,1646 @@ +//########################################################################### +// +// FILE: sci.h +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/sdfm.c b/28379d_test_SFRA/device/driverlib/sdfm.c new file mode 100644 index 0000000..b7a28b8 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/sdfm.c @@ -0,0 +1,188 @@ +//########################################################################### +// +// FILE: sdfm.c +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/sdfm.h b/28379d_test_SFRA/device/driverlib/sdfm.h new file mode 100644 index 0000000..dd7139c --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/sdfm.h @@ -0,0 +1,1178 @@ +//########################################################################### +// +// FILE: sdfm.h +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/spi.c b/28379d_test_SFRA/device/driverlib/spi.c new file mode 100644 index 0000000..910152a --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/spi.c @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: spi.c +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/spi.h b/28379d_test_SFRA/device/driverlib/spi.h new file mode 100644 index 0000000..2dfbce5 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/spi.h @@ -0,0 +1,1743 @@ +//########################################################################### +// +// FILE: spi.h +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/sysctl.c b/28379d_test_SFRA/device/driverlib/sysctl.c new file mode 100644 index 0000000..25dd980 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/sysctl.c @@ -0,0 +1,1469 @@ +//########################################################################### +// +// FILE: sysctl.c +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/sysctl.h b/28379d_test_SFRA/device/driverlib/sysctl.h new file mode 100644 index 0000000..39ffbcc --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/sysctl.h @@ -0,0 +1,3531 @@ +//########################################################################### +// +// FILE: sysctl.h +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/upp.c b/28379d_test_SFRA/device/driverlib/upp.c new file mode 100644 index 0000000..72a1e1b --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/upp.c @@ -0,0 +1,298 @@ +//########################################################################### +// +// FILE: upp.c +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/upp.h b/28379d_test_SFRA/device/driverlib/upp.h new file mode 100644 index 0000000..2337868 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/upp.h @@ -0,0 +1,1574 @@ +//########################################################################### +// +// FILE: upp.h +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/usb.h b/28379d_test_SFRA/device/driverlib/usb.h new file mode 100644 index 0000000..7d5f908 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/usb.h @@ -0,0 +1,560 @@ +//########################################################################### +// +// FILE: usb.h +// +// TITLE: Prototypes for the USB Interface Driver. +// +//########################################################################### +// +// +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/version.c b/28379d_test_SFRA/device/driverlib/version.c new file mode 100644 index 0000000..f6490af --- /dev/null +++ b/28379d_test_SFRA/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 v6.00.01.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/28379d_test_SFRA/device/driverlib/version.h b/28379d_test_SFRA/device/driverlib/version.h new file mode 100644 index 0000000..9be429c --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/version.h @@ -0,0 +1,100 @@ +//########################################################################### +// +// FILE: version.h +// +// TITLE: API to return the version number of the driverlib.lib in use. +// +//########################################################################### +// +// C2000Ware v6.00.01.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 6000100U + +//***************************************************************************** +// +//! 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 x.xx.xx.xx, so for +//! example, if the function returns 2100200, the driverlib version being used +//! is 2.10.02.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/28379d_test_SFRA/device/driverlib/xbar.c b/28379d_test_SFRA/device/driverlib/xbar.c new file mode 100644 index 0000000..f6b5a9c --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/xbar.c @@ -0,0 +1,255 @@ +//########################################################################### +// +// FILE: xbar.c +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/device/driverlib/xbar.h b/28379d_test_SFRA/device/driverlib/xbar.h new file mode 100644 index 0000000..fc8b4f9 --- /dev/null +++ b/28379d_test_SFRA/device/driverlib/xbar.h @@ -0,0 +1,1294 @@ +//########################################################################### +// +// FILE: xbar.h +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v6.00.01.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/28379d_test_SFRA/lowpass.h b/28379d_test_SFRA/lowpass.h new file mode 100644 index 0000000..75256dc --- /dev/null +++ b/28379d_test_SFRA/lowpass.h @@ -0,0 +1,46 @@ +#ifndef LOWPASS_H +#define LOWPASS_H + +#include + +// 一阶低通滤波器结构体 +typedef struct { + float b0, b1; // 分子系数 + float a1; // 分母系数 (a0 归一化为 1) + float x1; // 上一个输入样本 + float y1; // 上一个输出样本 +} LowPassFilter_t; + +/** + * 初始化低通滤波器 + * @param f 滤波器结构体指针 + * @param fs 采样频率 (Hz) + * @param fc 截止频率 (-3dB 频率) (Hz) + */ +static inline void LowPassFilter_Init(LowPassFilter_t *f, float fs, float fc) { + // 预畸变角频率: w = 2 * pi * fc / fs, 然后 tan(w/2) + float wc = 2.0f * M_PI * fc / fs; + float tan_wc2 = tanf(wc * 0.5f); + float den = 1.0f + tan_wc2; + f->b0 = tan_wc2 / den; + f->b1 = f->b0; + f->a1 = (tan_wc2 - 1.0f) / den; + f->x1 = 0.0f; + f->y1 = 0.0f; +} + +/** + * 运行低通滤波器 + * @param f 滤波器结构体指针 + * @param x 当前输入样本 + * @return 滤波后的输出 + */ +static inline float LowPassFilter_Run(LowPassFilter_t *f, float x) { + // y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1] + float y = f->b0 * x + f->b1 * f->x1 - f->a1 * f->y1; + f->x1 = x; + f->y1 = y; + return y; +} + +#endif // LOWPASS_H diff --git a/28379d_test_SFRA/main.c b/28379d_test_SFRA/main.c new file mode 100644 index 0000000..029e692 --- /dev/null +++ b/28379d_test_SFRA/main.c @@ -0,0 +1,105 @@ +//############################################################################# +// +// FILE: empty_driverlib_main.c +// +// TITLE: Empty Project +// +// Empty Project Example +// +// This example is an empty project setup for Driverlib development. +// +//############################################################################# +// +// +// $Copyright: +// Copyright (C) 2013-2025 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" +#include "device.h" +#include "board.h" +#include "c2000ware_libraries.h" + +#include "sfra_test.h" +// +// Main +// +void main(void) +{ + + // + // Initialize device clock and peripherals + // + Device_init(); + + // + // Disable pin locks and enable internal pull-ups. + // + Device_initGPIO(); + + // + // Initialize PIE and clear PIE registers. Disables CPU interrupts. + // + Interrupt_initModule(); + + // + // Initialize the PIE vector table with pointers to the shell Interrupt + // Service Routines (ISR). + // + Interrupt_initVectorTable(); + + // + // PinMux and Peripheral Initialization + // + Board_init(); + + sfra_init(); + + // + // Enable Global Interrupt (INTM) and real time interrupt (DBGM) + // + EINT; + ERTM; + + while(1) + { + sfra_task_run(); + } +} + + +// +// End of File +// diff --git a/28379d_test_SFRA/sfra_test.c b/28379d_test_SFRA/sfra_test.c new file mode 100644 index 0000000..a05c363 --- /dev/null +++ b/28379d_test_SFRA/sfra_test.c @@ -0,0 +1,257 @@ +#include "sfra_f32.h" +#include "sfra_test.h" +#include "libsfra.h" +#include "lowpass.h" +#include "sfra_gui_scicomms_driverlib.h" +#include +#include "libsfra_ti_hal.h" + +#define TI_SFRA 0 +#define LIBSFRA 1 +#define LIBSFRA_HAL_TI 2 + +#define SFRA_TYPE LIBSFRA_HAL_TI + +// sfra变量定义 +SFRA_F32 ti_sfra; + +#define CONTROL_ISR_FREQUENCY ((float32_t)100 * 1000) // 100KHz + +#define SFRA_ISR_FREQ CONTROL_ISR_FREQUENCY +#define SFRA_FREQ_START 10 +// +// SFRA step Multiply = 10^(1/No of steps per decade(40)) +// +#define SFRA_FREQ_STEP_MULTIPLY (float32_t)1.105 +#define SFRA_AMPLITUDE (float32_t)0.1 +#define SFRA_FREQ_LENGTH 100 + +float32_t plantMagVect[SFRA_FREQ_LENGTH]; +float32_t plantPhaseVect[SFRA_FREQ_LENGTH]; +float32_t olMagVect[SFRA_FREQ_LENGTH]; +float32_t olPhaseVect[SFRA_FREQ_LENGTH]; +float32_t clMagVect[SFRA_FREQ_LENGTH]; +float32_t clPhaseVect[SFRA_FREQ_LENGTH]; +float32_t freqVect[SFRA_FREQ_LENGTH]; +// +//extern to access tables in ROM +// +extern long FPUsinTable[]; + + +// libsfra变量定义 +// Size of each SFRA result buffer field +#define SFRA_BUF_SIZE 100 + +typedef struct { + float freq[SFRA_BUF_SIZE]; // In Hz, log-spaced + float mag[SFRA_BUF_SIZE]; // In dB + float phase[SFRA_BUF_SIZE]; // In degrees +} sfra_results_t; + +// Holds measured bode plot +sfra_results_t libsfra_results; + +// Declare the SFRA instance +sfra_t libsfra = { + .config.isrFreq = CONTROL_ISR_FREQUENCY, // Sampling frequency + .config.freqStart = 10, // Start frequency + .config.freqStep = 1.584893192461113, // Frequency step (log-spaced) + .config.vecLength = SFRA_BUF_SIZE, // Number of sweeps + .results.freqVect = libsfra_results.freq, // Points to the frequency vector + .results.magnitudeVect = libsfra_results.mag, // Points to the magnitude vector + .results.phaseVect = libsfra_results.phase // Points to the phase vector +}; + + +// hal层变量 +sfra_t hal_sfra; + + + +// lowpass filter +LowPassFilter_t lowPass_test; +#define FS CONTROL_ISR_FREQUENCY +#define FC 10.0f * 1000 + + +// 通信串口,LED +#define SFRA_GUI_SCI_BASE SCIA_BASE +#define SFRA_GUI_VBUS_CLK DEVICE_LSPCLK_FREQ +#define SFRA_GUI_SCI_BAUDRATE 115200 +#define SFRA_GUI_SCIRX_GPIO 43 +#define SFRA_GUI_SCITX_GPIO 42 +#define SFRA_GUI_SCIRX_GPIO_PIN_CONFIG GPIO_43_SCIRXDA +#define SFRA_GUI_SCITX_GPIO_PIN_CONFIG GPIO_42_SCITXDA + +#define SFRA_GUI_LED_INDICATOR 1 +#define SFRA_GUI_LED_GPIO 31 +#define SFRA_GUI_LED_GPIO_PIN_CONFIG GPIO_31_GPIO31 + + +void sfra_init() +{ + CPUTimer_setPeriod(CPUTIMER0_BASE, + (DEVICE_SYSCLK_FREQ / CONTROL_ISR_FREQUENCY) - 1); + CPUTimer_startTimer(CPUTIMER0_BASE); + + LowPassFilter_Init(&lowPass_test, FS, FC); + + +#if SFRA_TYPE == TI_SFRA + + SFRA_F32_reset(&ti_sfra); + SFRA_F32_config(&ti_sfra, + SFRA_ISR_FREQ, + SFRA_AMPLITUDE, + SFRA_FREQ_LENGTH, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY, + plantMagVect, + plantPhaseVect, + olMagVect, + olPhaseVect, + clMagVect, + clPhaseVect, + freqVect, + 1); + SFRA_F32_resetFreqRespArray(&ti_sfra); + SFRA_F32_initFreqArrayWithLogSteps(&ti_sfra, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY); + SFRA_GUI_config(SFRA_GUI_SCI_BASE, + SFRA_GUI_VBUS_CLK, + SFRA_GUI_SCI_BAUDRATE, + SFRA_GUI_SCIRX_GPIO, + SFRA_GUI_SCIRX_GPIO_PIN_CONFIG, + SFRA_GUI_SCITX_GPIO, + SFRA_GUI_SCITX_GPIO_PIN_CONFIG, + SFRA_GUI_LED_INDICATOR, + SFRA_GUI_LED_GPIO, + SFRA_GUI_LED_GPIO_PIN_CONFIG, + &ti_sfra, + SFRA_GUI_PLOT_GH_CL); + +#elif SFRA_TYPE == LIBSFRA + + // libsfra + sfra_init_all(); + + sfra_start(&libsfra); + +#elif SFRA_TYPE == LIBSFRA_HAL_TI + + // 初始化 HAL 适配层 + libsfra_ti_hal_init(&hal_sfra, + SFRA_ISR_FREQ, + SFRA_AMPLITUDE, + SFRA_FREQ_LENGTH, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY, + plantMagVect, + plantPhaseVect, + olMagVect, + olPhaseVect, + clMagVect, + clPhaseVect, + freqVect); + SFRA_GUI_config(SFRA_GUI_SCI_BASE, + SFRA_GUI_VBUS_CLK, + SFRA_GUI_SCI_BAUDRATE, + SFRA_GUI_SCIRX_GPIO, + SFRA_GUI_SCIRX_GPIO_PIN_CONFIG, + SFRA_GUI_SCITX_GPIO, + SFRA_GUI_SCITX_GPIO_PIN_CONFIG, + SFRA_GUI_LED_INDICATOR, + SFRA_GUI_LED_GPIO, + SFRA_GUI_LED_GPIO_PIN_CONFIG, + libsfra_ti_hal_get_adapter(), + SFRA_GUI_PLOT_GH_H); + +#endif +} + + +// ==================== 打印 LIBSFRA 结果(CSV 格式)==================== +/** + * 将 SFRA 测量结果通过串口输出为 CSV 格式 + * @param res 指向 sfra_results_t 结构体的指针 + * @param num_points 结果点数(即 SFRA_FREQ_LENGTH) + */ +void sfra_print_results_csv(sfra_results_t *res, int num_points) +{ + char lineBuf[64]; + int i; + + UARTprintf("Frequency(Hz),Magnitude(dB),Phase(deg)\n"); + + for (i = 0; i < num_points; i++) { + int pos = 0; + // 频率 + pos += floatToStr5(res->freq[i], lineBuf + pos); + lineBuf[pos++] = ','; + // 增益 (dB) + pos += floatToStr5(res->mag[i], lineBuf + pos); + lineBuf[pos++] = ','; + // 相位 (度) + pos += floatToStr5(res->phase[i], lineBuf + pos); + lineBuf[pos++] = '\n'; + lineBuf[pos] = '\0'; + UARTprintf(lineBuf); + } +} + + +void sfra_task_run() +{ + DEVICE_DELAY_US(1.0f *1000); + +#if SFRA_TYPE == TI_SFRA + + SFRA_F32_runBackgroundTask(&ti_sfra); + SFRA_GUI_runSerialHostComms(&ti_sfra); + +#elif SFRA_TYPE == LIBSFRA + + sfra_background_task(&libsfra); + if(sfra_is_done(&libsfra)) + { + sfra_print_results_csv(&libsfra_results, SFRA_BUF_SIZE); + sfra_clear_done(&libsfra); + } + +#elif SFRA_TYPE == LIBSFRA_HAL_TI + + SFRA_F32_runBackgroundTask(libsfra_ti_hal_get_adapter()); + SFRA_GUI_runSerialHostComms(libsfra_ti_hal_get_adapter()); + +#endif + +} + +__interrupt void TIMER0_ISR() +{ + static float32_t input_dc = 0.8f; + float32_t plant_input; + float32_t plant_output; + +#if (SFRA_TYPE == TI_SFRA) || (SFRA_TYPE == LIBSFRA_HAL_TI) + plant_input = SFRA_F32_inject(input_dc); +#elif SFRA_TYPE == LIBSFRA + plant_input = input_dc + 0.1f * sfra_inject(&libsfra); +#endif + + // 直通,用于测试SFRA,plant扫描结果应为0°,0db + // plant_output = plant_input; + + // 注入扫描lowpass + plant_output = LowPassFilter_Run(&lowPass_test, plant_input); + +#if (SFRA_TYPE == TI_SFRA) || (SFRA_TYPE == LIBSFRA_HAL_TI) + SFRA_F32_collect(&plant_input, &plant_output); +#elif SFRA_TYPE == LIBSFRA + sfra_monitor(&libsfra, plant_input, plant_output); +#endif + + Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); +} diff --git a/28379d_test_SFRA/sfra_test.h b/28379d_test_SFRA/sfra_test.h new file mode 100644 index 0000000..cb7549f --- /dev/null +++ b/28379d_test_SFRA/sfra_test.h @@ -0,0 +1,94 @@ +#ifndef _SFRA_TEST_H_ +#define _SFRA_TEST_H_ + +#include "libsfra.h" +#include "driverlib.h" +#include "device.h" +#include "board.h" + + +void sfra_init(void); +void sfra_task_run(void); + + +static inline void UARTprintf(const char *pcString) +{ + while (*pcString != '\0') + { + SCI_writeCharBlockingFIFO(SCIA_BASE, *pcString++); + } +} + +// ==================== 整数转字符串(支持负数、32位)==================== +static inline int int32ToStr(int32_t num, char *str) +{ + int i = 0; + int isNegative = 0; + if (num < 0) { + isNegative = 1; + num = -num; + } + // 逆序存储数字 + do { + str[i++] = (num % 10) + '0'; + num /= 10; + } while (num > 0); + + if (isNegative) { + str[i++] = '-'; + } + // 反转字符串 + int start = 0; + int end = i - 1; + while (start < end) { + char temp = str[start]; + str[start] = str[end]; + str[end] = temp; + start++; + end--; + } + str[i] = '\0'; + return i; +} + +// ==================== 浮点数转字符串(固定5位小数)==================== +static inline int floatToStr5(float value, char *buf) +{ + int len = 0; + int isNegative = 0; + if (value < 0) { + isNegative = 1; + value = -value; + } + + // 乘以 100000 并四舍五入 + int64_t scaled = (int64_t)(value * 100000.0f + 0.5f); + int32_t intPart = (int32_t)(scaled / 100000); + int32_t fracPart = (int32_t)(scaled % 100000); + + // 负号 + if (isNegative) { + buf[len++] = '-'; + } + + // 整数部分 + len += int32ToStr(intPart, buf + len); + buf[len++] = '.'; + + // 小数部分补零到5位 + char fracBuf[6]; + int fracLen = int32ToStr(fracPart, fracBuf); + int i; + for (i = 0; i < 5 - fracLen; i++) { + buf[len++] = '0'; + } + for (i = 0; i < fracLen; i++) { + buf[len++] = fracBuf[i]; + } + + buf[len] = '\0'; + return len; +} + + +#endif diff --git a/28379d_test_SFRA/targetConfigs/TMS320F28377D.ccxml b/28379d_test_SFRA/targetConfigs/TMS320F28377D.ccxml new file mode 100644 index 0000000..79dd5cc --- /dev/null +++ b/28379d_test_SFRA/targetConfigs/TMS320F28377D.ccxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/28379d_test_SFRA/targetConfigs/readme.txt b/28379d_test_SFRA/targetConfigs/readme.txt new file mode 100644 index 0000000..d783fef --- /dev/null +++ b/28379d_test_SFRA/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/README.md b/README.md index 5c08d9c..b6cd547 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,129 @@ -# SFRA_F32 +# sfra_f32.c使用教程 +请参考博客:https://blog.zxcli.top/post/9 +所需文件为: +![](./fig/所需文件.png) +变量定义以及初始化: +``` +// sfra变量定义 +SFRA_F32 ti_sfra; +#define CONTROL_ISR_FREQUENCY ((float32_t)100 * 1000) // 100KHz + +#define SFRA_ISR_FREQ CONTROL_ISR_FREQUENCY +#define SFRA_FREQ_START 10 +// +// SFRA step Multiply = 10^(1/No of steps per decade(40)) +// +#define SFRA_FREQ_STEP_MULTIPLY (float32_t)1.105 +#define SFRA_AMPLITUDE (float32_t)0.1 +#define SFRA_FREQ_LENGTH 100 + +float32_t plantMagVect[SFRA_FREQ_LENGTH]; +float32_t plantPhaseVect[SFRA_FREQ_LENGTH]; +float32_t olMagVect[SFRA_FREQ_LENGTH]; +float32_t olPhaseVect[SFRA_FREQ_LENGTH]; +float32_t clMagVect[SFRA_FREQ_LENGTH]; +float32_t clPhaseVect[SFRA_FREQ_LENGTH]; +float32_t freqVect[SFRA_FREQ_LENGTH]; + + +// 通信串口,LED +#define SFRA_GUI_SCI_BASE SCIA_BASE +#define SFRA_GUI_VBUS_CLK DEVICE_LSPCLK_FREQ +#define SFRA_GUI_SCI_BAUDRATE 115200 +#define SFRA_GUI_SCIRX_GPIO 43 +#define SFRA_GUI_SCITX_GPIO 42 +#define SFRA_GUI_SCIRX_GPIO_PIN_CONFIG GPIO_43_SCIRXDA +#define SFRA_GUI_SCITX_GPIO_PIN_CONFIG GPIO_42_SCITXDA + +#define SFRA_GUI_LED_INDICATOR 1 +#define SFRA_GUI_LED_GPIO 31 +#define SFRA_GUI_LED_GPIO_PIN_CONFIG GPIO_31_GPIO31 + + +void sfra_init() +{ + SFRA_F32_reset(&ti_sfra); + SFRA_F32_config(&ti_sfra, + SFRA_ISR_FREQ, + SFRA_AMPLITUDE, + SFRA_FREQ_LENGTH, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY, + plantMagVect, + plantPhaseVect, + olMagVect, + olPhaseVect, + clMagVect, + clPhaseVect, + freqVect, + 1); + SFRA_F32_resetFreqRespArray(&ti_sfra); + SFRA_F32_initFreqArrayWithLogSteps(&ti_sfra, + SFRA_FREQ_START, + SFRA_FREQ_STEP_MULTIPLY); + SFRA_GUI_config(SFRA_GUI_SCI_BASE, + SFRA_GUI_VBUS_CLK, + SFRA_GUI_SCI_BAUDRATE, + SFRA_GUI_SCIRX_GPIO, + SFRA_GUI_SCIRX_GPIO_PIN_CONFIG, + SFRA_GUI_SCITX_GPIO, + SFRA_GUI_SCITX_GPIO_PIN_CONFIG, + SFRA_GUI_LED_INDICATOR, + SFRA_GUI_LED_GPIO, + SFRA_GUI_LED_GPIO_PIN_CONFIG, + &ti_sfra, + SFRA_GUI_PLOT_GH_CL); + +} +``` +后台任务: +``` +void sfra_task_run() +{ + + SFRA_F32_runBackgroundTask(&ti_sfra); + SFRA_GUI_runSerialHostComms(&ti_sfra); + +} +``` +数据收集: +``` +__interrupt void TIMER0_ISR() +{ + static float32_t input_dc = 0.8f; + float32_t plant_input; + float32_t plant_output; + + plant_input = SFRA_F32_inject(input_dc); + + + // 直通,用于测试SFRA,plant扫描结果应为0°,0db + // plant_output = plant_input; + + // 注入扫描lowpass + plant_output = LowPassFilter_Run(&lowPass_test, plant_input); + + SFRA_F32_collect(&plant_input, &plant_output); + + Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); +} + +``` + +# 28379d_test_SFRA +该工程为文章中SFRA和LIBSFRA节所使用的工程。 +CCS版本为20.5 +C2000Ware版本为6.0.1.00 +Build Configurations请选择为CPU1_FLASH +通过更改sfra_test.c中的SFRA_TYPE宏,即可指定使用SFRA、LIBSFRA和兼容上位机的LIBSFAR中的一个。 +![](./fig/SFRA_TYPE.png) +当SFRA_TYPE为TI_SFRA时,请将`libsfra_ti_hal.c`排除编译。 +![](./fig/排除编译.png) +当SFRA_TYPE为LIBSFRA_HAL_TI时,请将`sfra_f32_tmu_eabi.lib`排除编译。 +![](./fig/排除编译1.png) +# 28379d_P_SFRA +该工程为使用`sfra_f32.c`的工程。 +CCS版本为20.5 +C2000Ware版本为6.0.1.00 +Build Configurations请选择为CPU1_FLASH diff --git a/fig/SFRA_TYPE.png b/fig/SFRA_TYPE.png new file mode 100644 index 0000000000000000000000000000000000000000..6e60b43a5dadb849f7e4dcbfe0037d741e9c99c5 GIT binary patch literal 12205 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 Ln)2nc(BS_AXqsYm literal 0 HcmV?d00001 diff --git a/fig/所需文件.png b/fig/所需文件.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc4790d43b5b152443ff5c81681e65dc64794d4 GIT binary patch literal 4809 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 OAai4^QH8;cnEwG|j1g-9 literal 0 HcmV?d00001 diff --git a/fig/排除编译.png b/fig/排除编译.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8df74bf261e3d08c83ba522800cc4333c031e7 GIT binary patch literal 28823 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%0AW_<6Yg2Ggms47cY8Dv~nSLfZXi$*$utu>tI+ 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 literal 0 HcmV?d00001

    aH(VET(Sf1>T!1ZKAs@wh8^e|JxR_1HSQjyX?xp_XKaAR@TAV&0FK*0-*m3H zoU!lg5YjsLiY2#fia1tRsp~uP1UqggxVLm=NI!=E)Gm*nh`Bi7)V(X6+iS^<-FHXw z{2ut92M*W33wfGvduRCf`b3U+2hVVD>K-7^&z>ps@x8kQv$5B?9)#oN@hyt$OSql_ zi{z4oJHWsVA)M;(yj=bwUfPa)a0oBl_Xct~-=es3aN{5wj{oZTDDHB?bpgw_DDGLp zS94z3&y#M{B=HhkmtJ4@qUI9>P$=MLl$wkYlm!W|^A zNbY08A-r?9D1GbyG7|6M>yO*OUq3o z9G@HVElS@U!VMOf%U!IsV=*{>JU<^t8n~r|8)D#A5bh`gcRAtIc*N_W*KZBs)Hukw v8_|vg8DDM&cZe*H?(PH!w`56~`2e`R$fFxiy6?lpJ}CwFp2^tb5#0X(!i`?d literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/device/driverlib/ccs/Release/driverlib.lib b/28379d_test_SFRA/device/driverlib/ccs/Release/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..9c6ecf83dcf7e335a3d2814cda3261680ccb1ddf GIT binary patch literal 698 zcma)4O-sW-5S`stEm6diJqcUMK|LfU{jh=v5iA6XUV6`0Q@RkXB&m3_h)4Yi{uL2_ zmEgtMwA*g6f)8f*&CX=z&5+tzkVeCE%{18(jumgp)swMiOD6bQKjrsvn()wzMuUNY zL>Rvvj7%jK2O(dMnQ9X(XPvaHy4^-FrgoEQR=qK6>T91s;OqT+cn1;_@>bBYe8Bq% zt)uvo?jWh4Ifr=kTp;^+uQ^#3--Jn=LZzy0Y|#m&Pn14W`a$U~Cg|aqCw(Kx^OT3< zJkG$hQL2LZ1gEPfuv>B#Uwgdlb_gL@cM1ZpIMV_zGui-#>;OtY!P!G9^a?q@^j7gP zvfB^1Xds*Dl*u~TCg6EJ*DJJpigqI#W_g+iAtwG8LSG4BzVrtA%@rRDC74$z7h#T8 d6GVZiRVdT-u6yBLb*|0DAMnTimoszdLu*R{xH> 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⪼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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/device/driverlib/ccs/Release/driverlib_eabi.lib b/28379d_test_SFRA/device/driverlib/ccs/Release/driverlib_eabi.lib new file mode 100644 index 0000000000000000000000000000000000000000..52a3255258ff25473d270a5de9cab59e15f09b7e GIT binary patch literal 654036 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 X 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˳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

  • JQ`X7AtXsk}4X479d-X~6n%f*SpN?(`7npNhxt{gQx}^tg z<`8Dxrh!?vgqh>Y^{ijk?OeejtmP>+1DSO@PjCqH{rxmx)-7R9%avnRJ>*=T2{Xr) z>si07+XlfQtmP>y1I)T5%<;H#soMk3vYmi9^ekI7M-xYrJQC8wc>H%sw$hc*oZ4kx35;kffSkMt67M0Z@;+NRhU3l|O?wGAsxcgD zX?1?6OnWz;3u~!4qwmBSn6a{=VrgAZUspx&yQ7)S=>Hrk#ojTbIYayd2?WtU=1T+x z1}cfLka0C4G;}ueiloh_77yUxo17C9cW+QWffuYn_ex|%zirHOwEeZD^5+*Ml&_1sCiFw zaU)!Ft}5H+pHPsVi0vnJk2_%;1R)tfS6br&9*%17>Ry3)miE>!#v9)Q0?@UH^i1OEQm zTF9!F@qbqEsb9OR)Uuv7e7-cve?;&>wbImW@oi~w{2PJkj@onpeu@(Xm-wp>z&}y& z>HaYU{%=hFxhTo}Hw*r$;NJ!Q_&EUB!t}FN@Ts3k-UsIxJ{LV1|5bwD0scMILGx{u zg0r0y1*aDBZRk$6nfT|L^XRU_<>y1<+>b)OA1`_qng>Nw?40^Sr|%a04*r;&QD~s8-eC8 z!p!B^1IS&%JtW_2Ni#FqJVD>vpOAQZkRtV8`#&c;{XI^0n$U&Ejz+G=W+ZXFeypQgSvDjrqDqdkZTdPL z)}jfAAdyS$t+t(6H_*RvgY|Qi-mHcgd3RMnC?|5@Ssp`zucW;-?n8Klc6CHk#&mBI zq57p2#+velsTpM^_z+y*=Ez36^95m&>~8x?4DVzC&#YM7+rOs0SLwi>au$9uE8x3$ zksyd&Yuh*W4mGs*bz+fK#iXu{)K;gLatJhbSIHqr0943 znl?o6AyB~che83bLIH&n@JdXS541s4u=)qu+R4cXZPZKmlnWo{5U2x#qz*wU(=nKu zDp!xLK0THhQ(jnt*L|*z^h3N-4Ly)Z)tI0|kk=y*iAI*8xxsC&hnwi;jqBH-!KL0S z?nma9YlPJL_+`0>SAaNJ+cQXItkb&EMCVEn*H%y#ySG>82tk*tJFHsv+r9OwLj-OK zX#sQJWax$ z_y2drK)>QdUzT2Rc?yUVQtuD(6rFP^bjlLiTjR5Mq2v}F4-W+Onn=}w9Gu84+->cP zz8G~|58GExp^q!j$ROS?xL0c`jOh5$_Z6Q?yre^*lOG%ko&2Yx6Aaxd*fj6h`)}A& z8Sk}kj`dqNTdkOqa}ypCDCEqrkk}hlJ5TLDdD9ys!`Qz*vJv~&Mh39|%Sb==FO2kJ z|Fe-E?DvhV#r~?14(vzXSWWxaFQ)x#7t#JN7tsENHroH}eA@48ru|jt_0vR%J~gSM zu76ug)pduj+1B#o_JWqwnu3-`+jniVkHwUtZM%zq+m4ltTfW*JYqJq z_vL5CC#}Oay*Oh1*L~K!Us*{^UOBdOc@;vdcD!-@10&Tts}8d!#=ENvwpmAQvic>L zn7L%JH)d_xx4bG|wd0wV3F}Db@#R(a-U4gF-isgJQ&mLrzo^MppS%x?VIusK_Z>Y! zuX{}^I#=ze-$@#&*;&6M-7>SA)+*jR%^I=(W%0>1`Q&8}Eqc)SKs?bd*mt4NwrdKp(YD?@2%zKgN(3b@Y zy8^#y{P9)_K=SIzS0>JlRZqTRPrPRG)}@{=)ASta)>DF%rxc~2BqZp09W*&4XdBJ2S(qq1HIZ7DD10b! zSp3RgCQ|bgiFbYcHfMEHIkD&ybi&&&x>BtoJMrVO@skrpcO(iwPD{&9SF6!p5S+*J z6Lr!B=A_$W6DC(+TX1`#=qj8VD=1Nih@!v~g`KcsMezbPCk9^v5^6C)QT5OR)I;^rDy)p>b!!J5a?aT)H4(3Un<9|l~D`bwMX5ROoNkg zio$525r)nc@-Y1?vbvLif;2H#DEEXSvl{DLI#Z|(#eu2ruBg?l4d=xUK^K54bS0Y|)nWKT3|2Bt{vZ@3=5nlk9Q!Vg?z&g&9 zl@*x27+^3RHakQ3IFr^|V237)=ZlU!Wzia{nv=4AgU`L^nCl{pmY2578;(3>#W09X zb5hoCfvXIk@EpUZ89JPw0u(IGNm=6s9sy=f{y3LIZ}MtPoP>4LZ)GL|pQq$0YqrBl zS;q)mj^{GwEEagZ!0#7$kH8NK{2O4Mhm@5>1!6p2V0xQYXYxt-Oq4}znaRMMhhrU1 z$~sZtqb9nXW`Su&44-?0z@HcRTLQlTtn+|%VvAioTi_~z7Yj@;g6Pc+xKz|t)4Fx}%&M`ix@>1v%gB6+Q|H+$KMrzT-?M7nBgW?n z{#*y^862k17ns4pI;jMobwZf=wZN>C28W~9ZsK-q1>~mBnOQ0LtAV*)8Up6Fh%m=L z49xLwbvP;O{lMJL5T1iSY?sR+*1O|+N|^a4 z2>v{WLqn!FIM>9TV8xGC*V0(Q9nC(TF^K-8wPgy?zW*ZS^4z2IPcKHKvm5Sfa z5T0++`lBPqb)n5;TM*WIurjk8dCF=7X8jY^d@DoaOu6l%sBt^Sru!A#4orfC^-mbL zA=)yoT+a$&{ZB(6a|mmB%1Q&X{s}Y3mFrm{tpB-!LzwT^^MG0ZggG8puGfNN{huZ{ zgt?AX0<-=Jb3CqG&kAAvHwX@4E!VR`SpONpA*|)PJz@Q?5FElm{U3Pd2<6o~a|Abg zAt8I=_Gu&lJO>T)JGO00S~TBeA*2+KJL7{aMe(>2D*qIZmH?QmrZYJnvS}QD?z{}r zGCD>=LbjurT@KAIp_qjPg&VgtDXGvai3tuaY^s-o%b4bs;4-K#iL-DS)T0&>Wco<2 z1evB*Sa6W(V>}X?T|##!ms5c}pXik!&!9;T@=W#+XCcp|5g|dIsk{gY@_d0;f;_MH zN|5I(yb?q^1rm3@3C%7cjR^_zOt$dOE+L7SOM(oOM9dsPo+o=H$n(*VICDvwXvH>a zp@al^22Dzk=aV53>%}3@RG(bQLgcwgN}O3LdcC-lhPsA_5KbE!Fw8Pg(6f`{f2nka za>STlYWc!A6zMYBVWTn~x6y?R*#?aa9r>J`9fm`-E^c3iJ>}lJebyY3_Tx6SRl$pU z#Bk7g2dC5=d4GOm4#z1DF@qbAx21X*r%C)F8;`N2tIjn8g~!#RBMc5q9&%kgmX>OG z+-}BR-)jJz?J9GrlOT!P9gbWA9s^sVI5Z0O2pOy}kIPOd4voyt1~@!6mdbS8rqQv% zjmN`Mjf&gd*rx-e{pL(}=15SFzcw6qwhQUVyYXsl?#vN>2jKFinBwBD#zuPdZsg;G zHg}eazTau7-oMRo+?h4OJhvK-JF_NO&ej`_rDmy+Eohd?qTch`hnLTjL-stMDa99Z z?{_#6;CvZXRs9SR;)yB{>WwfEoI6@EU@mZ$Z~RvvJlEi+08xzl34~DwWcUdaAo)iMej4F7fnQpwiDCRo!S4j^N8q;@et|yClb@A>e-XlOpNln<3_mRY zTLixg{N=}D4Wv={#`g@Edd_*8Dw%JSc|J_kN0R>t{OT%w0 z*tH&m*#@kFvZDO)v2C%~yWkc#7JDET`!G(`7n+wJ)vy&bmmMmD|BGhPl>P`Na|a0x zbgk%RcH{Gvy=AOsIw*6nqQkUa>}uTC!NNqdoMC03gROGRNy~d3_ROQStg@eYOlmr? zo`{Xi@QZO{5{c?Dz4-nmb7F-0jA;qg7&c~VKp7lr@9XHY?9Woc^@s$mCbMjQwyi&l z-->Kz<52a+wQJE1*bC9ltCMmNaz(MY%ZcLN&?sC&>@{4TJ&|&z5^2(zXhA>3$SSf* zHb2{9cx_ADs+zLR%a-7Qx`;?^n>TdPw7ah%sseIRSdi%GU%wtz7VC}9))k8d2{t@J zVjklsXidn==F=%kk6Cl9!m`4cJaLymFrfoNRauqqBh%-E3r#b}~&lDEKzI$deLO%BpJ4BTMU|%mNkC+Sclp z5egxJ4ykKXr9+ij6#{_@scAx0;?hhZBv2vsO^Yd{z&VEmDx{@#d2LIb3N3O%S*T-O zx~#dauBC}081GPOSSmRU#F^;lG?*$y~oST1STY59s1>(#4ElV3$n)2K#~! z7GbC2Y^`gqty#K+qIC7cLWfaRTdOWwS0=5F=2|6nIJH%6RTPb`{>)KQ#c8QqvJ_WX zmub3?Xu35Znhek;ZSCsotXbd5m+%s@d^lx!#xCrV>CaH^m*Op?zJ!*#n&p8@V4+F6 zW_j=uh~i!X9R)AJk*au_mey1?gkDY<>ewVM;7iEx;gsPS>#$3vdnxbxvCC7@ zRxe%JW=f)K0~R`rB};4TNO7(Wh@zxA(dz#GAv9#`H?ZC=LkfpeGBbXPT{8U(>3QaA&M(3qVjMTu1Ha3fMSYECuZKINK`RpfW9c1U*aZz!(7j$ z=qiMpIA-z?t>7kVwy5M7nTl=6;JTLf_1UJOepOPZIrT#ZNM_4Wzp8CB{7e;~m`m5L z9qby)*7OeyP{M~hOc|hV`n4|cV&-Pn(_G0MBYr_(BoCDRW;Fy2hmAMc&0Ki)rCeY`tSe>_jrcS$@^e|(Rc zsP6`-E^{dEuLccdgp3py@C-jeZCiLsGoC*DhKMs9OcnQ%Z)2~vbejUwJ ztC!AHtC!AHtC!AHtC!AHtC!AHtC!BC)k|mU)k|mU)k|lp)k|mE?`X-?AgH%KgZ=ti z+V{1tSc0Ga4EARAQv90LOM%Slr9ixTDWG1x6hN(BieI&QDSokfDfZ6lrNCzCtdMPAg_0rT$_(DVVevs}DrjJUGa`bY{#u!yy>11eBk8%tw4j(G;CPwI7m?M#l$hRdu7N;5N{Q%kh5roQtD@^ zDsM2(+8mm*a`DLw9YV`47q3;Emu=)a+!JEn(99(H5oy|6lk2BxtGln^ymnVKW%n>f zq?Ug@TFXyS?^1KN^Wj#^W!!M#8$vo1muKLx8OZy1=vSC{#?|_-9TB;AQ z`n8UFTY*r$s)??(f#66@ceov`?asE*X6LN7E7uRM(>izvZ%4Au5xtUC6*}7_t2B=2 zj%$KiJV7ngUS8?M;Ej)Jb&d!Tv}FUor?J#?iF=5^;dT7>#8QtV?jZs%8*8y~-`mpA z7Zev)K%;W)Bk1FgZB6Yv z7{SBTZPPDURj7N2KyS}LmM1(8dkdH;ak^Nkx4!BX0FAG+kGN2myTxdubeEx>%U%6I z|9ZFNb$Lo2WyO>{mlkQ+yC&kYch5h|p7YNCtuA{}-ljm4}-SKrh=&Fm}sK1T0 z!dJG$xw0o7dm6c3)V^RgKZQHvT&p!e^+^d zUS9XX+GGRH*i~L+jw!YVocl6jdv^Q&mx9r4wT$4}_j#|;yAl`r05-x9xm@3vjZ-Nk=wZ`^TAyM1i! z!|~;dQYm?|KV$EQGTCP<@bl>4N4~sJ2~}+9pBukujC)iL&ydz zWU*d*tc&#)qn(|6B`wxFyadbb@+?Qy`nq9T4l0aZ2b(x!Z%3qfwcu>@>QILb#TtBJ zM>=7fvi`iJov`6m{xIqQaGYy=andslhpq61QLmH3IuQ03+;-v?t;}iL)|5lDXfMB9 zi`FBE>NenNBkcCjBPKS-p~y?*e`D!ov(8P}vpmi*;B4e3a*c83WwTcK!<65TM=2Di zJ?S|uFOC!cN{&Q25{0qi;!_h7&b;%^SZeB>cP0wI@NgnAClDE(@j1#yC(f8qe8z)! zK9rbnMr`twL}5oR{?CZNCNcGHIOdozxjA8<8_dP)#A!}U{RVML&J5+;N*B?7=Yxs# zL-2}n>%hRBo9?`G6Rv6?7~eOEyYbG%#D7a9PF>ZUC_E-H;nZ1)!a0d?@u9{<;_*b` znV*LUS1~EI>byi^DD+a_6Bp6ECoyh2U8Wn+yAz3CMD(1FXiCYdMB+Lp9;`BKPZ~E) z`w@xdsRLAog!Dy{r+twmCcvji#kkXojEj;a`zFZ`_$DcsY$7V0YE8zIW0C8tWZaR~ z$&kQRf4pGaxU&H#XqP1u=R$Hgj*H26iQ~;H63l%{WE*gE>sE zmwY&{mps#5FS*>aUh)xgy<}=%b&ni_|I9}B2HO0;)b`Ux?L2MNrqh;Idv|?hYL{uF zHdt;t1wC82UIplNldBCr4XrbVbz`$Lgm1?mwhXn}wF+YPuEW7BX@SqfMKI?Qf!{Ci z=LG(Sz)t|{bW;`$JU&UKWoHO)GI{v1;J@r}uy&!qf5HO}=ixA1EaS5TJ{MTWpR%qM z@;e0HBk-L9KPB)_1ujasY0;R>qfPz^AEU69DRJZ}YmVSA0-kI5gli1{bVr`D$fHZG zlBcZAz{eRrVdigjKh1in__4+y+N;2Qg`5&k3A|u}qwYa)D11xJBR%0^cC;mj(Wrz|RUy9&$LX7X*G; z;39k4k-y9NFafoWPb$3tsdGj0`lv%t3s ze22h$1pb`BUl4e|z-QoXH>cGo@KS->1inb%YX#mZ@XZ2$Lf}se{IbCRE%1oIpT-0s zjK0QZX9&M&?j4^2<~;9nI4SEPfgcf^-I!;`{QCs{k-)S*HFG9m=nmuA0-q{yv%q}< zZx{H(z!fV0DT{^!Ei~6c_|N8AZU*MGKJRc+))xf+is0OcZwSo4Q{e9i{5yfk9Rl+w z3w(^gXA9gW@H+&)O5pbbFErOh!(JAd>mvM$xvuMhIo(e?oRoE^z#pFKay}#Q!va4e z@M{8>mb&MjB=BNjou8D|F7Rf7uM(I>aKI%4HakQ3>n8v20p|SQ?r>6SjWEqmSsyBM zIlBbDPv9p6eqP`N9`rdLT33tl83I=dOk)ntF!>}r2mK^$nZ>}I&(#hmWpxUC9zKjS zr&Hi71^$@8UljOz0{>3nf*Ed{vjsj2Sm!fkEfIK?z?}lqr}(qXbrCje;$^_#|*4FmqlKczn4lKSAKd0$(KXfWX%Y z{I3GvC-5@@zaj8ce8S}X90z>1(ZiVnR|!m?Jm;A*K$xCMuw@#6*_+l%hlBOy1+GfF zX^qw631hWryfj>N7|0^b^=9%`wL;x z1-5{vKFvv~dUKMZ*cqxr%x?hZy3hoyIj9T3I?r~7F!MWsncwYjQr1>rDhHGw!pz?W z%=~MBH78}=2)qz~#3#)BTY#B=8?ff2tSNp&=A^90fltF9@d-2k z31H?w1*|zK>v`Za@JD>Y%zqJ>`7Z-&PRc4kTXGhTiBFjMQn?^C`(GFhYY9QBkv=!!a>m9lFu*dc#4|~j61I#wP9GGoN7`G?dGFLkC zl(iF>?dW1F^D#%BvK|3ms7|#rgms)&=21tE_btF|FT!&a-^#q^$WzwgG1kAGAwgkt1xl_x^=Y~G)W`atCOCvy|7l>>KVgo?m1|FZtpB-!LzwFh#liX~%<;H# z?WvFTPr76dVXh;Uz;sMyxDtEj5Y}?-sgL#FAUK3s{~2J`KVgo?m1|FZtp62)LpWIG z!#wpBD$jVJb2-8Ng?#1FrgMUsHcB!FUijuiO4s1}UL);Mj$FwC99`&SrdwC^>QXJi_WA}DWpxc4gwGF|SK zAk%ovhF@xjgG|#|LV`@AD6ujlU6^ zpF7Mi^}94DsDOQjLw%TBoF@&3%4^)Fo)M+$-F|Nl$@X#kTkPW4}4nipOoL!@>NpubdLa=?dkrf1JsRqkDyb zo{fFnP$`ewHlG*rx-epBawp zcP^N3^NvfkKQYA*#zTt*(?%XpH7qj{s)PD0(wcXhZ#d++RKq1k;`-d9^5NZ984k5| zI%cw~cN;PsYNIrV?CRaw7aR%lW6eeL zL4Nsq8!jB~KkZb^yW?>Ln5$*{;0T$RGoYq$U{Y;8rmv}iy6j_41@O#QYf0-ERRU_N3@e#ui1>%taCs zp7|msG00Hw!o73WZ0zanJgI#M+FrA92)Z*0UpvsgzROzQv1V|?N&RcyadKL1^G{tg ze?i4*r!C6iC-C%B7M|kz32ae*0zX=3Tc1*`7W)a@P7S@;j>GS!kXs_%FX&F8%8TLh z&ut<6v{j>7+zkN-vRUl@h|Yr&`d{|NlaQ}vBBOh1L9J23`aYzv1b&EVn*?BKWgOKj5Ei_*~RweUFJQH1Tf&|B_Mo zC;Ir$fWLbbK8QS!gR$8Q2Ze_HPA{h;8}ljH#S$B)AQypR6~_)ACO zKQ8#B|MD+b*5D}ozxwzs;D2-!{w(oGwGi>Y2mE_S;nxd3<>wFJ|7;X~r;k7Di+B#1 zo?D;q7ktXka`2BCg@2deQ-1CT|GZK7kNNn20>6J0{);~T(f@8)H;lqBp@&|xQGPB0 z|I4HB=lS>_1pmjQ@SA=72f-g1g+JiqzXJa38M*bp)5kyVOL(U=3ZL95@kZCX3j9k( z;Xf((lfd5r{)a~4|55NKgMT;pUl@fyo?a-JtpvYMf&U+)@aGEt6!8BB{%fP~YXzU; zpYvrrbsLAu{MJRbZ+(JK&(00tFE#wI_V6QuPw{U8|9zvxzfbTf{+qzRca->lCHSPz zN5KEfDDfB5%NMgv!|xx!Kjv^sMV2L*ot__u(6t>JUiD&xOP@Gk&AcAsUvWcbB6rcLsHAowi^y9@l?X`P>m zitXjUBKTJ$yzPF}NAvQJtA>pKFpdP=Yw&jwUR?fQ6n>@Pw}HRr0rU@N>HLJ{zfac%yfyp9J5(RqE4~_?DC#S^$I2dI;^OiQlLRZoS+$nI9GLKZmk< z+@t6Z&({(Dr-_Q%Z7v(MY94R)`Si2tX z>nV+*hbf`yC>ep&S`L(2fM9cKE#B0=N2yU7MGGjQ4~W!STNY=1@noA?Gc`?cTWT&p zjIsoT71>NMcQ)Z=tj)#iHja*;>53;cG^$Vb|li<{TWl z=CD-VYkq~&rPPW#Dar4Obaex$+db_7)--~qWy~~YNt|t7nysyCs=5%y4JVk;X?*#* zeH`lFu%y2eEo2|kETx2teod*c+O#Y^JUyd%@C{+U#kLiM{gq6;|3*YhS=3 zt1>hIU)fiO2Q0Lzkat>G^qSEZDzqDIQvr$qj!;%f6{p}XunCxgBK_*^$h`vNNPq0Uq)(o1buZ~JCa zjumS~GNqJO(LPGB4V_|+gIb8z7Sm$U&9O1P;P1Z4QIIpO-x(%+-0q8jrAA8R839U zi|SgIIz5As@Ycq~&FG_>O3_qTA3PuWuH^i*47c{I>#G|c>gpTp>F?8~+lnldQa+0E z@Q`EQLOY`+YHeI4w$`;YqT@mp#nGde5voToB}9*2LYN*~h68$>h-{WpUW@Lb3}1}r z56(62wW@d3P}SUA*VLM=Yp$wps&n%UyVdA06!@mPnzqKJ%?^np(I;h>RJER0S1Y1( zPqAV~ORX0!SyI>1)(8*aD~Rbt>h@=Fr^m`4eO80r~<$*tHskyt6ESo9Jl+lc2B zzGhM!F2ST8RGb^;UZblxw~%?R^>s>*QYq@7q-yaD$>}+{)-_Kw4gL_fZSaSnaWH1^ zhb*w-IYJg%c{xH(u@X5#7Fo$0A*W*6qN(qWnyZ!1vKTGvUP@P7l%>nQOn-3F8^peAQ$9ysON%~#njcJ zkqP9V+ggDqk!&Eu;nwzS>gl9)K4P=&eRy7Rs2pIJ>S?1*tu+y&rwzknv1GLcBY)mo=_0F>@uPjv@ zw8XCE64ZxQBv-6h^{p$UUX#@4RXiEMO2zX5rNe4%h8jyrjYS{9E|I>8H2PV*i%IHC z{)4JjSBgC9feW=#ouG@aZ*>bBw4b03vr(8EzzRd}UMlQUP*5o;sOTHmCDM;#pZ^8C zK^~Xa+uy%oO?$^Bbl>ro!azvg&}IFqfstHW6~aJB-iDq&)eqAix;f^UVuys~ZJ?HG zzG}Lfy86})byEq~MKKtp*%dx^o+`MC?FrIVxs^Nnq&({C>ssuHO%A9x?PefJJ?gB^ zfCw?^3kf34cexcJBo7XxWltE)0_q2odul1qBRAA;*A=uv>bR=qgJ=s609MT(n^gHXF8Z|ob=cWz7H;dQT&<#`*1227uAunCL*nVbA$)ENi{ z<*gSTOS&XY&!hfqHY6->19v_(F+rWrtQ5NC+1F=PciAU!J*9L#MW4hjk=~1aen*-A z`gHReygq7ReHWprv9RkSw*MM5J&*dZf$LMT^Yv+>@A@F*>uVVfyS^{tdP?bfimt&f zk$x}s`R7lg?p&aaMv2wkxj=|%1zQ%2TYZdPKbv;Y4G6ZEp*8C=PfMxml#t~OZs_6i ztb183;Hz!TG%jhUl_ZJA_x2Ct;!5e_iY~=2k=}%T{uE?0?@e5+X!6x-C4ZAIvJ1t< zRI?yt@)F{zqZo1tt-bA=y5tqS6FDxW92YIXE|ESB`>A>X8?$gtp?Be$LjR&Hh3>*N zg}iW$OX7uV3UMp2?1USjj`IuT!Zo)d?E-hAsrE1)>%~CbybiFps(|o!< z{JlDz%8WXl7pL*Y!Hd%r^5Qgw&f+xsEN5{V_dGO1c)TbmJs(jQ_26kFk?zC3Of61R zrWU6uQ;XA-sl{o^)Z#Q{YH^w}TAZd#FHTdY7pEz+d$1}^nO>ZxOf61RrWU6u(~HxT zsl{o^%;GfoHH*^#nZ;>^yI1PT);xzbGi__p&Elz`9wKxra)#5bxRg2T$mlmhNk6N6j%vqcU60tbV zr2A)Dmj2E(gkjW!>wAXgFT(3K>S{Fi_o*ja8jwvJ4YIJaV<1Q5FOR<~E{JNaSWe(< zdrQpDtU({vQf;b2F?%I->hvu~p(*f8?ju2Tg^xAOXslX*>=Pz2Lt)S*%+tbnA!`p#LS7P2u4hwi}g@!k`tsG{=hN_R+P%Hjt4b?N) zHrxWQ>zmblx?J`{hYg=;aoZ>R9d@MOehVrNqPm5WBevq|sI7QOs1@OBU)3a41G&C! z_0>17GO}{v?UJ{0q5JKtTnj2fE7!MXqe6Re!>o^p2x*+0m&=RO!$WckXC@BRa&0EqGhh7QFlK z*MdEREnzo1uVIx*r>pkSnp82@XIQ6=^!F@7DrhJ-V)Nb;wRs;NgLx;=_ZwOJ#!x{6 z=e)TJ>fRPT6?EKjx$NlFyBrnNF``3^*n;1U+JZm(`?cUG71TAXtf0l?Phi7hYO{XL z*xIwDi;Stfw(!HAH#A}s{yJ(CCa?}n&c{3bx%B~*fAy~3e0{Z7p}*)1&$*L6BS=Av zmW{#-G-Bv8)O%O2D7+f0r^V1j!QUzq38WfU$MJp6+xNxGSFb>Kp^hi9HF4req5$ac z3r+zzgD9rcgaRN!BQ5|FB3lQDpYMKJs z7a&~wpyomlAVgda=0{!*Hrn>4(3ZgYTw%TH`Fa7L7OTux7SE>#D@Wzd84p$NToGNq zMhz!XO^AkIZ$VR_mv7ezyN3we%XaPdR#b|Xb>RZ|;VmY3WXk-O-PR#fH1`OR( zLq>!Q{fv;0Vq3>>X4oAh@KVt{&uG)A#}btxGe!|3|tLJp?oD%o)6h zuQP7AZa&;`oysGk^OeWkqeQTJsN$IkA&t}1;Vr-AOan}C~tCj+NY`1I3gZ%usZ z%s?SD8AiBv{m3^&rw}qB;zGDL@JpyfgQd zBY#0wWpO$l@2MQ!dv>54iAj1?l$0~rKv|Nch|ANjA}>#~3%%zk$Bx-$={$^V z$O(>KI@3O?NYQCdkCGgI{oo|*E1jNu_yJ4j$rSZ;y!)Wi*;gAVo%*F|egDAv_92k8 zC+0x$^spi>pX(wopZCV?;qaGgLj%+uGJVG<@gkavrx2l)^^fm>Xp5H=avm3zv6oF< z3YyGp33${N1RYCATDkmSP)>7nH=gFORpdNuaT&tpXIAf-GC^!2~?K8>{!A<+QgZu3a3c6#7Gxs1z+k4Yt{I!G;xarFbavN|DMNQ>Azeh3(B$ijecz zzJCvuLVQ{rtx{m@{3w+Iq5euC;`LVw^oPBbLOrpwQc!O7xo)MXq(bNk_e`Evs|9$& z{pB80c2Vxnr#;34o);+hZJzl6puznWk=2WSU$@4`jkx?z&x^X#@>HHZkn5(fq@%mf z+!XG_C`l^+LX^AfElA<#UEb5z*)^;`c4$bqld!KVo1G6eRU+6g#M#4+tU8Qngdkq# z5UbYG%v@z;pA583j;K0>re&aQL<8GDfSZPjh7Y*3$|{bja8!)luYD7>K)x^$bJNw= zV2($%=Ds;AW*#}lq`0+%yG8E33}eXMU=Zz}`d1vZ?rX84t)=VEa;+pwP3TCY zGyJ^&Z8a13CbwqdfJ^B?)lA&7MyZ+Ja_7`7JuH&b^VLk`gqFGR-nN1@Q$1sI6uRy> zdGU4!)qOJ4IJ!wVF99%w(U*wx2Ee?UP|xz7Y^V-i$Sbx5x#M!u z!#7AbJzurNeOwK$@+9Uw-r*gWd#0*zPEdm{$p2vHe>U^?aWi!OboG2@O{`xQR@#E@?fM|?ss_3VV)45#*ZzLEuNPp|?yRm5Mh#3Q1=V)<)NoiAhl z+S5qk(^Va_QtR=4L*J|9Jsu2;T0-R*BN!ZMW$CuAiTE2zx3xWHZw+=9Q3?E?e9hdB zk_RtfHTmxetSZyG_=6)>)yE=N)hEZQDz0&|9L1m=&r_V5AIeIddLb*-cN6yM)E64D zO7D(brT0ar(vMukDphw}@2ekD>lFN%q8h@8ShbHwuG*(_eQaM3Zw^)=ieFZtkg5*R z6+Tv2kq-apIh|Td+bT(|6#Dnx4TIYEhDWUXKSr+m*GJX;^W@y7GOYDCQPpb8|)_zXJ>aC4jy)C&00rdDj#_gk~+b_(~iu-Ay=Y~~-QQP*^ z{dhOaePNzLN=BN2KTk)Q10%N1&5>JYcLaqWPoH$7?CW4D62KgPe%f zyD{Qd*4@_Cc{xUM`3vx6-px+fyk z=F@8+JYu!Zi(IW|MyJ-PJ*-yMQ}K;RAkBK)>cF6dh?RSOd?LGN(g@i<|% z!^?|$?kLp(zsA66_dFC&IJ*rVX0hzJY~s%^er&t{>#~rrV9r%(WGXq zench=d0#6C5u5MZk(=*_(e*D5yMh&~duc*#KD`FQBUbCPk*oEE=+ye~m8@3vLJC^d zLrwJ3b);FEf#!A(0wW|NR&Fdm+R?DxR#|?IhsnW#by63f$H<4QPnM&(@v*|r9D7qU z{Wur^cmMuv!cuBwK$$yme3lAOBDU0Vkz4BQFs{()fgs zG4*6J|3gtOZp5~`Fml_i&1pN_9GB3DyVv2!Rjmi8j&jwkaP~pi$UGW-`D$UKToa9g z7Rtqp*glsGuno!$LXv2XCXAcYACUoPb(q`u}a@`u}q-{Tp|- z>MFa(!wOQ6!xoYfIOibjV%o8*t`m0gPN8=vOa?8Kiy5)4k_A!s<|Y^9=*{J9mvY!C zC;#AWG;X`cM!^<}?Bi|6+J=Lyh;4Ih$rn&#{%aZgk4NKcFqSpc5&Wrni+IqEtsDZv3+id+&+7A z*@u?GHj22Cd&%ZFM@<>!jDxq$k3T4EBgXyYv`vr`v2E^;+%}Jn!8U(Ppy~+CAJ{hj zGY;N1gVzh&nCY!K?cxoO*d{-X+$PWEvPlOy=QUdRwoUDs5ah6mqy)}6c)N_-A?$+w zu*g8LE%Sy)Y?s#~w@YDRjy{;w@oDrrO$x?fm%up(Zs$_0nR#jJH7oQ!cO9T;$$Rfr!ZE;b~-(BJJpZLPCYbZ z(qn_M*eQ6{!P{wMr?8W`zl>rdKOmjZ&|EjBVsyU6RZ* z34iK?wI2N8B}8nUj}#U~oWgB|Z~Z_(EYg6NmZ>E-OQpIi0+LcE<4>)#>?+kIM10A2 zMqcFai9o4l;?%>puu^@Cwv$$gW8TL5LL*k`w<1^R6S-Ou8b+e)r$RZ}3?J(tS_tK; z*(y2yR*&A@!b*Clabi;MZfL}M|3&0_e<`#mWBti3N~NB)()~Vp!nBO%jxa|v)E?kb zG4@7vd3wZJZQXBwsk%7Xo*t=OU0ob&x4yLdhFH6O|E?YH`oHX*3w#vS`S;K4W|IvG zgdqVD5hJ34D3^d-L?t)EMJ{WIh*nJk2@nkglK>GBP^ltXL2B`CwOSNy)z;RwYSmU+ zTcv7SZEdyIT54_Ut(Jd_mXi1PoO7Nt&+Kj%Y)wC(|NFiJ+5OIQe)F7X&YU@O=CWt@ zXKPg{9a$U0hsz+3NVa%}55Q)4?WSv6q2N*CJp=OVe)!koW+rrZ`!SW@7C)bUY{3*ihS=*>pQ&6z!-bZ&aiz> zOjdQVea>{c@=beo{SjrbCrzB!Iu+;nPhIZGYkj}dk+*$ac>AGK#WSqIZ)dnWAIXy$gN_40MM410Ol zS?qGV6t-m8OSr6Fa7);D)3zCZN>+8TMdLZVMUA(Lt=^VvI(KZ``IFAyZoi33q>ov{ ztxt7cq0`oNZokRc(y!;JZt+^1z*qT!x zsgBiWRY&Wyt9#d(r7BPk8+18*5#_+13R;3xTT1(b)O79edoCaAW7mGY?b&0xW%A>^ zz4AlrW9QPY&j`0n^7@#i!t2AH3R;5HV0}0>U2N-IK2~M-&P>aE$t`2+)2_~c(Dunx zyYRbBd(?Ex{PRG|{62LVT@Nzl6Uj}bartug7UdS88t`d;ok8J}B4{*{|{+J0DNlIqJsMPAEw{$1;z6ndxznRQS0`ZJ*l zd1d`2LBG*N`<`B6>eltu*-NN|-`DdMTl4D5H|^VX#QI9?kz>yDjp_7nLY^rekJbXQ|lg*X7z4O#0ff-dfl7Zs9&gINe&;(YnV|@;t@m zP-*i#RalY9=ib>GsV=D7=jL~AjoJM%tA#b?*}LrW<=J~g>l4oL zfl!XG1vz@J)%2;`?Q+@z>Uj^~I{wbq(@@P4FUYH_-1O3>DO-15zvJ9;yR{B)fv3oT zmKmX?W?-pl+otKIdSEHap*;I~TSC#6({QFZr3a33Tc^}~Z&BZtooLTZOjCyU(D7*X zW~Gl+tlYEcw5``*OQkP`57U-Hc{bP4-CMothPt36W~7wF$)S=sEJI18uG4>B4&VR8 zsfe?m*8)T zY@}METGUe22wI^QsAc$U!(1!o+f@@jTQRpBnl|u4RiZ}ef2&lzP6?+kLiz-}cyqk! zPz`q3W-MQ?eb&Oy1!^(u4Oq5Gt_y#|x4A)2iBuF31+Hy;+qNt~tGMZP}-i zMwiKr&(+n*J~O5LyRl^QNsr9i^_%}mV#%~zcf^^=XQuVbv|OgNVEtC7luM@NGNonm zd6e4@tLu}u!@rxBDV9uW!-H6wl4Hq~mTCPmrHu{pYfa8C({h>8y2EFt{QkG3(OrDI zzt2uC>r8cmZmHTfE0Mfhu>Y+|Y0ok(M{g&xKF>(@`R^_lti$S*_L|yto8P?T{QlkL zjt_jEpX~FbAgv=gt-__PjFcf!9&^e?T4_?+zq{N-=X3R{19f0yLUuR zL)u&UN=4N#Vf8$_~*x z*CpLVNq>#>=!4W)ujJIPXH0#OQX^5{E?tnk^j{BF07YEqz0eAT_nj9?F>dGfK@6_f>hBd~c`J3`>7657fhEt9q|55QJ7enQy*PqC zkzPdzvR6t3_e)7(TFI{iN!s4B4Uy3cubZMyVyhfrkp^{7y$9JX{+KM{(|zW$_@S$-t9 zS0s+A{9#Cdg{*#&9@GS()FZJz*f+BJ#Cp<9^iXUA%;yfEa_tQ# z@zgSpZjNXtIB3EN^7}B-n|9!&BeTx$VIw{G{BqOe*ZE1Eqzn4F=qFtBbdkKFi%)kK zBC$dgRID(PRfMw3(%*h0S`f+dVUHG}0AqboDoHzqE|ncYuOe{MSG%E&k#X5SrdyUm z$SI0s73f@zPZJ7us_&-;TNTET&MSTv*{xBTf6o$^zS0EeiQ;?ETq6t-+RYs zgT;Ejzc%J?_*(>xN8b-)hoTtzz8CAeCw3?)d%zfp4oEiV7RCJN?d#r+9UfhG34Fya z*1q2VTlC^c+%s0}XNShTwV@+|F8$w8*DMlsaTQY5*zR4$RhT9&1mNN-3c}TK-67(- z=o7?sw{B*lRDa`COjJg$KBJ+at&1Y3|6p5?*p9mD^};62O0!8XH~k{25#&@CeBhKk zqTU*J`V-ZLJVGixdRd;=I}g95j>J@?M>IaY_oby6*gP6j({UjntEY;_OY$c4u;y5S z8k0u}*}fNz_s%ZNJ1l;5{OVFHpHpZZ#rt8ILaoXj0?f-h70Er0(GK&5!h+`oP7HD@(lZB$SL&{nlUV>5@9+G5~E6Ty5S6q$1i> ziu2M#Y0meqB33mxjnijx3O@?56J4mFDfyc&!qCLuU8U27Dw2T}o0sSBu{NFO`MWDSUFf2Tb)WQ`{(<0U1uw%Z%-DaM;10o;2v&IC zAM0a+dk8KN{D|Pk1V1JC2ZGyhG-dxCf-ez#nc(*Y?-Bfw;QfMYalm2!4T75lFBAM3 z9JE3BE<}or1Ruep>Jcf)B%wwm9FZf?EV{6a0O_ z&j{Wn_-BHDDfmOdgK$vfd}j*2Snv+PKNq}D@K78)*-y3Liv)jB@Q(!lMDWi9zascI zg7*p@f`dKhd%ECtf_Di1nc)3`hxQHp%n{rs_y)mG3I2iLX9d3~_+`QG2|l!6knc3X z7Ye>Z@RtSOC-@=3-xU13;Ex0kMW@J>o8a|=KPz~X;4Ol`AowA{uL_Q$gT;9rBe+8F zQo*f)R|&pE@MVH;6Z}KLe-fOHVWT*Pk%Gqxo+x;-;Ku|%EBHmh9}CV!2bS|H5PZJi z7Qrh77Ysx{6MZk-@JbLrs97a?gW2bJr}5P!!6Oe3G-ZNo1TPl+S+L2=SK9=CUGTRB zKLI}3#zy>^B= zU53QB**MpMInM1)zpwr#xZudZ-dFHp;8Gofmmq#Xvq}sE zb3CPBqw!Ux;1dT2nrVVRBlsdPFS|+bor1qB_-VmE2AAu2yae%&G^@n3V29uNHhAxYEW({3{#VRxs!FO{ekIcLeV^I?#My z@N0tqF8HuxI4@rvFStVRd4d}RpAW9GaT0SGUI6AeuX7q-eL?WXV*|~df*%w7vfz)w zCNE#%8jj;*1RpQB1U${gM$Bb62F$U|a~fZrEqKPTK(kQrC4z4d{5aU;<*T0v-YvLO zaO}81p9h{{<0SSXil#(9nByGcG`<=txYzJNbF|+j_XVrt z1ADgMeDF*gKQZp$>-c+uIsT)a##h4x_dX%e94mN=;3a}L2)s<$Urkv@N~hof>#ONDtL$B?+e~7I5sNC>sYXf z*;f+;PZvB#@EPEQT}R?6b{*$|c^#KKjj!4TpF29xv3ULei&?G_SH_oFAIKE@bADib{&a%JH83#b=>DPzEUT$-dBGDvqp^zc!1zh zf~N^yD0sEt&kO#h;9m&d3pO$PDtCOq0|XZfJ_bC`t|RehZCyPU%<-2yjjyT%kD3r@ zW(sZ+e1+f#z$PzWJt_D%g7*s^G%?VhEci2m*9rcj;4cflA3Wc#Bk?r5j$Z-uIzHnx zzIsmZH%|&QKNb9*;JitJW(?Tmh5nV`1%fXZe3#&71piU+yMq4)KHIJf@sI4f>;dz- z6rRi)UmYSic1oZ*Qt+vQKO^{Zu*u6;*9(3`@Ed|-rv~~_f@=g{D)>Rc-xT~9n64?) zxd}0bG114k$HBaguR4vdek=GVlLO741ZS59_M-%!1~z&5>Kwsq1>Yt3dBGnFKB6q} zGfVJX!DoTb^Asj8LEIPDh%qJ32J?EYb{b!;6}+@O&}#<^y3B372G2D8o_r8eoFA41pBiB{}Tky7km-etc$NU3BFhGi-O-5TsS*ec9h^6 z!50d?R`B(LZw4>2Y5^*s>x%)s|H*n9FLI)A;HH z!2{<8nu&tX6ud(4U0{w#K-EgQi-WxE}wIq##i-%8--^2yg+}B;Kg9$-&ae)ui3na&#-wd6Z(x# z6{X?*pD;AiFsnqLdv3pPH{ z=RYgp0>OR3Z`gc^*V}yifjQqXPUEZbf(M@+XvPYjD)?-{9bl7}udWijS@0LYZ`yc> z*VuTrfjOS9IgPKrDfsr!1e%8gKP~tdg7<(;UcQQ*6L6kjAH3VfLwuHvrw^Fp8R0a( zDiJ*J+(0u@@GP+L>8tYuHwZo-{Fcp^n4YV^l(+!Q`Cj2PXy*mDohLMc?*<#6C^x~6 z3H~1VZJRIgLpI;UiRyPzb*I)@H>hoFG0*@@+6pJc-?7y^`_t# z76h7i1ov1N*oO)}9c=RQ)dImw1TO=>XX7E}GHC&GJeNC-udWn)wa_eW2=wa(-wrnZ zef6N=Zwh`4{DF;unD>jv!5qUYPUEZB1plxx(ELj9KfuPPui}dW?j^Vg{GrX4nD>jm zV9s}x)A(wv;KLUSjo{f}20N!KsCBDzoGl^y}=ex;ie08nh)k^}+Ho*@I zeo^pVu*nPUc2mFwg8PF1ZsQ?dVdLos=6Fh-2G<+}pL~9xnIm{9*!aXbrr-^NH-Y!s ze2K5O`Cbj?eD8G{UwuXJ4HpEO2L%66@auxTX3oo3eFXOxJP7=;jfa@);SpetXOh$4 zUY_7#O9Rcxg3ksUpLotq@P&d`f%n;biMbwjfH~jKJB_by5WIew&ReI)jNVe6ucLl zZQ~(+!Iu9=V2vZeDztu+XUY#_)Fj(Ha6lP+t}^`b8I`E##cWQ z{H==u&C7!K2rgV5Xifo}ynHoVaIN4*!54t@ZEVEcrZs~(wvA4Ma}dERFAg+U3BCtx zeERC!f}apfuY&Jo^Cjjs?FV4a_YJ4<)o#H*StB%p_k)d3Ulm*ua9_dnru5!6Ut(_4 z27)=?lbps^rwTr9ZJ?&-H=*IKkCmlb5d+3T_hI0xq)g5Z|p?C6a%rI1F8I5GUlROx zu*u6;IhO_8Q!u?Qx}T>oc?n{UrwGjPOmrGwog#SD<$-3Z;99|}1m6rcdHL#o!CwrSWf)t3cde^sElNAP2UUl9Br z*yQD_PQkHFft_A=T5RJX=Ixaa=6H^E8ea_;Ty%AyIYIDL!S#Z#0GqtfClq{}V0z`} zU>gtdt(sNhZZOC5wA1+N8NuJUCeZ8>{0G7N1rPol=jE$0f+q^5S6vRV@ep%7rC^Sy z)@e|m1t+czG)n|uD)?r>Pk>EcsLz657EG^qJjTXD%-icVFvs%`r}5Q41@GP*X#OSm zkS&3IwBUJQlb5d+3tlRiUTHYg#zV~Uw1YXG%}#^+Q-arA7ihj9_(8!x7W^LAWHI{+HnXUkEg(f=yn&nj`oO!St%O5jGxTZV%4^b37M0 z4W4@uykuLTxm@rU1wSVEO|Z!e&uR+(NHD#UY?O_MnB!451bH0}HX2_YDLDVeKy$3% z3c-Om1To+$We!4dTOeob9JRjcCoJYUC9OFwC{^|n?Wj3x>_`^go4@`Rs* z(Hu-(2c!A4^7^#=98AmyqxrPr`Lz7}H)H;^@;aDx?<4AP(I>3K-LdS!toy-e4rbl| zzXlr|?csmYj{Uz}h6hs*4@Pq^W%x<`@z9;nW;g9M`AwGFo z8BaFsd_1MPWcq=%it;kY{qV81D}6rnGA~~CVB<7>vx8r+KO;X{FKWj=>9VE|_V4Az z%Vr^8?n}r%iR?@ChK9?Q%AdutbI5*-|{GM56dTlM_4}Ce9d{W$+x#%_DJF97~!At<#-O(zqux3 z{1;jOL*OUd@-T4R@(A#8mdAq4eWhA80j#Y3VDlYf^@m|m&Z`*Ac^wTl=e)Iw*6Z*1 zqy2FteSLzwe8^v?Ww0#O^VclXc6`(FV0_QCJ}KXit)24SXPMTQHIu;mt-T!IS$5fJ z;J2)OCcbxDo{R5yEFVny9Bj-pM9d#p{}l6wmMLb|Oa$+-_ELQBwLBHyZ&;p<@3$>e zJIw75wHxQ#yr|ulZHT$& z71!#)>HAs#N5Bu43DwX3)=t|fVYyn^7YO@m!E}t{dO~d`*QG<(|#vo=GbW8 z=XPc&nBzYl%rR4&#&J^o94E!haZ=12=M*rk_^J+UwwIS6W_<&g^-G+_S8Kp;;E&=VX8n3F>oe|*53+d{T)u@t8ajJ;JOp| zZTyjcV%C2EX8+U%7!96BLR~Zc94|r4`g}0!sV*3eudiW~U-Cah=!XjZ@nECz_3x)m zpUq2@3Vo%}PXikbev<;GSjj&z$5SWt4Nl|hYgeYN!*d!!zeecSgN+8i>jBgHlYe6N zf1}Xf>NLK7Ce9ppyu?F7{|%x4HrQx{G=!ZIuuTBOl^Mj)T4F6M6|^)@Ok^p19Na zY9N^QH!6Q())x!?5U0WKbHV0V<0Xh$f3nb*I*qStz(v+SG3)0G{W(tKtL0#GJoOU9 ztZx_k4yVC08(?#s^%BIar}4yieXn;KJU0dAd&_ca{O6fqw!ULusJ4r31Zd{6#8PP!E>8n zYBy>760?4S(4XuyzDj`2G1^NIv%W^?=Q|CaX9Ewl{)t(?TEp-ufqI{k=l}6{o>H6tL-6cnMB{{MHX_ z&dt39G3)mUy^68MS4H5l);}@p`-6G=((s)|Ofz zpAh;Qr}5Pi@JUur%z7Hjj^kPGG``vZKH2JtS-(-}uW=e*-2pz;>WNu@x6t3~H2Ccj zxYX*2S^t#K?{pepy#g+`dSceUCiHJO4W5Mq)3KlGKQZg~3jIE(@l|h}0908$G3$%K zTt5As24jqXr&&EQ>qiOwSf}yTG_dKTdI@6I&lLKE)A*_ZJk$CoX8jVOZ+04Atq0Gx zdScdZ5c-Wy8`U*+fU@4>wUG3$GSd3zN(4aOS*pKbjUv;KIY$Lr7C@3Jew=U6>4 z>!%6*Os7HrAAFwG6SKZS=$AMR`v2fMt0!jtdZFLoH0b|>7g#+p>u(kMJDdjne=zl5 zss0nQ{@X(TxYMBj4_;*T#H@cw=wERf^#8$2te%+l9|-*(r=hD1=#S~oNaA<+=5sM( zIzPme*o_Z9|JnzBjjV{Dc#vk5z)f0r&PB&_KIbB4&Ed|Dehc^wy)61I;9|`xG0EA{ zw*p>jI*2mKgCD!bimGeT?{sMjKKwd%W8;ObCa`UyMXz;iMUwnRpMLDj(rEr z=Ssxv=aRzz%s={vd`?8ne)>8)jyqsJ4bw_rZ^A!g0# z&W`>7n9p~JIi410N1qMM=QzadXS1{8xo9w-*ATOxuR6Q0o(1!{3^DupiL>K;2Tb*b zwihvL{^IPu%0|Cyzts>IYgUO|XZO`HV1+UzKg8^3n6u+r0hrHCh*>k$+3{N>FrSYQ z7n4iW`9^2=)n#Bl2O&PnYCh}ic$N>$=N-hXp+2p#<6Hym&NYPQIcN9PU%-5RLCi6~ z=j{0H40c#PryyoczO&VLr8|0iaR?)&Lw z@yrbR58US`=DhklJD%MI7u&ovQ?}UdrOxiFbHUuVCoa|!m8f%eJVOO8v3`gLTFrWA z_ti~c?(-9~pIeVp|Oo*x4bwRsV zWhT_VaaT_tj6q)2xP={ZK!_*zvq5nESfKbf19o+VAXWSK~qdka&vK40Coo4+iEw zFfsdC=Il7;g1O&I%zkcic3-^;=Dsd5YhHJDT))B%xoW#!#H=~W+3_1&@I0#_o@!%W z;_SFC1g1U&)kETwt>!^z$FT`~w$%`GUVm|Rj8V`d=zkKIT0f(l9c?C<`<%q{t!BBi z`-;Z3uCsX&&$gN$IlHe4^Mbx5@r_o~&)M}yUEH&Ry}{gXB*x~WDG}Ilodky0v>De)@XeaQj%^M5>sCX| z8e(I|`2zS2{LywKW=&v6-wF0NNdgTqYXUp^pRn&H2{gp43GBFb4f|X8BTXqjSwn2> zIDZ7cjX%;5vnH_P8V>A#CJ8jetO@Ms>%#sHNuVKSO<*_oGPvJZCp5%-{d@`d1N@O6 zV)hf*aZL|)?l%&%Ca|Ml4LkQ6iCGiaac&Dc_Zx{>6WDQm3HH7Cqj-o}6WDQ$7k2J9 z60;_-oBJ%>Z@f`xh>acBI>7t!M|s_WPxeD>?6}?tR<@oKvnH_Pnm_E^ZzN_-V8?kk z?A&i8W=&wnwJ+GY-$=}wz>Yp4*=;^Sy;x!*|4n!t{0 zp|Eqmk(f1s9c>`&+;1diO<>100ob|UNX(kRj_Y!;bH9<8HGv)N3D%qYjl`@8?B@Oy z_Zz94SVL^=xJCr#ej_n!0z29t*ty?G%$mTC_6K(EHxjcZu%rEfo#v^I5wj++qy2%M z`;Ek`3GC+lm-~$qgofDI&Al`3H3!G{nY^_6N-U zMq>68*wOyLJ^_D}7cpxBJK7)Ex!*|4n!t|s2X^i^60;_-qy2%M`;Ek`3G8TpU@yfV z#Y4=Rz;5n2a=-B*p&>SQv_IfV{E;7G_7m9A{=m-tMq<_kcCNBaX#;E!S^Wz;5on5>}Y>rUt%@H ztO@M0--zQdE)*`NO{aS6PaGlDdR!PEQZZ!aXjtgEm26y*G?o&pGZtFFUZYSsZYg^D z1f5h^XepXb(w`Iydmal5Y2r?ku$o+_p(pbw_gtqr-)ed|%{Z&+;WU?7O`g-x6Fihx zp3~f7HTh06!D{lI=3%Sp=`{4T7RA%kXa5M^$)~k1r7mAGX5*8E??8; zJj-CWmpOi+PZ4NPK&0v8G^SmpcfL74C?JZt&}r;=0*Hw^b0g7LyD)L(>!c7hXfjwA!!bA8hY;+P5lE6%8>Hv?=){&&7pw?rAmGdb(&t- zuV@+&Xi(0i8Q?T0TFqgB2IWk79p*H1tY%=KK{=CVpw>|RDM6|Ba~6PFW|unLEj0$E zN=qH?mKuXHq@|37mioM1YEZBg%8-^C6fA`jqos_6min4q>WE+|TkDQ+Ye83*X(|ph zw#15^=1r?PGSHyJDEA|s=3iDbIMCP<8|*awan+TkqXLaBv7?-Zp0uE8NT9JbbBNQN zXEjGV%~)H8M{5n0{8*G>U-%Igl-Q841tkWf)d18Q>-m_#v#n#txZLS^3!07%G$=7D zjbokW5vv&*Xl#iM4I)JOP=vyQ(x3>11?x@`8Vf+ZWIYdao=>#vKFsC*j@29&XzX5j zoYTa!$Qxa4;=TJsTcd_M%@C_OKG4{f?Rcj-*=kM*G`7S}a2k5Lf~FCH#+KL!r)jmC zk%7jR*hr_LE8sMZ3N*HkjdGg%tY&nev2|>;)9kdGl0buUrWT;YX?|rjW1ME3ZT-eL z&3jfeHqh8|9_ut&Fncjs~*hjOO8PShHztK)22H!iT){d9a_L5bla6t1*n*`xV5 zln+@Z1{RbCc|IwyVBN_wDX`czJ=s~t+x0pnu-LUYHLxINs;k0+n2!uw5c6?i3u5jC z%jCchVm>5nLCnL#7Q~GIaw)`2eoCDmdXED65f;QueuM=vBLHbZ%;Z^U5Hoo$3p`^H z@+>TfnLG;%VkXbRVq+E-8*{nyJkiE1EH-9gu`vsajagW1%oTxW8?&(3n1#j0EG#x= zVL{B)j#WC(qeqR>+f-Ucs}qtmCAy80nlakX6yayA?rTcRiTdiJw2aeBRf(m>>#O0? zGC^TQl(bCLJyc;qH;&d~YT#$|XnmDmT1wCwg*9UoHb-cwvD(ix;par%Lz9+qy0%Em zczR(2u4M9lI(qa38Y((unW(Q&3k|wf6!Y|8sglt;FKH>!c}dF{otLzXMQ;)3m%`79 z`mT($jMJqmE#vhSd})~gA7MWe^&4M>1|63(!y0s48j>s}YEhD9j6P$Le#WZiB+ZHH z!X(Q$)s|!#ub(cLekQ2(Nt%heG)@aj104n0m!-wjXK5)xI~UfB(OXbz#_BC7Ehp-$ z&eAeYH75BPuh(5_Ca5Jznu%&@*n$ImYm#NOYEQD1s7sP8W7MTdma+PHF*7KQ6HnAV zMrj$Re~%?C9xuKbi+4YgBU`JwyYH2L`JD&`KW>61aT z&1z_Cb`=lZ|E5WA1-;!<*K4=c^o6b~KUq{MF!jSY+xx;q-~W@bsY742HQY&5Kq;Yt&Wwd~7vCGH3?Vj*jVQ{6)R7 z^hvX!smf}Ofwil=8m#8n44P}KW~kPr&+8$p8J5A%^HxKB`mW;nz-n{}chM&Fp#}`o z@%Zb?58dyl=>+_BrI~Ft)Nkub(`q&Jd%&(V+pGrN@h&y=E^V5qN7$90Usw&g?9k}e zj1~z^f3=!1uy$3S^QrO1q_>o(TQg%2pF^#N&N{kke=4npdY@74hmLmPX_?hfA3Ew$ zE0nq~f5B?#OsOkBPg)I57`pWHmetVpW3%q5@f6TO3DYF}MLlZqQsX(%YEIS~YROam zoM$zsWbm`WYN&4)^^V79YF=Non#o#2k*8`NwVG0`sYt7N#cIm5raZ0Yf2@X5qh5MH zg>*p1M5$3Py`NE5Q>ityMQo)5@ig0Nroa&OXz#F%77Os*Y&BI{L#3VS=US_osx?%r zZ36(}=^?9`21C@NGX&}lgr}cd&2*TfUNt`HEId5@-D+mQ9Q7{8r>#&zc9>o4G_Bc? zR#R#PoOCV`}=_h)S3U!{odvKp#csE4;J zMZfR~PxQWdnoh@G)O#{b&sVAMS`C$6)SDmSr-o=bo_1LcogGKC7uv4j>20f_t4~Hl zZBTg1w?#%*pSseFvKl(eHX5oQ;c2GTl;LWa(NLWZPYbPvu6P&?)&B5wvDMI7iP6w@ z4No^&&8aT0XSGH{`(b!`+G^+;kBH9YmFlLkz5h0|#0 zm=T^PSq)t~HJa4&Imc?~YHC-0)>)0Bx}kPpu4el9`K{Bd&Z?R_Ue(T8SUxvV+tgNG z-_|&nx@(Yj13AU9r4 z^-CM)UbJlCl-Aak*2>2A#)a+SQmO8!#DxL9>g7%CZJcLPFg0BS6WH~trVoaF9Vi+T zbj^WeI;XTjBgL(7VnuUXW1_LOsl`>Ll;ks;8rqjsHmz)GXl&&bhiGo~RC2HDOH!&` z6)31stL9eoVkY)fJKUj0R!=pRFH~EQRFf%5*PCVa&2E*#l}&q|wW7JbY2lLkWy>0y z6ZNg_O(|QKstqTU(;mPP>*XuVqO$7funy$6rX!QznvSmgW?Gl7)8J3 zC#7i*LkYGXx>hliXzF76G`-csEo5j}q=(zdP^!&Vw2Gl*lW|w6I_u=dFtmKoeum7t zMjl{6Zc9T8a>Em}sG(%r-gJ?w!%b??(kw1&Q&Jln5^HbaMk|z_6e`-)P;xlbHlRvP}-U1_$;*qqrVB;5 z%}-rk9ubmL)3yJ}8WDkO(UUdF$AaYarW!T-eyO634#-`AZgNbmubda(%5k zCrs~7@AXt}bDLH-h6_yZ@9C3lLxXx?`cdHpO*_*?qHB^fEQ+1y$gvsy~rpDw@Y36ksK}!Nh9oS?I(?BYj4#%N<-s<6^m<|o0g#t7;aj&sD-(H!GhMt zm2M8Z++w_@%=Xn>4zgrzTFO2rYip9mRn#;ZmxtUocKPJmX3Z(}%-Wr+aG}}M@a_;8 z%@)`Dh&9@tiL0sB+~ruP;fX}x!w{{8@$V0k(YFfQe?Ev4y8S&5$24{Q(> zmzsI{92TH{Oz245ExsayzEbGxz<+}N_6+)3p{Fgg19zGq$)LYj=;?Cglep{rd8jMG5Gw96^ z2+cxA;p-;)NSdU7^J6e0pl$tI=&LgLH$Ut#db*t2c>w=wM18A+{)8cBS@~HiG?8eK z(gFLs(4S}H8D*2`M?!pS>l(4_@mRJI8|`+wgNo^B^X2wOn!Q`-PX}KoD{LD5*M+_V z>2G4EKYP3pQvINb%8lYFBVRSsm4|JlVr6Y@jZ1O;w^hXt>5-EkSs#g97Kv<#M4pO7 z{)M75E1DG>xuj)jJX+OFnJiq`HnNgB9$4+-nptzll#HsN zxQnNbDXthNsI_VFlJ?@E3x^et zo;Y#b2_>UOPbjWw?5J-mo{qjv>x!j~%i4(-wzMv9X{~Q>Y*1dW1=u3NLBR8BgPAA| zBNL^uYLxd?$h_QHQ)X3EO|6|dx4LXr#hlqS)pKUfoKjs|kvOAv&g_|I;nrpbMa9gr z(aKZVvl^FHELv=xv@C0HZE414o!i)~A{2~A_0eTDH8rczK{jbpOGFkXIh@5$D2rQV z7By4m*3?#=F}tE>`kdKixaG+!p%c!mo?bJhwz90IEC@;@OsS|)ku(b=%COv7Xw!Lh zYZ}|ybyqV&KZ5JMvITcGau&3-G%GKX(}p`0jSa;Mm(;f^FFR)i?pO#zJZBZ9)V5Pv z+me=6Kr9ehOHNMHvT%Z)&&g?S!I@t~EMN>d*|oJRAQ@8v$C0D4m9vA{ahTN$7He@< z($dzNle4I~1wH;qR!&393hbOjv_P?)&C2qh!rI1ffxE2YJIHDBy7loADDytv>1EUK zS)CxBi-8RKcnxzC_-veCgU?0uv3PFHD10rMTQeG8O^FJ8o?orMnyW~=w30rT&7D6B zUo8oIMz$2snWw*xOq5NXg2f|S2A9p6Q#plb_LQ=jGv}O1c+~XSHCi`hdQ~+Uj-Eb6 ze;+fC=4K}5PC27;4#J9TnKf??1zA&8P0^e&-+a$2tEQ;V#4LT|s{~(X+3&NfjV zGnl3CbIPj6;_F<@()W2~)hFVs7PItSS5`d^U-g)!?*(Pmc zwEiAbU829oSC7%(ld8w+@5$9C>hFr`ar%2|^?3a~qq>~j44qq31-BPeCC->ub~ah& zz*0Ny%*yHWRL{Gz@g%C*QR#|%g+9~Njb9x#2eqkb-P9(!hPTA)?i?0-Ya(6(8O}8~ z$J!LNeYMh15ZSO+&Zh_pMf-`qk@AYDi{+`Fd+|u%EK{H>mL(NwgDlceYIm=4OSc#5 z_HHTEg{Dwv<+?&$*s>H?y}GKWq15g!)Can~Q2)>^g=%VQ{`5Ros5tviw6^fQVwAZ) zeRF$%IJvuv_1$hS*3q8V8fpQO8vunK=kn#IMD)R2@Bh*eZXi;YNAjAsB~6Rk@o0ld zbaO~ry|ljV0++%wNa$#7T>VwvtH=W@Rfy&lY<{ zoAeHqcQhU#v#k^sGyS|!|B31Vo%qQ*kVe+sbz!2{?UmtN&s&MgfQujYa9|5Dn2&hp z;G&P{zfvc;Hf+LXSewBGk~7tZ_Qs{lO}3h#z9{TIO^$Ng(&JNJ(FFQbd4I=4Yr(cn z(>I1p(Mg!xwrOPDy=@!2f7@Q_c^#o`YY+9omTJTEOG#Uo&Py_G-84@0_6>GQ-CT&B z7ReWfH)xtnQa31_iDQGlg)`+~gSrz8+KiVbZAO>a-5c+!?%#ON9k`YD&cXFdbGk*R zdbMs21upt;X4hKkI($lRuK!l^OxIY`#VEJ;P}+_~>*-VFozll`@1|uMH^OdDr7wam9rd8!^G@vE?) zK<72#;VgP!t*oJ;wbB0c@F-GhXBmXuUH%KYzx>xl^sxw6Vyc?!7n>%DXQGvC)@uQN zN;9pA+LC@f{($v(&aQ`EAFRjEKZW&pB(xnOq3tj@v>nPr+acn%!(h7|%Kz={kWcj} zQaQ-fAKr%d7ZjleasBF*RGUmK`dCL_p51xfj6q&xMnPV^H*7|BY3GbV@knJ(rMB&@ ztIYO>?dbnTr@F49bLOBUB9%{7e6R9^oXDhkRf7`QljcnuGus*Oc2b;e9Bl zzPPj8qy2~W9x5|h_bRMsm0tHMtb5g!U!E#OW8UWCarm%Z7r$%Uvniec;y(~p7gQ%;#56XV&_WrT(zB>sOMVkT#0Ty`?$Tf z#O}4#Zm-Qjo7$?a1F@vp0^0|fmNTzmd%<({+@`*Yw&=U{xhb)nnZ{48xGdgY-TsOZn zjR?IDjrVYFh z<0y^N|5mAbof1x8g!Bn&3`RiezymZUtr^SLYoE37a{pr(I#zmWOGs)o#)y7>XY-Mvk>cZc5)hZqwR8MP})$Oq(`v@ z(INCyNl$#@TThWQmh_CpRz!~ITNdkC9?34?zbTOz`i%v!#A4CL z$&sRxm{*z|iBP<5+4q%MxSw7)2Me3ODlA6-W3+Gs79Nvk;RigqaFBDA%(<(D-^Id* zw8mnqBLn-z^1d9){pH=Uyyzu&#bRHLC-2T{w>n)i1g}nZ)q&IEt2EMVzkDo#dK8^!QLH*Gz%*S;?=jc+K8eYQ03iqiO%rLm2rdDoZXR#To7B7`nv`RQbNDc*W!l;v@zy^QSS z{K@%xtqaD=GUz=CD}hmz)?e!BmFjaDfXWE1%|;-t)}~U7Qcy&5zIPR|9$HNA{whni z1@uv8i5hU4>hvc+0c&ofk%^ysqsEmcYDj6KMw2FLAZen;kS1#QYQZ;vjZa_QCYT;?skV6$pJDT&7hAHQ$DIZP z*$aLEPjay41;O;PL*o-K;S)?xewd*a@Pb${=k*bo{rIR}MuV4!36A3O5^IJCE(5cE zs$hB`VxCUZ1A^%u?m0FdVtU~Kro=zM zoL8>`*5E~tf~f&v%|O8u1a(0+{24;A`PYRBQi<%?$94^WBE zYRz7PnDx`Zte@#L=A~ceSmPz?gr2rP>#3ZK1}`uM&%+|A?F{5{z9I!=tD&k>+xyoiKqEwGQ)H^eQ3lB+VRcxhxin2SBWQ`9WMa| z*J!(!AZE=zXZQ7slenJH?`Di%B_@KoZfpXZ?d~OrM`@ob@i}Mr)uUjp55&W)=DW`B ztKWmq(RMFEJjZJ2mhiX5+7+be{gmj2cx`=yaX|?7rl@;-L}hyk7n%$F9gCjZ%5*|wwo6s8oPNR zB5%k3LPKoqzA6Uub|hv$f!(|ik+fLhZ^t^JAvSirkPOWG zBQg64?C9iR%F>_wf+Bj!!Dv{hW@IBRcpcGEAnKqpxkp@?sVCZat|!@`k&!p3$mt|gr>v{Rw*nH%nEA|bbZ)@pegsb%Y8J0 zrrd=ELDRYm3xcL~7ZwCfYZ6%Kl{~cW!h%I;-Gv1)7sHb4axX#5$A&G48Lp%TF;|2w zi201L1u-uUTM*twVGCm37_!g{Z+uvKxOnJ=Hv_^J#7yNQG>Dm&$_ti4%!9%f#7s*G z4PvHJ%@3AB%*ak!5c5f43u2~q50;`A%+OXA7C1RGY(dPl-Gv4*Ul6t+=Cxr9Vx|at zx(LT2=HtT_#0*zbV`COeA?C7>hF%OaEo?!|)M^Av(Mw-03|o*9Z9$s>IWKn$qKbc!h)C^!xqHc5w;-aOT!k#e0A7@ z@U9J85Ht0E&1<@7y~ZKtK4A-D?iaQo<|9HDdVxwFEWwMr#v|q)u$Y%}k>~Mx7bu_Q4d9&M)O5jX`-@@ddJ{1)z8x;z?6@_ zs7G}oRr4DXV4`gw_154sRkN1_m~bfqn(OeHs^Q;L(|MB_^c;{h@o%W9yv-odsebr( z)4tXmlH|e6uCeujYNsjZR2l!?xkzj17tcqhh;FogaJdnFy#7kvkfOQUYWix8y>gkP z;@>{gz7h3kZ=~%Jp1x=O(Eb(Cd{kI~x!+g~wV6h9X^Q5rRzt@xqoFz!o^oulQm?>h z>cRrd4X_$IGIpgIX*JaP84cBs@Kk9v)CVvc+Bd?}Syn?wBBMzypH)^v$2g;*dLN#? zU^Uc|7)@&Zc-U&F%`_USui@#(Rzq!+(Qpe8=%~MLruFM1ssQze1~Z+0eq!3ZmFK&` zX;OYi$s^LF`8{AbDfGLwa8mfkS1D;}ew34P>5SlGwg^@sB}{$*9OdrHMA*dd)91vwtSo3)gHxO#uN1d=TXC)G|`?)$5&l*lG4_v(HC2d>@VGY+n7kvlT zr~6(nj4!)31A}Q7W4#d17U~FM`m6cUeGQ7AreByZ{Ylp(N2E53p)q6L6?*DFH9-Gb zsWEcV72A2T#_X|z7za1CiTsz*9F9}wE98HW&=({9QRs(c(2o~-I%D}5`e_;T{1R2l zn)D-Z+SQyv&&PSv({X$O^jk9MZxHd2eiQWH$e`!rHudz!3z5)G18T5P%CqLBpoQF>8UaL>Hed&4^ zPg4M|LqD*>SkmcF7y8+dEx}G%nnB+p^yEKlIO?d?XPIn5<+EAnk4E~n&|h!$Ty({y zc0qi7N$9EmzXJUo8RGel&_4$Ke&~}Yy6(!;t|${;GKyu}Pf%*7^*_xf(a-pJ|K)xJ zB|V5`ZykyKWvUV4UP0f~z2 zfJ8-}9+0TW4oFmF1|%x70}>T^dO)HgJ0MY!8IY*R4oFmF1|%x70}>UP0f~z2fJ8-R zK%yc$AQAG{0}|m|4@iV>Js=Uj^?*e9)&mmZTMtNtZ#^IpzV(1a_@)7g@TCVNDslr7 z!6F7E%3q7aDK!%~1*!-JBclG5R~xo>)5E^zXf?XKevfP1pQV3`y8t87DLPElYQmr+ z9nEda7dBroZM8AGIV7!IP`{#q)gYMKF{S_p1~x{^K7P!YnUSDzQM;+OafqEDr!=c7N+r|#JiV;&*V2rSVL4p}G*4pXHx7Y6!`c(PraaEHR z)k9rl@Z;99)>gceg{Cr6=m?V%yLH3YckhP3LH`IiX#-&hih8};XHZ=*81c?)Zd|sw zeTkw5w$^eNTQ_BC=q^sb`06I(ut}wEePk5gwt2=t8>p#`j!9GWTX-7uwO`Z%O2G97 zb4a(prl*T=HmRv??(+JDjb$tAo0{qEJs6Reoaj5{UcXWjs{D1h9!-8|`1EiEppza` z0m5nBy8XY{z1#m68MptW|7iP*rT@Fz-}G0~ZGRd?J!SLLd6(BuHv=kvH*Pi1<~L2m z^kw!vOOTkeSW^L#Q@gbayxzT4V4oi3BDo2`@A>VI{@YA@?&i|$^QpUT`i8q-1r@c* zn}z!@RLHi04wo{Wo10QjN$%ES#%~k4)&F4czf#b2Th8lOsSCQtE*u_hqv#4*j50!( zO+0-F?n2b91#(I>5vRBwz(PH$8*Lx|{7Nj9d|^B9$&?4Zz{O0VB6 zUHp0H;vOKC>_QCo+nR0z1a&>Fq+5%>zMG5x;{RfOHydVoW9uTk3u11|qIMc`xw;XZ zcKtX6?+n~{3!1NE^)H6#??8ahTqJG|;N5>`V z)pQ5PG=@BiT@SiO(sOzkuKF`*+)PoXJynB9-npW4XE5E9n z3-|I*y>Rt4G1c=?TmmzNoBldTn$k@#?AGGFzMG5pj_xYn+(D*zldnKgvC<8Hy7iX! z5>>Yr=hwQqIKTU;7pLwcs-E-FBv5TdafUAFaB2)isAWh@|zG|6rFY-LYOhfoMzbDTvm2w?tahEo!bAlqq%jHE#LxP3q=%K3{rW>DWOhQ)rpppI?97`U5WWh+D?4*DiI$Gilc6=T4Vr*1rqg;25trm(FiHxm=5Nxzg}l zru4Jx)aLWlL_LJwjBGP^lARmVIjtbOiP9(8A@*pQ8QCSB+Xqd%OGS?O`yunTs~tPM zLovwSu<}hiFbJf&ZffUC+sZdpZtdLi8oqb#>fbr@*`3?UvuRl~@YR${D(?;FzgYNJ z)&1+MhELgARdZaES*oCVUwzg3d$KEY?irM;*Zi5SJGWK!AkF)W4rwv!LaSC8)ih`p zhPX?K;On%@nI@9{`#aM_(*L)eX(EA@BGH4y>ER1axll_m+Qn18Y4_IkTh>=c z>naCisdpTE;LDMrYt|*FO$yR3N=~bEX=@|pNTmFEngX!v5UEH? zqgzNemdMPcwB+TA*&)70)}flq%e7WwaaO^wn@8VUPp4u?Iz{on71l9>6&c2P^3>m za@s#!T7F8}^*Ov;YTDO0?Q_WrZ|LD#|Yh&K5 zkXx;IlZGg4d@d$ZM&o7BjnF`HGG4H6<;D5(aL@r>10_%TgWJ6SSB>`PhVc`l{bd?r(2n*;V-W^2H+G=&RuGIG*!4Jsy^}@`^g|;D z_Aw&|7V^k}MZw5{eM2J$_LCzA-i;QAZa?99RQ*XGbWEj*+FhFX7*MR|%#~L{Iu_DI z$1j@roAq>jqKS@0G|_Q~COXE@M8^f1=-5FM&(kr1CeGi?afD{1!47To(eE*%AJQ+k zY2+4k3o-e6lso3Lg}qMjTC6y0E*E?!jxTIK9L2(Xyx{%{*vHt z34TuS?*#u%a6WF+ns|J5xZrVuPZ!)Sm_|6{W$9tl2D@IwopyU&3g(z^a2j9TB6u~P zg=Ed=1b<2Jw*)^Y_;-T;CO99DKAL#2UV_I7K3#B|;EM#)Bb1BmdJ#9;^;!?+m~V6% zU)?JB5(3WVqa(8YL9odS zqlOCpp~-x6yfE&TE;|_^MU#EF2_Q(;)a_!Pg4DTkxY`lP}6jFg+c#+{Qy(Y0Kvs zFz5BE)A;JQf}g-akTpLQ{4Ut|^c9Vu$ee`-WSHq;nb|g9;=^sed0_T=gwy!yD8a`H zO|)O2?~S5=*B<7=OjlZheO1PDRJh@dDA zObQOInF$ccAs|LYlK=rCfy59ZAPB7!wN`1Q(b~xl7p2vw51c}Q)}&PZ>=4) z)?V$s+N&MN|9RH1_q)$IiF7!A-@U*8g6#e5cRhQpca3}P;k<9ie?s6Ffld0p`m4Zk zyqI-zzNB4gbs%;+6aqUPCI=i}og(n*f-@3tCmsJpfiD0y>HDfd;3k3jX7fs`1F^Hr zd?~QA+}Iaze6?NRw(>CFUV--ln>2m(VS(=zn9C+J547lC3HRU_Jwahvq3taZ|Nk6Q zCs-QewVuIP`UUlaB|{)D7V_~zj$s|}(QWM<)uL@|nR&8B-*shb3oOTib4LT4xur#6 zI<$SbMgLyKjJ3Zn9n(Ks^rx{akZx+b4^{SK=^F{8=E}vgxH@FL-G;x^ys%UcII7<9`9zrT>+H zV=U9UdH4yze@gIw1nlO_7lBve56@kb#4i1pfnEBq02_|6OzY;i;Vjd-`DzNT1Fblp z=@Yy3Q!UdPj;|`fG51j3u$E~J$5^Iy_gTYPrgir|v>t8lFT5nN(}xy6TzPi~9AE7N zHunNvlGyQS!OQXS#woa8co5j#7Z5xCX9fQY0moNIfX$lOOAL@sC0`W$mjjNkMq*%hTRyQ%pVlOt{$m3U7XJu2dK*jr40|`$h_O^)NIrv&8(*(c zfIqe`@kEVP^3T{CIV{FQA2+6mT{`0exv$OyUarselEhBW8G+na3xM6&A$FXGKTSSoj1W7WZwTbL9|vA((;;@84+e5yeGb@-1!7k&wy*2|Y{yoc z4)J7-Rq}g*9BWJ9RhC1{`3NETY9RO3ThT_YpA$PyWgz#}Ex@jC6VJ8jyep9V>QP|V zpNSpkP$2i!Yrw7#6F1s){v62Rp&%aiTjDbmTNe-=ZQujR%fvFo1`Aanhb*l|L+ugW2J{gc>nLb?E2?4 z!67zsU)$nz{d0!k5F5F%NNoC{mz*a!#72%e5ZLukVy90iHx`Lq|Ew1rVk7r;xn2Kc z9k_IeUH@dBt@z{kC3c)pZmx-|ET>g)h>hG>BzFCCz2FcVxv$&V_0Mj>AvSVfTNLFv z)MqQUP9I_;$NdYi>z~Aq6Uu#U>(+&Kt za@jwfrDgJqxk1QPyLTH)%QJC=TY5;O?d1u91VEj{4MJXU)@&S&)DoV>KnX*Bz?p+1 za*VZM#?^6yP!Mp=!4Wy3{o!+Q#Pw__;cUQ}E|ko}5pK7v1VCNN4MJg%@_9I7%Au8D z+Hf8lm7wq}yWq?+Zy}5XQEvBAr@uW*AfI^>}6G-GwB|R-FK}k9DinCCzi=q;gf+>eqaA!ehrW{IW3;L9(1UjD{ zl|W~;M2mjr#wl$=_ofkzV(3$;kT%hwg(3veLB+!|)AtcC}xeEz&W^IHL+Ja`v zr7q>bX7U6fnWe8NMj|aF#&BjP>&Mb6A};lrIl>ZR&JY}k18aty9pj!|g)u^e-&>5= zS>Tj#D`E|FRtq`D$Gr&|InGicpBu!z@{Am3ov=`IIG?8HKu=eBL zSZ;Y33C{8$NBB^jPup}xYfk2JJ!v`Y_i^v7*s_Gt;H(N3Lmc-iv1N@%gU1F(@bMS- zF2FXOiH0eb!+FDS*k;l2 zR?Fc$W;krKXjox6p|xuE#b{`^9M0-P<#ny)gqD`sU!#G)GGPdMb%P1wCVrrd9)L&=X3PaDpQ)-=snw(TnO%NF^|-}K+KX83)k7DY|tSW(8G$=SHf zKl0L%slR1%!pIM9v@qkZM)WLyzRjiz=A~A&b#|jYp z+Hiz0N%n@;sMoCBD9usNoO|xf*|X-&J9kcb`HXS~xrMdrd2{E^)biHCuVO{@%)@_P zKdHh!eQ?&O>E+Y~uHe?DU$XSwCD$ps%Ia;IhDS2(^{gE@Yt{ca(A z*{T|ESHi-5vn)SBA%d)*yG8n^BJMn#bd}|!E9oHl^n&KXg#b5$f4Al5+6c*iO7Qs{ zY>-N&gbGoIYh0ng;X8mYL#bzN`nVC(L0V`2l}LXJa3dP6iHadiGrLIt|BK+Cg7gnf zw>%^p6y{k|xxBKauCZxx}$iqzBVlEYs136HZ1IG!@@od3;V{f zux|_t``WOuZww3j+OV*%4Ga6mu&}QU3;WivF!t84FpxDY4CD+80~*7^0NSuH_S z_Ao4rZD3d!SQ{4hjbUNm8W#4AVPW4I7WR!{Vc!}S_Kjg--x?P7jbUNm8W#4AVPW4I z7WR!{Vc!}S_Kjg--x?N1{@SoG_S_S_S_S_S_S_S_B1Sv zoi;4&2Zn_q5r%~eKZ>VJdYBqRxz$}8yW4u&db@h`)W=I2>|}9Vr^RRMr$}bvU7j`b zWG4L`p~X>7dDhghx6%}IrlOlsTjrVg())%!6ERC^wmTT@%nFBTK(sSsB8b?rR?mfs z(`$>x5MPT5@8~jF8VKQb6R&45&X<<2kH?rM(RUQCz3Oz*I+_oeyeP-SHukmmENk1? z-Py5eU6anUY$$4d$GY{)*Y~t8J6~UROe-by!E79Zda1qOw~-S7y6{I)p*iu!1l|*UFWu z7&3P4I>exSgR^Wmmfa7%jw2#mhx5&fS2BTHHF6`~edy+hjtNAH_K3!1w?VdMyFsr1 zf4f1J;|5hX2&Nh{LFub38>Ae6!L?Y#Ww$}@$aaIkmgv@u7qK_!>$sd5M#fc3=JB(m zZOs}iGd7!rl{)~}Uc2nz%Qzg5VT~lm9UsU<#vR{QdL{hU3*+wXm=2@OoW5KFQ$H3; zY4dbqc00i5vfTl`@%MLtuCz6#UfHCJv(O#VGZ`Z943l!^&LL-Mz1}Io13~tdEm&l` z-jcRHVK*tqU(ij`7}@O~uV=e|6vY1S31Ut71ci@eTEuY{dW1+lHMe8#18#!Yf|u^D z$y1h`Y;Zok3>rKoKD*6*eD*BXnkD6#e}8jt4%g*+EQ;eSG`C1SHMe7K?(`wg2jLj< zcVL0$+Mmx!%=JEcqs)%L8{nWL3`NXtkEqCYk4XOgJz{<2$%1aCs3;5lBAP*lJpX~- zVJ`^x<32aNcSN3#4AVIxyzKUk)!FVFoB#g4(J3D%>1K*Zvd}Xk>8I!TkN1oH$4C2x zdAcg@71%4v@fVpg(pcH;6R%{uPvpe^?ghjD+&hY=@tQJyN=Uz1U=JALqLEI{ZbulO zJ-fnYDKYKu?+C}dy3fKiam;!D!xM%x=6j_v=9}AAKDhhJbmP4_N2_;K3Gi{x`CkgouRBh8dF#suzZ^)?Q&fX>!=!~zM^bbd zQxNF#XRS-&aJrlnm@=;GFK?nQlLLvsC+u_@kha7FEjRk<}Q>#nHigPD_+wO3SW6U8+v7X)abMeI-c zM{9Pv^qA5&2kUft^9Sns2X%UNgH^e;E9dLe0d4l?Uv(dywz{G?S)l@DsI-)*vgsztTURrIoy6HEPONBPG|- zsOgTSu!k8KVB>X)uLMlo_DlYjxbon&r?Njjsa0~^+lH1TtBQv`Ursu(K~3? z@r;D`pAn0XFthpZ+TP=RC)}LyPDqV=ZJ4-ywC&jNFP#}r{Jf6**g)qAmt{!yPs5%1 z0h%ps;HjB3dNhc=G(*C_8aDRT#4sA)MYE?m+cb@}Da)s5YxJTEF1RRBaA6`b^NK63 zOk^@6dOb~lE)ldu!J?IkMB|P`!I=r~W>dj$rWs6ULo(gaLcV7$WX4gX6Y`E-FJo{K#_$h&35STxC zbNn)aX9_%D;5LD80ycX3>JtKgL*QowreP+>pCs@Uf%&!1X}0XdC!?PsB&P#AJu3nZ zY~2W4FF2>+Rk-6{DDZq>lfJL`Nyl`X7xC>juO-0l+%*9QzxNk-Azt|f9D!*c(#h`@ z_#p6fotLkk5cmfI^ZN<&lL0SD?Ccr-4A`alO2C253W0x$$jhYo@sS%7r0O09Rl;^@ocL<@qgJmzaH47e^0>i)yD*W7cMZ4bFaX(_vqx$2>eHZ z$Ko}lf}09~b!7 z0>|+l&7C_%;Q7GkSe=^%?hv?3V7`wtKV9*X#FK2F=>vA@-yLv#^+ADeD-AjK3H%*_ zpA-160w0I>Kra1@1a1eOYxVCF_-29MB{1J7ooDNxc!Je`AFxaR-vW-WzAW&^u?TUT zLjwOsVE$CwaY_X~N8o0GcLE!Ie07_^9}@Uq1m+tL^D9&@N&IKq=N|xe`Tn1P^MIX_%(rjJUMrqQw6RSc&)(i05BBAhKEw2l7X1OXnOj=a$>5lAYU9COWT(cjjZbxVsn6@0U1Fg6>_b)iLn zCu`>07X4c#4i2az)qhV0*3~#H@aIp46UZ$?RB(c-yDWT7g0*UHX3x|2f(hM5IfF+K<=wUz^-o)JI*%)xv!oDcKw0a>GSJA z?rXdLrhUESAmlC``Y|wa*xLto?M}?O10h)+$Z_umT&cwv`@p8IRC0bGkG3yvuY>C& zmhC}X6XTYaAsNbj{kYk+HI_U9huFxC9X!|8<$^=(<`B+fuC0k(UZLFB!E<#<*e zp2)E$xq4=qcJDUU>gGU7PH0nZ0f`7vn{v3(g~X+Eg=Wysn@i_hNXQ8-zp-6P0||h- zjvIu~@*DdB&kAk0-9-XIXv2+dN{+GNM*Cy5JI9nmt8NeCh(TC&Ll@*(#;Th>YnC}H zwDa~|eGYl96tqOgvqC#>v_!|ejD#orfg6OP@GNv+o@MO3={U?048YEfoLl@wgR{WEd10t@oYe*Pv$)4=lvzv2l$@mn_Pn@vA+~1rkQ`@Sp+s}8 zlu-e8781s34s9e%3*sDbRzz5HagTOHe&nKpy|bKvhY&1RhTa-lOW=r#d%Lk^dqhK- zt+LP(l)Xj^+6>DHEoHI%(LhVMCeRYp)i|Qvr%Sf1m_K9wdiyb&{PBeOJT3A&Fe8fo z6e;+MO?=^&B1`|KDIlbMCm+P5d{7<8hx)!Y10nK_Wh6fBYr9CSDM`B4&Jq!S9W850 z$|Ln9Bcin?W1_z@$`~`eE=VA)9#fJ@sm+wwq3U!X{S+ z3tr(5)LAl%`gbLFZ8JiAb^buK#-}JqqJ*MssX^yG(IOV|r?X zQlHm@*x6%xQA~uVBL<$W(*kE!UVU^Uq{Mb-;FnvDyqdbxGVv=MUtC!oKhu7<5b`~t z3+G{#!1OB?8A-RDGoAjFzUIi-bJje-C0t481X62tKc1Uj)Bm82)Dj zzZCpmg5PcVnd;|D0gXGr>KJOLZ1^yAs&s5&kDg57o|MD>WT`BwpSkjJd(P{*1 zAF0m=1fN~`UhwA)!+%Kdv4mFq+51Y%cSBjG|E%B-fWHO&k6AufZVZy2<0=7i*5`*W zggyUO00b8$`IDRw@o&Lj9yZ;r00=Hh^5;4s;_LDEHt_eg0wB03$xk{V;-})ze=GV= zD*%G)T9SX2;J1QvIrxVN5L}exU+;v7|1$oLyNJwasBjrUeAEp(;74M3_gkUV^Q|~Q zu)|nMds{S+<3cSu{L*T)Z@ZDy*$6qm(bu#KKS90&tfZ76`CklwHluGR|vFEY1P(t;)nf9CIbVttTv4aR3q83$?X-RL>q zh-JwIu(nm#*s{F2c5!m~rMPbsA~b%wj(ca$MY4Q`?fPZCa45uWhPqu<2`Qb>oud zO^po=wN17gr*K;uYwXBLp)(@KL%0^Rd3$9_o^5qS+EwxK(7E~^= z>F9{61@oQMGl{fsTGP?CiIxmvFCe9H+A>_hsxB1Aixq6{ShuNtP5J8eZ9U4%El9PF zR&WhtT6!4=lS@4SiI8L^c?BJtq7nKyFR!I#3y?7dcRLD@7ao2Hhl%nBS*q`06OR$* z$CURA>|^H0Q{GEB$}vZARnXbBX`PA*1&qLD1j~3ZfA`-wMQ3CV^D&d@6P+cwP<@_l zrFjKwJG*E+FQ;Hl*A|#}B+~KrFehhx6%sDoh~yIGJxnyUu1d8fxl(OOu2fr+E7g|d zO0^}qQf*1Dl$PX5jU~BKV@a-5Taqg^mgGvcCAm^|sd`+rW|>u(l*uYAnf>T1#@J#*$pAwIo++EXkExOLC>g zl3b~^Bv)!I$(345a;3(ST&cArS86QDm0C-3rN)w6skJ1B{Iw-H?6oC1?6oC1?6oC1 z?6oC1?6oC1?6oC1?6oC1>}g33J8em>G_WKGiLfMBybDhvIW6PyLv`1twH@p9)trkU z82XCHv-JtOUP8?DvYPy*UT@q>u7VA5#cQ{*8yAn=(9^lOdv)iA`t3#>9L2qr-ELOn z4B8SL#l0&xa^B%A*P;=U>0Z^*3(IUSaeIJ>t~GeDaY@IT-t~$jSes2Shhv?suuva} zcC2dKvc{h_>~#uQT?vbbi6n1l^eOc^A}C-UP9<;iKe;V0@}z zYO3I@Q~_^(yt2!=RmG^?0pT}E7BX2_YaY_?EjX0^$-Ww*)R>+Q(cWZQ8`uIp@Dx7m!s;3z}Oq&EW=T+vGAt01pT4--}VN8GBj zlI=s}p=voTI;++E;p|rPqi=dOkGi7RRC5N$1wnV#!;5W^ft1zi{&se&`$cbidausV zbs^f(+rF{ebaIW-dvoS1gze2m{|B$}Sc4f|DzKvUwLo8XGE%Zy&97v)nkT|oV|qPf zR?o)l!4Fhm$L4n>roOwoI%x=YN!KRcM=$3+SlenCqTR$g*I&PQ`qIy~8Je5b+CM3K zhOG2raW?FnWvG5wYsKAIL;I$6Zn-6nv2Np9EL?_hZI$6#yHlK_>rotY)TAeJZO>M| zOEM{2EZ0?hz#h5sPBH>Ekairxv#UD0R&NNKRlh;TN#xLxNG8e|Or{KX^5`9-eY_SC zEuN`s@WHXUj@xdLO3G@VxFE}Y;sMX=$YRg(Y#ZU*iKo1Ym zVY-{5als*%{F}CHY+QRuSI?Twrsc&k7yi9lYuY>8wwXA0kh#n42s2I50sQSlDuKvt zI@4txTYKBvH>K(l5re$7r+s5v$0l?#!Ay~XcFpRpEqGpGs!Br$`#OxEgQI3kudNo$ zFShUz2`IfiX_Sa0!}wtDb+6YkvFY#9?Fg{1<0(Zq=U^fkcdU4p*s-=t&w(2|dQF8N zA2QNL7kj+^*v=+_tAE5RQ+0T5>ZsGFHoigpvM@e#-rXS~HSeuqRK~ooe}nj&!+2SZ z{S=qIhg&uJ_hn|5=;c)dH8yKbRY&h;#L1hol*p{k3ZKpLtngjW>&`eUY|`_%UIuD} znZONF-Sgc6`ttUa#|98x<2tkYIwy_bh&|s81rrqmq^2so6 zYx$5@A9EeBW#h(eyrP;pEj%1<-p_4G8 zx|@WD>_I_C!9mX(tUK)UoMBc4`o6U6LUs=ru*R}P^dB)b@a3f!+%ehyW8<^he_*dP ztLe{+d7T+%hkvC1Y#3^cXX-z;0d>_{%nlNCBt5wVN2bZ`VkK?fxqA3+)gAVu^lsG^ zbSpXk@UzilnSc0#8rPP2<{-DCG?ff}&34xo8=2MCt;llkxhyusinIG4y0-kC zv&vBYu2;0}FjK)vY@)I$x+zC)ogA48L`$}68lRwxsp8FO%vD)#%sXPQ|NuKiW#It4g5Ba(Q zG5S-#ov!o9$SlqS>(!^Sx(ZpZKA-Vn5ZWR2=|Y))p`yn82*ZrkBW`P0JG`~g!%E1r zS}`NDI;Pg+m+_gNl4Yov^hb|r57PDfj52=P=&3Qsonk6b-sePWP)2063Qx&$70$|1 z75Z15YN`--q2_}e>+_b?$X7-Dwn=x!R6o1Ow4gd84-{N= z@)IXloe@G-tMlKpT%9jusXE6bPdC+>`5_7`6%R5@g=VH?wOX&pp0!;(-d?Y|;+fv! z;0c9ZSDNKJ?_M*^q!8^)VWm&5=!?+@(&9-&>Tt&^ORNj^Q#a+)ZLC@MMW0CPXJa7h zXLee@Az4{%m>aU(Faz;_@&(PbP3n_Cz1k|%FYMKrx-*9u3ibsMt6eXw^z@Q88XPOD z_5MJX>;2*XD+9tV*ZhCMW0Fk$*;OqYfbV#Q?D&qD)i(HEmfPUh|LneB#-D*=F*gry zuvooAJkDqBo`65yy@%jrwPJsglg)=v>(y^^hMMie_eX0q9BRH#ht&B5o_}v-rxUr*jXl<_L)^vUTgWF zA6Ts}j8)}nOXjU394b%ePfz7f82pgsPZ<1pI{zD~{3GhbZw{vOei`s=Y5_0RqWY@9 zDz>pFUEK7Sw(33kM(68jgFRZpcckzY_*J+3Mb|}Y+W#7IZ+WWr=*HpF{gLF>9qr7V z;?HxO4ex4L&(7;8AABa1>=`Mve(2Nr5lis7t?KqG)%h{D)skHAw93I`QSLg*F3_^w zvHg>ld{o6w{A1~gq}rc*zm2_6$1d%Uw-q<#c98!TEvdTY(EQv^9=}x|!?Jwt(mN{l z4u0Ukcjn)T*dq@P&W9y<$Yc3?>kiK!sJi9Ikv~9oWFXAvzyYtUW>VEHHT}OD*mLyZ zcjl^xKAjWvD5LXwo&G|tbA#2YL(8c1LaTFw(D^EJMi3)&xk2X=wyDYEI(=C-*$Uaq2j(WJgVJ@pAk2P3IZc!|eh z>JxsB z?x>N>VpWqH?d>Mr*8|=2I?<{Vb`4@Xaks6Tn5`>)9BMzYg7H>_Cmrf9+Uvdl!0!FI_ZH=0w!zOhQ7-n^nmt~u`pgSf>@Uh&TRw=N;am9w z(~8vt{nZ~laAr;a+Q9?XBD|@W+5uXhA9=Lyo|^lr(8C%tL#5%sA5gJp1%~-&XVa%`r}Q7 z>prn^N%K3N{@BWW)0Y%d^4j{P{S5<6u<5@D+rhmH2R^a#6IUEuQJH`1)9?7%!4*~U zkFETdD;D=x57g;0-llVD*trP#EScV5XRu!c`7EBkxIflZjC>Y1??FBd{riyO;^td) zo{I|^`=6-A%6yYgRcvYho~Lj5S@i((F?lTN&uxvbSdhQ)@RET{V)c`fHg8_9Odnf19dn${duj7KkzZ2hy|no@o%hm0#+tk@?zg$es|Vis^ld*2 z^KR@P(MmrLi}NoVY?ylg;g5f3$*1Zk6?Qq<5-n?htY7y{)ml`N-v;MS-2ijpnuFKu1C=YeSxFw0^bPV!D$GWD`STqRJ({gdJ= z8c||%ltk&qcO@g-#t3&wz+DXPKIs2H%~wOW>ad;~_&*RVLZJNtcj*<4^E*bXgkf&ISIY-Euaj>TqmvJJZfPH%zlP zHBJ2!bls*r*B7fxNportw{3Om zd96X*me`eutW59+&fkL+9y!imig zvFL~uj(H*By^tEYf4Im;>EVKBBHi4g)KmX`*w~-Z0mgfH?g)UFGh}^3o=e>_)~4q0 z02x6VcV$T9dyzE2I6pOwpA?uhM#ltMD8cO()o>g`Jo|1RPEE~2VV`NMSg z@wc7wZJbiFHj%h0R#>DHU!N#gmq=jyyVPw;<>(w=5jplJ68oZBI=wUMN@p&Q#EM79 zMvjS%7;`Y;jZQDnLnJ*MD<0E7kSPCJ;)FXBWA8{5pPxAH{PPndE=r6VNQ`YyjDj@&r1}%FHtlqG3w>SIL0LWb&tk!M<>pSUvpk!9AZD17!kh$`!6MYZ1tH_ zc_xk$?_*ypcsWtbn8YY^<`kX@N#eu0G4cD@NMnAM17{#nz@Dm8Oq9j1`>jsyy=(i? zqtGeR%k>kSHSWGUB-Wsrm1$!25%|@hYBg(#StaoefFB6i7ylcq?Gx zDf;vg(;zt>$HGs{MI(oEC}Vxa_}&;#64M>jj1E1|Xty%gSLEMNk?wn@C=)G6E%0Mg zJS=U5b9dv1wBZUdCZrAR6{p0I0fM%9~Jl;0v{3hDS>|?@UsFxFYq{gX5;dm zBJd`GHw(N?;3@e^U8Cy|R;qz7H=QUs71*UYH{kf{0)fZl7mto}roi-S82x>9w!rjc03W0loP5QpNUf_2K%pVr-v^o&4v-P$Y*rk6U;J~wyz_;V& zv*YX+_#uIR3~bW()e8c@EHHm}yUXf8>~#2VV3+=wBFFL7c!7@tcATRE`?wrB`4oXG zfK6V$S}O1*0`mu|Z?pOkTMK!~D}h~_*9IJ4?Gkt`-kLeiPJ#Cc{2;JN-&c&@$}4#dt23q9_*^j{7*zIsLA*9GU-xF9(GUj-gl63V9uTq*En0(S{~GqBMO<4EAI z2>f$_e=RV7C3&MQ7x5{WixHA90y{lN;38)@zA6&|4uL-@@M8l1 zhrkIeD4aec1m^D(`3oi7swat`w)4Ok;P+^`uTBd%zB*IjA}mH6XR^R^1zs%h8i98S z{9b_{5cnXl(al%C5coNP`OB$ySpA7B>^1Q}fSqnR6CKA_`2vpucAVb}oH#C&PZszs z0xuKzDuHhl_#*;8BJlSGeoo*)U{e-forG7u4%1tY!~8YTJ8gN1U3t#}c4esvIIxm0 z@M6I^6AMMhuN8Qez&i!LL*V-aepKM61%6%NQv8C&<#mR@7Xh2H!26oO>jd5i{4QHw z;_ul0xe3^%d1JtV_cehxoEUPh6Zj5+4+#8-z&{oERe|%%!!*wTHoEz0mca9XZ&wUn zlGwG;dB9HRMqtD7)iQyb1!vw#AwMbbMuGPT{6T>~Bk&P{pA$G|a+v;Pf#(Xm5ZLM2 zDR7U#{8@r|Hs&RXPxKT+avQKK@4Etyuih>2djx0m$szwHf!_^m()SfVVQ<&Tdr9I- zo7Y{yF0cCoj;}r?@U2rq&W8m4GO$V0S4RYXQeb`?zRu=LTy69HF|f<`_W{ROe-QZb zsUhcCfsX>4G;zH%dN*-vk`2&jtSe86oF6 zf&V1%s53*(X}~5gU!5;-g~0q&a@et|yr0j3(GdJRoWf_63<8bV_dXwp#1o_{>$0gDB zc`r%KHb6-8O1N5!;h7Bkc8!PkN@zI7E1{_eFWHLoT>5K(-5k3f*l>Kc1K7+V!+Rw( z9OISHw8ijV2@S`1B{c0gyjMcQFgjb^sT<5=ttt;=#z^=Tn02>bO zJ#pRJjAQbL^Gawq#w(%e!^3+eG#p=5ApL7>`owHwgk%k{)2BY*z+)NkHcj!8#8|R2 zBs&G4&%g}FSGNLRt0`WR*p+v$;O`4KzPb;1r{xnn{sV&lV8Ah+`F2_UA;JHa;2!}t z9A7;H{5H!ccIp2L*p>JBfP?3>z#PM@e`3ey111;07q_^K25ot97R_}zlv8*tz;5%^t}Pwe=& z3jW@J125XZw_853a{@W)7TC=d#E!Epko$_>CEff$JlUpm zbs+Z@`?i}Ch#iOPM>h|A8raPP#E$d1K<=xjfZf<9cAOsua$o%s*o}8$Ja%A6z8=VZ zH7*v8apGB)!~SW;KHe7qyKzl?s^u&UaGVmKZ#m-wIlP1dU$5m}l6b1+&_jih}BPh-GIHbHv)yvI{&5^)BRAeX-IyvD9AYE) z^|iu{DPA{RI>bh9ynDJa#j-jMv5_0^o^DLd6C7eA$8`$WjVWT6PAE6tJ>8h97aU?E z#~258V~W_N6UvQuPdBET1&7#OH(P<-b(7eo6UvQuPdBF43l6cnK6V4UF-7ds3FYwY z3%MIp#EuineYG2MH>QXkCzNAuhx~2$3FT%@b))6nB{;-J z?yGx%-IyYF>4b7z>mhezir8^Nxvw6C+>I$>#|h=W`U2!`Oc6UyDEHMPkh|*?vEzht zIi}v&iz?YsFRHxLG7)~b)Hsv4=p6PobV}v@O6qRn-GFnP%xG~^rFh=FVsg!p!3wI1Q*v4kO(iT(77ZkfzDj(2o7{UIVyq9XGSH^ znJF9JtE`_{P?#wT33O)4p=366X39bWotd(bKxfwKSbQjBy!pSS#Y2;l#~)2GUf3>UUQ&x zc~k033P6XN}%(lQ3-UuA}WE-ZBYqyZjVZ! z^EFWkblx46K1g2B?mgQ|CEJiLFX}1 z33TS1C^*m=|D^;vUl5f*=ORcZ1}V>l&LvR^beYwMl~NM;Q9i+?49P6bF%sz)GKMqb9yTdK`htuj zE+a?yf5ZYaBZtYp#ti~jl5ww8Z^# z9QK&FcLKHv{6&NFrO18;8z9(H`)HWS21nqii+kv}x}Q=KhI-4CW!&R+%Qhg83(j{TuSRjNm0K4T?60>X zws_q8av+z$`5Zh^bLe%Dvr#lSzpLyuaZh_*O;gDEA}rUOpQObzMdyF;B+YpO+xZkn z!ndr>yi&(>D(oN8@Qmf~T3|Tri_!3k<#6^hoYp7-M|pP0alJ8AUME-%uhfRaJ`@cX zT2AOuJ6-3cmcv=yq{DWNhIY&0O3!dO4x^#hazYQ^>1Dssa(G2E>98+G!(EocRf^$o z{6xd2Er-`Q!(o4ohOb*rDOTNv!|@Xhzpxxdjv9e(1aIP(uAN=AWagYL#^i=H)2D54 z2aYiP8hL!rG;tMYP2CC9hK1pcIK0ud6kUkMIwhVAL86vr&uf$Vo_!x zl_eMA)bdB8BDEl*GS`J5WULVppO%0ty5OXyk%98Ybp(d>6ed!JF!1Cg#HQjxPd6gU z)?UUqRAC^uhUvta8QqD9_@TXCq?6d=wEcMNLqjl}ty*j8Sj0q4Xs1V{pW)K7rc%>S zaS`osPQJPK{IfRq_P|iTI%`e)sx9kU;P9i};f_sfyBuy?wW_DRFF1l#_jT=?14DDE zRj3Du)5Pj%2aPrfZgtS2wARtmp=(x0r?$2hx(sFNVHeUA*?F`eTESYBvC$=27H9~2 z>B8CB8~S+8^S)-S@kWf<)%$>+cz+Pgw@TrI z95tSc=aj&89@oOUkEFy^WZ;)uj$GTj(=zcZ9AB*S9Y524w-6q&*KUgVl@il$SY!xi z+LeXVpVGNjM$Dq$FoP%>%Eh7m+D%Ki*1t6qzal)LO{C9N@dw|4{|>?DJ;`U^fPatR za}D~{H{gFo@VU-@8T|E^0wB1mE3eRpdh_oo{IOWV+&T<@Q1H3_o(KMe!|==OdY+ka zUE2!&Q^WA*2)+;gKJZ@~hQCDcxla8&_{U!cfRL%YTLga^IIn`d@uffa~}Gr<-5B+$v;!@xdP0+0DZzPO!MhetzTlFu@gsF-T`SD>Wq)0$;$L_bi0yC>gI46-UGXv)GW>o!OMOI5wPdrL31fnnF%#%4c{es4$2db%CKqH5(77%h5_sqh!C1Kldio@k3dxWB)!ZMuR%u+}qWyCjr*2ep?eZTNs!9T7CUZsMWaV zZ9k?lPwUXVt9y)p=qIsYX$g*o=+(Ro!3RueCzPueudIYyReS=jgQCXUdV0eu=W;<- zc@UZXIzP>O6Dob)n^@^w`gvt#rqTy6v4oZ0-kWUi>F8R6IP>^l)Oiq>{VK0}Gpc+E z9Bric^B8?3>N=>_-U{_4P6{$y{D$c5X>+*g?OegZ!O=)GLs0R2$j7U?yI2bM3A_=C zt}=!oXTMqYycx~%?u^ay57#=s6TlqvFutbN`Qk)}Hm5hSA%eHNeu92=g; zVtEDZ0t*(`HnmhYG*&NaS=M-QQ*~|2vP+lYqo&Mp3zjTzTvk1E$a78nEEOB#{O0AA z4JtlFWaY)p3f60bjw!ojj3x6}TWM-1n`)O;S2my+c<_;$bQn2nxHDlGXy`NNrE44} zJM&yTgbQ^}1|1}Jh#Jqsg1{?4l~ylrXsM}Pu>cjk^kP(kN)aX(EU9k1c**iK_JSqL zmRG`-`x2-aO{cD*a#=lei%OG~P0JV5sGJmWUFG5h4VS7!ikR#rjVd=qT#clcA(cFp zYr9WPdtb-u_GDX6+s1Z0MqjOBeQ1nveO(=ERNkttu1@8}@-}y@+tj|MoX&xjmz%d` zQ$&!TcMW4&dKtHQeOC`aA|zQ!US0=0<;nZ13dC#f>$! zL`!Nb8yXrfAv_r)R`aGTsB5BN>VjImKV=1v8j{OuFRp2XTCu&0S2R+|<&{m;=Hh0v zUs2gatuDbK_t?$C?ozwItg>k~4lledYs)fQ}1Ut&C>h1O|$j>f~Gloe^JvpdSBgiuHMgYnydE< zo2r=1v}McdknD!KFPNlX1DH49d#F*jlrZhJi6cT{(830L1}QM?8+vuh+W zOV`59?s-x})|@4{9M*W(!NGyNaM)#AFc}ZA+~T_v+{*;C^amN{GR99#;16{MK3=ie zAVEFBBSI-YSN8NGGc`8bb=#Tsy8VpThXwX(uCEqss^6}3F~dWy9KxgY$Q`}y8@tU( z8iBvPYx8QmRMY(M5RqGTVvSpRMMgXd+P7o#;_8}es#Dk2(Yd9ky{5ev3&8d@O1F7g zl5L?zei7dgg^f|UWvf1gjivY$Hnp_^Lbe<1ONH6a;Sc|BG+0>$t67a$eO%BGe8tO# zLj)EOXf99R6WL}8VzXUAuV;PC{37PT6KoRi?bmj!vmM!BE}t`txA)FWHr3dXq9I2^ z@2pU$A%uOadwXWuREZ$!-HfTQbHnnk1)HinH`Mm@boHn@T(?^?$U*PfxTUk#5Hy15 z>NOpG%i24YegtGO#N8c>N!3yVA?#Wk3JrvCQ+H=)D0T;k*of4EWT|ZD=H9m6Et|~^ zvBeN?FuE?-)YsP8v8Jx4{c6k5MU!HXuj;TmF~JVbEX%5wH5plOgsAmAxTL09MCl_$ ztus-VMB{jf$hBCj+52}>_TUha?Y%RX2WM#r;Ti~&E*lLYT&;!mRxe8Hnfj{USz!Vi zLf8gjkbs5|wrZhEfKr`6OYf}ehDBJE+mzjryaCe>1-~a=61RXuEJ!X*x0*LxG( z(MKakG{6|@nyS~&Be6!WS1BvY=TxLdEyCl4pcZ>6)Y+`~VL|vn2EPaAT5cSE)U`wX4)thN-ZO%NldX8aiVQLjU&GaSxEOw}IgbtHz zXwW}&345qHZ%c->ZqFe5c?Q`F8DxLRAj{SL96oZ`&)ZHC{hSZR^kWU2rN1u_-8_iP zb{9M`d;ZkiEyAaAydHFw%pEsVm)V}F%WTWsWpJ6!I32UQ;?2nJX=I9qG;k{V;t=V-$M#^Oe zUs{LFVwMwng3*tH%jPp$jXHPAP_=DmO4hmVYeOtdEG^qLpGai=X5pfQepNeUH&(D4ZUv4UR z_22ynL!UX!BZ=Tyka+@OUdk38hYoLNIuOzxK(m9dXZ7o)%rL}kx4`P`x4@T73v`E% z-}z#pMI5t}Ut2Lan5!oDU3~X}SEhD1(;?Y_4t z-s-(C)}>6{StrOj){!Y(C8LJ&+R6t%8>C=lV_I3qJHB`5$ZLbuaEn{}M|I7iBi|f6 zuqVEvCcYn%iG7saaI^#MRzCPd9!tb?O^y5+X&RiX@;(+mUT#T(oz_;QmSV*3s^M zFza*oppB?u;`TzJPr4=(QZ$+LH)%2jX~*{-IMcfuj$ikrYY>0-p`6J_YbGV9FP+{r z{osm=y*PS_+8clO$BNj(xJ|x&mF_jBeskKEPk(9fw_Z&yIh3)zMn8FI!e0j`_Lb_M zIJxis=^vk_c9V181hxDAqO(wgXMFcig|31>eKCVmm(%@{5Wri00vAtf?B$UmR-<00zJW{i* z)^|CrU1}!w@>fTWtUFjZa^tM(dbz9YfB6i5P=mSzJLp7Ik38lb1X+a6%VHRt#uD zAdln7?=mgAe^T?{OKl$dz=8Yr7roRLv*_R34nQZ9KK2G9eS@jn*pZlD@;~;_7_HfO z&7o#wIPH0!;Zo-G9;;E1DoS86W+iw20gYKQ#5E>1>Jm1--kB+FQ%Cn7%pZAweBq?a zQ3rLXua&Q$j$bi#+}3|+;7a6D4{cjsK^?zRIx_aWmviXZrMj;ldKOmdt|@-50_H&C z&n`h9KriaQXm3vI!4=EAL>KYy!DRzCJiAcgylL!3kHfjqp=XzQp8}u9<F9r`CW#7YCf@AE7eP;YM_fJDTqhF&(UvlIq>TGiN#JZ7F9tuXs!~e( z%;2|B=jgTlO9mF9#cMDY8ZZ_XV=PRD#z-OPNre~(=yMpe=yPaC-9vD#WY0<5KIKWU zbl&qi;wy>#L9 zg~vS~AG6N%&_eV~#Od)kcI3eo^U-VI=o*Zd*E7b9g1W+qeRY_{;_K%3f4Xgcf1b__ z`b?kLH??na-x6qtS{PV_veclI4JhMcTSlY7#J*XsR9Zv!h>3mEoD8#asV%8#F_xSh zS8i8kSz;q&dC9DYjykq-RA+sEAzU!0w$|ac$$eFrg<0F*7&O=HiG3Y|bS6FWsA(`(T{7 z>OSh5`;_{=i%H!xZCw4)Vs7l{W1H8+zENFFfq#}6#89T1{(vi@SzS!-tG8`aYuly{ zZ8Ja8HY~>i%rq>+LcO2z9RnA^+g`nYgLnyQl{4& zRg>zp>`?CDyYCxaHR&RK^uV;^6;k55<>kpMswT~Wv{0vxv<6LDr)!xz?__;Mm*4ih zL7q3EOU0@tjqA#38o4T`>3eOe=@V^U(`VaaO=kH@guzU~{j`{pl; zUEl*1x@um4y_EBz0_BTR%kAOfsE;{sXPVn^ zKJ2t{&8cpr{UGkT#?&~z0=K$cks60bPcF^&l3i7i`Y5t-jo8a_^J_7a-nB7iCgb?> z#K!GnUThy1_{9w4s!Fc=GTe!8jK^ao*HxA5`ZG>C-jT59%W9Lx*7#J9sYLVNi(?bN zEp}T<{`EoJb+K9$Nb1JN@#egp+gVl_H(cFvoY?bXYmwho=n!%BR%q#Y>dH6AMYnkk zNKLZkrCa=_GkckAcCRy8kkA|W)9|327~LIAGnUZM@MRJ#j!*Nf5o4BgZS4GUwSx^=tL5+ z95~-TobGw~06aTinV-kstT6gI<97@Gsq(|`Yl3Ef=i~~6_DwZgY zp(P3)2h1;tjT#%v8w*05QF+BkeFVIgqy41YY9{q1R^?-{T#z4Q0*S|QR**mf3B*Ph zXFQXYJeJK{z9DhehQyT4MB+)f@HSe-$Ho$4I(1RvV>+QjK~XF|ITjzou9P=A;m7jE zCCWBn4^a*Zi#jg-cH*S?rf*XW#m{2WqrMX>D8W(g35O3qrh6gSNSFPQ?SfOUj>RV= zMjg2tN##ORViMF_ouvO{EN3hfh?g8jKqX`QBQ!PtBN=RS@qbKW+|{VZt962`&v^TW zSn+u}PLt3$WFK$OH0Se7eR2sLjmPpQ=twwy7g;?X8(jp|5-7e8PL3Zd85=7rP87x8 ze;vvhf5D55@=#HuyC3703SNz3CklGZRu?z7`0&O=;)rgBL^uF**nrO^MkU4{?o3SC zkeIz8k=TqT(8;j|5~%JX)F3-Y4(l;d0v&XJM=d>6%+r^LNOk``ua>k*I>~dogCv3nzJ|qB^g4~T)U^@u0T_^)8;z&F*#{*ngzB`Fct z@C;nDGjNU0z%@66+q-o?*L@6J>oRa1&A>G?1J}n4T=Oz;Ey}>PECbi73|x~kaQ(@^ zwI+j0U$5MZNN;oW*7$t?h{o_yg8c_Az5wZN)!0iC&oucYX*Kp9%egq<`07%DuMiws zNOgSrJa>34uu0$eM%k{@^pdnSvKHqfBsU8Ft-yu@+xP;%Egq)1PvFl1JN`EWrnN06 zr+>Ucd;GYUib3P`0U-<%;3QSW6Z?`%SZ?if~0(R-26L5TWp1@OZ6YV%}6}Va8 zZNMgdU)>_`UV-_`{~N3h#C=wWJAqyLUk*6FIw$p70pFvcug(ZK@Z}-!$s>ecByTHr?n{<^?D_+^;mUn6i6CPXKHOyHjhoQLbL?b$7t=)dvOssNmd!3y9<2EAT;qe<<*O2|NYASTH(ZjuM!^&bw9X;3bKzWxwQ1 zV3${Y!0}asz)J<^g7G20S>SGg_Xzwkfj`vrbP;HL!sqrfHj@Xh6Ws=!qO zUn%gl0`C*}fWY*_?$Z3ez%K~QMS|m$2|OFv)W5GT7kHb%?-KZafe#A&J%OJS_|F0t z;8$)guTp`h3S2GlB?4a|Fn=w#S25t{W5Ca2t$>hR1ALE$zPdKx_-dEH9e4=nIJ*TN z5cm@Ue?#D(3;epk#V3SmmJ2*n;5va<3cN+&+ks8FeDzU*zbWuf1%653IDVJo&ZR$h zho=inf9_6RD=>f4)358zOA^!X7ecZD_#O>?wJPBFYOTPHSj0Nc8iBV7e7nH+3H)_| zeG5yjZ zBv%37qoJ>M1{`0#O;_}c>W%liSHzLz9kXY+jm*roZ0fP;0c zz%QO0atfw|_+)`+0Gsr&b_Kr6=0&{2<~3LFmjxVL69rx=IE$x-d0i#&O#<%+HhKB# z0fG5Z_T5$o;ts3BXMkOKpA0y@`hmbd6`Utd3HdJwoO5a@9|vsmfw%sB$CUvG{$2%s%jxc1SG>P}!MzgOT-3jC13T#J1P$JCQQ+H{!fM~C?XO_x4@nCa3V zjkBE2#lWuq%YYpR)3zPsE!wx9liw~lKNt7~f&U;dz5oo;JOlC__@mA?Jz#j zZ^1G3#PABnIPnCEF^97(ZXB^Jrk;&IL^qZzAb0#4!LJ8)<22OYOA-r@^zXyg@gD$o=|2c; zIPmieZ0Z)@+X()*1pi3DfuCRC-S}hr&tU7){}r%H|9Rlu_~X;BzhGJx12Ef(`V%|;9>Kpg;J}|FuvsU2N#bexT$TKo;NKT; zeDy70wms7)F4tHk>5JLb{}TbnSI-0YYmS#BcKW<1_%8<>_+`Q5$o|Cii5;Im33us_ z3^?#-3T)OAUXs}HrwIPEfa5FrT)xYuPwe;=f?pGG;4>8XZp$Zj{FQ>=8gR_h)*Q`` zCF@ZxGp;?2%e7o37X@jalL;HXVg}Fmhj=1iag(L(KUR zA<1^xts(rn0=uz5jHMJqa#0}n6`$F@U5h>a{I*aUEHd2qB0k@8rU!D|zW}>2MSL^r2qD=X$bI$O zoNycw`3Rt_$S8`Vz1kBg8e9^H3o76+Zt8 z#s#sP2fREd_th!DZY&Vj+jLF~hI%FLq;Lp5PE0xw&4uu}~p6 z#BMCq1MkKk=QLuMS133Bi}zSgQgDck-1skkyX7#=nlVk0-}1UDAC1&7#OYqkQru|Vw73FXFru^S7!1&7$kjsN1kIHo>(uyyGW z8@cgc?5-n}IS#Rr8~?@b+HsfQ5F5GiU+l)hJ%U4QL3d*f`8fZ)Ga<#Gg2Z`lorR;qKmwo^a)V$z2oqh-4MONIcs7ox zhw&Fo-?DRXG&Ya`SP$BKnc#9i2U6ZMg&u_8MIu7zLHJx8krR3lX6-P99)!6rAE_lQ z1;bbLmL39KUh^Qq<9kRP=ew3u6mZUigy|T6!HoVjHweW6XXXsU5q^GAi4!!3DLcQz zyhjlnRM7E(1VHhAg8@Bvw>=A0Hd;%9bWlMj2NJUF9XH;_24|syau5^x0-lNLV2y?T zd1s>VGCD8fvQ3-TD7?nWh|BOnY z^XpLwbUqrDK<5NnI@FoIiN{4H(3vZ7!GX@LQ3-X9N}%(Hq7vx*&8P%AAC5|(Ggr_e zFX;T^s02E5r5tkToA|$?66hSqYDI9M^B9yp^p$)Lblwz|KxbYX1P40b6O};cPediq z`Cp?F==_DK1Uf$ykKxdC-|96%y!N9+g06mR)e5 zGftEe=*$^OaG-N_R05qjM+pveUK)|mH|mv933P6klEA}q;Fno@SY8E=kw}kh7zpsV zicLz8Uf5Vi89Bo98t3s$9470$r}6q0_sC2S)m8^y(c>PUOs0o6%i&rh?(sU29_;&5 z{cTX33-b)&9-9u=3PX8({)*)=m!Z5KJFjQ#F+*_%Z92Su59Q6-c{k$~H11907Jt#; zJeu)}7598@qXZl+VPhf`<1g;TjFRYkfH2le?!*Lk*`1KWAE*hN2F^=%Kw-?*= z{^7igP0*ZrZt)il&a+q<#KyyNG@eJ!o0x7X-CpTscOJyJQi*%((-VQjc@5+0A?|%O zBj*vT;v~(X@2`q9p7UnNc{A?OpP}<%7*d@_Fx@LW`UFc4&I?#MqT=2o*rvA`zsF)I z!zwPOi~SZO5Ze+v#6yq0Y>#L-#d30)j*gmRCA?ahl-bhJP;WW-$-2#*tr!ihmJ|AS zPA`S?am+P<$;*A)7pCQW9EZM%+1}CcL7P`epbtkvGqEJx|uaE2mH zIw+}n74h_FylL(B+Swi31FIjY<|3UnkfBYZI7VPEB($3*y+DQ1bX#d*T$=f|Fe)@y zCS`&193c$sxP>y99?ImDBqaQQ+`S8671gyqzUQ2rlamLJAp{W-j|diDND`h(HGvR9 z3~&TQL^K2vAQ}^z1VjY{#TV+WQtP#?uf9}Tt+uuHt=6KoEw$F#*7n-g+uGLJ-qt>B zf3}wVzqR*Xd)AznTAB9#??C2!v-US@uUY%OXJ(ICp-V3bWfx`U>k6&5HhI~C$yhvp z-KL(k<};)xF)iD1{2^Pjo@inBg?Y}2R_vCbldjAT%XMfrBgd`TguuDEAP0Mw~0`Fb7tKmlw+k&RHjG^1=E1ao*K!t&KrWb{EbfvqUE!$(3INS=cEomkGi$mlQ0> z@rMX7X(Q?kBw1U!J`m98f;Zw{{s#ODnT%iJfA9_XvM+EP_>X}9 zjT4L#?vF`(?l(bte+u^1=q~-P2>+XckHl9ufbS)Rzcp5ix_jFkK95tI*2!1t_au#JsRWj;NvgN~E(DB?sze}Cr%_;gI4N*z*OS{d6Bi(Q7V zuEk=H#$q)nNhWucM74M|RcC9-O7(x}L$!VzlB3X9vbs?<#fMUT>HP<2Ud0)iOk3l^ zhPJuQ4T~1dYi(PAVOqBAbc`fZRycPAy95?!xZ9xBRLvMG-(yoi~IiU|jd+9c0SgbhK(SeUC#g0;B zdz(Hg>F(<3G#}9=XMJ58 z2k;?;SQ3_uBy-B&i(Ml9emcH`jz5ZB>1Y^GQnGeaUqi@N7Es6>X_K)yBqdI(yeeaN zNa{?pDY4Wn+ZwxH+eAi;ti!H+7Iszo!&GJV!&GIV?@%SnvOmUD7JQhhj6X~jkodz? zW#+?FL4f%%RZ4!C>UPAP3O-Er2^=QUoBdpsRcF32^;((RQT1Or^4^i%N6$S^Hjk4^HkO5^HkOL^HkNI z{ybH+{XA8*`8-v%{XA8*r$0|sZ9h*{Z9Y#`Z9h*{Z9Y#`Z9h*{Z9Y#`Z9h*{Z9Y#` zZ9h+i`1R+h@T)&hgGM?h(VwTPcAuw$ zM0}oV*jF&;Le&vUFRHF3o$Vd2;?R{j^ROrV^fo@gmm2%29;HgUO`{Q59#@|doD9)6J|T2A0=8zIK1%ykj-+)%GD-{} zXo}A}ggWt_8nzab#z88Gs+3ZRI*u}tL~x`jv@F^bdY88aU%|+7GEyS1kCAd6XkgUG zPBudg;lZ$MNLWxAZb(2W>7?GyaMbW0y z&HD3JZ$6#u>gcDS#b~p*Kw9NzUcAlxkU|GLwT|?EGNMs zG%!Z$oHsN#bsE+VbZzcLc(KH>q)5}|;b_z5`~S<+CWX;yPz^RMXj+WVP<8fQ(B5~x zP8^yf@bnm=5G&Hu`AM{?^Ot`?>S*V^)sjQgAXtw6XSg#;e(ys^Z^@R0{p*)BEY!)O zD>Pl1g@PhYiv!W7#V}9zANsb;Y47hegI$Z!S7`6+YrjZ6MNN=_=vQ=i_N*V+ptOH2 z#stcRy=H8y#THYYmq#zeTXPgccu5}35MSJ7;_6ad0WQ(DE~l^Ushs{G-G~p>iF7xZ z>%<|C;9fPQ?1g>!_TIAmNgED}G;I&@qD|aMCUFNu;#%wy_a|>7ar5X65?3gGD~Y@8 zpHAH2Kfyx=l(=%dK*g43q(v`;GP=n;5vJ`1^{z9SM zw`cU~#>*eymo}OoYrMR1w|C6S z#GN`YKPT>;I_~*`3# z7SjEq)m>)o-nZwK8@@W&cyr2H%E!4WTZ%=%@#ylq@vszf%z{1hZrXd8ij{6KAImV( zrsL-AX<9bCYr(3f9Zf6t-ZQ6k@9w*kjiq;wyJ^qYZf+{4&_AxDlndt?(mgJ(?jxL3 z>Xw?DR(x&GO(EU?|5}Q96CP0Cn7atGH>Pr=N+naJsZ^>gRi3IyjZK}LIyE&ng?rER zupMvI7*}n7ziO!3y0B_{!$Aq7=~tuk;;w9+H0x)=wrtG~qsb-{wz)4mjJo<(XZKqP zqmi3E@0`NtZ7HJDgk>;87gyhfHqTST{w0eI(~PfvE-k{AY%MMbn_J=c545!H@d@wK zp`~N7?&y`YW^KNJ59AHd>*P+wDGT45D4T+nJAWQhsDr;p%i8Mj4R>wZa96_X%H{lx zIEzWgSsPBy;4k6L&Sl+BtJ??XJh* z^bk7oy=w^Tl^;>gvC%lzY*azgmi^hx;0FYLOyK_(IDx@1$9tl{(*!>8^%;S`C@|emJz1OPWe9)B+W8nT+d!*Y8ji1iD)3iOq?q%4fqx_L0fBwo z6J-871a1Om{bve%j=*$3k#1a(KM8-!+SvijI(Ik@R+SLA3zPB8*)H&V1^$@8j|luj zf&VOU6)IO_kFO>Oe5}B9hwW5rGvV8<%{9Pm&qBxX)#(B+7o3w&K{0=^z?}kLBJg_z z{v@!m!B>w7{G`Bi^QghvN%&T4=eL15-j^N6SHBbZPlEIPAp!q40((OPISp1>=ZOL@ z1U5GK>Rf?41g6_4bFH0(*`MbFv(Bp=$5+=1e1qT&ph9QyPM}gU%XC22^&k6jz;CunIo6P@~ zz|R5KX_daB8Bn}-h|S9oKF-GVQ^9}LaeVcf!2b}OpW;<4j_WT1$1#Oy^!tjY6KB}C z2y=xT)oM$;=CLIR`7X0vvVJ_|;V4ohG(*(^9P z`tXp1)`odUSOS}m4NDO9abXE;rr3u#|Ipen6uXeXW{O=%U^B%oB(Rxc7ZTV^u?q=o zrq}}stqnu5oArKlPJqp$!V=g_aS0A=#*hPZN1Vs%VDq7232dgb1P3-BAC|yo(i5xz zR0o?$kC0eD2NGHvhV(dzTZMvpaLLe{bg1O;emQnon|ymNj({d^_hst^` z=Vi;G{1Nvi=jHGlYEr3} z>=C~;R;4-g-q`pY9>4iWR>VDe_mSUs45&0CN!v*L#XV~4b2om2tXgw6Vt-T)iP!(2 zx+SKykgvnr_pElRMGc42KD^Q6@U&66D5S@u0)dT6Wg$+Liv?ye>mgMuG4v@aH&e8Im;bHqpdZOjh5B0adKcLjTPa7etO4plX+ME8hIi}Wl-6o~}T!g>UQ1zZ_ z?>~b-`#VO+m5tQDQSj5iV>hD?D#G8D#a{(}cM<;k1b;m6t>Et}!hb;UPXc}c{97&G zjN_D&_U{*bbh*?rbT#%D;r~kTmjXWq{_92T`Mcnw+ov{cL96(T5$5yfDBDsIgZhZi zfPZ`uex2a!Uid{=%dH51vEUy9{d2%yRfJDtdEU+d*a-fB<>&L~F2U~rf6T>7eWVEg zF2Uah{?EXFwg~@gg8y#tpT7j-^X~#+%V*C^g1;P`ziq{6tq8xI69wEJ{M`kkIxIh5 z`I;#BJHfwfJIZ4b{yf3227lM3C}Wn-LFsw~*o}JubT|rsp8&t|SreF#-^W5wM&R#9 z;7=&Rze@0{z&`-~>>~VI1^;>QC+t9(vHX1g|GePe0sixF(yk)>=LDb1@|eq&deHLo z`TwtikEB%>??QRBd^?{ID(}NYXC6tV`mR9!{~iFgeEfF^{v2?6uGG}fE?plSHVOV{ zi2wKo{566<2K@0?1-ckX{g(>PUCQSec9s^hOio-4wi zCHTw0AA3E@*AGmL93=gJItxKL1AqI#pIwAc&j#>T4bbx+XzwgPW&@=D-GWd4yaoJS zMfBe(_$$G0My2>*5&lDh-wpoj;J;Xe|82o1{m};k}_=MpO?WOu>5@fIa~~Wi9d1=R`xE!KRJtk3iux>!e5%j-vIuXitxJypX$#& z;6Gc0e}&+u!T%iizb(T5px`e6|Nnts@}u)%&kFu1aCW~3?VaW4^XJzEe;xP_ zf!|t0|1Slf{D0X^D8EJYzm~O{)8U^V9V$K%LSk2WJcbssi7U+KjQ69G2R(n zs?<~9&$jwswL)wsJ1=azIJ&ELr zbxDEqXvV%ROCD*ZbWUWir0P0vw|BAUWj1xy)#?|HDchqI z+9NNvYYQFB>*?6oONG=0I|(S8iK5-q*|DT^eLxa2&<2Qx7dd$o$VbEo10hK zv~Wx?PVCl zEuGWc+dr^$Q~yRRo1)WwB!yC%%YaBz{e@^#{Wsp$!Ueuaam#US6^(E_RTe`>()wpf zCvFyKx22`qj5t!K;jOGl^^fq178Y;Snxz9+=2<;OIo0AK&P33*JZDHBSCR*-j-b6N z+km6M$D1xNZBe$9Ngk;ePKemcr~X^LoZ5@qEnLz!c6N5mx0!i7C4#Q}vqK~G_E`~o zn^r7%+f@OLK)tFXO*S1jOgnHv&p=~We>;|So!i?p(AP^-OXib~_ zR%oOy|3btr|Ixq8<gHHS}+vgFmG%aZkMFj6py08Lvq^{?sTVx}R4oBOt~ zOe2T}2AoJES-6n4C|pZuuTnopC&v^n6RE7wrsYj=W<;9qyCY8bFT{#KYuG?KmRONtO-77ZAaBuaYA0n6BrW*?g};G9Sq`4IAPP8;DUk@|UDJleLR zHvX@wGj#VyrS3medz!sxs~mFk8Pd&J;gR}yYs5ajt*DPtU%b(D-9fCnWnErR4zF59 zdsVg+HHjT4g?&G_yAw0sw9(v(u4`ykB_Ao$RQhDZsr2nPRpanw2ZI79;egNAzY zc@^E|LK?k_76EC5PXTeHwtwT2h@QXFNmPInX$t*3;uJcnRggH6k3^Oq&1Sn(r zj>KCnW2iy(Z3m&s4McI*Cz!Hl(bcN+K0;OhtoPI@U;e!1oi21&I*M{ zk>-WlBhCw7{9jpGPtj?lyBeyj1#^Ts^=Y@6`0C-r3D=|ujWkuh6LG4%{=YI+bl*@G zrPFjWT|j$P_V=UmCR0$5b{0x2Ly0uOsuIywsi!6W*EV{&3AV!|*i_t_HRTHPDn0mW zB*f-fFz%bMJkq3D6>-w6FPbz(I_=VNW^MxAtQEe~1%#%AQ5%V%NZp6U z^di;2>)^Q$^H5Y#eCr+TKKhu~QhOsvPYqh%u{_cXyE$UVeXywGc>aklwX>h6RdF+e z1#c;1`r5Opay<8Eavy2oTWtDXGEa;kXL4Ai-u+a>-u-e>@4hAH>71v^79FRZCr8bw z|JHS_hi~!dDtVZnRp6eW4Ug23@np2+`-jP5Q%gKr<}1!WT+>e}Eo|SCX}_qu7Z3Hg zPP>rtm|#)EX_?;cZrsG_?AzSl9dNS)aDskvX<2(8-mAM3JX{TJ<3+3XXz0J6O%i*O}JFXnLLn#+hZA61q{n~$z9J(&4u?fIPp z;fI=ZR&rv_P5xlVQ2%ohu4=z%t2Sq_#(pxdR&37ib8}LBF_oM0yg~)eNqpa}rrK;E|W` z!;$(Hg=Dl4qw0Q>ogTq!JZQb?z3*_Xp=YhA?Fk1(nt|4)qOC5jO?h}mCR5<~Q?C16 zc5#k&5?9~DUEF7KEOHbJLF~~_i9i;vQi!D`pmY~|kVLm{c^;FMNvTH&QlP5}2#{|2 zNlWvb^CFuk!qQcFrRU|9ZXszE-o~W{rvdkPLm7kXp6wJK&NGo$I(J2!XP!5xF$1pYtxL1CFXA z4fC`}X1bgzr=IeG$c6f$>+DRZh1q#f3$wGJ7MdKWZ(^vj7pLhQ$UdeoUFu#lcX{S; zM$F5Iv<^#`MO%lRUUrbWJa!!6GORsD>c7#mAd5OL%sx2~Rq3g2Rkjk3s-cn)31FT< zK+2d^zH~*A8ysokbVZyvmzMpTX5^}LE3e9)nVIc%`*@9ZyMCg9>Sy704v*CDH%9FD zd;V>H$0G}95>o>wh5e2jdkvf0yUhIpUCHTkCSC6+k$V1%5qtg@Z?`&n6ZMVj=eoMe zNn|sW(;2F#w5dAVq|l?Yb5e-AEjx%Ym7Y+{N}tF(FM|=M>a`rSmeAZc!@wumnBB zX^yzFlGQ=bhi{OkPDfZH&NAbm0xI8V6om6lpZTHzJg2@%zTGy*i9j-UiO~%TMu^l4 z3%z2N)1}cpimFR>UMjm1-E3qPar=)P)Uft^1j9!}qO6oBJkqk>RUU2Er8Q>x`1k1K$&L3FPagpMeHl09bg94?n%VdM^%+1LLOFQkmn)*SD zeEC2#BFzZzsED>MJ-6cR)}^+!Th`a!)4%MZjp8NjKvbllB1k{>N?c& z`lUvmV+*=YPQncVc_RqcM+nk`*a+GP+wUH-FqBL@39^zBkteCBl^}B>p8&Zo;-tFw zU?o)q>2a1RHeWysZCi)tO>4M-AWVO~)HT{7EYiaBM8qlb+S_dvxP;^{Jpa@y0J2Ie zFj}Fh9nAA)GTDh$u>9Bri@XR89TIIrF?mR_hT<*McF`4~FQ4vGC39h)y*EWA2oE;| z-QFN5(gM^KaeC~0Q|WO~ojsb|ST%+Asw|0Kt*x)%(WdrI-F77k1dAuRsR_vnkJRmZ zB6j<2Mcw|-^p{RY_cP0pd^4_~Cz%kbEANZgm7hE4uDk(*sKAxtMsuk5j_hcIB6Z)_ zBX-}j2i<+&!Ruy$`#6u~%Y+;jsRMrzu>)T@*bYpM!XO6@Z0c*jpmWit3)Xbze-1t? zJW?kfh}el`LyL6_-co&NpM~Fz4l$g#c-j1=csZe~x5rLlQ9e{@{OP`MZg8Y-95Xc9 z-qrC#i%yb6ybfLJ9~kyg#xGMV}te+0I@f-?0 z^0%QKZxEVCY}S!)X_hWec%+W}OvH|SzIgrc#tVe-aGAa3CbC&jBry=A?-4C*?>|47 zr_x6q-F2^H-5u0w&O`L5g87D*Zia+BQpcSWvE#Z9p5tsg zemhzK(N3EO!Sv&Le8Xrl92siMvpA7D^wNkOdSg+CzKK34DEc9StS21JVUf1HXoFo( zF0Z0T1<*nL1!@7L5XQ0Gnd;|`DpsZq#s%4gNYmxR5vR-jMbqW2__b=7cB3jeFlSuJ zyOr8|&zxb&b_LWKtKW=ocqNCmd$HzWmF+R?%i81EoAC8I+>0%OG={yAZqU-9u{ouC zcY7!Adt&bujpNKw^PYXPiCwz7B}t*JI8OGqUTu!{Z8xk&NOv7b=CS9aZ(z^e)}B^v zPph@(9%0YEC+6NPZE1D3?0cf|=47w6WKW}I&4n$EL&=(0j(2`xW1}nC_e3nSZ}w%{ z>bYA3KbE$q2NNFok~}$gPYRwi{1o`9UOw8p|F465)!FCQ<~_e8>-@jl^QD~>JHEwj zV_$7!-rE%K_F|R2?s#6jTg6Ix)%)+6q;}9XWb3%j>1ays9j#tpF-V%P7gF_s!5dZ# zmbX{vIGXkh-f-^VzOUW$)V|p`qq($OJ)9m)mFO#f43Y&#(rhL9;(SDC58`}ONKKrj zHqL!dG<}0(^KxP%iHxoCK;u1g#;I7-xP9ZA$F+=Wbvd7|tSZJn^G+^juU*kRZqDv! zhqjJ;acIl9=48_?^WN9EyEVD*mi_o`NuD}Ls5$x4>el2hk-uMDogS<-*H>TO-84pd z?)V80X_p>sm7y^{_F|-`DS2I12_U;}baol5xO6$qh^et?ObE@2sWF+IyD6q;Tue!u zqDaq2QwAsR8GT@|ZE)XL@}=9~a?ad$i#%`N`{*oL*HC;DiU>>6YOi&^_O>yx<2XMBrMG? zIiGdsH)%_ow53hj(k5+bleV-;TiT>8ZPJ!DX-k{5rA^w>CT(exwzNrG+N3RQ(w06V zVyZyii+N;k^ByjT)xAxy*&p1gq}0eRhitxM=1bLI3+?3b=&s`rBBmo(Hz)Vjr@HxS z_B~OLk^@=rnB6Y1pFEutld~i%!E9orWzs4O?^?w&*l$(P`MC)38OS zVT(?~(_Bm{);Mn7o+0fm$&%GE;8bs`MRBwljpJI9Bap^%oyNF^{jUu+exoF__iC2i zg?4Ka&Kap&+Tnwxp1xMcqjt_niCLxFz2VSjSg%7{4B8Bfq{O;1Ps{KTXK|Ey;$9aE z(taUoQ7;7?5}_MDSOT|!?FF_pOzy6=hAuy<5%dQhcN z^Q@NFHXI@0YfBfnwnGz~N29)qBV9~L3+Kh7oU|!fF0Rd#!%6n)szO({cmKChM&b5%zxKBme^5ui=In2HLA3-enxF2xbIlG%s2J&(6jZ@phnq&LB z#L8~7DwE8Ly3HCXVyZ@3ROniQ`r4V~-qv{cj)!BtkD@HRWYk(j@ZPo2*t8PzQb$i;X+tXIvp0?`t6yrL?{5cm(Q?k9iG1=DMw0qye zDcwz%BTdtf-_xq|V&moNdgR8TkK_6|znPwO^SI{uCEYk@jHj9#%e$NBB=pg6Rnkk+ zlxl9$lH|T|HCm#)6M9u_pVovt1o^EZH(F-qn(f^#Wl=#5*RFY#5wVnl5Wa?i$jLd5+8X-s6=uj(hxxeK&ithUG1) zCHd-V6*KuWd&a8Q*%WokT_|E2zIyJSczX)H8};yAd+POQ$c%!ik5jJG&5io@A3(0- zoGn|ck2;M}_oVL=F@^igWSc1^VSA}xnbI>?(&GPedRlc}i>^KWxrnJ`^&`vY$Kt)% zd(>{4KE}Q$=08=^u43MyBQg5)jxo8YY22b@1#(f-<-7JY-t+kEMM>|_MUed!Ifz=d z?2>a71WSy|;c$=$K}!{qV@F zzRWVrxQyC@eB+*{ofT21<#QsY!nJtX_EfX;T(a_CmFI?vnApyQZEYIIHR`&V=5(lC z%$I{^y7PHnY&EVa-^g^8V@93VI$TWDQ=u6e@0fbDAUn!vw$aRD7|AXx$!G74PD|AG zzR$(Py_CRS(?h5FH?Y{q$mTD9DtnH1zt9!!Z1l4(CK@GT)Bp=xt|mY4-F?}2Zrxsn zk{n2`grqs?<9@{6R+=w0<9!;bl_Iy9qepeldHCAgdp=b|xI9Fi7Kgc*!fA0Ca!Phu zT>ExMLy=Ia+#xlKbVjCR4x;J`FzZmbD5+6o>ymlD5qYfxqmg3^pzaQ?x`K&cyw=a zwc+afQ>ozoV8Oo9Tz7WVdE_(^6Zb0edFVRFGuJ}-=e8U6USY02JTLKO$BlAk=W!Ry zu-IMW;>%lNdr!D4dGhi`g44s2S2{2@s^M6 znR`p)K4$NGEMJ@OM;A+aaIDrEE6^tR!#HO!GhTpsTngoZF=~>v+0>)YP+i!(tT1}?(VVw^34)Y7FYUs% zo%>e8#=G;jug*RXs~mECTe8Du1Yw)9!)PH4W9LP&(-A1`oaVx|^=F@VxC`5Uc6Qid zLD*T@VTZV|ZD(YMoe_k^mLgEv(&56k$JS(p(bBWl*Re~o!f?aFhHZ^qpB1*;g>8>5 z%L=2X23co!Rv3M`h{G<;3ZrM~Y#3caDBVW|VH8~`jNY`d=Vh|P=!+dTjFKpH-t#VO zTkJ;&ls>ydgx!`EMvKuKotMNukrlSpg ziEXj$Jh8={w>`Ew>%3(yY+H;f0~uejJYOs?6}tvnFv9veMh>NVk2iWL!-ieuQKhz_ zYI{S~rC+19fu&v9I%F8VyKQy!LVf7GVm3z+R;+BKot?S$EWJm?KANAECdJC>I(Oc- zSVz`*QCwd!oyF{2?CjhgTbN}hJu7OjeG#SKIJ_njM>~nT8lIXs1bh7I&5L$TKOILR zMn4HJ{u4DMkvJz-J~TFbSgc}1taQXT6J=DtAOvt#8W65emK!>)?!u!^CvimF7}lZiyE48PkG zi9gWZ`=4z7eQ(0H9}?$mZU6t^suN{;?`_N0^@Z%Xb)1D_zPe;c;?Ql0#EQhoxzH9Y$&UbVp^kd%lzJNWjbiEhNUyYm?Hx(yu~n|3JdiIt7aL;6&yF@Q*vCCdF+ z`7lIQo)g)N0dq{EY*k{&cDSgtD*RhEDppaA(<}XKTfdY-M3=>o8Kxb&N}qpLV(9k7 zkh69muhDUN%!kib#i|a$`6EVTpMOUg8(IfLx5vtm1s75Zyb>EaijrYRqU@Z6KWoKF_?IY)ud9t88yo5+hU`S@nEwcdr?EdPF=9LI zhny2jRp$#1lW^UoISG0FP_}{+f+9Ib=K<_(ijqAjGiB#c3_2di*lyBXGANRq%=U}J zoQra*m3xLE>~3-cs=T^Ui87SXop;4jBPoZ|#a%}G>a#wY7;-t#ClW*Ut|}7h?a21? zFNT}QpH5+hvbkyI0EFAuimpdA&5VQm_6!XMo+MKfzW8&MN(8jdoG3K68INe-75*TF& zjbNheQdGvIqwG?&P*j2E*6)9y6PP9^sBLuACp znYnHBU=9n_d!Bma)1!?w`D&ma*f8TrWEE8Yc`Co_4wV;#3`4ZCoF2i~h~`pHYfHpZ zD0;}J+jTeMcgYy02Si8XKgPT%&A)cEA=TtRl$x9xXHSvJ;JzYZUoR4NAPCE;XWu{8 zTy3#F(!<2zoRFJ@R~>GG$56uMl)r~4ROi3CF;w)+s$xU(CF1{BEhsBFwcvH*Obq$X zyUT{bojK<{R^+@N2j}IgsVDgs&%X)diYpmCJB zq#=ehyYkdZ?UA8VrGJKP^PzF_|{0P>$wBd!LdYu{au<=m?1$oH-xtST`M z&_e-LqQ?caquDpw(t58H&A8D9Mk6uWXcmVy8kN#Uvoo~OObl(z zr`Z?UXr_fWnpL4~j`?vTYML3Ljb=e;+oAX7Lk0wC7JxRIwV;jd+hPv&;=%;^`Z#_* zk4E{lnWY+(;$s@&)5iSlU%tMyW+_FZY1-HiG)kr|`@HO9=F@1EHX51A&E$kwCJEsV zJtp-r_Y1#SJPW_uEj~lwl>$E@@UsHHDsTxh9_tw)@MwXj2z-jbs|D^Ac$2`72)s|= zZwR~z7yG)tczg#B_%+yvEwdSzZM(*Cd`#Fg-&fsz`ql?49;c!69ujZ zHum`Hbb;3hyg}d|-~-lv!hf~)_X4y2osQ$HD+InqaMqUw{3`|ixWM}b{*}NnR52Xa z;R4S9Hn#byS>Uq-ZWFi@SZVvc3}MP=*fQ&YS^q_j2Zy4+M)d+z{3p@_E z+}c36-`a2lFxxQ0aeQ^Mz~fPAGUpV5R|-4;Z1kht34E=e7ow+sA5fqwvO;_}sx1^zkkaBBl$E=Ml{v(5vKnzQBh7kFqupzQx)w8kluX zb{t>T3Oqw_4#NlIn17PMX9>Jn;61=5UeqT7?-lrd;L+AL!XL4=JpjycecN$-^<9C# zg3cdvUJ#f%uPh%c@N{4km#^jvyink!z<9-j8lnv04_SMb0kh6N$MMx>f!B@=IF||h zA%Pzj_&Hz`m#=;;@b3kF6?m+*hj2OiL)bEZ0cLwfqSJ0Tz8WoXVqCzPAn-haI|SY# z@COBcT;QJpb6kHC_%(qCfyY^!33HmNBLaJl05%+79VM`z4meW;&IsHs@Rh)<=RXC$ zP2dj$r>#AN@3v|B5n%S=mmJ4ej|zPEkpbrkfqyA*Y<$2O3vA-@)d>QhB5^uQ32;df&WwBPYe7lU=x?Gej@Pi1%6fFzXMOOwh`t& z-s`|@+t3NjLEA0xpMV`_Vt^+B8=bzIEbvs|qitM-PqluS2F!X|9LHCS1g*sd@vz=!-j<3!UxOsBG zSugOr1^$e{&j|cifybQ~=s8v3bAXL)zUmS9Qh~1!_*!7BHiON}5T-AgVar?x%-8Zk z$MMxi1-@oVz_~}@rv(19z$0q{{uF^*fQ=2lI$Pj(34E2nw+Z}dfj=+sBfwMbbrHVI zUe}|*d|lsj9AEuV;4jw(oaY6O)dlin1a1*{oxs-!{7HeI1~#_&>c0j4i@+6A15R4t zX#$@tFn#ZSy1ib)AJ$l9<^c2cp6fUmZwkC{TEOWR_t=bL7#s*^L_O)Fxy!+Bf!T9JWt?dz$PwV(Pz9*vhfn$V&gqq@HaV*uPzdJ z&CDRKodSPQ;4cfjAK1j@EBcW2Y#T3O?n8c8@PF$#zIsLAR|V(!S%D3I7kJD`fqa(0 zX9AmeeYHX09)am&&!<@12)Ek&zX_QAe4XR?>IQ+|D>xUQ9Pr;K@Mi^nM®TsAv6 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

    qt|56 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 + + TMS320C2000 Linker PC v25.11.0.LTS + Copyright (c) 1996-2018 Texas Instruments Incorporated + C:\ti\ccs2050\ccs\tools\compiler\ti-cgt-c2000_25.11.0.LTS\bin\lnk2000.exe -lC:\\Users\\zxc\\AppData\\Local\\Temp\\{02D5EB0E-4731-4AF2-803A-9EC1D249F785} + 0x6a2ba339 + 0x0 + C:\Users\zxc\workspace_ccstheia\28379d_test_SFRA\CPU1_FLASH\28379d_test_SFRA.out + + code_start +

    (C$~LmP(zmjgj3vc z1WD!V*U`vGHijK$+le(4TYlnAoT{kv^sjVcY1O20wdIvlOUG1Il*2i7HFfylFI!F0 zvwQ^2+Eh&J*hE@9VwJx#gH(r`%@Rf^mG;u1UB>$!Uc6>NHi>wVrEo76eMrI^b$+jh zT=m2)9#>sDf5Oy?szR(H9PR#Kdmp4~CZm&wg@GYMVbnWJO>z-+KHd}#oYKm*?6YyyMi z2?e4}9qlKWA2?8JCU$GCClUy^MD5dF3tpyj5};}ggia2Ek^OkisDspTma$FDMR2KV zl6}L$o)@(Xq>Hf6S(&A+>au7MTw5qCd;<(z1@^KaDg!039e4Prs z3_Q9gV$C-w7EZA&ezGsC6+v-I<;tE2E{fu?up2YaAsz zfP|%>?iIKJ;1eb09cclPVTyo21haf3w={wt9>JSdgd{HR)g!+IwX26a$Q2h2fmgSQ zpn_Ay@>XQT`~b_Mw;@RaK{^P-N%0MVmeEFd_lCZ?jfu@bh`ja<4;UgsmNU`>_cyF$Jd3la0Sh-TgKx+hfT?^<* zqZ2!T$5+(&BB(wBgMpMQc`wYq`~_pCZQ-TpO1RX)v`jH(gmD6M;Z_J;{5pSZo*#ad z0NiH{D=vb`dV?)dU`3*O*&TvTk;|(IH^3WpkPAXzy_0??Al7jXD8#1{;jcdwAbltR zb&>s%fcV2Ly0T~gl>q60E5QrRC@r1yD*;?eP<_~jf%!Y<7T>2>(;=1w$wQiO34q;X zN3DogifFja&x`DkRq7ruGg1W#ul67@Y>P)v#L^0-?MU^Ksz%Va;vGk7GruyAyff*> zY2@{HzC#zoXCded{fTD8?LM*B$dVm2DAf&=;hZXzr*^--Iot7i0A2Bafp0=|s_UjV z;OBRcP2u>8`C;f@)1!3~PT}Q0{Axux+`7umW1q4BV}`J5F#Z5zuMLtf-AG{Kv=JKA zy4h9SYeyb;TxbCud5+iV5;wcxm+a2GUa&N!;$v?3kq@c_V5%g77m47DW2$B1u3s74 zGjvQB@7qb)g^Odpaqq=Sy9;W(a*{M(!u`|;gEZAg!c8Q~s)aX5jaPnQGrJuLW96EB(9(b52DT{#lB-9*GS86=Zr5h2@~_B%O_1aK#!i!j_2aYTpT>- z$n#AgZ>qEPAr5<7DoWhW!th8)CS)v#jRJ;DK<;0DomgzcKcvU5yP2 z1Lx@l;U(G)*%Q2PQFTp5PTIcEf81d4Yw5WJvH_ zKZ6G^B;Z1I{J^BWIOH|>(|=#m@kSKpDex#r0Z064f&3j^Cz1X_Jy@W zoV7!pKk2U3!XVM_qIKkJv~&w=$ur$T`b@WwKGQ9v&vXmvGuuK8gegV&a8!b@V^Il0 z4n(Ej_?ZOuQ$FiNABch-!8ikvPnBZl5VgUlS1B~!t)|d8FPsA7Ll*%R0#ru7chIrI zUPK@wJ`y7EI(S~RCJ=>S0z8j^kN(E@j^oEq@)Lm&MUayf6ygZS1;`n;3a}$E6HqZb z7)(c?Ju^&-@XwzJJZK}YHsZhr05mF4PBD2vb=1&vY}$$?RQPzD`4x&1|4C5_C1zI4 zgZ_f?U~)$h^F&)?-yC$p*%yn*wMS^@ zIIs4C5^M4|k&l9&??SP$#X##vFW5}s(+9EhCpN#%6X`(3>y4Ha4J#T9<=_}_aCERY z+|&#l7XfA)04mJBN_E-ox8tg4whn4F^f{DY%0A2R)grb#D@ALlO~UK>;J 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hrpwm.h.A2071BEBB454D887.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hrpwm.h.A2071BEBB454D887.idx new file mode 100644 index 0000000000000000000000000000000000000000..f0e2bdb80e11353a2c0c9190abe6886faecbf98a GIT binary patch literal 44058 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cla.h.9E23A77F9EA5338A.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cla.h.9E23A77F9EA5338A.idx new file mode 100644 index 0000000000000000000000000000000000000000..4012e211f7c532e898840bd1dc5222de4fd324f2 GIT binary patch literal 2392 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cmpss.h.B0E48D704AE68711.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cmpss.h.B0E48D704AE68711.idx new file mode 100644 index 0000000000000000000000000000000000000000..0a5e2aee99b18c57b5e2570c961faf5feb21dc57 GIT binary patch literal 2190 zcmYk72~bm46ozvV%n?SAttz6jDOi+*9m665hQYC5*cUNC5()?i1OrZ)vL`B)ai)T8 zr%)(@xIs~2tcs#mt0EKx0R@+`nW_~hM<`0mkV@^6Fnf1ef+{ylk|_O~&0-x}^~OGO zd5;FsCZz;QiRFJ+WwB0(?bzWZZ|9-#13yzWemTE=a6rRM6Y&Ir39?)*j+V{DREK7; zQ8W-}AS>0v|EVx)OW5E76q{fZ#Vf)F&hP6>)J9xPpqN;x&%ZvsJKgptKV1~P1bP{v z$oF$E7hcsvkqW71>hs5@yWRC_rWPUI3R}(9*kZMOedm>7eZ+kP`j~|^CSjx;aLrcUb37llkPwrh2Hm;|zLJPOrByf>wdaRb)+IKojy-?&r zE}hQ2#s|X+*=zt}5r{0*)yM69cFWo+I}mXcMA4DzGV(s_!>$TKe3`&yLeKw_-(mVD z{C+5kY68{FvZ_p1zRG;5j7Q-N&U6;8Y#U|^o=+wqb^<55X~!h;d$SK-sIZ)XoS6la z(4!;6hlfQdw!t>K+K=HQ2la(J6A{~jt%17w_BP)RS-(#b;t>KPOlP^r16$72)v81R zfdaBh{SUtVizV-ew(msIM4*Y8o#JJ!WhcJ+E(1jyfi_0O*-d$*<{!#Mu>m&Fwj4~+ z;#T+N??&thj&!}RKg_k{b(j|*4uw!!znQPqlY7JaN)YpbPeby?Byx8P+fu~4U>DtF zk4jHnk?A7^Vj0M23lqF}McvCX_9BjiNIEyylA?}T@{G$6M?eI{Gg>-p&kwEn7I6rK z(9U|ezPr8WFX8uyqam8&^7+c}>3Wk|#O~luZ?&jO8{@l`b@hn*3G_2_psOq`jmz?B zKoJbVH0HFjd2)t*s1dOnxY2dWKYkQ0te$rq@g#vsLLZKDS3`}Ix9KNQj1d@PcD+ui zZ!Hj+G^1D#>uEi=?;pAD|M>PVh|?gAZm-})|BOxZ(iX&?;7O_0rhxBPw@ML2}hm?>RzztNtaHpCv_K`$D&E+_RfS=0r@!vuzzDJyP>y>;$k zrAp*L4sG8WyROaR5aWx8!yt?{J?!Q>tgezcLZ|Ct@$~qTS_jcKXjQ>{MYN z@S(kJf|34s!3Y&8x%*Q*nEs)R52(pT&D rPci?Yy`gbQ{z?74r!K1s)I)jqIh64ZsDgrkHz{2)5qea literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dac.h.441A3FDC9232B7C2.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dac.h.441A3FDC9232B7C2.idx new file mode 100644 index 0000000000000000000000000000000000000000..39008fca6d22fe75b58addb6f350d924875332ad GIT binary patch literal 756 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 b3Z;zco>r5ub-=p~Nos8w`_gZ2mc{xP(qw8* literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_emif.h.3A87699B60E548AB.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_emif.h.3A87699B60E548AB.idx new file mode 100644 index 0000000000000000000000000000000000000000..1d4d85429b2c0342904be08a77d2d36988d93328 GIT binary patch literal 3214 zcmYk83sjBU7J&DZ?wuax5sq`D$3aS0?NaDLoAO91BTjYb%C2^`Q=E1k?DFVElH5{? zqHu&>q8E~L^_JJoE64DtC>6I7U9Zrc|2gCTmpw-9F}`oDHP>8o{_Ec^_KO$q8YvRl z`q*y?l7&i#ibNs}`U?qF$X)3B&yTM>P-batY;0?394a@qH5H4+Zc>HJbGD~g>?t;( z|HeKF`6ihnQ0`^yYdUw;74AZOAA)tUem{k zFMwY_j~A=5ULRPTKIiWw%+Y)zkH?&}viOu{GmNkdWkOiB8`;%Sk_E#FUkAJnn*8|0 z>mIQ$`t3N;2iONwc@gL_(JEWjl@r@>yRaW`Z<9Cu^=~XY&H^P0SN5N#5u_PoY5w`lGPfK!lWhaM~sMO{6v)61#$LjWL z8ieZs>sjDwLo%ly`szKN#5KTcFqxmBG*WBJ4B!17iEX$|$e_X`e*E)B=ZS>R0G?q- zZ8XrCH`50vk?=%M9e$bOfmg3LMLy+l6<`%x|L2DjO!7NaG)cq)#)42xH>F`*d$-$U z5(9t(EaQ8V{#Dl4HuFakZvfvgk@%Z_;rdKJPJ9LY%BpOg{K@=WdK)Lw0Mpov)TkMk z?=El2 z!gqY;aVCy+u__TWNCac>G#)S7^Fd-1x}U>d=p`KY?XF%M;}rK^cUJOv}*j2SaHw_!g~Psu>Cx~yHc%oQ)plR^Z zKS`tjrhpbdBeV~~68y5)k~jx=j+Nf9WxYjq`87@)06f69s#V$~6>lzEN1_z4l=Z~D z=t#ReA=*+B9e^Dy#wN?})rNW0d6DP`>}Q>N_H=J@f^MESiG09(Hbcc*cVPFgN*Re{ zz+@&y_c@#zJM{r4oY7fm0P_?Jlh|96HxSMP%wyw?^wo9i7pHK-3azyHtkpVoM}1mQ z!{H}@Prhm2gR5Re?Hs2dkp!5;S^!7J&9lB@xrKxqx(PSx`4u(uMkilX5{?3lV#lX_ z-DSs&BFiuma+C{K?IOe6%@Gmq+X&wTyvZ(xu8aaL_3j)_|t5=DSTEVQS%!r9d|K9X_@1v?O!JjP2HH<@ zNNmNeLJM1+SUE#&y0U=qeZc#m!;d%HYc@{J>>Vd|;11y}m9sCgV}#7(4B;lgCN{qO z{gkT5Zx0uea79<4#&xJ<~QN4d1s&VFtc;V=vn?mL@T zk92STZdy%vKF*)OpXZY`@BJjf&NYPR;#{G^>dBABN&4z)2}c4(vb0vbiFUZ;uUStb z6R2N=3Z#E5@_VqMfD^vxD_om5ZmfM7VP)SyxDv3Ebwpf1e`CX%mPQhFfOSmx(hsNj z=i6_S2*3d0DLdWXQ&V2I_AcRCz*;tb-N)7hEkzb5+|gagV2OWHf!D)r_X#_qqwrw- zx~wBPqTRWPa0Flk+kaP#a=fp_kv~W@12(e`{li^z(Aut*6UBhV?9mhHg`aXY@8(1& zU?;nvdjBJu=hdn9kVFk&4Xap?Uy@@I0FloYL4o^{fjg%+O4DkE__1wEaWJvzKrQUlYaDn{oYT`zR+QY&wtSnXnJHD6fTvH7m5B4Jd4dV literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwm.h.0433AC57B0811C1A.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwm.h.0433AC57B0811C1A.idx new file mode 100644 index 0000000000000000000000000000000000000000..562d757c08b1d0efc2d1d9522c3bbc7c5bcebd9f GIT binary patch literal 14682 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 OjMQCS@LO3%=Kla_EfBi^ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwmxbar.h.27E6C3826583F178.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwmxbar.h.27E6C3826583F178.idx new file mode 100644 index 0000000000000000000000000000000000000000..75154dfd45aaa6fe311f062094c0c214c643d133 GIT binary patch literal 20184 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 TKf-xS$f^>NV%B!UW*+ZP)wh<2 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_flash.h.DDEDE01080B4D1A7.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_flash.h.DDEDE01080B4D1A7.idx new file mode 100644 index 0000000000000000000000000000000000000000..3844a4286965abe18ea69a0cab78607003682c29 GIT binary patch literal 2530 zcmYk62~?C-6oBXcYF@RZz)~WDaVZsHMr8{SWEm7t7ExIOVUWSWKyW}9%mu^+1Ur%o z4x)(|WafgBoI?r6TyONO5l@V&4CeArdsf<&O zrC&v&E;&o1OG!>pB#m<&@1jrqA4#4!TcOR4OG;5^XdSc^J0~?kjH}ZmW%y9;#iQm8 z8sWKEfd1fvK7;?uDU+Rh-0ojJFt#`0A_0qpk&;MAvi!NA~B=(;iXlyzC+gl{;(9T@KY2S5cAH6ffoUk)Gzc1lpYCMBEJ63^r02e6)I_#fedt zB)$dwmY4bPu_6D#lZ!SaRH*t;S}$K%UttZQKw^V{8-&qPhD@dI3EsEuU z%YlWu*%RDTwDcE$5(R(-z=ro)zi;HK_{>Qp_5tqWq26e+!fpfy29W3i?Be3}pG8gj z7F7_5Re-C2y`YT^joqf&R#7|ze8~T?sP2#KqF<*6lh`ESCV>suWWNOm{;vKZl*A#x zLoiC(hx4|s2L-AbVI;=kI9BZQXLUABK|Rw5*8tY=N$OJEGj=X0pGhJIb3T&7$UfuLk5Xb0ZVzS zzf7FF^T@Mzvq%&RSS+w(a`kAYwYgP;C??`W)@r}2i6uc!)AfXN11bal$~ua>6D+6F;4I zE|q>^HDY8Ti6ekV_)G+9Jzq8U|Eie86r92m&sW)nEKXN$BwQe1fiPT3ytA|HLin<` zOG)Ta&tAT5?7cSk^kM^HCv^HiT3tKstlV)+&St`^1zgQ9@xdO!){8Aol_WXFpX7oAaBeS=N~H% z621(08SJE*)*QTEbN;AXJ&7O;VmscOc{BKa&D93N<8k~TX?3u@(yaD|{21Xpz&w6i zq+HXPRNsdkC*g{&Z026i@>y45yXhq1M!-hCu?=s=hrh1vIzwUw;0k^XURaWCrmlK= zmc(S7%<6f%>yy^TlI|A5Q*kOgHM#l<*}-$^=Lx4{I@@jU(3H#1zP~TxV}QqaTHS*+ z<%c77ULkQ9@GyVzUf#u_%`qRhkuU%n_$g@du-`MY!uu+TcEENX>e64EEiG=9-yksu z=de*PGnhgYg8d!Bj{zTpt<<`^gR8JR0o`87*J5GoCr`-l)yC_NkOL$FB-`Nto zFM2@-33qg7>k~cy?i{=QsFAP>y0GC&*gGbsWvlCb!i9i^yra9)>my>4Q$%qc@H!ur zdqX;!^$v9pNW^12Yu@l~&l6E2Jvs?j09No;_?89bl{Fm`MF0k{E7>VB=1ok!QN-Tp z{js#)Q#RRZi`xSp5uSh(SQ|pk8V{yfPwyh!3fRgAu~g%8w{!j#QTzn>6K_Ln%{24a zD?ZOic%TP6dW)JvXFRn#@q+Lpz(>F`=rk#6v4{-a?2G~Q6yRdS*S8ASHW*~Ge*ojb BHnac$ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_gpio.h.41FA06E19287CD49.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_gpio.h.41FA06E19287CD49.idx new file mode 100644 index 0000000000000000000000000000000000000000..0b4def5327053f664a9eb9e99e9a329d3912c636 GIT binary patch literal 80276 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_hrpwm.h.062BC46FA06797A2.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_hrpwm.h.062BC46FA06797A2.idx new file mode 100644 index 0000000000000000000000000000000000000000..f9d3cf6284ca48d0a0d4b82fd3265f242a4bcaa1 GIT binary patch literal 14684 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 Hl+^zNWTPnZ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_i2c.h.EB302DDB2BB42BAD.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_i2c.h.EB302DDB2BB42BAD.idx new file mode 100644 index 0000000000000000000000000000000000000000..9dea536cbb9c3a60b109cf3541a777260b7d4a60 GIT binary patch literal 2124 zcmYk63rv$&6oCJWY#s!a%1cq^d~MSPTS49ram5ZcaTEku7OABzP_3I3CKSbh0xHNu zEDSclDJqfJqDBD)oFe$BfSOHUb2=H5iDEFD8c~s*y7b=tN&6??cYE%6r4gZGaWHV4 zND-R0QJEsMmqVaZgKjkm;4SmWZneR1s&hkSA%c^RG!JqX>eaX=Xfm!qhI^xZf1SSp>3( zqgf38)$9~=vX6&iAAx_GX-`?%)o%eE2@%b^`5WhFN@6 zGO>N8m8(e@2pHH679xR5<={4xSO&{zMg^%E>7~E?W5Ur8O|NZw_UQ@>9?VB&c{zS&LCL5@=+iAk5+qT|li#oFQUGu;{m2_bOU^ z%1y!#{OH80vyD;06@~!Bc?9xUqpM>EjE|q)S&m{UET!jTK6%nr*DDqwE+kM$XyZiv z6;+!%yTvFf2~@JtcZ~l1@-R;tf+CYZCYu0v!K>)JWtaqoCwS68vNxFv%S3Zy5i3DS z3)}F$ri05hND;e(JI&`}>ztiOH_6u_ZX(b`W}3ShQ&jdU>_(Xk#T5cqSR)2P0~e2t z+Nw~{%U0~9K|W8=w)y}_I2GpVn3 zk+32t1+g2rQEVKK%7_s6n{X_|(xM_J3@zAdYpq3GN}!ZDnX})1IIds6JZBqBK8M=+On^$tsh0^?#V_R0wE6OAkw6B4-V!%--%dHK+igV^3hOEo$*-# zioFE(vZ2rUKz)jrv7rz}5+u=DTju3O`Pw`;;j;wJvRxKA-}~W7$+CSY!XccdN#LT* zDVJUo))CMVDtxCoCpbF}m!j|iAKINoZLyPHRn9I$e44;%7C-YKZ{^23;!Gl+Kt4-U z=~xZD+L3Qj93gOoiB;N%L(xtr%2A|28g0c~|CnF9!J!Iq34s!Jen~}l^!edllh{pQ zH%s;TmcC%UMvlF+-2j4C9tVPj4pn=s8lUi4w zZ#C;EifaU}u|?FU%lk&6It?gPprSomm>aCK8Y!+vyc$+h{6cdf-7jPFDa7#*Pe&8d zHh+D6PWBnZtpr+G^zGJN&7+lBEhyq3j;{Gn_BIW!j&s`)Cqg3Kw~)u@f4n<8?K0v3 z2%w8q@ZHtc0||CU#E}q5bFsIy8GBmX(}|c5d|Pu1$_KBDi)yxZA-+oBDr-Ucpp}d4 z#%MQ+4gwuaNYVqwJ6BD;i6Rt2>9n%?vh2k2L$?s`BCv}MMR{bb(jvy92ZaI@w5Z1A zZILHVPwYe7OrV*?pKTHCGPbhKB($KV@n45+`T2N<`)$O55J+d6HGlQ%HE#ZYB94Fv zT5XBzfL8ul^nJu0;6Zy+KklP$3hjA-_%eaZ?4L(hb-cFbo3~;=f&FYnL{;nc+XMLz z@fUjt>|sk7l-qKXpMPK&MFD{VCYHV={F>{XBPfaq6f^PW#m%EW{8vvjv!>Oe?9QQA0gvkH^ literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_inputxbar.h.4DA7259243D37193.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_inputxbar.h.4DA7259243D37193.idx new file mode 100644 index 0000000000000000000000000000000000000000..e6c8999bc308b074a430b5c35f6888af39027dcf GIT binary patch literal 900 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ipc.h.03E10185AF90B29F.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ipc.h.03E10185AF90B29F.idx new file mode 100644 index 0000000000000000000000000000000000000000..171becdc5601439f6c83f8706b20bd601e0b73b7 GIT binary patch literal 4550 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memcfg.h.A519B1472C2C820F.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memcfg.h.A519B1472C2C820F.idx new file mode 100644 index 0000000000000000000000000000000000000000..ba6f719aff339a18004388847082ff0275dbe2b1 GIT binary patch literal 10292 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 N*G%Kdtyd)^{tpfE2dw}A literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memmap.h.1F0EFD10F73ECB85.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memmap.h.1F0EFD10F73ECB85.idx new file mode 100644 index 0000000000000000000000000000000000000000..2d42249ab23446af33e2b0449d4b638993c6984f GIT binary patch literal 3930 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 literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_nmi.h.F6208B23496C8165.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_nmi.h.F6208B23496C8165.idx new file mode 100644 index 0000000000000000000000000000000000000000..56ba5244ed9d28a8e029f6d5185e2ec1f57c9147 GIT binary patch literal 1312 zcmYk(2}~1d6bJCB3*iYW7>!gs5RE8@Or=;5LCIEya&|pvr9dg|UyV51nX-DN@X*iF3A=&NSl?j-Fbzj^t8-+OO~V)0_J zFT=uyopO>SyrCNmh-GURw9w8bXHC)(@G>-$!z>* z4OV^~XEpJ~Y)Nc_G~RCbpYRqvYpl>(%zTUylPk@|-c&1BVynaB)+y%>_~t(M6Zwk@ zpkUIE6B*{LJE`X6%HboBQy^umz~;j$x2-L0B(e%r;|1Q{m{a zB}1N9;mEZjs1=0@G4`V;{`@C&{tWz(37OQ8aiBBAa`W^|4*&vrm_bYy=~vyE;7q z^}1Ub$m?M}RsS~QNXw_`?p)*qNT8XID$P37*t%bZYyuNi&%B@ca8J{XJmd|qfrb^G z>*sj;gv&?Hf~*jseZ}6be>tTu3XoUBYP$C&pJ%4U#nQ$c0cy z!*VBAym-9t^;%>pNJk6V$%@C0(AE|Qaw(M3BH}s4K0r2unYPn^tg2`bG*6MMp_;0bHxFNG zP^kY#PK8vOiJ@ic;H{=@gUD-O4RO-NQCCiiy1ZNkRsYRUAK}~F2{{BMu&bwZAfP>a>b-|s>vg*9A$gvPho40Z% Zop<&&tKJrX?_r|L?Y+m{JDm{>^9>akBLV;b literal 0 HcmV?d00001 diff --git a/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_otp.h.2F365A12F0AEBBD3.idx b/28379d_test_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_otp.h.2F365A12F0AEBBD3.idx new file mode 100644 index 0000000000000000000000000000000000000000..6c0c1a7705fd16a904cb091632771a6cddcd888e GIT binary patch literal 366 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/device/driverlib/ccs/Release/driverlib.lib b/28379d_P_SFRA/device/driverlib/ccs/Release/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..9c6ecf83dcf7e335a3d2814cda3261680ccb1ddf GIT binary patch literal 698 zcma)4O-sW-5S`stEm6diJqcUMK|LfU{jh=v5iA6XUV6`0Q@RkXB&m3_h)4Yi{uL2_ zmEgtMwA*g6f)8f*&CX=z&5+tzkVeCE%{18(jumgp)swMiOD6bQKjrsvn()wzMuUNY zL>Rvvj7%jK2O(dMnQ9X(XPvaHy4^-FrgoEQR=qK6>T91s;OqT+cn1;_@>bBYe8Bq% zt)uvo?jWh4Ifr=kTp;^+uQ^#3--Jn=LZzy0Y|#m&Pn14W`a$U~Cg|aqCw(Kx^OT3< zJkG$hQL2LZ1gEPfuv>B#Uwgdlb_gL@cM1ZpIMV_zGui-#>;OtY!P!G9^a?q@^j7gP zvfB^1Xds*Dl*u~TCg6EJ*DJJpigqI#W_g+iAtwG8LSG4BzVrtA%@rRDC74$z7h#T8 d6GVZiRVdT-u6yBLb*|0DAMnTimoszdLu*R{xH> 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⪼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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/device/driverlib/ccs/Release/driverlib_eabi.lib b/28379d_P_SFRA/device/driverlib/ccs/Release/driverlib_eabi.lib new file mode 100644 index 0000000000000000000000000000000000000000..52a3255258ff25473d270a5de9cab59e15f09b7e GIT binary patch literal 654036 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 X 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˳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

  • (C$~LmP(zmjgj3vc z1WD!V*U`vGHijK$+le(4TYlnAoT{kv^sjVcY1O20wdIvlOUG1Il*2i7HFfylFI!F0 zvwQ^2+Eh&J*hE@9VwJx#gH(r`%@Rf^mG;u1UB>$!Uc6>NHi>wVrEo76eMrI^b$+jh zT=m2)9#>sDf5Oy?szR(H9PR#Kdmp4~CZm&wg@GYMVbnWJO>z-+KHd}#oYKm*?6YyyMi z2?e4}9qlKWA2?8JCU$GCClUy^MD5dF3tpyj5};}ggia2Ek^OkisDspTma$FDMR2KV zl6}L$o)@(Xq>Hf6S(&A+>au7MTw5qCd;<(z1@^KaDg!039e4Prs z3_Q9gV$C-w7EZA&ezGsC6+v-I<;tE2E{fu?up2YaAsz zfP|%>?iIKJ;1eb09cclPVTyo21haf3w={wt9>JSdgd{HR)g!+IwX26a$Q2h2fmgSQ zpn_Ay@>XQT`~b_Mw;@RaK{^P-N%0MVmeEFd_lCZ?jfu@bh`ja<4;UgsmNU`>_cyF$Jd3la0Sh-TgKx+hfT?^<* zqZ2!T$5+(&BB(wBgMpMQc`wYq`~_pCZQ-TpO1RX)v`jH(gmD6M;Z_J;{5pSZo*#ad z0NiH{D=vb`dV?)dU`3*O*&TvTk;|(IH^3WpkPAXzy_0??Al7jXD8#1{;jcdwAbltR zb&>s%fcV2Ly0T~gl>q60E5QrRC@r1yD*;?eP<_~jf%!Y<7T>2>(;=1w$wQiO34q;X zN3DogifFja&x`DkRq7ruGg1W#ul67@Y>P)v#L^0-?MU^Ksz%Va;vGk7GruyAyff*> zY2@{HzC#zoXCded{fTD8?LM*B$dVm2DAf&=;hZXzr*^--Iot7i0A2Bafp0=|s_UjV z;OBRcP2u>8`C;f@)1!3~PT}Q0{Axux+`7umW1q4BV}`J5F#Z5zuMLtf-AG{Kv=JKA zy4h9SYeyb;TxbCud5+iV5;wcxm+a2GUa&N!;$v?3kq@c_V5%g77m47DW2$B1u3s74 zGjvQB@7qb)g^Odpaqq=Sy9;W(a*{M(!u`|;gEZAg!c8Q~s)aX5jaPnQGrJuLW96EB(9(b52DT{#lB-9*GS86=Zr5h2@~_B%O_1aK#!i!j_2aYTpT>- z$n#AgZ>qEPAr5<7DoWhW!th8)CS)v#jRJ;DK<;0DomgzcKcvU5yP2 z1Lx@l;U(G)*%Q2PQFTp5PTIcEf81d4Yw5WJvH_ zKZ6G^B;Z1I{J^BWIOH|>(|=#m@kSKpDex#r0Z064f&3j^Cz1X_Jy@W zoV7!pKk2U3!XVM_qIKkJv~&w=$ur$T`b@WwKGQ9v&vXmvGuuK8gegV&a8!b@V^Il0 z4n(Ej_?ZOuQ$FiNABch-!8ikvPnBZl5VgUlS1B~!t)|d8FPsA7Ll*%R0#ru7chIrI zUPK@wJ`y7EI(S~RCJ=>S0z8j^kN(E@j^oEq@)Lm&MUayf6ygZS1;`n;3a}$E6HqZb z7)(c?Ju^&-@XwzJJZK}YHsZhr05mF4PBD2vb=1&vY}$$?RQPzD`4x&1|4C5_C1zI4 zgZ_f?U~)$h^F&)?-yC$p*%yn*wMS^@ zIIs4C5^M4|k&l9&??SP$#X##vFW5}s(+9EhCpN#%6X`(3>y4Ha4J#T9<=_}_aCERY z+|&#l7XfA)04mJBN_E-ox8tg4whn4F^f{DY%0A2R)grb#D@ALlO~UK>;J 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hrpwm.h.A2071BEBB454D887.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hrpwm.h.A2071BEBB454D887.idx new file mode 100644 index 0000000000000000000000000000000000000000..f0e2bdb80e11353a2c0c9190abe6886faecbf98a GIT binary patch literal 44058 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cla.h.9E23A77F9EA5338A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cla.h.9E23A77F9EA5338A.idx new file mode 100644 index 0000000000000000000000000000000000000000..4012e211f7c532e898840bd1dc5222de4fd324f2 GIT binary patch literal 2392 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cmpss.h.B0E48D704AE68711.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_cmpss.h.B0E48D704AE68711.idx new file mode 100644 index 0000000000000000000000000000000000000000..0a5e2aee99b18c57b5e2570c961faf5feb21dc57 GIT binary patch literal 2190 zcmYk72~bm46ozvV%n?SAttz6jDOi+*9m665hQYC5*cUNC5()?i1OrZ)vL`B)ai)T8 zr%)(@xIs~2tcs#mt0EKx0R@+`nW_~hM<`0mkV@^6Fnf1ef+{ylk|_O~&0-x}^~OGO zd5;FsCZz;QiRFJ+WwB0(?bzWZZ|9-#13yzWemTE=a6rRM6Y&Ir39?)*j+V{DREK7; zQ8W-}AS>0v|EVx)OW5E76q{fZ#Vf)F&hP6>)J9xPpqN;x&%ZvsJKgptKV1~P1bP{v z$oF$E7hcsvkqW71>hs5@yWRC_rWPUI3R}(9*kZMOedm>7eZ+kP`j~|^CSjx;aLrcUb37llkPwrh2Hm;|zLJPOrByf>wdaRb)+IKojy-?&r zE}hQ2#s|X+*=zt}5r{0*)yM69cFWo+I}mXcMA4DzGV(s_!>$TKe3`&yLeKw_-(mVD z{C+5kY68{FvZ_p1zRG;5j7Q-N&U6;8Y#U|^o=+wqb^<55X~!h;d$SK-sIZ)XoS6la z(4!;6hlfQdw!t>K+K=HQ2la(J6A{~jt%17w_BP)RS-(#b;t>KPOlP^r16$72)v81R zfdaBh{SUtVizV-ew(msIM4*Y8o#JJ!WhcJ+E(1jyfi_0O*-d$*<{!#Mu>m&Fwj4~+ z;#T+N??&thj&!}RKg_k{b(j|*4uw!!znQPqlY7JaN)YpbPeby?Byx8P+fu~4U>DtF zk4jHnk?A7^Vj0M23lqF}McvCX_9BjiNIEyylA?}T@{G$6M?eI{Gg>-p&kwEn7I6rK z(9U|ezPr8WFX8uyqam8&^7+c}>3Wk|#O~luZ?&jO8{@l`b@hn*3G_2_psOq`jmz?B zKoJbVH0HFjd2)t*s1dOnxY2dWKYkQ0te$rq@g#vsLLZKDS3`}Ix9KNQj1d@PcD+ui zZ!Hj+G^1D#>uEi=?;pAD|M>PVh|?gAZm-})|BOxZ(iX&?;7O_0rhxBPw@ML2}hm?>RzztNtaHpCv_K`$D&E+_RfS=0r@!vuzzDJyP>y>;$k zrAp*L4sG8WyROaR5aWx8!yt?{J?!Q>tgezcLZ|Ct@$~qTS_jcKXjQ>{MYN z@S(kJf|34s!3Y&8x%*Q*nEs)R52(pT&D rPci?Yy`gbQ{z?74r!K1s)I)jqIh64ZsDgrkHz{2)5qea literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dac.h.441A3FDC9232B7C2.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_dac.h.441A3FDC9232B7C2.idx new file mode 100644 index 0000000000000000000000000000000000000000..39008fca6d22fe75b58addb6f350d924875332ad GIT binary patch literal 756 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 b3Z;zco>r5ub-=p~Nos8w`_gZ2mc{xP(qw8* literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_emif.h.3A87699B60E548AB.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_emif.h.3A87699B60E548AB.idx new file mode 100644 index 0000000000000000000000000000000000000000..1d4d85429b2c0342904be08a77d2d36988d93328 GIT binary patch literal 3214 zcmYk83sjBU7J&DZ?wuax5sq`D$3aS0?NaDLoAO91BTjYb%C2^`Q=E1k?DFVElH5{? zqHu&>q8E~L^_JJoE64DtC>6I7U9Zrc|2gCTmpw-9F}`oDHP>8o{_Ec^_KO$q8YvRl z`q*y?l7&i#ibNs}`U?qF$X)3B&yTM>P-batY;0?394a@qH5H4+Zc>HJbGD~g>?t;( z|HeKF`6ihnQ0`^yYdUw;74AZOAA)tUem{k zFMwY_j~A=5ULRPTKIiWw%+Y)zkH?&}viOu{GmNkdWkOiB8`;%Sk_E#FUkAJnn*8|0 z>mIQ$`t3N;2iONwc@gL_(JEWjl@r@>yRaW`Z<9Cu^=~XY&H^P0SN5N#5u_PoY5w`lGPfK!lWhaM~sMO{6v)61#$LjWL z8ieZs>sjDwLo%ly`szKN#5KTcFqxmBG*WBJ4B!17iEX$|$e_X`e*E)B=ZS>R0G?q- zZ8XrCH`50vk?=%M9e$bOfmg3LMLy+l6<`%x|L2DjO!7NaG)cq)#)42xH>F`*d$-$U z5(9t(EaQ8V{#Dl4HuFakZvfvgk@%Z_;rdKJPJ9LY%BpOg{K@=WdK)Lw0Mpov)TkMk z?=El2 z!gqY;aVCy+u__TWNCac>G#)S7^Fd-1x}U>d=p`KY?XF%M;}rK^cUJOv}*j2SaHw_!g~Psu>Cx~yHc%oQ)plR^Z zKS`tjrhpbdBeV~~68y5)k~jx=j+Nf9WxYjq`87@)06f69s#V$~6>lzEN1_z4l=Z~D z=t#ReA=*+B9e^Dy#wN?})rNW0d6DP`>}Q>N_H=J@f^MESiG09(Hbcc*cVPFgN*Re{ zz+@&y_c@#zJM{r4oY7fm0P_?Jlh|96HxSMP%wyw?^wo9i7pHK-3azyHtkpVoM}1mQ z!{H}@Prhm2gR5Re?Hs2dkp!5;S^!7J&9lB@xrKxqx(PSx`4u(uMkilX5{?3lV#lX_ z-DSs&BFiuma+C{K?IOe6%@Gmq+X&wTyvZ(xu8aaL_3j)_|t5=DSTEVQS%!r9d|K9X_@1v?O!JjP2HH<@ zNNmNeLJM1+SUE#&y0U=qeZc#m!;d%HYc@{J>>Vd|;11y}m9sCgV}#7(4B;lgCN{qO z{gkT5Zx0uea79<4#&xJ<~QN4d1s&VFtc;V=vn?mL@T zk92STZdy%vKF*)OpXZY`@BJjf&NYPR;#{G^>dBABN&4z)2}c4(vb0vbiFUZ;uUStb z6R2N=3Z#E5@_VqMfD^vxD_om5ZmfM7VP)SyxDv3Ebwpf1e`CX%mPQhFfOSmx(hsNj z=i6_S2*3d0DLdWXQ&V2I_AcRCz*;tb-N)7hEkzb5+|gagV2OWHf!D)r_X#_qqwrw- zx~wBPqTRWPa0Flk+kaP#a=fp_kv~W@12(e`{li^z(Aut*6UBhV?9mhHg`aXY@8(1& zU?;nvdjBJu=hdn9kVFk&4Xap?Uy@@I0FloYL4o^{fjg%+O4DkE__1wEaWJvzKrQUlYaDn{oYT`zR+QY&wtSnXnJHD6fTvH7m5B4Jd4dV literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwm.h.0433AC57B0811C1A.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwm.h.0433AC57B0811C1A.idx new file mode 100644 index 0000000000000000000000000000000000000000..562d757c08b1d0efc2d1d9522c3bbc7c5bcebd9f GIT binary patch literal 14682 zcmYk@1y~l#7cg-4-FJ5nc3!&`JFu0%fQgEMDAqL*R1{QDYz4srX#@nMO;SNpS`?5D z6$zzFPy`jE{ATX=x##0~ygtwQ-FIha=FFMdeNlbgnl5#vWufFfo zAZ{B&;GPujNr(T1dxs`%zni*)f*pVzO#BOTRcay(-CjrtSOQpr*oMl;5RGJ6h9%G` zfljs!x;iUv#O2l4k>24F&X}qBjB0z{R`tPN3jy>@S4f;-@T!3=y^{3R^UsSI8 z_9BqULMA)x?a)$CupGMqxB0Fi>&kDbw{RLk!7?n59)fE>K5;k}odBpCFg@RNg|+^D~IHSx{6 z&araiD0p$;#fg`i>Udw?cCKk(0vS@sz+}^r*IZlo>otX13Dio){k_zIc`t_*KAzc+ zKpG2a*z+Z_mzcfB-chLGpavViaLGSGGNzh>vlN`MjeS>5;%|%^)t^9)1ac(euwT~- zX!hEwPQd^S{`uRq>g75Oslizq&J!RH``usvQ^d{?&jAEpGVqcS`>lAv)gobc6@>^6 zA~^9<6{c6Yv)6|WBw)#bB@Re$mm}6`sd5zDB;Y0y=kMjMzAM!q4j)7yg@+VgT(1Ld zCh8VH&ZgkPg9|SnsH+FfBcY7AD%$LQwp94i|mqu_grEBA&@IT zE_QHIkL{M z34CDS1CCXg*_5tZJ9bhi=b#+NYM#p_r}UVc6jC`z#gyJ#xs%Uc=AoIN^moP!GL4d%PpT9O z87O4L6?^t)kIIAd?@}n1Krxn8?>yZD+txWzumP~aTA1F;|JeGE?R6w$1f%V+f>6AsrV@yZoZS zK-EkN$x=whePeo?n~p-#!LbA^04%WQz2mK|xR_HE93->s!h;yWT44Ii5fX10~GZzn@q!)wK8f$SD+}7>L5;)S6SH@0~Ve0)ct~>apqQ z!qK}s(l$*bpbqL{A4W~su{4q^qv1Lh>Tol0Qc|i>9=>@Jfi51pc(G~2$B{~xbpk2u zgq`&C@ZXPhnY_-gLyB@FY{h{UuDo+IH7k$l=}smP$Uqu2O$?AdQv zDGdiO5WtA*^bK3JKr6V8f-MKOI2e0R4Jhqz+HWcWFCM&bbK8;Gx>4Rpmx4C~-prW4 z<7#~5#Q%nz(xZ^WLJn>t9q;$68w`w^PQZo(8*IbR!bi2Xql7{w1C_W=ix=7@Dy{A@ zlYp5N%y3+fZjYT8w{$v%P98dOt_KVldeK609)&z9Uwx)QePSldvZPp3K<4-E(>NyT~_5gTi$Nt~27;mVY*{9@gs# zg)9NGurBxI3|gly%AxRrhZnq9>RujE-21(9*c<{eEW}_LDw|Mz>!|Az3bsv zDzV?ezYMv>Rd#bpxLSZ}?8VX1x8KFjh@|jQ0w3{03LEG6n(SFNk3f?Yns8Orx9)%3 z@99skUTu(}&QX`~m`(;j)_9lfd0(`-H zGU=?}Sy%Okf-4WMc)ZFDe*7|Rn%pu1?*({|pKvaoQS~r<0|jFSj2ZD}w{JG9)h^gV zA&`SW9NTyMc7#`+IZPp+gM3^Uz8$>{^9SitaFl=}Zk_(=-quk^&QfTRLJOwzv`kn( znJ-i%;3EMaJeUMVU+_u^T&6@IkcU7V!apX-8ypf=Q>YW54*M})cKYq`@g5Ym!8UR2 zHTj#5UD0cmG6{$A5Qc@~)RsT@;xl$HCvZoAJ9r`4L4GDRc6TUzH;9V|ijFfeI;9 z;M(Xv<<~{CHVXX^QmOyM2_ z_ZTrts-Vb3zGMc4C;_7IIds#)nuPwnlqh^;;3J;S*FcT0UV{aN+Y-2qZ5STWI^1F& zO2L`|Ydl#r$cO2UdXrA!D+6B{@%2L3iZYeWR#g<7Sa4#+yV^6bSLs2$7n=xN=ixfm z1=c+>*muE-%>=Tgkd5_l?WUR9hWA-D0$~ye!2K1t)DLT*-oH|gC=Yv=#$Zu#Mc27x}?yBHIy|mJ>YjUSWnA285~c{nuD%lDRYI)z3S8gU2o&TTP06x2;&F3c4R<eaakZMr$Sh1W3(+B<1WMw2!phq&=cjjN(Qugn zW!SW_w&jEAi<&7Evrvp>c#Q9F*=>^t93xQ4LnS72&!fqjJ2xm&2$Db$o^BU1-5P@) zg;P)lWibO=enw3DhpV9B)v#K;qr?4%>^Iy6$4S^v0)BXzunD8W>*dB#u$O>69yhkK zU!F#~BvJ^JK%hiiUd9j9hIXdz(Iwz60e37bN7>wI%?n#8c<|uCi;t&$M$evG=`X8C zAXWmg_=!80Zu;4TB~yrJARhDY%2XX|#kCC-!X*%nb+fzwVsA(N6(zpLv+W@!m z$u+H4j9%`5#}u9m@En(L*V=%i>TD5(N(ofrf~;!mxkclA6@?|RM4XE~3+p$P+jP^g z9RqfF*a+|4^hP$X{S*Ob9-Mh`xvW#0F4yN@MSTK)1o(p|gsN|A3lg2qQ?QeO9nRk8 zvw0t?Z|FEd)xUQD52!h;DOHZEpp zJIN(~py0!S57v(%-3(_V|Xglw7iGaBP=9qxh% zrkX*)LI4W{#gw{(OY6!hD1xH6joh^!{8nyC)MXN03v0!7QR3((w2b$o#N}^E8K`FjR-FEYR_zwAzMg-n)@CIk1F}=ry zNh2L8JZIrKwsGBHpnZO$iZOu}9$NSbf0x*D=S8mV6`d54I7q@vHA@4%*XC}#M!=W@ zV+0Ma{XTAC78J@DD8pT^e3nO(b4?Y6`yAZItUWNIvVDf%d=mm!;EH(6NUAaS96IeO z4d+TB7taQTy`A)252sNmHoZgn)K3cj4EW=V+_t=3r_WdPF(+^pu8M2*@nP=ZvdgP!xKw~r%=3#T zJ-QaGd_kc}0!{eUQU1T_c{_%LQ%IFUDjvYqbRlZSTUiSNjsiI1Lz?EE1O>CSK@_}L z@WOsSoDD15+m29ZW1tNSYR|f#!vd|GC`1SlA&4i0?VaNe??17`l7K4*u9$;U6CXq* z&t691yA;0TD~y@xhlaD-1rgSmG?~v|a+tzf7T)5rl)F};J#oYuTLQ%l6ytVvrS0s#sQQEDgso5QkaI?yt#`b=0F^DS#yw)EG+z^Oe&aD4c*3;)M@EB$ikeJtGyKTJnaaDUo8B>Mci}1*qOv#03Wd5C&R+{@8RbugbNUksWv1n^8U})85AzTC9$e$xfoqp@vD)B zZ?JF!vtxpsyj#vE_8x%^utD5apdzbPYr+yTo zIf%x_Ta(H|&z^LpkRU(;zEn3k;HEib=VCVkUs(8p%O(H9E03Jj)7=RKvJi+luHEwR zQRQ?44+6Oy=Kttor&V@XPc{Ncrh#%lQ}Y@t@*~O z1KuQ@CWSOCUDwrzEx7SDn1Zta&Vu;Gq&>FPJG|Bw}g$xEV zZ~^x)J|1?&(1k(~3q^RVOX_;3UR~@-AzgrUth7)2w!02guBBklfIa4Hxbm&=ixaXT#aG}t}4AU_z{723AAHIeRdvNmnk=zf-?)wm>&uo zMut^sAEDsOgD=iRSm*5fhbLa75F|hlK9Picb=vH)`4@$54!Uu+Cv6OFQd`wZ;jI+j z;@Ix;R59H-Wbb1FpIG>W12S&jjfN;?GYT~lsKK!velja##*RP=jSMv6>oe)~v6uX^ zUr>l-AQJP#>(cA-&ecnw5D1V!06tObzl+^tJ9IgPb8t>vl=IHjw#SV>_LPKQ3-B7} zyTV|=nV#L{6#RMc#{uazp)~BkazkGN7A#m``qzj3Gjez5Fh2rC3>0CBmy2i{+vnCD z3g0>Sjw3Z$sBnLBp@_mFSR@`BK5YACw)FOA8cyaR8NUizG2qDgTbHu^33y1r0}nq} zs*WtGwQHczD1}BW!Q7M&j>!`*1`u%L!42QrtxXJ!-?`kJf(ZvEcu#U6lF-o4jui4( z$iwdWq(#_liGE3;m4Q}F&g>bM5%Np=1`=pzpdH~(#EjtkV~Z$Mb5MjyU7rw!Q zXDy*U?cO{mV9kRy&YwkAR8VABHw9xJj1j84W0KsVM=$|b0bKDV;0C^H>^avF6tqEG ztRX%1w->1eTzf&nzAX4+FNTj>Hu!ClBZUiaK|DVSl~3%}y9Ls)CkLK*VlkiGv&_%G zg~C%7p5le|;=R_qRz(UcVWpVNU*%>pZ&s?(@Fxa7VJQm9 zk1*5SFfoik00#lMU(8kY7Y0w3r;x=!7JedLRZ;nZ#Wo5tJjCFc_Wbdz0~Hukq#$%?-Kw?MDBR7>L!1$z$cvENTJMyjhGccbuzhd0>9c8SfT z54m|1%2+7FLNQ*+ReomO=m-KW9JFBLi_brJv|Znj!Zi-AA*gTeo!7T_4u$owUK}Y! zcQxxMjYb-NEWl%&Yfrm(x)-grBMH3Z;3ZzjMAb7cc-|cf^I)EMq0%RJxnm*CG#tY~ z3?8qXbF3y*cq_dm5W+(U*5*QIn}&dY-6*{0;61jGnxLXqdnuGcz5w~SEv%eWvCiLh zOf-T2!T-ekYYd8gGHX*f4PTSOHC!wY5=ReveT<7GP{~0hw!qb^H5~rlo5D2#uHmtD zW6wW+AIe@*m=E*C7WTlke*+cY(XfpaY_NqT^6o#hrZ@k0AqKAD+ohdH7CDw=Jd7is z@REWT9=>l|_EKk}pTrZe;J^ZtAlu{lkA(e=6w)|I!v)MaG_22)f0#g^RRXONaUJza zua(tLDW;IkLN+cJjfV1B1BO>o_{hOWywpMY53?d`P9zeDXCWT*DX-|(@gL`ED5!y& z*zex+Q;sk#s;@}+0|y^)0C%13-^1F;h{87pzA@st-~V}1Tu49dBmxfwc!=A`#NA4D z8E-XS6KD{i0Z*H;am=#ahI=Vkv0#PE<)B$%*)qkDHv~$hP>O>dnfBK1foc(jeXviw zS=GQr?K66OreP}pD|~UW%=E7Bk{j!j34{s|il;8uOykabyAM!!#=|pAP0!k|Lpn1~ zQ>YT43Nz4t`FHNprw|I>Qt-xCNNZfD*7mFnqfo&>1@3vWn%{H>ghx=&0UdGf_Fd`L z_LM)CLc#~(pty=o?D9$uvmca7!hTZl!|R(YuXCs=$)^x0fk-^a^a!a-P|cb1mcTnH zyu(l2SaYWCnd@^30Xzg?dGBZL(bN1$4TZNHyv6L8{;6!(sVj{X3MEj8Uv2NZ_Pwo7 z@{BYBIXvXxKHU34b+=E_3kn4c6yWJ2s_ouWwOLCu2t=_Eg^4B{ubtL6c`F4o05hB< z@9MD%i(Ce05;z9O#BuUmxvlU)AN@sxE1v?25Y+vIulB(1qJ`?ByAX9cK?y_!s^aPs}IhOMBGzv!~%;0fI4Y^i%&y zyi_$Pn}8PsUO3k~?b05oJXWLdQwl$E(Z4dgea={KJB4xv%5itG*->87m&X zA8&Zhau#1GRP#`cM-nYn*Xu_Xarp#3Gw>OEJ$(F?Ybh1-6zZi=kEgV+8NGg2x32yV zSg6N}W_qs2PKSs36g(y1i3h%8@ws}h4qCkm)Ao!g~_#l0X+O7ncXG z9aepDpisp?70%tZblZ+`{$D6`^U%$U6;0Lj)uA=Y2_Fb}^WcqNv>Y|+$UdXngAZGV z*gMUmaF2z1_?VKt*YV{Hr*#y%CD4r>l(lU-du!RkLIU0#c;o)UpA6JUj(4HZ%0esN zuAtsLE8NAjh(HGe9k?#)b`;!#oqELtZb{%44tn*w38A6smnb+f;Dm3~uFDmK#4fg_ zFde4%m-&A`u}fDQ{O)t3goN)2a1S4yRtM|9 zwEyu+TD1h?BoK%BRF?E;@C4=46kbT-1@2)U5B%jjR9yc90bbynD2-xmy8#9ob>tIz zpeL5>gcjM7#ImUgNbd}2q>7V>K?D423!iWz8OarZ;o+lOBX zSnyzh_w?JyXHfmoCltat2*>YJRw*<$G?t(EM&Ke`6l?i~McQ^gOPXmogoP07^?48f zO80R6CIY1_l;VcokStxbA#&t*0-Ioym^Oi}L&s+fQl#N$EIh*t*?s>sd1&Zf3P}Pa zVJ*m9(yekt%bG%j1S0Sk1$Gx+)@#wJr;y4(DsCgb%QVZ5j7n}Mun{(jO^^RQZi;=t zHyXYJa0ibVw|w&FnHog55Gas90e%4jeSbLln=SuIz>)_`Tt!+N;)Uy53n?swh2rkA zdC9}c8+58@SQm7~30)~MyE3!1iH83$@CPS!jA5!>%$FQEd3XVhL zFHvx0!4ZGg?2^M7b&pZb6rv>%jn(pTZQ`N`>re_>pd}{2$#YAmyjk;xhO>Fd#sl%8 zt|!SIMjt4|NFWAJPYYH~$$TzR>muL);DG1YMA?hY3m5;U5X?g`Zh>+kYo|7^%jqUy zC4dzUxNq-1?;0aj{}50GRdHPB4G(@0)%B2u^QDlFGfn;tqwYbv6Q4FXbh;<`Tf#(t OjMQCS@LO3%=Kla_EfBi^ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwmxbar.h.27E6C3826583F178.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_epwmxbar.h.27E6C3826583F178.idx new file mode 100644 index 0000000000000000000000000000000000000000..75154dfd45aaa6fe311f062094c0c214c643d133 GIT binary patch literal 20184 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 TKf-xS$f^>NV%B!UW*+ZP)wh<2 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_flash.h.DDEDE01080B4D1A7.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_flash.h.DDEDE01080B4D1A7.idx new file mode 100644 index 0000000000000000000000000000000000000000..3844a4286965abe18ea69a0cab78607003682c29 GIT binary patch literal 2530 zcmYk62~?C-6oBXcYF@RZz)~WDaVZsHMr8{SWEm7t7ExIOVUWSWKyW}9%mu^+1Ur%o z4x)(|WafgBoI?r6TyONO5l@V&4CeArdsf<&O zrC&v&E;&o1OG!>pB#m<&@1jrqA4#4!TcOR4OG;5^XdSc^J0~?kjH}ZmW%y9;#iQm8 z8sWKEfd1fvK7;?uDU+Rh-0ojJFt#`0A_0qpk&;MAvi!NA~B=(;iXlyzC+gl{;(9T@KY2S5cAH6ffoUk)Gzc1lpYCMBEJ63^r02e6)I_#fedt zB)$dwmY4bPu_6D#lZ!SaRH*t;S}$K%UttZQKw^V{8-&qPhD@dI3EsEuU z%YlWu*%RDTwDcE$5(R(-z=ro)zi;HK_{>Qp_5tqWq26e+!fpfy29W3i?Be3}pG8gj z7F7_5Re-C2y`YT^joqf&R#7|ze8~T?sP2#KqF<*6lh`ESCV>suWWNOm{;vKZl*A#x zLoiC(hx4|s2L-AbVI;=kI9BZQXLUABK|Rw5*8tY=N$OJEGj=X0pGhJIb3T&7$UfuLk5Xb0ZVzS zzf7FF^T@Mzvq%&RSS+w(a`kAYwYgP;C??`W)@r}2i6uc!)AfXN11bal$~ua>6D+6F;4I zE|q>^HDY8Ti6ekV_)G+9Jzq8U|Eie86r92m&sW)nEKXN$BwQe1fiPT3ytA|HLin<` zOG)Ta&tAT5?7cSk^kM^HCv^HiT3tKstlV)+&St`^1zgQ9@xdO!){8Aol_WXFpX7oAaBeS=N~H% z621(08SJE*)*QTEbN;AXJ&7O;VmscOc{BKa&D93N<8k~TX?3u@(yaD|{21Xpz&w6i zq+HXPRNsdkC*g{&Z026i@>y45yXhq1M!-hCu?=s=hrh1vIzwUw;0k^XURaWCrmlK= zmc(S7%<6f%>yy^TlI|A5Q*kOgHM#l<*}-$^=Lx4{I@@jU(3H#1zP~TxV}QqaTHS*+ z<%c77ULkQ9@GyVzUf#u_%`qRhkuU%n_$g@du-`MY!uu+TcEENX>e64EEiG=9-yksu z=de*PGnhgYg8d!Bj{zTpt<<`^gR8JR0o`87*J5GoCr`-l)yC_NkOL$FB-`Nto zFM2@-33qg7>k~cy?i{=QsFAP>y0GC&*gGbsWvlCb!i9i^yra9)>my>4Q$%qc@H!ur zdqX;!^$v9pNW^12Yu@l~&l6E2Jvs?j09No;_?89bl{Fm`MF0k{E7>VB=1ok!QN-Tp z{js#)Q#RRZi`xSp5uSh(SQ|pk8V{yfPwyh!3fRgAu~g%8w{!j#QTzn>6K_Ln%{24a zD?ZOic%TP6dW)JvXFRn#@q+Lpz(>F`=rk#6v4{-a?2G~Q6yRdS*S8ASHW*~Ge*ojb BHnac$ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_gpio.h.41FA06E19287CD49.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_gpio.h.41FA06E19287CD49.idx new file mode 100644 index 0000000000000000000000000000000000000000..0b4def5327053f664a9eb9e99e9a329d3912c636 GIT binary patch literal 80276 zcmYh^1yohr_AqejzyuDRhtz9#Vh46#^V;2A7>EVZt#n9-NP~c+v`8aJhk!IlOC#Tz zeB+(@e`CD&#yG#X_TH=JnrrRNeTQ~!-)^>=n`_JEU7B~UJi5Tg#lwj>zwO|j|G&6)eCgd>{{s-e{oh&XH+9C{#!>~B#QWw%qjWyr9A%sXmh$QE6w<$!n z21`XC{1k?t!kkNKt-Yb~I5rX?SsIe*sYcJY?K|(!-?#`I4lj;6nlX5mFeC!jS)8lcaw3d_OhdFoJ~$Scq_L&MMiYccS(L!gqQ2 zF3)Kar`}Y{p(BqG{FT99nbU)c)(ZCL)XWf~SrEE4rE(t!{t41vO&$IYwW_0R6FqC9L!RfJSU&dtZ;<#zJMs~|*iLlifs=8J2p zhey??AO!P6Fb&a5?~;G+zcmlxj|BXY;FP#%yYjf=dNqVM{P2cK=CV5X6r<6JFv5Tl2B#4fmX{3dk{m*4k%ty} zrT+~d>G{V*&#o5WWkZexuiUoj;^yYm7hZDS@66=b8H7b{_Hg_z|H| z1sW+@DC41YgV>v4-5YiPOU4c`KD)^yDql~|%5 zpdUEn@K>VH$dz#>gAIuQi3D}amUL9cNh5g3fQJmHb-RW3_AV5kiclc~6;$(#l$mB4 z*8d>10kqMjjvh?$aVS`ZkRt{;6pml!mKqArS&q=F1iea}d(5*BE`xo05q=56FN)J) zSC`z%dwLAPS_Z7?sb0+Zly&3GS%h*SC>P>X@Or?84%4Hr5%iToUzu|co9Xr6FCUMX zETIhL6hp<+Lqzj=a}b`wQ`!H`j_iWOIfeG+`15;ic+brV_}rGZN&hzfM2HcE7#ci_ zm-D?iEI5W>Aq^JNoM-A*aOHhs&dtvTM=@}u$aC^i8 zL2wo1T&mPX=>9G}H3V%w(57jV{z)nJf%is)EPyQPjlZuK#`q{{A#8@t(*LVoAZvQV zk(+vx|9fS~qUP|7>v-=VXM!-m0|PvqF%@g47UdOgfe^@oKo%!kcqY0>{i$srLaYkJ zQYbdKEOT??o-YV~;^0REy28+UZLJ)i02_>@!IM3Wo|ci)PszM{pDcM^R3H_pN+#O>CzLf`uqp5Qx6jn0Mf&IYNjEgwW&e z_!U;syd(x8Q4A7k+*WegyYE?$fKbnZdKPEKvZNfRt2*Z*)XG9FC288Zr#m5a-6}l!ei-=$6D(UYI&fRhtq>jC#5aiR%YhU#K(>P!`c_|5~rEG!c)-zUOVGx2T159ZJZ2ZeL|HYZF z2w&yks~l&Qo#;~uuU4->sE~&W%9HMfY}0=;_8Xx<4hpEm!<4swWFDvpvLQzZa_Fi0 zUp!pl_F*1^l^|Hrv=Lu<>EcKG?FheQ;1{)(;h$3$bNj9!OsK#FEh>NiO-xC9c^AQv z0gepLNL>9=w@P7w9zv=hq|!Y;ZgMmAKVyiHCIM-*lDi2sT&&bIN643ee1eN1xkhFg z9}pUZpn>XfE2HPzDU)ObYd)~%Xjd+w*4+$8k}OV~?; zJ4slJ$5c0s!>|zfuJt{`U0FuQ2v^+O~p74AxROEDB%*B|1{!c#W#c} z@Prdu*PJ;1YX8Vj{JByHDya#_>o2h)uMHza%R@9Zx{b?~%}cg}FdOuRL7x)MbHb`e zTbW`Abu6f(aG_>6#C0}R93fp0(y2kVCwb>4v`Hg$i9;7fP-~wP4-%~85ULfSnrgA= z)$Vyy@~0xyi$FbX6;_;iBXyQJ9pR5G{Gkly)>i%no=%$)#+6{4)^QI#(V@BBdl1G1 zVN8${U}E;Et54-SgkZu16WVp;bdgIzv z#r4SMguL$|n zB-3<@yDqMuKqyv%Vyd8x{%o#U-ds#J^vFSv9A~v*+&j$m&P)`cPZs*9tr#w=l+NZ$ zAcTlR2*q{9L;GBgrO!l2Q9fV;X7^X$OroE}&Q~xf4F$0V# zd@ruQ?sD_+BZNpCd3tR5?EU}*Jt@$m1h}pJ;jNV!q}_G(l$ajGlDrwV5*!EP26_dhl@MnN?D2k0978f-TiUI&xxlUe$SoWFbhV$Z+}?PfLa8 z6ND}y=pqPk)xE)eJ`o|42Qq22FHt?C>2kRlp+yo}BsuHTj<{u-=XC!f3^HMm$!T`w z?K7D%%M``f&@Kz@G(`UnF232Xwhh5j4lLz3mzuFbxK}!S2ZEsz7}5r@Rc&2Tu)!k) zCuMM=6AarqWkC&s?vwWrgLWFb=T@d~{_PxxkS+`9G<;mAnf{sYmx$2Df;Nh93E!lb z>y&09R0}~hHHq2pFTyk1Mi5TG3C@b9H-&fGTKyy9?4Nza!G|VVyQJb=+bI_jdikN3 z4g|W6&0n*3{(S^vVKAnsTlwH_ZIQG#Lbn`r(=5Mky)H*x)de9~8G@kb^ zXPgj}U_&JzR8mqP^QG9uCQS^XNer5((fJ2vxZSi-MHm%>Q87-(How_)>Qyq+Vv}K8Cqv} z=?%h1S@=l3{r7}az`0~Agi2nhq$$Id?i|&O<2KwyXcB-X3f^1qC3 zXarMbFr}I|W!AKv8cRb67lv>e=_XfZRJ`1hiD07$HZ<7QzGeKk;-5x@gK&^D5EvGU z+vOYw@aG~aD5795lJ2xRe#0s$HrUI6J*}}*kDZ-0_1GzddVZ*<*_YAzIy(E}X@o)% zD5SJwS<$kW8yDO}cq2Ph{>_fuk`kDxVJP=5+@Z7A&bunMv5WWI@r6jQ1vH6#ZH1YH)vCqdt`Om44#x+EYT(jZ8S!%pW$&!U!RYVE&%D&2L*7T3T6ea{5!YeBEmaCct@8Kjdm*9Z=5|@LI@lv zcRTVb!aC(=GeRsc#L|3nJhANiUq(NIw*q+6JwkOJYJLmml3~LbKa9~R*?uczb@MMt zgg9l0qlg=PQ*KwU{(gjXen_VhYR9*;u6vwCa1;hd8tc7M({;suUPEY=gjVX0V;{Ip zL=NdAe3gf$W-)wNHKyNAGlFempquE){^lH!CVx~DPRoT-ym>9ja!xt z1(HxeJ!mmpR#2-t3qc1!hms-x=;!=fGUp?d^FcX{tHQMh+V|%#L8#@2T53e?uCMv^ zd20~b`JtUap=`okUFtZ3r6O2Tz*y1Le?G49BEoxRcuyS_$tU_K>*fsvI~Lf{jMBYd zapdi~dk9t{U_}7{9Can$Cp<^+RRv#FP6o5(uhq-7`L7Uc1;Lg^qBTpoS?F9S!Vn(} zQ6pv>F1YA8+>hWX37)hq_VedIcvNg0;hO|}qpq#obY9acqcSi`X<)d|lM|lH zL=eKIAe=(q_FfBkxKj!tS`ngYA*yzpEwxFGh0wtR9kg@}?oE&Ib()S~t_bGTh^76R zzc+*|MF^6DAi9TvfzelqDa#O?8Q@H(5iKty%x+!Six4aY!BnFC=nR8~4W|(FBtTDs z6B!i8+?V?vzBG9$X>g|fZ zkP$+%EF{yS{q6X%6(Y5^2&4QkO2em@TV7;UgzF@Tz$o?kls4OeJFDFg8f2h>nthx1 z&5*3VKmu=bZBS!KQs5Z#Uqr-Kp9;sY-;@af&*!jm*NLK zI(A6i@R2t+qZT2Z1?e=hp%rKPKAxWuZx{%H0uV?+za~@oLu-pPLa;Oh(|b?|Ey}vhKNI0S1Kv}gFSk{l z(O<8I5Ge+cVw`Q##HBl*6bB9={9wWl$|>J;>R*{XJPFm3P%X(>?n;MNmK=Ea7)z8Z zK{;)7N8_@l$a}s-_^klHX)vVzThdqNWP%W^0KpXDjvVLG%e1mY7?*-^DbB1dY0`3E zXfp{V0420Kx3J3hXL>tfiFQS3r-}2}?bNAdQ````d7zsn&IRB6sP0fNgd{mgqCRif zb*N_QNC1MZIM`D1uO3?#B4Ap9Fv@~a+Fq>oHx4?zvg&{DPy%=vN($kExgb|t6C(tFn@}iDuN*k4C!EetIE7BTyB$)s0fKv!R*!C?cX=d zz!Gsh5J#Czr|rh|2g6q&=nH~AMYv_-OP)&%A3!i;fEleHdrzDZTQ6}Lp?Y<_jpk(YdLJSLHXi)oIar~|R&IqAa7;5Qt*)!+#lkTDB2!6`o zN3lKKCLpHfuQfux0_4+R_!poT-PJ^O5+s|%AFlT@{HM_ODP}1o5 zS%hy4_(rXJq-A(}Q^iAs&kXp?;Kbd+9)_^uJg>u7^zB_;6k4C_;}I z^w0*;eD?hq2cL0-Y;nk@Y2$6@B{5LQP-H_I6VfP>ROg+_x>O4Yp7P*H$@${21DJ23asj(6oO0 zkL)@d1Un_LqY8F+_cloVaYC@?0edxE;rEdLFgBTewxf*W!K(Qw+lvy1c;=X*Pm!TUUj(;!IvL=X?cuE zK9}UPz7e5A2s-E_#$^3#)uwR)Wj0g_KqbxcqrWeT%swE2Fem|olwCa@;o>Vf%R=Z9 zgDx70^Ut5Sc6hlWLZdu1QjQT2H0`QNg%ZLLHw@7!qVL}&?*BB-M97eW42mRI(%Q#7 zZqGq5Rt00)6Lkbg%vjg54#7tPeCVmPVwUB2@~IuKk{o5K1stTnzfDFx(;=#4Pc27F$keStz7KvXfiU2PytXuk2~Mw zRkl!ypb8uEcp#6~v?t1z394}{1S>wUqP7Y=%)9E$(&-5HN?=dZ+0F9m(FJ8o5t@{s ziL#P4e)c!U8qOhDD}gnY*nQ~W_JiN=BNVWpfW?Wrw_WL+C!~eo!~;$gOM1S&TD1DyD+E1W(4$4dL-f>#{-r($%>vL&)8Ie% z&?9eV=Og@7grBtjJ6=-%zFDscp^61n6ydy`xeI<;4kDz=K`M|d)}ils%jJ*;B22UyQq@dLBe8ywBSV@FvIf$l? ztq~o+ywPepf{Q4)&?3R_@M1*Z)JB9l5vZf}f9mP;ysO(EAPn=vFeMU|cA686h@%sRmzgTb zYb@Lm+IgX!*7AkSsEiW9bOZ+g2ReGt^ZxXBW&G}`YzUTtU^*8x+1$M`BYh9TI}vzC z)!XB=>5xgoB!nqK7&ZFkr(I(HFK=Lp4u0sMde=1VR~9?_5TRcb`YC*`w%cKP@~;j; zwG33#7*P^jFe=&MiV($sC|b*BZ{K(%q^JNPlL47@E|@X=@x}Uy0fZ_MsG`Tcdr(l| zX7xBijx6NR04L?HAjLLc43hE=(Lp+p5j z7!$%MU+7P_uG)OB1Hn%M{Ah8EmmQeS#ihPO)amSXOW%R1A|e(pfks#E3)a zlz>jEd7>%L=BFyZ5WKm;o7VC!vF!`=c20shFPPIb*jMSpbIzw7OSmY23+;zy)%w>< zzUfAo5P}H`t-t=;$7f+UjIaqdab9K>Y|uV3xJP0-`{xls7@-&G7p5~G+mHN%P$v#` z6vS#ahAyj`wF#k>39Xd38b|7OI1cSb=x0Gctu^EG&KlO(pGOE)fKYl^?jEPrUH5Jx zRI;FwN+h0J)On=r2|}1Mgi()I@37tZY>x}VA7S`I0jA}n=B&UBSA;BK$RaS+*LHl7 z8-}1Q1llwdOg>-Sx4SeRAzA>UX)%3S8nf%>)ocV42{54pEn%^2Yw3A;2<@WKPSgLm z)PCDx(E@}BUWlM>TDf4;#l>q%5gHlLNc+I_brFB`lRFR!m{35oW2bI;>zgX>8Ei=8 zfkaAf_9|axj_+EFP@)7Sl&TC3>8E|LzlNYE2zoSfcb}NXbx2kN;V%>ZQb*K%fi1Q=2Um+keDu|8^#P^$v9^f_*K)!a|Ud3gx20I?JontdA&pN(om*aCGg7XNnu!A>0PXjGY7v%+^24I!i}LOR8f=}QFnXtj<{f-E+%-`*W8gwDCe4brY-5G5pDY z$0tD%+UVvz%hj4?u4*AvsX!Gq$Ue91W48?T5CTLYfIiJkh#PpkF3$s@MG#u(15>?e z#scXN{19yTz=k5v%Cv@6cb}vpBnv|_y+)|Dnb-I}t8MZg@(@683;wLQ+AVRwY zv{M|h64PE6vf#g2Y)DjsMB1=NJI{-Gr+ERPkOhU5gL=)9DvuVhKyViVcOlM(jeoDemIz64_a$rL*V&CPx+5H{^Vr}l3eJ?@^9pL0-qPhq@RbB#szv%0d9lV8 zwaF3!;7pTX@x2)bqkGmNd}P5#dZrqy&pdVpdl6zpAckUYi05xF-c!dA%6XxjLhG_{ z;h^KsZzBxw!vKvcwUnlpqnjTgbSgk6#gRFCHs(0S2OxBbKo{LZtM|Bm_E-c$nG%%I z3Yc3Yb6IN9g86K)lLkAQv%&`&;`Yg}K^WqJAv)gojelmn^}>7eWaGN+|WO921u6Ju!%oEe6??&L(K-%o2|pK``P5BW_OiX6oD?FB`|dfDPed z5dMD-PagU%*pMWN;3oinbo2WbY0@SQYY+@rU_f2F^V_r7q*<2{j8wpgB8m9#*C&n~ zeuwZzbis455!V@6AyZ|o=ZIkAy^)QX?B!N zw>$dub2Wk$KUmTBV!h`bL+PfDNl*eS+7lc$+f-*g)Q?~<1oo8HwdLQj2(p2NY%u2r zb2{Gd2zc{&zPKR5UAW6xhQ9W$^qyBFhdfOkX{tqEe9O5YK z&3SWXG#_V`Tkmd07?Xf8N+VhijwoER=tcOb3LojUxTjpLM{er$MQr#c1mCEwIybc2 zt&mxSpvMF~8Y7;Yw+jz*twu1H1apc#(a~34%w4z*!CnsRX&KsIE>$sKYzIP|G{jM} zD@~I*)O73_LX|;jaw*rM07FUz1YIpKOE?UKpXjcze~g`JCnV5(GU4=+S!{oy8+( zRa&PVGUOZ~zL*WV!k|lQpm&@9!G&d$a0bqB2I$A9yr#2t9 zgLaHdCh)v1~a zOV|(~2LUudYqq=2l3DW)!h3mmPt*UL*L~^fj4KG^{4h>SUH{)X1!Ii+2q7#8p_qGq zR@0jD>kkmT#lV}+T37s@X(MOy62V6Vd}v5Vh|k;nGV(1#gaSm+R=Pf4uDE)ag{elpt0AU1&KF%+x6G}qRmIiHFHTR1gZ7^Rogb*hNakLC6?LP6-dZp4* zHbf~x6m64+ZRTWFIV&SfFkpfv!PUqaB;g&!g$~J^ z$8IcHix4LTaTMS3=K2`-c-=+lk%AtYvnRxh#ZHeHBKY%xKPBdRJ5OvF>@Y%Tkbnj{ zpS_@#Zs?`sfl$g1rPNW=vz7kwvkgXw5`idcc9Cn(OwT(;BMkDwAWeU(&eW$KCq@y9 zl%a@rr@Na+>f0VqLa+)1(^R`99Tl&(QfV2x#BW~sO+o49$nV70UP};~c%g}4xAL@S ze2vQyN`;`5qHfCcLqd9OD-i;OA%FtFy-5CrYi6xMNKt?kYWBvf_1-V9Z9ymyfC5Sj zwrr0Jde40TVVDnwsS)3LgtfIO-A3@12X7kfKaS<`6sc+;xJZKw4WCS@JHl`6Ef6|n zp@UXIk@0lHVAdA|KPB*^-Rb(z{28V($p}7@;6sDKRc6Pdpz}otSrU*%E7SpFHJ%Kc z8iW!>D4~%!V)SF~uf|%0VO|)fj*{K(!B}{3$#OP$ih?J_#5ui^tE3HAAQX#2F>PCC zew{faQ)rLyK^8txj_CXO@0%ZwJ|k$$fHv)i)HjQB->Qy5Z~<_k9RH;kpYROV6a*td zFrp)xpQk;&S_{(=ig=-jc2Ghc3Id1T79vCnLL`;gUp_G>>Txx~s345edEN7SZ9jUw zdlBqZ!H#w}{l9#eqUh4=K~K)zorPd53dYn{ zhmvFyve)cD_#g=%sH1it%UxT)>m-7+EI3nJc^~=jMw`MlgaLUNpud>*n^k#9Q`-n3 zSp|}5elRlZeMhdFBMgeeAT9G}{frJYCS@S#D}X*_;I+|1 z{eKbC19(jZTB^aRH3d_+~`}mu62pvr5pcO~&N965+A6pR& zRltxka9L*K`MUE55t5Z4nI_JTtGi^5%sGRQ%7j#U+#@H=k3^h1hft{mm2`9d)%oH1 ze=Z?-$$%G)-K{SS-p-o&2BA&`>L|+)*!Swj(-C`wTqfkwJ-l|53XcZ+AoPes4|UYF z4CZe+wM2x^yzrS?_t!0MFL9n^gboID&}r!VTY|jjWy=x1h{G4U)RU=va%)x$APgwO z0KE@1^Gg)EUc7uI8xoWufimjD!&X+lR!E8Bj_axKAw;I|IUf5dH%ErDM_w z^IgNghQbgg#9%^<^VV3VI+t}(_7lP<27IDCe__RwJ^OMeVMGN+XfXVf@bWig%~-`Q z;VT2a)Pr`lO8aABCc-ym_(n_7isri~jIwtk)QLeIt>?2EbFCiFJc{5Z0&cY2UD5j1 zkzsxwAy^!OsXu=0m5L5}qJ^L*1A26G{~b3>ALSY#=tzPNwQld$^5VJH zqCx#S(0g`jUIl`^IM`E@{C?DX>uEgK8oY-vSW~lehZ!9Am?ei`#so7806b6ndImcb z5t^l-nJSoB_H*z{!Zm~>6-c7k?l!PhzyJH434lnzN&?*nD^!1ct+bh+F>aCNPVn7bX#P-#SdO|e6)yrcfhqYbp&rk@TS&v<9=pPuDl1KL<~wO0LWV_otW|VF+wN< zLaC!7k{%>$%+^MTQi3R2gkz!u7fjsNLl{g206aUsnv z2zfG)M+-|`RkFyUUN3|q0VtxHy9Mo1tp5@`c_~q-pd{63|Fa7&%xDB18PK7CtZ_Pd zs>ib*2vz)0MSGm{;$B;J-77osO$ns4^xqYyAPZq!7RG7pvi_u+3~Cf2m`Q*cJ?^VNGuLXC3U6RTs04)4G}wD! zc+<74;|P}0U`aa`!<$EIjnW?=G$}$8?I!dN^WQA(_<-Qd4bJozSCS%O`?Ve?B3LMa z1sx~67AoG~SD~_z4cYvVP0g-r>f@f=yaU0L4?HRQ%yHs%Q`x^C!C4iYDQ~xHKQSP; z`8Gn55+u=pn^|hMC1RH;LL(nE(xskniYw}qO+={Sh8h}h>xQiqMh;9M3@X7O4bjG= zJFPmOh1A(lD+aYR4VreWk+Tw>i4Z0WVbmW(!bkEY7HviNAORn!bsgV4Sn7A~IYJ{Z zG*Un=oFd%W`rQj5R~T|>_^i8FpFjIh48lWr$a%rB_q)Etm7G}o*-j4Z=-}m{>;>;x z4>A#o7*IqZCav8i;;VH%LbnKX(-M5};9bq)T-i-*CBeR2RDngnvq*1Ok zBkJVCwF{3R^m0QlHQ|y(^OGk;&LFtUfjd2w_1pyly583j-m~C6onARdKJ!i(m;_xG z=+YvQbnoLy=fGQ7!dx26X&mx|k4pv5(m*KUhawt0_ub>uk9~ZFa1@SmTI&0Emkw!o zjXxXmgCT{zr+-x+3$*JX1PDL?#gWf^Qb{E@bP*~Pp@K&GtEEPFiaG)&OK?K~jr5-Q zzP%QfKM=-5VT>Y=&pNM`Sd|(C7Y4Y{AC34lE-hXs#N5n=9&YHNCe*Qg=>6GB4xv{8 zdg;ipes=V_;p#rOa1j9)8Y3f9mj0a0dWg`^2mLgg>XRLvpI^{GaAkrk#j2ef zt|oU1yCT$zLoMC>q2*EM*ePKM&*3@eC5^+`+b!#?qVQ*Je$b|F%AXfH$8}#f!k{t? z(!&mHiOOF!S9%K@`sARG{w!Sk*p^zC`gI6j#o#N=SBc?geSFD9hZP9?R z626vG_Dry+dT+Az-s->UHA1#LWYbpn zYk-Amlc^3umKbEwQ!SP9_3S^Qi{K>*UbHK?UU+A%Kex$b2?k`*RGud~-&y~NFM_EI zn9_Q7G=;gUeg9_!D{io&liftW16!Jo$?2?(MP_Bm&K_4MRAgfdYmqp^Nd5A^6l*PR7^eEjzk!h11zPrC@aD=Q?oJ6uNyP=)~7e($-zVyaQ(TZC3+Xr&f1}n50Ay*u7ssHRF{kT2W^dhv$LL068+WQyg%1lgxlOQ-z zlHHzTU$FeQ_%?QlL>44cDCXKdaj3sge_4U! zN(55{Fr{Mz+q-o>PjBu<$W(?*S~-4sqhfd{RN8<>=eO{b{&$2E3$PmmLX)zK{g#oZo9qU*2&C=2q8)kLb+a< z#Ie&3JADvF88Aw3R!$|%y^|^yiqOk~Uix%W{on^v*B6BdReVrIZN>PzXy#Xk1_VDr z@T0b>{*kdI?flH0Y-s0!cKS*}s{5fJk~Hkz9PMphDFWAwUuWXo>hfOI2tU>pg;#G&oU~ z)U_ElT{-88P#^>av^TAf*BD3<@I}ZJgiNa7gj?0)C3PPVvK1klMqOb-Z-$o5Buq%a1T7I>*3PpZJ$-~F^7tW-##PMoI^*G<=Lo$*&`UK} z6r1_x_jeNnQxPzw*kdZPZmVyEBZ3YO=+Iv-c4!QW`{`F9d{%_d)FjgSD)$GL$n9oB zvK%B+J$jc7_jTpVBNzb~(J~|__f&A3~DpeGD^bk22THB;c~>q3NJJ_x3#@@#)QWzNG2gcea~ z5#{{(=k$O($!85}5fUXJk$SLYSLzy@Pt6Dsf)GI?(P$$5y2#a5gd|BwqIcj?-a)cY zY{wCPtH5tM`uozLl+3Rvy@w4J!eBv<`#{$Bk*&Bg!W#j2Lq}%2SU=N_-uV|HOdP_f z*_oFgrMSduA$$~uk94Uc^XinM<6aA^uNTd+}#$X|SdcBT?4)@BA4@5aPKZp8m1Y<EMm!az92#=X^KCBtpM24+8lC-SGoUu0KyLz z{GcUx@T2jy6Y3=h5z-Jr>*gXsYxXv8?mjj+GQp7o-<7qAv$r*!MTnPzcsha(3r=rV z+4dZvOA@;1^Dz6L*R{94bU^6jfllh!;s>JD@fnT?1q>*lY;5Yc`7QB_T@ivA5KOat zZq=`Ah#vRBu6&!FonH`KnBYS2{riTn+<93D`7Fq% zCg}{icx%hyJcQo@@SE-ty!7e2jo$ePd6JMvJve=ZyKu&=as*vj(51r@nTr+sB(K*Z zgeX7=_2ALfTvJ!<@0cth3A!{pB&#DDGvs>_#wB2!LQJnr$n*bN6#iv{HVd@rbYZ98 zoq^|FstA|iGH0wia4!h1nzjyqb_H;y@NM$QcGb6(00c(>M}p$Q>f<%~1qeed7@~1l z!sri6-`a$r0UDh2G+w$d;EZY){@gDK{nXzg0xGRF+lLWsc)^BFhWx9Cn)ZGZ*v|$7 z88DzMRN=9LN%+UP2=ArfJ&ma&_RpR?5n77yha3J-exZM&QFH9^T7+JC=%x3}tdnA^ zmk-`UFq8vB`g^|%+BOm?-yS1`0)*1pg3noFxobf$5Sjs+34Yxv3zp=yM))KGpJjU6vhall8{g8@hJ5{Z2m>N8@P8h6T5+Yf z{vg5!KKMWjU7tJi_0W+K1al=Yr<>gnS!S&iM=+BCGwMNo z_1MbvGD(DSfN^TXJc%pMx(-Mo_(*{db*<0C-yKQ%^AYM*pq|!&rT4~emA+Vr@Jk7P zQO0hcdiqqX>k@<#1t_7XGJhKQ*{6Rk!mtDk|DV>i*|_BeQyn2r1mdVk7F<_WE4y_9 zAyO0~X&+yF<>7kgD_0OQ#UPWyw`}~ew|7t9M=(+aBT5}-J&X4&p6QO@BLqIQ=j!F% ztg%S62q9DjLTPJdr=U@k{;VG%UI^kTt&>dmD14O3b%+fHqF_K9#Cyf&2fqE8gcx3k zp&50G|Lcs5SAZpQ6(EsAMr@k@$WJ4p=bstbLkRA&;7&s{>w^Q+ zuT%6e8_MLMjNXL4c9+-vcvB4Fi!^+pWr+LvSC^^&a}b=Bz?p_0VT2DxXsUhxlqV^1ObMZe4{8WDzR@2X z^Phn*C=7#?K&iHB5Cp-B2Yt9P3ONW|NYEJMF>`cVA|>)INeseIV%?-T?NulboA`Vev@A(vL>z|8iq^3KBudOV;<`=J-J zjN->@c>ZI96BC@M5sQr^ynPQ(K`;~nL#oH22Ud6V)aD}8b3;8XMg8^OF4pmM4E-&+)(}1RWOW&|2P|UioHr#Xf{;S*ZR$6DK)j=fX{= z5Jsh7lwQ5tYt2?0y?+hi3lqLjJzUf-JbK!F6X82Ie5Zf#x;kjQ>^IXvC!h|7=_7PW7E||A`8bxrB0tbri9TS}!xK79(WkZY% z#88mA5clGh^FR9#YGk2?DtIDy=D1MZNdy-OaG~h4=3;(^mcIc)EI-83Y0LoQPL{c8 z0m5fF_)HsD-K*<|N{=)k7%77h9Z7ESERisJ--Xbs0Y%W+oOW;LlS<_*uCDM_S#i=F+z?4Hkn#XUP=&hsB0}t8ti{HIU(38gRL^>bMLL+^OA%LKOmTkfH^fu z={L7UeOJN}-YLR6I_tWob*XZa!%7c-CyEYdfxbcG<^?7FHa)m|x6$rL+U`sFM?7S|o8_{S)hzE$LL2aj*c|TO6 z8=+SbdgTz7NnJyIDtP`DnKRm#tO%$ z&hrYmjEw zsx+ih%^!6CVf;vG!V<H1}KS&e`h&o-sVRLdXk_=CBn=UO?dW(BGk!49esHt6E$(p?&c4KG=MZ3 z>&!uof+G~kzB8&Zz0qwLM=_S;^YHp$R3mH`TH=5uD_}iAqFI_1|z*$`nC|2|5&H-nZSE?m5j0A)g=e zX_0Uc)&BTgYZ3P7ziFx;6Z&Z93*y!d;25=s6qgB z)V-|g8rHF8SYnh1M(Kd6>jnDwlK=mk2&AO(Nn1fKq4|UX0dzassuJT_GLZ=LLQj-MT>^l$~ zEq|5`)`DP7G0{oR_|UzbOA%aoz?I(LWX?6KV`*MOs8E6m3dr-0ooaCTu8;6r41QBU zE^9Z}k2vd!@L3E#6F4RAT$y0|2_ZoS5-7F%c7rK&(>ep8LjXD`!fi}Cq$THCieSV7 zBg%HG=B-y7d|8WNA_6AVR!=o#QuDq|Ak+y$9ZlyboBjkxSLM+@Jjy;%%kfRJa^!iq>AYiTY+Diz2a^OcZN+##fV)1#`5QYU{nCfA^ z%(G&({&R#85g4JzEzY`hx{LQELb4zvQ-6%iaJD#Vr;X6d2fZ{uoWo`2I*sZgWC=kQ zjjNeYFQ@$Vu|ntUeh;vNz6b5sgHloyW&Z+td)!B_N%G zOlI>gb<<~?5n370N`FMK`1u$!Ddh!1GcPn#1&1P^yq~k+ErO!}I8p`Q>^{GdDd~@p zCj@!a>?wBhtY)fwM)2hZUs|JVZpy6ja7sl;P=o}U=SzOfw-`K-fncQwR+I)WSnd*L zZaaWr&kgpperyfI<WG_+Ie zngxowYEFNEkk148^fqQKugTu=74IhR!2{U@g{Pzp`6Fx*a(N(^plu+iE6wCHg1s!* zQvw;Lm}@JwIU1pg0abK1FY|Z%#KUE=2ouUML341CcIuuhZIkc|;1`V&hVQJ)wiVy7 zL;^qpfkDo;iB+@u5$YtMj^4V8E+3w4e{uwY{eMGNM0=tZ!vZP(SF10wAxaRUXsXR` zaktSrxd9r5E_`! zK+}M)s8)1Ipcz8AEQC{AZ5lIaIegR#L0cZQDHol+HgA47!wDf>3essQig|shF@8@t zLX9xgP!@jw*e<3PZ!AI~0}83x4|rbokZq4g2xCAP)g$A-XBVb6iCkjCFJAaX(_pjx zzb_R(tU!3n4R2{Anz_Z5)W%vPBuGI5J=NT4VG28DMk8ER6wDL;E&ze?`cWhb($UJl(I;lqsBz;4B5sbnCOi4GyRN zlfKM`2yTd=H*m$WPVR9JmLS}Q+nhg=?wm6Jac0{A{CP+ehUn9+p#{nfL*4%&7^{FW zo$^VP$MXDl>Hjfx*I`vXPXoZEhwg@p-Pi?o7q-~l9bW|lgD&ZA>FyGwyAhBEMF}Yh zrTe|Z^ZcCm-}~|0bI$JU?ChSy^$9`*Cq&Sqvh?P57u&-Y2-RXxO~cIM%t^6BH|!DW zxuKq>p(roC?xUKY5PC$RhjwFZWae*PDN%#)Qv!Zcgj^f$j#~Vu8Nopu94LK{YBY`( z@QdGM!WRzsLj8Tl?$6`2Q!5Z+cp!#yRd2h)t9G9)2yQIkM!9OxT|4xi^=X7`3CO0C zbA1(%S)ls_;k!6|r$XXv17FRmp0@~ph2SsEHoYOK6;df_2rZ(}LO1x9f0mo8`;1#m zn2?7F8vL98Q>)x#&yFy{4I{LYs0)xkzvlG;1Z#e?ATqmSSv1zt2T zpD$tTYWnGoU=LtVgMZ(Sh-RH#F$f6&2^7+Xk$D*#PGlf7vO^=C{J{=w)WxW&B?A&47-D7y{bdnw!( ztb*`Y4E|Dx3Rx%4c&zsTVN4#zs6Vn!YwmVWkQ)*U9aNkSWKlqReKcGbpd_$mxvsX=;c#PYl6ti>aYgusZ}Hr(O$ z4vrhI5wzGri*|z3f2PU3xn_z`BLy{-d14PUX6#C{p9Wc|p_x2thPG+=WCTJF3-nNS z3)|Vc@<35ELW?l8(CqZ2DEm{3ZyZ9N0OZj+d(mjuZF9eP1V35uqoTn6`niVzHAx7e ztPo1mug*35UK{a31VdIZq$Q$xkI)K@19b>PQZPi%H(yNrwK@|CcbO0)4KdVF>*j6U z`1i;*1Y>zHrcltI+%R`j_Zfs}35ce=Ft*2Z&E=(<2uI+^zfkZR>=;>DVuT+X$bbR8 z3c29y&y-maQ3$<4&`TXV^NzOGG4~h*2O)5vZi?V8T=J^vX75BW zm3mMIKhwRf#+X+xu#wRBZRX;ICYZ8+2gfh8>p zU!z#wuFCEo2zK&dN4uw)Mjh&*V{Hfn@-RSsku>g!Gu=kz3zI*?E1TTK@qP8vTiry(! zeGnml2Lk9xWw6FUjzt1j5qw3#mu6+|S?kV-_P#}c?t z2XA}h_s#{uMhdeDEDkedTM!Dwpny86+fG1B)UgdAjvwNvNzy}egg*=l zK45~mIGEGCyucbhBpnq&_$m!wX~*@xl6(JyqSXlLtdLGo(sX&Wi?!$kf~z37(ykTv z@7HFJi%v}gJGj!!p`4@U?2vsLAxwh#zVyG};uBgmW@Dv(387d9is{bVV$``(4!lG7 z$^u{Mp^jelh>~Kv1%f_1=+iLhjyZVdS(zQefG7;m)R>=^x!gzD3Bgbj3~3WuAnVHe zn1UpP&%E%Nh8k~LRfZj3Dnf}clu(w=c+H+^vo{^VQW7j_DcvIL4cj!!5E{9lkrrY~ z4C$1VwJiuu^3X)%Zeo+;~j5JJqSK@=(}sGoSKw5k3GM5yI~S_-%~F`dP==0OMs3SdBw_^)$XUmc5y zLvWA;2fD%kvfBR~$)7;*7X*Lm^OtXC4Ssnb@Q4XLywF2el~^61GP8OGLaPk4(rbzz zZ{=?vH{5_wAPxmoq@_!*Oj*1~9bteK2556CHhfU`3RfJ$M_KqtvkhnGg6!nN6of>1 zNTkgWu~PXGPxX9+SQ&_=xJveFKM>thg%BkHQ51;=l|wsfmdZV5LXRBu$o>0&{z~Ra zMM-XEAmnpFK6UMP{(7e+FE=8*gLnVx_3RnXuC(Osz>l-UAd80Ps>-}e349k3BG@5< zMu*=5??PKKSdanfkA3p3+2O+`x2+2 zj0?)>V)w4tZu?yL86FY92LY7EyxUc;S}ig|$diRUsum3RP0rqz@kaQ?fM4_sagzT? z+U&v{1YI7`rKcpe*?Gg9>iGz}VAsDHO^mHU`{%h*{MdyLT78$?nDt!|FH^7b)5f`uShP!yUj-@JjbQyk%^2>hfMH2CeGv>#7g zf$*IZzEf#B6=1ZLeai-fN@=L1vT>frlW#BMt|0`-Ljc88+iAWhZ{GPLMDjo+b!dnu&Y4EqsWr_G9n}ndv4%(D+m#i}$Qg+NoFy;hfsxS^s z^dwmLmLWvTLNrCyIW3t(tQrjnh5S%R^V3L=rj7HxVT5==h^KAX_|&*3M!DSoF~N)l z%xD$J;r{nvU6drkC?AZ{?nT$_6n3pm3lQ?;AdiN!sP%^|odbIj3V5M_`ong6`|r2SvV1r1+Wi_qj|cQ<5Nu4mp?+|$20{h{ zGHCNFy2fNL^PPM~LBq7|L(FX(pff zWQCtI!G{BUXwxXEL-B?0yNw7L02$QmFIa@E;n6;XVlF7AuPRiY`|R=FD+sl0P)n=w z%0n6Qhh3}?^jJWTntkWl$YmZzAqaWwkVoS~UxG{KyGSvDqXalo>ptiUosl{ys>TFO z8PKHJfA5pMcV8@!KyYUPcly2bje$3dUh*$RaN-3gDpov?+5BlaeI6l>4dUo>^B&51 zyO!KTa1{kt>W_(Eea-JLyCRrMgDKV1yIKVYSU031vRNx3 zvj>G%LJAx9o^Xc+j)C-iN*--3`U3AvPH-pDFBuT<|qh?Rs` zf(!2$j}wQ+5k5-5M>@H(P^8oC9TNznTrf&Oy~QMe>y8!63p@uuzQuxf6t3CVT0%L>}2Bc8xi;&rL z__~T2LZ}FY(v$x!IY&Ef@?8)b_q`-=n zl}hq4{(`OX2tKmlL(`qL<((y*iJ1t0<>4;{!!^5Avs52{MMxBYL<%19%?KuW3`S{uNOGOq z+2}S6k^B%z{qeB&#Ym&wl9$XQoY=sLhV#h&FzsDg>kzKP^?%isY{21;ozb`O-{ z4cQ!!P5)Wa9)~)IYKG0U?qBkrY*huAejPVqPJ*Gr*k|N{{)s64ae3?R>26hqEJiych{{#a-wD$K1;!8+DjYox^GtJR)$AZ$w3tb=nMTe<82M~ z2;bP?8+DUnzKlS5=nsT2b_k;?zk0>#F7}i@geF#KqW|yqX3x1^yYNYbN^Yp69+b%F z7Ag24@tO%`a!^JmAC=g#z_v;r!CesCX?l!UK9U>Jgk}ab zQ!)QF#LacX!kY+HY*0m|w*M|aC13Nq2u?!aL{TD~boK3d)~5)$49KPaxO+26=egu_ zgkE;&r8_?uaIUgo&MO2Lc5orMWy$6JUE2_0KneyZv!7|(`}X>ZNQB>P@S9q9UOFd( z{Z9gdw-9(!@v+c(f9ue2DMBLec1NG%)TBWfCB<3sP`{b%`v+-jxZnq1N2;F zwdCchN`|lo6aMhQAF3nAhUlyO&R&;Vy5R~! z8!NQYik9sH&oFZX4#7bL94I5|E!teP{r+QwaUmF|W{=6-=(gYU1ww#01kk+cI521V zfx^5}?zJBuxMMe-r2f!e=6 zuz9K`ZSj+95q=yc08x}E1;%W+_Wxaj@QD{bQBC5susQxj#!-X-ZU~_1^bkYIpkcl$ zf~Ep!(#AuVW$2K+(OHCW2?(bdP0H`#&(-!<5X?BijFuP$pXU_m?~X!f5r7t|+0`r5 zR2&xPA{g<35rsm<>8Dq%lKK$_SzwT6w5gi8bHrY=yk$bREM(Ipzo9?)M!^bpgh@e| zq(6%LZ_})paDPB36oEo|Y5nTV zppv>NcnL`W2aL~5zl`fpxN*Xs~W`M{Kdr~SNrF$ND5TNl zmiU<6-~O-%kEj!eI=b9dW!c@Yf<)diAzu{o>4^1_s=o)7W+G@wfff}vrV%J%dl1YJwP5RU4-~u12#Y+Bs$-iN2gper#nbft6xv3?y_cefv&2qygugX@mhos zE(oEkvM>B{=2qw5n#U4)PF@R4q>>y-IT_Z}mJ z2q}o58pguq*%E(YJA`6cD5mW8J6T2QYJw|5s~EJ>AUG!TSY=U33PPDUlu_hf+!-^K zu_z6}TMWFZvdS|uf4PeNH-Z&_6+LA>yQuFl+?j?hQRt%OMdE|o9I>23ctijj1W?+u zztAtE`VKUikR5CRV>BPdbE1f_{6^2wAf%zhGTH0)? z2zFdxM{&4yyLig>tv?XD1fYwGg3k2Y3pR0dA^ehpU-Y{38|_(g!nwT&ojlM`ERXP;8-CLW>~+hBu~V}V;#eV$ z9_oDWcqk{kb|r$5AQ(|inRHHGw$$MeLK_3xD3i!~C71@kJB5%d2DubIFI4%f&Yw7q z5X%d(R2H1t#`$I9x)y>58+cGzw{er24ZnE~LM<=U(#Bk8d_}RwrXmDAcF?1B#EU$~ z*X?1&2>W6Gzs+}6@yHMTqNVt83m3FdZ-_67OI%#?6~TuAKD1a6n|r}fU$_w=m;u2w z#@|W*^c`;LL8xGX3L3MjX17Kk&tuhQf`J4WP}+;k40k>x#e+~N4Tbb1P0yjCs6bf+ z!CnOHsoJaF?03>rg@Iti4MsGRvv_8`<}q7>(9R0&R5*?g?F-#MbOB+UAI7OD=#TB> zd=>u&!HpfGoxDX}LknR-3?`_Xu1XX?bFy-n{wjGGr{Kx;)O3BJ;)#$g1KBjG ze0Uk-9^e~@P{RQ=w0-hEY4^g}FJlqB`N5m6>cYlr5%=fEBe*fZjhfw2+U~{vp=tzI zS#YIVdh;D|nH3Vh5waPOP5q%)`Cs69*=cZ>1$R0kXiw*G@wz@dB0~f+Xj0kQa$9LW z>l8wgAS6)%ym_mc_#HJx9VYzbgP&C4-?{THEpJE%!BrkyDY=dxb=8wOV2j|-3;q<+ z=i_&FtABSyFp&cjnx9_&;;4B0{tH669F)`It;Xl^nuiv@5QgPpn410ef{87|&OHb^ zETBV+w~O|*tCL>!B4o-!CMBhH$8(il6^01)!N~<8Ha2 zh?nlG5P~@&n5xiKH48V`x9>#==Y(*A6wkRc)+!%C$l-(>s;%ryUY}TRdK9690UeYV zLWC7vj^v#}=wUz)!D2fIdm;Q3p-~JPDH09tuK70G${Zn%7viXOtwQ||G;FX%D3*j` z+5r1z^~!c&yC1>;8w}82RE$f-W!ChkAb7EY7rhw1?L#iG9&1GC=7Mg@4Ce&MmU5h`S$f`)Tjw70N;VK_pI47AXWtHthL{T~(- zBUJN2HPwhJ3)`DL7nUQG%R@O;C8N1D4N0TF5Ryb7iN;{V@*6@o7Y!g}vO^{%aJgGr z#}in&^qF7-U_%vyTzpIGW0ms=(d-aSi7fx{sSR&W+(#G(7^f{|mEW&;zJxqLh?Idy zy1{S$)}m2US_qw@&`HII>cU971^)I3$uf{kN7(#1*qM949l?wZ%%}%_ovO1pj(kFJ z5(OvfsFwV#FmX8(Awn1;s4$2;Q-A$*hEDq}X5Xyw1 zjPCq)Zi1Fv&pU)BNobI~vt5gd5IfyTL$>YWP(qizUaCEzQaW4_9ay^Ch2 zA!ze~HbtUdjnCXOob?DHtPnzV%N zpbQt1Jf?j6&~t<~8EB)SW~s)wZ?Z=n!GRwfD9Old_I(KvE(ng2;7AEzO{hrF9Cpv? zbBIF)73ZRbv*s)I6(R(3K_F$g-kl#Vubf+o@JSjz(ZXkzR^j(N_9g@qHZY;IRDRE2 zws2?^p;a1Msjcov9p18QU>qTh3)1Kuzarw^*~QN=VnR1NbknGHxh7cf;Mq)sC|-!7 zK7aJ4F7(lNMFcxeu%j7g?u!B*kK8Q?VPX(QjToVF=F8$0JEzY9&`k+oy^i|2j#w20 zEf&zCnUgol-uqqEo#}J%fE{gb#1)=<-G1pkLM01S(!lXv;?uCu&v^Q)WI>A_lrnbr z?NscxKp5bG0U95E1rwsVoel``JP=RNbYf#(;!$S=TQ;zz;p}dD$FZT!XZovTV1R<* zn}*?CSN{YAYay_v+Qu6$&vGvExX!@U@8ixl$LmxKb*L>NYt1K z;X)8jU)7>_;!k_67(%xobW>4uza=&M$cvc>?SjxwV3Mx3-ns1J^bri`ruqEz@V(={ zybcIfVqitk$apANALa8W}Qj;VLyb{)2b`qhF z3;HN_hsugCa7IkS1RG3HF`=?YW5piV=XgYl5TsBeS_H?`4_(nlu;v15`l{%oDj)8O z=py9vK|bZH$Ud8B6-|8va}F@49k>g}WLiZ%j1bBgP)4mgx8}%lm21ujU-;n*HOWNN zsc7}cXoLZN7$D#bD6uozn~YE^0kxDx(^bpaRE9)Mm|(>QRuqYRzjy}DRf{8}2|^n6 z`3Z#v>Gvkv5jtg{lX_4!X}y5erL}(R&Rw`28Ifc||@P#4h3xhuW{<%d*P>G;!D#8Z=_&~oJ!@c)G z?@#wq1WR79q$CqR|3!sE)Nh0ed8nX*C6~*vo#g_jDHH5@!JdxTay?w{Tbu%drX*<6 z+k!6zM7&fVEy3Y?G)bK+M^+#37mAJL*t|CM+U*)1E*==X?iM!nl z;g2}{p%iYprzUh@jt4>@8w659uHx!AP#-uA+B~35iA;!V!QP`;p?HKDADB_VJ?-KD zz3p&3f(Z+lP&qhmA{3$ff$KT6_EQ6qjjel!rztwn3il&{`Ks zJR)8g;;EPjzhL(!-$eo8rzrfS8t!1-MnhYrg$RXQP)H}Ab#poQlBSyoL3|KIP0|(_ zIYU9j7$Hp>(r6z1>u7xF^LI0ZNl}=jb8OBD$!ih`K={Z7AL$&1O`;uoU`(E!mj2_N)|;}zS=YQY438PKO! zTIxjl9hC&c5#mH3PUPSJ5EM8+e<&2yv7Xn@3MqOK|!jjPSzO343JE1 zHMC+?(b4^2$pn8{@Ta|uMTJf#(g(Q_^n^i=QlI1-^|k996%fkgp^OrlpzfX-d-p0L z6v{y%?K3z`u1V2*xEvve6>=yT{+gb;qB3hGLa;mp({Q#It38*yMG0YC8pfsn{V&ot zid!~Vq-;Wnk%Ac7THe*^b4zK_5rhgssGzorwzv*g6V4!nvq3l|vYEB}Qb#wbA+!Uu zQ51GMWe}RxL2Bg=O~0EHb|mbE#CII(x*Ks z2CzZDaD1)-Ntoginfdg7J{LZT2P{=fO( zGo-=hs0>1@9JErSpIOy*dB!(cgl1W2rmdRWCJHi>r#2w`1^7$%eZyDzclDaH2oAE~ zK%wvmTw}zST}N;e1vjc=PH;zgl<>VpsFs0hO0G2po)Rq^wGfPi!H9x~r^k77FP{m5 zHaBR~hDGxHcEN)Y9td$l5JxxopZuoDr~RP_1^@=MI%g4{y!`!pF@hfl_|fC^;kiFo zp3nY*5W)!|l$7qik#q|QYDQ>aKm!#x&y^nzyh$2E@RtF9x{s8wLpPRhkh5lj4=eak z-Y*i8UQPD*(mH=Z)$F-NYr3GpEP9GryA#{$xDUGYzlB@mYcHRd95vDj{iuSu+ID9PE%}+td5riCyk`oo5E-kMvM$nZ2T{`)h_BXaX zs^1VCWx$b6&ZA(yD8TL~LMAt4(#h2m0z0kxSZ$c#EehV$=ZCj(ERrdgLD1&_eJVaC z(;dfmZe5OGEdbV(_=4_f*0J^~BYbCr?=(7mo(5cyylaLq$qAEmgU@1DZAndWM$nQ0 zElS`8f)ci`ANwQ3us{s`#cGO> z#|E^>8OLUAah%gy<7`Q4gfcZ6yosHWZs=&)_m zJm@oh4qou4ubLUO;C_}sIYNRQB+&EC5INx$z9C}>IRH5{+vLc;U+7%N=E#IrL1?8U z)~wCU1zPurLO;W<2_ zL=;LWiN)uOUyZW=55b8aoTz{*+)%fFsr_?=Tq($<`eI0N-1KV28-yAmsG%mQ3^(o0 zzpaDNEDFt(F1GAcaA>+@g^(%_sZ=LP96D|#cA^xajRV@~$2Bf(X1TOKe;N{nA(4g+ zSF)0!eAdtDuM&e)igqwOlR9gE4}zN{xY1DFs1fUXdgWh)K^_>STqVA8k+*$XAA$uJ zSWsMP`+Imjx+Lesgcx>+p(WzwCx*hKo97^Svx7ImFNLh27w;D#*z$rc1w&(4rT?$b z8xU-yz=qa!mLhKoF2vnMumrHAxjZNLN=H%D1B6HP^|To%S@+ibC|@wP1rnFwhBX%vaNM>jsS=IcU;lY=;l z-8o(c!Mw`{roV~>#wjzv{oV(uZ8MyiN2KyVDz)ye?aA%KALk-`7KYDsRrQilx?5G& zAmp<^KJD_oTE5eKG-WM9uqXsmh{l?g4!m5v0l}CTjHz{J*6uXyytxG-MF3K0FZc$} z?dE+d#}Rxu!H4ReC21L=-@4u-c*%elrEe{7PQ@nO0E9ty7^JSvX}OSfO-k;##B zVS+O|IMb=E?L|1gpHx67Wrb2IxwP+y4tIQ>hfpL4MU*fyy;@s-7;HsI;eizDjjv83 zN!tfbAw+RQ6csmbjHNWaO)nvQV})<@0xWORZ0Yw`t|IgZKo7ks5x=7RQjPU(gbWGD zprmB8TlnBRP7{PUF^Hp~>2;%`N@9gCLb)iEQ^y(y8StN~@gocZ$D98?TQ- zFcAb3dheldOYw$r_f&)tF&Lq9oL%ae`M50;AxaRU=)W_%&dAAs?)MuZod?pXN!$;>X5pU`(qgNqv>=4^!D(nUE?3 zsdN{Y7|NFtPH`Zlb3-~cdf?pef>{In2wp7UMOnJMW=+gs)G35IZm6S$@&3JUMjV%% zLHHmHA7~Y!cC7GB$m+`oHvC{i=|XkO#RW2_t|A!nf*}o>UAmP#7rX8tc*uYU4FP@o zgSp|1{}3A3pn(dW3n2wD`N70vb%+B*&+_{f6~t>g2(1DCoie1;Il3Sks( z7hdk$d~fO%f{_Fm(Rf;@QK0TRu8;6X0{&3Ke;6mHtf66nkjM&&^i{{=ZFXM>3P4Z> z<$oz@{o1^rE1!no$MtehPt{vEQHS*(ynw`ZLQa=f38Ak;`h4Ltx0KijeOXwrRz3=YVkH%cF9txR3fVvk_R z35Ilz4{V)N9h*E5!uTPK0#tWNUaaD^2!t^a7^8KH?e9IpQ)8bIYQ>0Xt-JYwK@5y71k+^Ij#d{szey?Yg5Kn?~dM0@N-hYmS8A{fhpF~!xN z;Om7d2jdZ(q``^qyq+yDDq+{(2WqR0KxRT4a_yJO^N`E2NUWf zp^lb^PD?wU?Owr-V8{oCv=OUfS^rY7Kn}r_0j9Jz-Q>SCbJP5l2+ds3OkFE`S1)J& zlFbONlHf|^Dc3GbW#MaT2z3%rN5lV=RXqG0F-I5_fkBEyf$dM^2bj+tm|zZIPNie+ z_FFp69f=6~te{W7=JKZL{p`9x@MJ=lEOb#Y>>REw8dc**a1sP3N@IAC#9`qD9pSBnw!_&|@^YLlYJeU*V72zIPsN2@f)JKjcN zKQ1Gf@Pi3O;!@GC=SHKiA*6CaDm9{WfzlO25p9H8Zm6Z{(b{!RKz7A9gjewD-;}*~ z*{KgY$2#%jKV0yKzDQ=xqKi4fy$FrG&`5W&DC%{;$;=Uiaseo(s^`hPEzg!LU+Tq# z5*8?-sM<2a_sre3D-i+}AdsR8M*6R9Ogo6sEC$V#FxJThuJVgGgHS9C#Z(!q&5E?T zwD>JTHaBEby|BLZyIjkXcL+(+kVLW0Ht&#?(CZHf9Wu~CPXyaMVf1FY1;U^-3{t9; zII<)3W=y6S25g}9(LMekjVINZE-Mtba zi3O5qCsZdwH7e!rIs|PQ(5Ai9mAYle=LW4uFyICQ>W#On%bv`WJ&52f0N%6*b@+{v zz%4k7@I?r|P{(pS8XXIbeTLw|1}-#fej0kVGk&K7LW49k&HV(l}3fyQ* zfLD)$)oMjGf({Sp(9^xZ6A!rZwhSYbaY7kw4wpX=x;L)3)Q<^Wtk6YeL6Y+pfh)6C zAy|ok6^)K_`X9cn3O$T4$pVv9@zt}BDTaohMyL^m8X7j&*XlMGY(IlwCjfTTB&u!} za~J%`Lg?m$ZhBw$+*!t54*g<;94W}5g6QPF*2e~}l?a{O&`Ie#fPF^DZ@(G@A3^Y; zX=qZHvEuyFHUwR1(50>3HSv~9Uw-aF=n#bt+G=`NJ-RYbtrsCp1k&g&FjaY#74l;< z{Fx9X1yOWWy6U&DKQvi@5GV|R6p73CG(E`+!Y?*`maNj&iBP}= z1vGJa9h8q-&OL#k!v#9@f2`PF*HFHyCmz6r0TCFWYGI~A+hzHe41_--@P{C*cFNdG zWD&xoEKJhw(6YH#vzLf$LkJdvV2X8bwVJ`m_XiPl*g%I?z#^AITaRCJLns!7VhWxH zukVf5*LWis3V|Vgm7k?$&f+p3gnU`Zr|jk`yUIMWARD2N75XTo$Dj0XNh<$};KB_q zG-elqhO^n75d?2>@TS()+q-B(@_LCtCS-|27Nu6D5qag0N-_xABA`v9qwL|4k@t=Z z5XK~6jQT_P)#;Qu9~L6?b3#9jz!Q6C2iX?xMQ~t%1I=hTIVX3k1s+9+5Q7NH(i3HN zTmDOXh0rbr?F2>^{-TasJ|YZ>!w_9Aw~KG!$nGG74+`*s{yg)=?`IyLpHD*$KjcuV zoOy9w*ZD^yc*K+>OwmuN-(Rrozi>m=ASPG|fE5j9q0?t}y;!>x!JQA>X>#0pSclu& zVGDvCfE~>Q1q)Wr{oQc|AyF0*sRz|gwY0Vhxgku*zy#GKn|CX6Ka&hW_$mWmX*xaj z=wao)vOI(+QHY}O$=+t4wSMfi7$$<)18p1P*#NSg&n@oi`#>o7oKn1${NCiVKx}1x8>4puWuL@VIZ_~ zLp$Z%;2>q`hwE1%1PMbBrM*9%xt16ES0h+3z=A^h-ZA&b4%{0N3S^*w`tQb^54K~D z`w?tKz?R0-K%TXZsl;J~U>OLeBlN#_H|=yyE@{rZQkkb@tl+X>X^uFdTzUK%+4j<&u;Jo6JxO}OUDnhvo zlvC`=ueSXr$8~P{2w}*ffio`LIwLgxHiDx(IMSNAhl9gJ*YrMu1qWErw$8YHZT@)O zGlWDoNTlNNuHshLIYo{LnXHgWTVO+$VJDls{SYiU!ICym40U%dORk)TZ*uUB`XfRp z=e4+hF&=|= z>OW2(nDc@;tpqbSsPDb8;sHXjJQUM2#GE4`L+5ie5CTLXfU?iAEr}0L>*^yUia;Wj zf(m01qZ&8u5bDLCo^lCq*tR@Twlahw4k)5$H-}e^dZ?Y`iDW{M90bwgc&@{>`i?#U zgm@8%r`PDNX>=&eJ|cn;D-N+#l{6Gz-mUdy8kz;6nbOjO^j>eH2g~q?ZVu?Cf%Cgn z-FuGQ284EDXs3W{<2ZACwag=gUQy_!X=28+vPiSN&k)l1AdP}r-@$Nx-XmRvZ_@CM z79}kQI2UgSGC`>3fojSOao&s8FPmY3ki-W`^i^Jt&rWaioQ6PA2&C|to%6lJcQPH1 z7?6YkDn2gfeO&&-rwGA<6D%lp;qYe(&A>VYPag23ABO$AU8p8-OD}?r0N7B#sh=)g zpX0$6#e`^nh^Ab!mWyktaf1?ql@M4_!8xdQAYEhW4ul3)XrSj@O&c#Ad-Guzf(bjA zP|7e1wUSPIp@L8(4n-8Z+#LnByLwI|M2bTsb*;UHbFbEos|bOd5J)#TX}H#C)46L1 z)$&kHu{*cnlvLoXw+Ip95J6vcHpcEsV}>q*FE9AgFgWzFTw`0|G&o3r18o;3+(}Rs zs{DXQxUqp7pf-~))W{T%rQW}jxXqSd|3WkTet#wrjr3jy-;1lIt z*SRWBE7-pxbnrk2MMLaij!Qudj_TM(4E<|aa(8068YWvMNg*j{=UA&?saX=Px3an84N z#|H@Y0QGcLrQug6Hks)nq>4f+#qLR?-Io{cHbC$d245O#7j{hW?AdRQ5WoTfR2oRv z4`~Yg`G`;=1trv0pAV>rO1<(#D3yUynm@k2zWmUhy8yvV2+Sx%Yict};kijh(QiKQzZRU;$`LlX60#U*ZQiCL_%Oh{)yI?Xq~q>3#Q z=CdJKbAmOE+0!QrX3Z&(MF{1B(EoQ;J|~I}@G2nWh(Qj;q4Tc#6EZ*7BSZm2QMmQn z2=0FO^9Vwz0F+XrC;#bKeEyy)f*u>_(Slk#uVlqS`O65koKQ>a8#v=rAKoGrVn)|yvD)MO(Lb?E?(|Z{Ff-gM0xN{I31i*n3_(ho* zckh5v1Zx0mT2{I~ZD@Aj5dOr3IB|%hjL2F2y36g$T!dN%)Y2QP-!4slV!N;$p+_Ei zXf5Hj!rW)P@hCze9~9Emb>D4LVW{~GLLvhaDH!aMtbcobI*U*QP(-aeE9;5aM`wEk ze^&6P(P27dy+~q#C&HKKPP4sLm*na;_ z5A9@x93IG_M22`&$H?d-o%Z3BVW)gAegL;DL%YLX{X)(TI93kooK( zw=KdSZumosSHbnddv9xpAjEM(9F5u;bKEoP&O{+32tWee#|_P*Cgsdzgm8HXr{dhU z?|yWF(r*M$Iq;+#jAmtxn7v~FAz2)fDH6AZ@!bA$cu_nP%oV_#)?FGi+?_1il@O97 zAc^MYK|d$?MSc4bMtNbBGP?wqCSykVVFV9Z@Sv{UEK-{mt#AUN0HA;(kxkC${`mY; z2wFm*MYD%X&zbNu`)?!s;(=cjK7nU9?rh?`kKoD;t~5Qin{HSW75E6DTL8MLKXN3J z7md2VLuitQCMpaP(?r(aZ1zTI6NEOJw5{^zJYBf77@<-KD(R}`5@|E&(%XH)8iDQz6D%-6yWoM}|J*yW#Rnmo6_RP3Z<-g_ za4S3rVN@DMsY#wB>`ROB2|?&%fj;`Gosj3scpZx{DFBnyy4k&FRx_m25ys_UoKnVG z{m)!{v26&OVAH>6D?`67_-vW##*e3DVT$%?M^}38OfQ+0z=RAz$e`YcUH4{{;fgf~ zZCubsQ}!G?xS(ZSc;`@^yj%-F$zn4Csgy7E({&ZE@4oi;hF+PS6&kFGr3Ozl4pDRkAM;MWY5ekJ$jd*3# z!#5C|`N5eMCDsK$T7TKzL-;8PKdE)akNup%n&OVo%Ll!*=W}3=$?I>tMbqaHhY?zP zn53;e^)>AqLa+b?Q-0IXP<-OS@)IGG12X9qn6*W<8)r{WL#_nmQc?=6U2HLP`HUpy z5qA7wN03^-9{KQ}u=dGwtE!Y3j4M2&cpk@xU<gus2+Wd14tX9$f_&`9&< z$#?7iR7{y7wDLkLMal1bR!XN=d_t(@gIbye4gWM2+glVM{NREgbh(_@Ti$h4sw6Yv zlL&mG)x5~&V*Rs=jv-hJgEjp*fNiJqxA)6WBe-#b8)d6sJC;=3&cBKf%>mI=E7b}w zTmFb)g3!+o{nYG=$EQZ08ap8vaDf5sC7$(2h*kcXk6|Z9HcjE^_1V98e z;=7uyKL33kN2uV03YvnworFq<%q9@DI6;dp_ma_-h_xOoQ@?oH0RYmw|TL`s5!R zT>J527{ZVY3=u>K?OyojO&Wrs1Q=56KI|Jio}5~Wpe+vClw>A7=S(T9Rw2alKrGFI zI&(dp46T|F+@!&c<^rFo^rH3SJqR`ou%R-z*ImxBDQi(G6GHeQggWZ!EPrdojMWHL zvQR~9+8+YmDo1^k5k8B+X9^#cB_UeLp4SnoIiZ^RBXEY+Q~!In5wbZUo1oG$q0uh) zIYPV;#M4mAePsXSQkxb+9zW#KRr%d>mn<)FLosG&q=XMHB5YHtfdkrWisy4mgQ9l157Q`6@VgDwiVb*>L;m&vb9 zV;)f<0Tpyr)tB=JpBk@62;hVO3ThpvA>&vrRfG@$2%%)jtF>~r-k%2uO|sBLJ?PEH znY^L%DT1vW*wPP2CI3FT@7gRigwO2oneJR6DejW>_iThdKIo&?wU?9IB6=+cVJGbT z_ms$O*$ytn+bhzU9}kPbFg=bnPF}4PwEreTFbf3JZ_NLibA!J)Vj7$QoN1}l6&Vm| zVyuBjg!4l^i3nXR&_z|u zO#bmXR=d9;42r`b^2jJFhQFa zv?;ScOFEy~eq1}*ZouBToU)B-2!=9XNDm*<{{CDVRQ(dcP894YN5UqK z12;HO*LFHOP4?-jBe=7HJ1yW|UwApt^86iw4kzeP0=L-rSFnDc8NyAt`L98=-T%BW zW{t;>hdE)G(%93ZTtm)>ix6VDAeIWdZ^6Y%X+hr+(l{WEs$)3VdiSwGBZ3Jpm{6=2 zyh+ayZkj?cX9sf%g%-KKTk;Yz*-Xe60p<^l{;!+PmrllyR45=gGr*a;>GP}$o(9|I zAawCS7u6)G5qm4NxlSWY@xm0PnE0of?irizA=ELTj`q3?*Uzf1H+_f@$qA9vQWdL@ zbqjLqAY}1F7G+&q(V&}6m9_}JV&F@o{J$TM^Ei%sA=t};Jym>tL+{>2-|<7x2hgYa zrsx8EtEve?h~bAAI)`F{aO^gh2!x+3@RL%^WyQc6`ILDi>=x`u z3!R2BHW;IKL^kHR6un6F$0N*zz?|~B)ZeV91NUPPisYe)rXd4W@x8N`Bp}4dK@6?_ z$A_1B-uN;Ne>mX}4b7Wl+yPq;C*lz!956!Z;(n&q36FVc2zf$~N0+O~^K4eFcs9a) zxc{%wE8M^44H#77$K~8mPJ4pxpN)+7zpX-O<%U**^n{4HyxcViCOlw5Y4XASyBUE= zeFz~!5JLCuDwpaZ_+Sd5iUq3ZmFK`#Tal8yWw}iFAqGDvP3ry_)HIv93&BJlOsM3V zU6gJb6!8mMR`n!kcJ3K-Wp}BtMA-CjnK>r&Ga*;OhH@dy_MaG@VN8)_ZCxlQ-~n!4+#sJicA;4;)^fFXw-^igb7 z?C!!=3~Vv6P_bJOm6k@jB_%{cX=zYW8j(g+x)j9Woy~8(?C)Q$bw8dPC-&Lr%pJxW z;iWXZq>tZIj%?pt^w=F?Pz(lXqMM{+xh=V46ax7mkTTsHfA~+I{PY=1^hiJtP4Vp` zqH6^P3lPjC!HgQJI;nZ&w~|0E4_rCmO1rw1Z`gbI#xFt`lz~Co=r)BV?(y5S5#0H~ zohG4+r=K@%cy$*cO$pMdb{&4r)!KCF2|~IAq|;rsGQ>7L*Rw+K5dt3y#*T*9-|pum zAeae&8O7G|2!NYlN? zfAH`RVfaDw^5^BvxpziJ;k!6|rz@0x@8THwsea~_=;lB-J-5!P*UWM8;}L8m!G@lD zM!BlWlpkvmM)+WaCZW&=mGWCt45C~&SIhTDu&yH{ z%0eOyf;~bmd>cFs5&DIppPu8{N&UCqG=dQvCBTtZD(32@_g>f+AdIkJg!WJMwk4EQ zq<0{sh(Zb_9z&87qci!t5Tb-2ih7mC>;>F?<9ZS76~Uec^ODw8ueo0a5Mmh+OY_+< zoBPw^uY4X4{KUYIp8V%s5pH&^3W5V4IMAor?ytS7=hcr#i06lR8XbG=`d^E`Qb(v0 zfjSDVKki*?PTsv7!GHq>)KH5b3q2DF+dNuA0P1KEY@96j=Yf_}IzqMxWK-7K7!{ehW>OY{83WAdqjWW?4FwYq<{>mQ zp_$S;1qr>&p?UK8JlG3+$5#F`#Ha8}1un+JPZi)PJ@+HK9+%$WO$dHc;73#Z=7^bk z8$Rwt@Dczos=|A6PvGCo{RpWXNTqq%SGG56=!q3Vi#W8nLLPb$HFY28lhPnn(0*6wc1i&s*4oxAe;^1l%jFdx|?`ExsG5d z3YOHR@3#(5e-^KR(9VW-T8mE^_Pc}7c5wc@K+W7QZBt9`4&st zWeXC*3TDMr2QNrUlQ^u9IsfbyU`}e453&7iYb?lTK(x<<2XBnI2Odw zrkwMg@q;Jzoe*k;pq8Gas9L7C#d#FG8Q@KEx;|g^1ZT4gmPk^CBuf2%>CAtjZ5V~% z%?I8T-(pG*4wSgYBN#Hlkh%{$I;{RgLOFsh8*HgcLW-T$9al9V^oT$Y1-^y9@9^)_ zYeZ<1fi}u8maKW9bHKJ0VMGi@DDM%wdg^^=L+zgLPp53vV6&R7Z7rokVCPj`nHk({ZJ2tPC@9Tmk4id$@XXDk3v2l zDZlvl)p`C{!de!rX<;S0er9djqF@9s7I@LN+=14Sj0>u<2#sRUNDr8Q%P-z} zWE4`RA(evbhQi+1<`WIekC<${ zir^^^p0p19lhnAV%*zzPR}6e<;+lQr%}#iZ@ATOsEts@4`uXe1SCw;v@|@0 zP|Sj2n#*I;YohG-Ttw&*g&u0CuJBD(`EOkjdKI9TevfVjxLQRGg&+jTKmhIUN&bF+ zb6`mh!jL2kQ41bYNIp|!HVSck5J!3I^?y%J{WUDa5=Js$M5mg?*zIKgz6QZo6l`fO z@LA_AITSy+ga@7q;7LQ%dB^U~rE88N*vWw%&9u%Jw{EF&xQ0+K0QJ-!-2po%C8)hb zxCj@=@`cab*FW_mtnhFJA5_qY*Tg?52K6152c^Acd|`Co$>Bu}>Qj>KRZ^3*A)x zkLtD2M-XfTz=m35DW_uXqjQfD@|ciEq4iSKY@MizCkO@-U_g~9UlsdI&F(2esU(!r zT}h^%UGh)uHA1!uWYhauWuz1 z%e%%aFC+M?fIl^@#}f9*JcAnuy(-X4;X82YZZX}L1_&NX;6c$!=~;iEYh*S;rW9mS zTxarK-B-f*1;I-Yyy&BlBY%B&DlM!*7*>U0%J`0lImMf3HXYJ1Ct z%Ggjwr~0DLx+o+$3BiE{4)o-$3TyhRGSm=qq#=hooSK@?`g!q75t{g*i89y0mD_@B z<#!;Mu)&0$d>~rwaJb!W1Zx4XrV%B1Bv`1Z=FsRh5Tkt6vUI91^s_!=^%DN=sv_pG_Bg_68ypNkI{Hw~JdgAO4Z@2BBLO zx+$9;G_+q|6P19_APEiBt9C0MTHeM=L2!})C+Z4Kb?a0s_`e`j%0nf+#M5FOKTEhr zx{?Pkgy03;mH!EYW{hZ0-F~`BYane?=<`e>ar#*aLz#BDgu}K;m~QRfo$C-gyV30 ztZt_W95}PCnTv-DRG@&y_>tD6xcQF+t9a0%0v!~@0{oP|UVH@z>B5js)6hVOv99$A zCPD-oBB+NnHKti5o>4()=RiBCdtg$6C&b$7a>XkqNv3y6?aBVV;Ljt zhy7zye5^sQ@%9`uJe(#BX>?BuS3Nowq+y5PCJJtpcEm5f!Fl20f$&rXp3aego3Bf`UEGXM+Sra}_e04HH79V6$e$iLYwK4F^Lhum=AG#~e zbB3CJGkzibQH4Jg4fmz?xo?>d)jSB2hak#xi=NM!dD%q?A%-7fXg}#+=tW(%g4qZS z%Fsal)>yxpy`ywFf|WE_(K=pFa0bNIZ$_w# z+X3Ml1HRGRuU+}$?%5beggy!Aqf_1RK2p7`$_c?t2Fxh1+Oqp6+AMZP$dQK}YVl{|<*C6iY)f1=cIMcY^CCR3P{>!JoeDbozV$pGj5|zw+RZ zF#MrvAG+i+-TkR1LYXv_(W!cJzG_A|{2xd`8HGK?T7eI_YWuLnJAQaacV+Q#O8Eod z0|>vx;WsT7_9O{^96qFt5TFPF^oJI7PS2ct^j#oA3jMd)Eb554A9 zQB~elE18MlDFvQ%S3}NrN(ToT5r(8-h~U^;6DQl6pyD~ss-~d909CXl3 zuxR3qNk?D5MEE2KpD2~rI@FXbdCLyLO%~i}Y5aQaX}J&0_6Q}SP(mxNV2_PmH=Z~l z1j#@U4TIU&`kQ7O_#(Vv!yBrrxzqaR798tBh){qC3VgmI9^1X{O|RvFk2v^H(>|!5 zC0@>2i;yb>xfERGu3oyn@YQ;RZgJ?Q5~~!?e=it+1R;e1DYVV)X?p*id*Bs>CP`?b z+Wo4_(0`CS3i%R{PviW1b;qfs5BgXlK?M>hSXwIeXlc)Sj8G;EWi&It=(dP0kTXCy z0Vl?0&2J$-JBAKg;o)9!=%t(W*{VEgiqk6u3stb7P^niWo37XS2H}qq{GqANc_?g7 z&bto?3Br&-!{06Vdj7z=VuVlu2&KG=v!#a5nZFhxKoSDzxo7u>J`@mWMBqvSm!S8Q z+yeoNL4;v37^a<@!^$0P1kBRMB%ROyl34Z)b$?Sphy%cazwE#-rH<)8S7If1t%%?Y+ zU6sG|5sE~ih+;yX%Ql&1g(e8mst`?U@?gEC2gSBIBZRRajGp?UR(g@v6<>r*e#oTf zkQcLz)ro$CFd_pZ6x*b)?CQICA`~H37-DG%DBGM$d@(H^!9WTO=sl7g{cVFc#&sb? z$U+2-SJuTH;{C;aqo)FhrQlt5j+@-1FtLGG;)NW%pt`ylIyF!3`!s|SHk42g+16NS zEm!D^P{x5WT1e})He@dv&qc5m1Y7#hmQmGe@Uv5_kq0;7=2);`F0uRWz?z7MzevIt z>dw%6GUnLRNeB)A4zz!mXE4*$VUjvRAQJ*9SI`(y54_TU3L#esa;cyDIY};^(s37| zQw}<5dYB_uFyoo*3j}9raHhP9VXrvh%StnZ8eyoRO79*oZW@5W`aSYhfXR&8yniFZkfN6cI1?0BIFA~K22Kc zcWO(@a`O?)1;Ctw-s_#b*SkY%5KK8>O4sO5PF2||-;Tg#0+%`VJ1LcYpEvJ*IfRg> z40)7ldRz!x>T^}Gi3bjH;6Pm=k;M++JF^bKN*JuDN*tzsZXO;vixAF&aO&&l-Ns$N zs-ur!FAVlnBIDtiwSv<35lY3Nlol}JQ}ws1@3u#HDg{reOXtn?+$mh~7U6{myr2&v z>$G0wd%DCR_{f6~wTI8y`1XqW4+!x>5Kjxx(_;1N14DfXy^7FFq4-dp-5fX3zX(A} z5JcVQ`|Iw3q5mc|^T0q93@ER%O_0*+ZJdr!ECa=q64*Woiq~tIiI6D+nFO;V=Xj}D zEkh_5gK~QE6Z?myO~+{=bjd*%bgN?NalxRiX@Rs zi+){byNA#(3H>ypZg92Tni3u&{84~Ev}bH#^;;rR!U!Ra1!>fRZ69yVT6y;c0#^>W zbXT^8bsr9SnjplBLOfN;N^MtN*?{*55z-JrBg*0QqX~1)#3A@Afj`ym;a^_QN`o>G zA_XCmUbwdyxA-4(*=K|TQ7E9OYYF2O+01-|a486()3|S)zYqciA&^exV0m0r zqGnkOo=O1`=iHCm7M(`5` zKf1=2qQwypt>+^c34#&L1&`-F_hY*)M0f;`#@=G%yic-P`*jf>E)j+jI#G>Yl$z0w z#iLi?fFHflbSm`8>fQHOAf(Aa8ddrR@rTQ1ENCR*YST<4q8( zRKbe!+<2BqXl1koLX!$K(SDNYRV%k$sSXG!{E$L}Ig#(0nvQo8!Vf0=py98OB*+c^ zRE5yRgf4<@zqo52YSbcx1BBBg|4Wc@`8eMn1XodTr7_F?y-MW2cf$x=5#Z7va$31$ z%8jUxQ(AfOlL0?zHJd0}>1g|YHi8{L*wO8FiBGnf^<*sqR}i?=;>!vKqz=blKrm*2 zF}25Ho6oOQCq^I`ihv;vf?3D@2!9d$fbdfUep0m;nbp^6boC-wD1*iSRQp?{h>kmp ze(=CW7+k3P?7H&3-^ytPLI48-sIM3A-Sunlr2`1B#=|RmBSz!=2bH5cE+BXdgEyV( za%zr(pVMOmFB$NnUUE2mK|7c^A^ebo9~3G-oEK{Q^d%9&S{|%vhSI6fdX%eEh0ve^ z4b&O5p2{fm=hh+g3PCTe0`Kg2oNr`2_a_f3_@RQf@pPX&8mI5S79m>#vMFER*%#Pn zz3>o10}~pkm+*akUv*>F1%whQD4`e{KXvDJ|3M3cP-zII06uK$nbKA2h~TRVzSOBd zCEi$Xkd=zis0xj=oovswdn&+}i!dM$1GG^Q_0V_ctO+FuFO}dWy@PSYGCAkyu||YX zD)5OmD&D(low~f6i{K;-PShR`{-{rs-N*Nf2iA&UO&fVl3FDb7zp5cbNkA0+^uf(! z_E#(GnF#L%;5{W#fg`v6J=~{(Pz_K`1Ly18f2TDi79mu~Kn1mVd3UkP#pR0;S~$=` zq0)BF60N4kqwrG-ep2mfvQ}97ZC`~YM%XYykzH$c!kZUWs}Z^dpquVWW`o8rxg|Rh zVk97jp5wsUf+q3sI|z}=5J?%_eTM(nXJ(cNf280KU3^V?x4+lP1cVkzXrb9dYGQ>d zGrbZaKmr124YjODJicg7BZ4tM7*mIPXCqO&v*R~HsWg<*vUOto>wx0QL4+VF2%?M6 zoYgV-^Q1r<4-BQikW#z*=lQ*Q3a}r z0cxqC?qBiQa`*XO1RnVEsS?$6C(LtD=d|-+LALl``0%w9OqWb0>_J9;WbaHcWa z!;Dp73RWN#aiEA6mCxhFH8$O9LNH)}0nHw6cY3C7sSxboK{gArDRWKr%U07il0&Ew zhZ@?0deF7&`cTef1gSI#1u;~&n``AYgK9kxdI5Urc3mV@*Z&?0 zN2n8rIyzP5z;NhPr8oqCaquS?oVkdvD(oYI8-N>ixA3I%{yO%B2qpqxLJxR&zE@V# z`T>LnHZ)KK6+057?&B%c#e-gH=%tMPVYPE|*ffCbp_+URm03QUX*Zn)f9cvn!FLGn0p3$1E&P|OQgiGhLX9ZY(6Z`Js%qWI+)=Pm1RENb z&$gHUGV)Bt5`_#Xq&Q_Du;-PUd<8x;sV$Nn-;UtO z21g3^iHi$`(*{JldGJ~mUenlkr!?uupocg@2?I*#;!7XRekb2B1z|`IhA81m(7a%g zFl!q^DL^Sbd3EXOY44Ye!WUKeLWzoVjFsj2y|+h8@Ixu}kU2qDZcX5rB7_S6v~7;v%lj0D z2U?&t*07ys&y~-8$il;)mEkjmRquyxYnBFwGuo zjx71R`5Qv03WU;|Hxt26 z2>fVf+Ox9bEkk2If{O~cPd z;B1QE$plZ@-{X9%%Q{ixi;y7?8T5Ih&6GnfBB`MWal#NsGfhdNTjw?PScD{DNFrFL zG5_?pu=fbVN-#_@dgiHQF{=al2$=$qNkiXZ)~tZWv)>Rr+2Bb%_iwngnXB#(1g zX*{i0xhrQM&*W#j_z^`*^SD2A_#R%sH4%rFPz-FDs%!uqX0Bgm2B=i)R7=L z6(O4e*)#}-mLH3~>NIoo8nVzzonh0s&lAq5E=6z}4^FhQS-WPz(zE&Y2(?V8rHkLU zsh+E~zy-mR1)lUa%w%I_rOje)2w~z7M!m!~!YA0bJPsk04WU#eFYbLwRV&LtI0dK1 zy7a>@0vo5Be8ee1RTCu5+ z)5n8fs_=`3@-E4qh07BbA+*Rs3ss1mka?wGsRKfm0Ax|a`m5}_F0bW?kjR2Wn&uJ} zubAIl=7umV3&V7(OJ;uFUfaA7+*HAhRzkKrjQpqF@j-}XLo8K@_3pNhmjr_lJe9zc zHorDZuG)X8F9yL|3cM*@R*Zdcntk;>g1sEr(}s@v0mn`wr4$5T4*1em$Uwp6Nacxn z2t|TWL>p6PCW?X|=5!+r3BeF8C+C|98$3KO+s}h!QAnow&*YTffpZ4O5&Bf1kCF(_ z+bb1B4fPQID#2eGHracsS~MK5A~*mEty@7 z&?p6sl(SBm^e@r&XD>p#7_`$zetqq}wTq6b4e%gF6=LWE9l4V-o!Up$5i93@$9$X5k52E zGljkTpHy?c1@$3hNI(W99#al|dBxc%^qU9n3~;9vpijrRY1>6L5DLYikb;;t^VCJL zsip`YmEa?_U#)oJroy`w2@mbIMjQ1j#^Mg6{^kbqk;;he|LhxXL2ZdtCEnC}_^3EX? zDMFE=^8eq0eGt!asgE@tEujn^v?s>2K5ZI)+ZMr75IpJC((J+3_+{ta5#A`k8`=`* z9=ymj+~I*>C<=xY6(V2DT8UJ?Mrh-MHcDoN@{H!Jd=rQeCIw;C-3~5ml<;|%f?&fB zHZ*9S!Ay1G{*MTmvXDukRp_C??(+qC2+Lvl*q~Y5`%QbcQ#~Fo5{Dvcy%YXl8wE>r1C>5UHYT#Is26>mLp`dA)D3@Tc#SEDi>abkgo#y6!ccF z*wb5AycVHc1j=b2Li1{MLB{YNgj!*!rR-w&-4d_I5qn2Vs6si-P6HDy*2LI8LE!QO zm%eO1@}b?xyX7fDvobVOH2f{;8z3I`453B|YN&hekl5^8UgwDruL|+htL#gS9_?Bm zgU}}oeRNlqtqy0+17ZqFb=;PAgh3VzQX2S1Hf6=|>pld1&>w5@ zh?6BE<rTiBDss&P#-P4%E}?I>z(f*N=m42<8%CPLay=rcA71c^E>4C{$2vi!eBN zf8^^&gaCj57|ZUR%!YQZ|CEPd!v-4)to~ELTrlMeLWmHA(2SWd?|$`My#|C}HUv`% z1^KRD4&JQ@4r1UyVN%sz;=Ao{#$O&pC_@BQ`t#=#X0GQGMlezVBTCAD=_DO1O_4w- zkbwf)ySTIV+1ca#(g^=V;U7Jq!<@3)F*T!L#R4k|N#dd*GbR}*VTm6s_(AiTLYwA( z;YkJvZsOoZV>aw|cz~z%3xsQMZLGy>e=W8;GCv3p_X=qy9L6jmy(Gs`q(UE;i>=4p8kVe~HE>G*n1^gO?KsE%@lg}|cDr{FBh$XT_AdAAD zd&tm+z2jOC+C`w9VwE!A-`P*|zawOdK_+z`xw-XfDeK1l~L_Oy~cY2j{vqgxH3Qv^Ec;<3;FuB$vd4Z%ekTxgS`+Va$; zDzhC3Hhf@1yB%+zd^Vd@aT>uCz?Ald+@(FI>&Biz$Y4SSEnhBqS7;0GGe(G1fJmCp zWHgSPDbaI72or-adh%u41_VWeMj=TNlBhFmR)02kwPF~S7!-xU{}}{I_dnVY^yJe>eV@@icJdDsR0?l-)*5)mR_O~u0H1R_dO{eww%ME^Zn<0b? zK{$o6#by);+h)1AY=3J}^j&_)-pv8s$+qFRJ7AO{1qY2+A2~ilJ&agzbEhP722SN`EdT2%)|HdP$@o^VIfG`Bm zbh>G1q~Q7{p%EUW3qd+9#NNR@1(VaGa1@S??cV2ow>q#-hKc__n;){N(zgV20zHN% zA{41W5v3{vU-xy2UtES@Ap{oG8f+=8sy&XI5X|_%jBhNR?OtoQdY1Q51Uo*kqra~u z`FGaS4)+fTnQX|UJSkr{=iSTf5rj`n_(UUc-1W1UPhvuPiR%CW literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_hrpwm.h.062BC46FA06797A2.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_hrpwm.h.062BC46FA06797A2.idx new file mode 100644 index 0000000000000000000000000000000000000000..f9d3cf6284ca48d0a0d4b82fd3265f242a4bcaa1 GIT binary patch literal 14684 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 Hl+^zNWTPnZ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_i2c.h.EB302DDB2BB42BAD.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_i2c.h.EB302DDB2BB42BAD.idx new file mode 100644 index 0000000000000000000000000000000000000000..9dea536cbb9c3a60b109cf3541a777260b7d4a60 GIT binary patch literal 2124 zcmYk63rv$&6oCJWY#s!a%1cq^d~MSPTS49ram5ZcaTEku7OABzP_3I3CKSbh0xHNu zEDSclDJqfJqDBD)oFe$BfSOHUb2=H5iDEFD8c~s*y7b=tN&6??cYE%6r4gZGaWHV4 zND-R0QJEsMmqVaZgKjkm;4SmWZneR1s&hkSA%c^RG!JqX>eaX=Xfm!qhI^xZf1SSp>3( zqgf38)$9~=vX6&iAAx_GX-`?%)o%eE2@%b^`5WhFN@6 zGO>N8m8(e@2pHH679xR5<={4xSO&{zMg^%E>7~E?W5Ur8O|NZw_UQ@>9?VB&c{zS&LCL5@=+iAk5+qT|li#oFQUGu;{m2_bOU^ z%1y!#{OH80vyD;06@~!Bc?9xUqpM>EjE|q)S&m{UET!jTK6%nr*DDqwE+kM$XyZiv z6;+!%yTvFf2~@JtcZ~l1@-R;tf+CYZCYu0v!K>)JWtaqoCwS68vNxFv%S3Zy5i3DS z3)}F$ri05hND;e(JI&`}>ztiOH_6u_ZX(b`W}3ShQ&jdU>_(Xk#T5cqSR)2P0~e2t z+Nw~{%U0~9K|W8=w)y}_I2GpVn3 zk+32t1+g2rQEVKK%7_s6n{X_|(xM_J3@zAdYpq3GN}!ZDnX})1IIds6JZBqBK8M=+On^$tsh0^?#V_R0wE6OAkw6B4-V!%--%dHK+igV^3hOEo$*-# zioFE(vZ2rUKz)jrv7rz}5+u=DTju3O`Pw`;;j;wJvRxKA-}~W7$+CSY!XccdN#LT* zDVJUo))CMVDtxCoCpbF}m!j|iAKINoZLyPHRn9I$e44;%7C-YKZ{^23;!Gl+Kt4-U z=~xZD+L3Qj93gOoiB;N%L(xtr%2A|28g0c~|CnF9!J!Iq34s!Jen~}l^!edllh{pQ zH%s;TmcC%UMvlF+-2j4C9tVPj4pn=s8lUi4w zZ#C;EifaU}u|?FU%lk&6It?gPprSomm>aCK8Y!+vyc$+h{6cdf-7jPFDa7#*Pe&8d zHh+D6PWBnZtpr+G^zGJN&7+lBEhyq3j;{Gn_BIW!j&s`)Cqg3Kw~)u@f4n<8?K0v3 z2%w8q@ZHtc0||CU#E}q5bFsIy8GBmX(}|c5d|Pu1$_KBDi)yxZA-+oBDr-Ucpp}d4 z#%MQ+4gwuaNYVqwJ6BD;i6Rt2>9n%?vh2k2L$?s`BCv}MMR{bb(jvy92ZaI@w5Z1A zZILHVPwYe7OrV*?pKTHCGPbhKB($KV@n45+`T2N<`)$O55J+d6HGlQ%HE#ZYB94Fv zT5XBzfL8ul^nJu0;6Zy+KklP$3hjA-_%eaZ?4L(hb-cFbo3~;=f&FYnL{;nc+XMLz z@fUjt>|sk7l-qKXpMPK&MFD{VCYHV={F>{XBPfaq6f^PW#m%EW{8vvjv!>Oe?9QQA0gvkH^ literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_inputxbar.h.4DA7259243D37193.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_inputxbar.h.4DA7259243D37193.idx new file mode 100644 index 0000000000000000000000000000000000000000..e6c8999bc308b074a430b5c35f6888af39027dcf GIT binary patch literal 900 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ipc.h.03E10185AF90B29F.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_ipc.h.03E10185AF90B29F.idx new file mode 100644 index 0000000000000000000000000000000000000000..171becdc5601439f6c83f8706b20bd601e0b73b7 GIT binary patch literal 4550 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memcfg.h.A519B1472C2C820F.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memcfg.h.A519B1472C2C820F.idx new file mode 100644 index 0000000000000000000000000000000000000000..ba6f719aff339a18004388847082ff0275dbe2b1 GIT binary patch literal 10292 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 N*G%Kdtyd)^{tpfE2dw}A literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memmap.h.1F0EFD10F73ECB85.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_memmap.h.1F0EFD10F73ECB85.idx new file mode 100644 index 0000000000000000000000000000000000000000..2d42249ab23446af33e2b0449d4b638993c6984f GIT binary patch literal 3930 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 literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_nmi.h.F6208B23496C8165.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_nmi.h.F6208B23496C8165.idx new file mode 100644 index 0000000000000000000000000000000000000000..56ba5244ed9d28a8e029f6d5185e2ec1f57c9147 GIT binary patch literal 1312 zcmYk(2}~1d6bJCB3*iYW7>!gs5RE8@Or=;5LCIEya&|pvr9dg|UyV51nX-DN@X*iF3A=&NSl?j-Fbzj^t8-+OO~V)0_J zFT=uyopO>SyrCNmh-GURw9w8bXHC)(@G>-$!z>* z4OV^~XEpJ~Y)Nc_G~RCbpYRqvYpl>(%zTUylPk@|-c&1BVynaB)+y%>_~t(M6Zwk@ zpkUIE6B*{LJE`X6%HboBQy^umz~;j$x2-L0B(e%r;|1Q{m{a zB}1N9;mEZjs1=0@G4`V;{`@C&{tWz(37OQ8aiBBAa`W^|4*&vrm_bYy=~vyE;7q z^}1Ub$m?M}RsS~QNXw_`?p)*qNT8XID$P37*t%bZYyuNi&%B@ca8J{XJmd|qfrb^G z>*sj;gv&?Hf~*jseZ}6be>tTu3XoUBYP$C&pJ%4U#nQ$c0cy z!*VBAym-9t^;%>pNJk6V$%@C0(AE|Qaw(M3BH}s4K0r2unYPn^tg2`bG*6MMp_;0bHxFNG zP^kY#PK8vOiJ@ic;H{=@gUD-O4RO-NQCCiiy1ZNkRsYRUAK}~F2{{BMu&bwZAfP>a>b-|s>vg*9A$gvPho40Z% Zop<&&tKJrX?_r|L?Y+m{JDm{>^9>akBLV;b literal 0 HcmV?d00001 diff --git a/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_otp.h.2F365A12F0AEBBD3.idx b/28379d_P_SFRA/CPU1_FLASH/.clangd/.cache/clangd/index/hw_otp.h.2F365A12F0AEBBD3.idx new file mode 100644 index 0000000000000000000000000000000000000000..6c0c1a7705fd16a904cb091632771a6cddcd888e GIT binary patch literal 366 zcmWIYbaP8%WMFVk@vO*AElFfyU|>`p#DRC7JrpMg|53 z;fY15@n-P`2Jr@lKvF-YD6=fJC?_*XKh4O(*t{YINhC8bSwEvZKEI?uF9T?DWo{D4 z)S}e1;`2bd%=G8=E7c0@j9iQs92OE_3xULG_0)%=;u_*WVIvMBNtm!$!h~5Diyv46 zh0Qt4;lc~}F8=(!OF9fFY{Fpz7p} zOa4WLwAU4TfWnp>mQpY)6@DA<^}gS76ez6Cp)CLt=IOcKo30-84k&EQVGK6}=&zha ZkecG6@VhjN{$qg~3r*|)5+lp7ODa9WZ6RWkE&2=p{ z6=R9Bg18XGo%{cL784WS;TNxZITs;>2O+$9f1pVxPjkLnJ3;~v5(soTb3WvUEMPJ4 z7T_)X^QT7LeD-N~-@^!b0>~4H;Jd<9&$8)#2&Doj70mooLs6Qa_qk{#n}Pdqf6kv` z=~pkWZn^d^77y}ZkS7|fMuYL)D^r^hss&I@4arxnh+5{_g|G(Jh}!>}G3wgy{n8w! zI7J94LJ>qMZOE%FeSl!a2P?j4);m8wR`wfhj^H2!2dWW1=St~bmr+~>I@r*`7S#xc zyU7zK9!AI#LY7c8>oe^#Id*O82sV7Mp*~b9J%(o<) zL;+cGy6grkz5$^^02MTEg>U~|cye_ZAzJ|16!H*x4U-!tmOKUu*igV0g|IxqM(u56 z6N0G#Oa-EOtnH9>_Z?i$XFy*Z^uhwx4S@2HPL4a*m@=QW`F-*e*#7$^oPrkq;o)Oz~znB@o+ zET~|KIxo0Tc)!-%9Kk>U2Gqy8=wgei=A*!X4jXi6p+1)$xfpp)6TyuGZX8i`?N^Uc z|5Q|kP|AT)jwmFlC!WlR?(Rf*&4$<1)P?^N+gA(U3K{s!gU>XNgY$Le{@dY$P|Jo| zsxfw3wcY6a9pVf)3Bif-s!iob#RSch2*x}x=7~mivEq%@!W-uiBDoOB6^&|=mb>kd z=;sKZIPi(qLqXBjajixvLK6>~s41N;m9990P6Q=T67}$Lo@7<#iyRT$}t{7EI=%Q_WU(_J(fz2WT27%pI!&y0U2yQ}fqY$bVyR$c^nXT*khbQS1^)%~Kh#C|&W7)_J8DN&?m02m0%4d1!z@wI)gQ{b zis!{4d<6IiqLbwH>H{+yy^|2$a^WonQ7&kW&Y~$R$1#vAgk0)8^F{8JVr~h;K1wsoSTKJ-n>|U<=EvDlmLNFVGX}#@Y zL)%!7TM!!f&_Fe^Iz5+PFjyePfVKd%DF+3kiyVu2Nf zB<9lmQT}J^CNq#Ege2Op1#Mw>euTD9VW0}2ikk9KsNu&r3?P^Tm=ow9oBaN9U%oU0 z`7Fq%i_xMgch*mtMub9uLfV%6wPlSSo*SkzUu4tGtg8@@En9?l} zJ5BSs$AM4;OFmdqGVq^{NXeC|K+xfU4z0QH-Lr7T<&6lh*zk&)TCC%tzIQWkCIg{- z2&Ja-DmCP$DeOk@5r7Y^U|`l`FaLG&2%lK+i56;+`Gv*TPbwm8hwan;Y%`fDk5ot9 zd4k2J;$SK+IxI%*oaJ`iP6wf$2laF&e3Ta$%soBz9|nBI!Ix4xbjy6pyzy!XAwmeD z&9Ag;lFZMm9SB}L@S@nxkb1mh+DM~W421I_oZyDms``0h9tiDxXs66gtC6sdUZ69Z z0bf4&Qb6`wxds|e=tIZ{$fq3HHGk>d2-y>J7)awo8ecTQXPd0_4qb9Z=;J~kZL|l4 ziJEux>JV1I3elmrG-c7K;Ne+wnPM#fE$X3ny+Ha_cmRSv2lQ!K8;m6PZc{a!$AAHV z0oB-Zb$spwTXO_&A$U`y$|dbM{lS(9zXkA{j>)+`NwNJctq9FLXr|S$uCcaT@qEgB z21?jaLYG|8z(=W{2ah3q62K>VO)gqczq$HRAHsVUyr&E)N<63dWq`GSfiHacLa`mX zb8_5Y3D*$b3g9gz+nmSYSC`C=L}=ziGcD67xf?@I*YqNUb0C~vFSlz))|{Hsk6SXFU3Bpx^!p`Lb?FbsVS?++ro5?FGMKfKoP}iU*Gb1 zxe8hc!yFhU_|JLif15(g5dr`LsPhAwZd;#T@1-+qq4Vhc7{&`G%H zX-33F)2|3E9B82)!ZxYSzw@R5;TIczQH@WFbKZsS??o^HFrg6Ep1d6IEPh0Wfifb=|lt@aj>DB(%A(+O0K6O zWbq)2j(U%4PIk5_qgOHD!3Pi8vHep=);!rLgYb$6uPD<`pO;jx)LW0>B?K>;xp?g3 z@5iJ+BIF1lhw@hL>lfX`$Ze|`2opdU4fnt$F>kRw#t5lwNTsbT{j|Cw%(Va^fCm9I z+~9Gl-ItqH)-d2G07p8&Ts23@ndI0Yyy3$enuqk(DIu2r{s>=%@ReRjCenj5G9!iS z7-$qgBMo=@49SY?>#rb03Luh(+tIOiQ$>CT!T=WrC=U;mrOj*$9=D!>Z!GvmkCf7D zdeI{?HX*q4!JS4`veDUlN8n=w9UwXgF@P~Ob@1=KCu8O8HZqVQgbeDu)BDBeBFR#O z1~xQMQ_IVbZ~QA^BSM1Vx<xAw+W_nl|U?^8tq>e(E9ga-o;j zoMm}#)V%UHTNtS0LLJp`9O6pFoPwS=lkwfi4jG%Z3%5JCcNw95u*i4P21w=+=AhjMxXUcbLvJK}T?!X3CH>RPAfeILofUpTRiC%`aS=)!Ui&tTBoe=71YI6?Hd$Pp$>P`k?1Q0_* zb^Lv;%vi&H7X#%&D5niDQR|yUYT0*$dKT2vOTnWmJs_p16TwUfW>n)u+{#mV1APc# zYzU)msk-8Ooa+to-3&N#z>#hTGm2ADi6dj~(@41z8fbg8MA z)9!EFwn7b|iUU=YgHdZLr*$mQMyO;#C52@Fs9&AWB7+b#1fW4j@w^YQl?r;H2q`Q` zq0?~O%oBB`jyVVoJZPXRW!g=#+14k2BBb*noie0PK`dRX={OqL z)6jLKwFM!B46TbE7AGLY3n8AGY8xJ} zr^G5jNEAXMfoV{A-TYD9LkwhdA)9jW$gf9B&d*9kXaQ)UASyoS_*u}@fsn<9Ec#H5 z^)s!0t<;b3mJM%dR9ilD)~AF`ILtsH3kqo)yQ@9O`@x!nV9Ekh3S!FcvpyC&+YmGb zph*d;`Qd)0)+srJk1Y5|HQa)}N@Q=njiA8?4O-g3z1*6F{y2na0YuXqO!bt%p8ch{ zM;Pb^=%&owb${{)tsTn|Y&l>{o8XpP@>yY5Ji<$HcuALNb=6Uiu7^Dc%|d9Vd*f+( zafN69>7xu}3L%qLu;J19)i#T~5klAyLi=eIZ~ynJM`IAS!8Xy&WDveR-{yNh7He=o zgYvNcO!R4O!Omk0ln9}OdRYDHXn&;QJ_I*DxKX;j=$3eNNFaxxD+FDtakOLImP6W~ z5q86F(GN?qa(j33Uw2@!0w{Ypas?l+HBCKti6{1NR!iA zh45Vn->LKE^(Kq1Z2kKb1NlP8Cuj{;e)uNFAHkCYo)i*ytz)(Fuf8LgaKVJ`4A~uN zA)joU5q|UFH;u~oQuW-OXC})rpeF=9>f^5`-$UMV@)3Lhd?;&SXLemsXfJ{d7i_2x zpKU*OYJI(PngK5WFRF3ijM^%XeeMWV0;r;$@$RKWR%5Xrf;J1Z=^*wuJ~*4_^Y_0D zm~g;^vQW}pdf$J079!*cA&-WutRyv7O;^@B)aFb^sR{**6 zX5$?)elu!zJ%Sz=^e9r2m$$_kz1e)00d+p8(-~rY{(SMXb3+J$JP4#&yqT!K=h*2f z=NPc(fj#B=4u#F*Dp!Ug7_q>J&Z%aV%I#+N8xel<;Wzcc)mSo=UM#M_fFlu;4|$G<9#j5+RHW}Jb@>oSAycAprO#1b66b2f*|Vp@5r6If~Ma@7~sGF ztzJR=sG7kZHv|thcu;H?arSDoPs&Be<3JwOh&cIWhj~8lA_K7;h^3zeQ-el-w>P