/*
 * main.c
 */
#include "F2837xS_device.h"
#include "F28x_Project.h"
#include "pinmux.h"

static void InitPWM(void);
static void InitCMPSS1(void);

int main(void)
{
    InitSysCtrl();
    GPIO_setPinMuxConfig();
    InitPWM();

    /* Output the CMPSS output to GPIO17. */
    EALLOW;
    OutputXbarRegs.OUTPUT8MUX0TO15CFG.bit.MUX0 = 1;
    OutputXbarRegs.OUTPUT8MUXENABLE.bit.MUX0 = 1;
    EDIS;

    InitCMPSS1();

    /* Generate a 500Hz 50% PWM signal. */
    EPwm2Regs.TBPRD = 49999;
    EPwm2Regs.CMPA.bit.CMPA = 0;
    EPwm2Regs.CMPB.bit.CMPB = 25000;
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm2Regs.AQCTLA.bit.CBU = AQ_CLEAR;
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;

    EALLOW;
    EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 1;
    EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;

    EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0xF; // select trip combination input (DCBHTRIPSEL register)
    EPwm2Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_HI;
    EPwm2Regs.TZSEL.bit.DCBEVT2 = 1;
    EPwm2Regs.DCBHTRIPSEL.bit.TRIPINPUT4 = 1;
    EDIS;

    while (1)
        ;
}

static void InitPWM()
{
    EALLOW;
    EPwm2Regs.TBPRD = 0xFFFF;
    EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;           // Phase is 0
    EPwm2Regs.TBCTR = 0x0000;                     // Clear counter

    /* Setup TBCLK. */
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    /* Select division by 2*2. So TBCLK = 100MHz/4 = 25MHz. */
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2;

    /* Setup compare. */
    EPwm2Regs.CMPA.bit.CMPA = 0;
    EPwm2Regs.CMPB.bit.CMPB = 0;

    /* Action qualifier module uses shadow registers. */
    EPwm2Regs.AQCTL.bit.SHDWAQAMODE = 1;
    EPwm2Regs.AQCTL.bit.SHDWAQBMODE = 1;
    /* Set actions. */
    EPwm2Regs.AQCTLA.bit.CAU = AQ_NO_ACTION;
    EPwm2Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;

    EPwm2Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;
    EPwm2Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;

    /* Activate deadband shadow register load at counter = 0. */
    EPwm2Regs.DBCTL2.bit.SHDWDBCTLMODE = 1;
    /* Active High complementary PWMs - setup the deadband. */
    EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    /* Always invert ePWMB output. */
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm2Regs.DBRED.bit.DBRED = 0;
    EPwm2Regs.DBFED.bit.DBFED = 0;

    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    EDIS;
}

static void InitCMPSS1()
{
    EALLOW;
    Cmpss1Regs.COMPSTSCLR.bit.HSYNCCLREN = 1;
    Cmpss1Regs.COMPSTSCLR.bit.LSYNCCLREN = 1;
    /* Lower threshold comparator must be inverted. */
    Cmpss1Regs.COMPCTL.bit.COMPLINV = 1;
    Cmpss1Regs.DACHVALS.all = 2048;
    Cmpss1Regs.DACLVALS.all = 1024;
    Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;
    /* DAC needs some time for powering up. */
    DELAY_US(20);
    Cmpss1Regs.CTRIPHFILCTL.bit.SAMPWIN = 4;
    Cmpss1Regs.CTRIPHFILCTL.bit.THRESH = 3;
    Cmpss1Regs.CTRIPLFILCTL.bit.SAMPWIN = 4;
    Cmpss1Regs.CTRIPLFILCTL.bit.THRESH = 3;
    Cmpss1Regs.CTRIPHFILCTL.bit.FILINIT = 1;
    Cmpss1Regs.CTRIPLFILCTL.bit.FILINIT = 1;

    Cmpss1Regs.COMPSTSCLR.bit.HLATCHCLR = 1;
    Cmpss1Regs.COMPSTSCLR.bit.LLATCHCLR = 1;

    Cmpss1Regs.COMPCTL.bit.ASYNCHEN = 1;
    Cmpss1Regs.COMPCTL.bit.ASYNCLEN = 1;
    Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 3;
    Cmpss1Regs.COMPCTL.bit.CTRIPLSEL = 3;
    Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = 3;
    Cmpss1Regs.COMPCTL.bit.CTRIPOUTLSEL = 3;
    Cmpss1Regs.COMPDACCTL.bit.RAMPSOURCE = 1;
    EDIS;
}
