This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/MSP432P401R: Security & update tool, in field updates. Bricked boards.

Part Number: MSP432P401R
Other Parts Discussed in Thread: UNIFLASH

Tool/software: Code Composer Studio

Hi

I'm struggling a little with the in field up date function on the MSP launchpad. I've developed two basic pieces of code, one will be my starting firmware, it blinks an LED on the board quickly, one button triggers the factory reset, the other, initiates a firmware upgrade. JTAG & SWD lock are enabled on first startup of the program. The second piece of code blinks the LED slowly and triggers a factory reset upon button press. 

I'm trying to do a basic upgrade from the fast blinking LED to the slow blinking. I'm struggling to tell what is truely going on. It appears my security functions are working, as the debugger wont let me in after programming the board, the factory reset function works flawlessly on both programs, but when I go to run the upgrade the board stops working, no blinking LED at all and I can't re-program it or reset it in any way.

I think my issue is the way I generate the encrypted update, I've had problems with the security & update tool, it wont recognise the length of the update file (TI TXT file) and the command line keeps returning "no start address chosen" even though the "-a 0x20000" arguement is present

I even tried constructing my own file, I took the slow blinking file, padded it out with FF's up to a 0x1000 boundary and added my password on the end. I ran it through an online AES CBC encryption tool and uploaded the file with uniflash to the specified location, ran my fast blink code, pressed the update button and once again bricked the board. I've put both pieces of code below, they are only simple proof of concept pieces, hence, they aren't too tidy.

QUESTION: Has anyone used the in-field update function via flash mailbox before!? Not BSL.

#include "msp.h" //FAST BLINK

/**
 * main.c
 */





volatile int * write_ptr =0;
volatile int PRG_Complete = 0;
         int i = 0;
         int * LOCK_ACK  = 0x00200054;

__interrupt void PORT1_IRQHandler (void)
{
    P1IFG = 0x00;

    if (!((P1IN >> 1) % 2)) //factory reset
{
    FLCTL->CLRIFG = 0xFFFFFFFF; //clear indicators
    FLCTL->BANK0_INFO_WEPROT = 0x02; //Remove Erase/Program protection on section 0 of bank 0 of information memory
    FLCTL->ERASE_SECTADDR = 0x00200000;
    FLCTL->ERASE_CTLSTAT = 0x05; //initiate erase
    PRG_Complete=0;
       while(!PRG_Complete)
       {
           write_ptr = 0x00200000;//start
           *write_ptr = 0x0115ACF6;
           write_ptr = 0x00200004; //Command
           *write_ptr = 0x00010000;
           write_ptr = 0x0020028C;//end
           *write_ptr = 0x0011E11D;
           if (       !((FLCTL->IFG>>2)%1) && !((FLCTL->IFG>>2)%2) && ((FLCTL->IFG>>3)%2)   ){PRG_Complete = 1;}//Programming complete with no errors
       }
   while ( ((FLCTL->ERASE_CTLSTAT >> 16)%2) || ((FLCTL->ERASE_CTLSTAT >> 17)%2) || ((FLCTL->PRG_CTLSTAT >>16)%2) || ((FLCTL->PRG_CTLSTAT >>17)%2) )
   {FLCTL->ERASE_CTLSTAT |= 0x00080000;} //clear erase from completion to idle state to allow re-protection
   FLCTL->BANK0_INFO_WEPROT = 0x03; //reprotect segment
   SYSCTL->REBOOT_CTL = (0x01 | 0x6900);
}

}




void main(void)
{
    FLCTL->PRG_CTLSTAT = 0x0000000D;  // 0000 0000 0000 0000 0000 0000 0000 1101 : Immediate mode enabled with both Pre and Post auto verify
    FLCTL->BANK0_RDCTL = 0x00000000;
    NVIC->ISER[1] = 0b1000;//

	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		// stop watchdog timer




	P2DIR = 0xFF;
	P1DIR = 0x00;
	P1REN = 0xFF;
	P1OUT = 0xFF;
    P1IE = 0x02;        //0000 0000
    P1IES = 0x02;


	//START UP LOCK DEVICE & POLL LOCKING ACK

if (*LOCK_ACK == 0xFFFFFFFF)
{
//    while(1);
    FLCTL->CLRIFG = 0xFFFFFFFF; //clear indicators
    FLCTL->BANK0_INFO_WEPROT = 0x02; //Remove Erase/Program protection on section 0 of bank 0 of information memory
    FLCTL->ERASE_SECTADDR = 0x00200000;
    FLCTL->ERASE_CTLSTAT = 0x05; //initiate erase
    PRG_Complete=0;
          while(!PRG_Complete)
          {

              write_ptr = 0x00200000; //start
              *write_ptr = 0x0115ACF6;

              write_ptr = 0x00200004; //Command
              *write_ptr = 0x00080000;

              write_ptr = 0x00200010; //Params, sec enable
              *write_ptr = 0x00000000;

              write_ptr = 0x00200014; //Params, sec enable
              for (i=0; i < 16 ; i++)
              {
              *write_ptr = 0x12345678;
              write_ptr = write_ptr +1;
              }

              write_ptr = 0x0020028C; //end
              *write_ptr = 0x0011E11D;


          if (       !((FLCTL->IFG>>2)%1) && !((FLCTL->IFG>>2)%2) && ((FLCTL->IFG>>3)%2)   ){PRG_Complete = 1;}//Programming complete with no errors
          }
    while ( ((FLCTL->ERASE_CTLSTAT >> 16)%2) || ((FLCTL->ERASE_CTLSTAT >> 17)%2) || ((FLCTL->PRG_CTLSTAT >>16)%2) || ((FLCTL->PRG_CTLSTAT >>17)%2) )
    {FLCTL->ERASE_CTLSTAT |= 0x00080000;} //clear erase from completion to idle state to allow re-protection
    FLCTL->BANK0_INFO_WEPROT = 0x03; //reprotect segment
    SYSCTL->REBOOT_CTL = (0x01 | 0x6900);
}

while (1)
{

if (!((P1IN >> 4) % 2)) //initiate update
{

    FLCTL->CLRIFG = 0xFFFFFFFF; //clear indicators
    FLCTL->BANK0_INFO_WEPROT = 0x02; //Remove Erase/Program protection on section 0 of bank 0 of information memory
    FLCTL->ERASE_SECTADDR = 0x00200000;
    FLCTL->ERASE_CTLSTAT = 0x05; //initiate erase
    PRG_Complete=0;
       while(!PRG_Complete)
       {
           write_ptr = 0x00200000;//start
           *write_ptr = 0x0115ACF6;

           write_ptr = 0x00200004; //Command
           *write_ptr = 0x10000000;

           write_ptr = 0x002001F8; //payload address
           *write_ptr = 0x00020000;

           write_ptr = 0x002001FC; //length to the nearest 4 sectors
           *write_ptr = 0x0011010;

           write_ptr = 0x00200200; //destination address
           *write_ptr = 0x00000000;

           write_ptr = 0x0020028C;//end
           *write_ptr = 0x0011E11D;
           if (       !((FLCTL->IFG>>2)%1) && !((FLCTL->IFG>>2)%2) && ((FLCTL->IFG>>3)%2)   ){PRG_Complete = 1;}//Programming complete with no errors
       }
   while ( ((FLCTL->ERASE_CTLSTAT >> 16)%2) || ((FLCTL->ERASE_CTLSTAT >> 17)%2) || ((FLCTL->PRG_CTLSTAT >>16)%2) || ((FLCTL->PRG_CTLSTAT >>17)%2) )
   {FLCTL->ERASE_CTLSTAT |= 0x00080000;} //clear erase from completion to idle state to allow re-protection
   FLCTL->BANK0_INFO_WEPROT = 0x03; //reprotect segment
   SYSCTL->REBOOT_CTL = (0x01 | 0x6900);
}



P2OUT |= 0x01;
for (i = 0; i < 10000 ; i++);
P2OUT &= ~0x01;
for (i = 0; i < 10000 ; i++);

}//While
}//Main

#include "msp.h" //SLOW BLINK


/**
 * main.c
 */
void main(void)
{



	    FLCTL->PRG_CTLSTAT = 0x0000000D;  // 0000 0000 0000 0000 0000 0000 0000 1101 : Immediate mode enabled with both Pre and Post auto verify
	    FLCTL->BANK0_RDCTL = 0x00000000;
	    WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;     // stop watchdog timer
	    int i = 0;
	    int * write_ptr =0;
	    int PRG_Complete = 0;

	    P2DIR = 0xFF;
	    P1DIR = 0x00;
	    P1REN = 0xFF;
	    P1OUT = 0xFF;


	while (1)
	{

	if (!((P1IN >> 4) % 2)) //initiate update
	{
	    FLCTL->CLRIFG = 0xFFFFFFFF; //clear indicators
	    FLCTL->BANK0_INFO_WEPROT = 0x02; //Remove Erase/Program protection on section 0 of bank 0 of information memory
	    FLCTL->ERASE_SECTADDR = 0x00200000;
	    FLCTL->ERASE_CTLSTAT = 0x05; //initiate erase
	    PRG_Complete=0;
	       while(!PRG_Complete)
	       {
	           write_ptr = 0x00200000;//start
	           *write_ptr = 0x0115ACF6;

	           write_ptr = 0x00200004; //Command
	           *write_ptr = 0x00010000;

	           write_ptr = 0x0020028C;//end
	           *write_ptr = 0x0011E11D;
	           if (       !((FLCTL->IFG>>2)%1) && !((FLCTL->IFG>>2)%2) && ((FLCTL->IFG>>3)%2)   ){PRG_Complete = 1;}//Programming complete with no errors
	       }
	   while ( ((FLCTL->ERASE_CTLSTAT >> 16)%2) || ((FLCTL->ERASE_CTLSTAT >> 17)%2) || ((FLCTL->PRG_CTLSTAT >>16)%2) || ((FLCTL->PRG_CTLSTAT >>17)%2) )
	   {FLCTL->ERASE_CTLSTAT |= 0x00080000;} //clear erase from completion to idle state to allow re-protection
	   FLCTL->BANK0_INFO_WEPROT = 0x03; //reprotect segment
	   SYSCTL->REBOOT_CTL = (0x01 | 0x6900);
	}



	P2OUT |= 0x01;
	for (i = 0; i < 100000 ; i++);
	P2OUT &= ~0x01;
	for (i = 0; i < 100000 ; i++);

	}//While

  • I have not tried this implementation. Generally, TI recommends using the driverLib APIs for doing in system flash programming. Based upon what you have described I would not think that is the issue, but something to consider in future development.


    Regards,
    Chris

    edit: These parameters do not look correct.  Per SLAU690 it should be 1010 and 1000.

               write_ptr = 0x002001FC; //length to the nearest 4 sectors
               *write_ptr = 0x0011010;
               write_ptr = 0x00200200; //destination address
               *write_ptr = 0x00000000;
  • Just to confirm, I have gotten to the same point with the driverLib implementation.  Similarly, the factory reset works fine but the secure update has no impact (it does not brick though like yours).  Here are the source files I am using.

    00000120DD010200F1010200F1010200F1010200F1010200F101020000000000000000000000000000000000F1010200F101020000000000F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F1010200F10102001549086840F47000086014494FF4B5400880134980200860124946F65A10086011494FF48030086010481049006820F0071040F0030008600A49002008600C480B49006820F0300008600A480949006820F030000860704788ED00E00C480040143004E0000401400404014008040140101001401410014008B510480068006880470F480068006804210246022090470B480068C068042102460220904700200090084900988142F2D90098401C0090044900988142F8D8EAE7C0466408000224080002A0860100094808B580F308880849086840F47000086000BF00BF00F011F80020FFF7C8FF012000F00DF808BD0000012088ED00E008B5FFF781FFFFF7E3BF08BD0120704700BFFEE7FEE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12345678123456781234567812345678
    /* --COPYRIGHT--,BSD
     * Copyright (c) 2017, Texas Instruments Incorporated
     * 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.
     * --/COPYRIGHT--*/
    /*******************************************************************************
     * MSP432 GPIO - Input Interrupt to start JTAG/SWD download
     *
     * Tried several combinations and permutations without success.  Unable to write
     * directly to the Mailbox from code.  Documentation is inconsistent but it
     * sounds like it should be possible to write at least to bank1 while the
     * JTAG/SWD is locked.
     *
     ******************************************************************************/
    /* DriverLib Includes */
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
    
    /* Standard Includes */
    #include <stdint.h>
    #include <stdbool.h>
    
    #define JTAGMBOX_START_ADD      0x00200000
    #define JTAGMBOX_START_VAL      0x0115ACF6
    
    #define JTAGMBOX_CMND_ADD       0x00200004
    #define JTAGMBOX_CMND_FRESET    0x00010000  // Factory reset
    #define JTAGMBOX_CMND_LOCK      0x00080000  // Lock JTAG/SWD
    #define JTAGMBOX_CMND_UPDATE    0x10000000  // JTAG/SWD Locked update
    
    #define JTAGMBOX_ENUD_SA_ADD    0x002001F4  // Encrypted update start address
    #define JTAGMBOX_ENUD_SA_VAL    0x00020000
    
    #define JTAGMBOX_ENUD_LEN_ADD   0x002001F8  // Encrypted update length address
    /*
     * Image size is 0x1f2, padded to 0x1000 + password 0x10 = 0x1010
     */
    #define JTAGMBOX_ENUD_LEN_VAL   0x00001010
    
    #define JTAGMBOX_ENUD_DA_ADD    0x002001FC  // Encrypted update desitnation address
    #define JTAGMBOX_ENUD_DA_VAL    0x00000000
    
    #define JTAGMBOX_END_ADD        0x0020028C
    #define JTAGMBOX_END_VAL        0x0011E11D
    
    #define JTAGLOCK_LENGTH         21
    
    void lockJtagSwd(void);
    void lockJtagSwdUpdate(void);
    void factoryReset(void);
    
    
    int main(void)
    {
        volatile uint32_t ii;
        /* Halting the Watchdog */
        MAP_WDT_A_holdTimer();
    
        /* Configuring P1.0 as output and P1.1 (switch) as input */
        MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
        MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
        MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0 + GPIO_PIN1);
        MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0 + GPIO_PIN1);
    
        /* Configuring P1.0 as output and P1.1 (switch) as input */
        MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0);
    
        /* Configuring P1.1 as an input and enabling interrupts */
        MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1+GPIO_PIN4);
        MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1+GPIO_PIN4);
        MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1+GPIO_PIN4);
        MAP_Interrupt_enableInterrupt(INT_PORT1);
        
        /* Enabling MASTER interrupts */
        MAP_Interrupt_enableMaster();   
    
        while (1)
        {
            MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
            for(ii=0;ii<10000;ii++);
        }
    }
    
    /* GPIO ISR */
    void PORT1_IRQHandler(void)
    {
        uint32_t status;
    
        status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
        MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);
    
        /* Toggling the output on the LED */
        if(status & GPIO_PIN1)
        {
            MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
            /*
             * Write to the Flash Mailbox and then execute reset
             */
            lockJtagSwdUpdate();
        }
    
        if(status & GPIO_PIN4)
        {
            MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
            MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
            /*
             * Write to the Flash Mailbox and then execute reset
             */
            factoryReset();
        }
    }
    
    void lockJtagSwdUpdate(void)
    {
        uint32_t tempStorage;
    
        //![FlashCtl Program]
        /*
         * Unprotecting Info Bank 0, Sector 1
         * FLCTL_BANK0_INFO_WEPROT_PROT0 = FLCTL_BANK0_MAIN_WEPROT_PROT0 = 0x1
         */
        MAP_FlashCtl_unprotectSector(FLASH_INFO_MEMORY_SPACE_BANK0,FLASH_SECTOR0);
    
        /* Trying to erase the sector. Within this function, the API will
            automatically try to erase the maximum number of tries. If it fails,
             trap in an infinite loop */
        if(!MAP_FlashCtl_eraseSector((uint32_t)&(FL_BOOTOVER_MAILBOX->MB_START)))
            while(1);
    
        /* Trying to program the memory. Within this function, the API will
            automatically try to program the maximum number of tries. If it fails,
            trap inside an infinite loop */
        tempStorage = JTAGMBOX_START_VAL;
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*) &(FL_BOOTOVER_MAILBOX->MB_START), 4))
                    while(1);
    
        tempStorage = JTAGMBOX_CMND_UPDATE;  // encrypted firmware update
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*) &(FL_BOOTOVER_MAILBOX->CMD), 4))
                    while(1);
    /*****************************************************************************/
        tempStorage = JTAGMBOX_ENUD_SA_VAL;  // encrypted firmware update source
                                             // addresss
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*) &(FL_BOOTOVER_MAILBOX->JTAG_SWD_LOCK_ENCPAYLOADADD), 4))
                    while(1);
    
        tempStorage = JTAGMBOX_ENUD_LEN_VAL;  // encrypted firmware update length
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*) &(FL_BOOTOVER_MAILBOX->JTAG_SWD_LOCK_ENCPAYLOADLEN), 4))
                    while(1);
    
        tempStorage = JTAGMBOX_ENUD_DA_VAL;  // encrypted firmware update
                                             // destination address
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*) &(FL_BOOTOVER_MAILBOX->JTAG_SWD_LOCK_DST_ADDR), 4))
                    while(1);
    /*****************************************************************************/
        tempStorage = JTAGMBOX_END_VAL;
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*) &(FL_BOOTOVER_MAILBOX->MB_END), 4))
                    while(1);
    
        /* Setting the sector back to protected  */
        MAP_FlashCtl_protectSector(FLASH_INFO_MEMORY_SPACE_BANK0,FLASH_SECTOR0);
        //![FlashCtl Program]
        MAP_SysCtl_rebootDevice();
    }
    void factoryReset(void)
    {
        uint32_t tempStorage;
    
        //![FlashCtl Program]
        /*
         * Unprotecting Info Bank 0, Sector 1
         * FLCTL_BANK0_INFO_WEPROT_PROT0 = FLCTL_BANK0_MAIN_WEPROT_PROT0 = 0x1
         */
        MAP_FlashCtl_unprotectSector(FLASH_INFO_MEMORY_SPACE_BANK0,FLASH_SECTOR0);
    
        /* Trying to erase the sector. Within this function, the API will
            automatically try to erase the maximum number of tries. If it fails,
             trap in an infinite loop */
    
        if(!MAP_FlashCtl_eraseSector((uint32_t)&(FL_BOOTOVER_MAILBOX->MB_START)))
            while(1);
    
        /* Trying to program the memory. Within this function, the API will
            automatically try to program the maximum number of tries. If it fails,
            trap inside an infinite loop */
        tempStorage = JTAGMBOX_START_VAL;
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*)&(FL_BOOTOVER_MAILBOX->MB_START), 4))
                    while(1);
    
        tempStorage = JTAGMBOX_CMND_FRESET;
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*)&(FL_BOOTOVER_MAILBOX->CMD), 4))
                    while(1);
    
        tempStorage = JTAGMBOX_END_VAL;
        if(!MAP_FlashCtl_programMemory(&tempStorage,
                (void*)&(FL_BOOTOVER_MAILBOX->MB_END), 4))
                    while(1);
    
        /* Setting the sector back to protected  */
        MAP_FlashCtl_protectSector(FLASH_INFO_MEMORY_SPACE_BANK0,FLASH_SECTOR0);
        //![FlashCtl Program]
        MAP_SysCtl_rebootDevice();
    }
    
    /******************************************************************************
    *
    * Copyright (C) 2012 - 2016 Texas Instruments Incorporated - http://www.ti.com/
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    *
    *  Redistributions of source code must retain the above copyright
    *  notice, this list of conditions and the following disclaimer.
    *
    *  Redistributions in binary form must reproduce the above copyright
    *  notice, this list of conditions and the following disclaimer in the
    *  documentation and/or other materials provided with the
    *  distribution.
    *
    *  Neither the name of Texas Instruments Incorporated nor the names of
    *  its contributors may be used to endorse or promote products derived
    *  from this software without specific prior written permission.
    *
    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    * (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 <ti/devices/msp432p4xx/driverlib/driverlib.h>
    
    #if defined (__TI_ARM__)   /* TI CGT Compiler */
    #pragma DATA_SECTION(FlashMailBox, ".flashMailbox")
    #pragma RETAIN(FlashMailBox)
    const volatile uint32_t FlashMailBox[] =
    
    #elif defined (__ICCARM__) /* IAR Compiler */
    __root const uint32_t FlashMailBox [] @ 0x00200000 =
    
    #elif defined (__CC_ARM)   /* ARM Compiler */
    const volatile uint32_t FlashMailBox [] __attribute__((at(0x00200000))) =
    
    #elif defined (__GNUC__)   /* GCC Compiler */
    const volatile uint32_t FlashMailBox [] __attribute__((section(".flashMailbox"))) =
    #endif
    {
    /*------General Configuration Group--------------------*/
        0x0115ACF6,                                                         // MailBox start,
        /* General Parameter Command:
         * Acceptable values are one or a combination of the
         * COMMAND_xxxx definitions or COMMAND_NONE */
        COMMAND_JTAG_SWD_LOCK_SECEN,                                        // General Parameter Command
    
        /* !Do not change, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // Factory Reset ACK
        0xFFFFFFFF,                                                         // Reserved
    /*---------JTAG & SWD Lock Group------------------------*/
    
        /* JTAG and SWD Lock Enable
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0x00000000,
    
        /* JTAG SWD Lock AES Initialization Vector [0-3] */
        //    0x00001111222233334444555566667777
        0x00001111,
        0x22223333,
        0x44445555,
        0x66667777,
    
        /* JTAG SWD Lock AES CBC Security Keys [0-7] */
        //    00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF
        0x00112233,    // JTAG_SWD_LOCK_SECKEYS[0]
        0x44556677,
        0x8899AABB,
        0xCCDDEEFF,
        0x00112233,    // JTAG_SWD_LOCK_SECKEYS[4]
        0x44556677,
        0x8899AABB,
        0xCCDDEEFF,
    
        /* Password to be appended to the firmware update payload */
        0x12345678,                                                         // FC_SEC_PARAMS_AES_UNENC_PWD_0
        0x12345678,                                                         // FC_SEC_PARAMS_AES_UNENC_PWD_1
        0x12345678,                                                         // FC_SEC_PARAMS_AES_UNENC_PWD_2
        0x12345678,                                                         // FC_SEC_PARAMS_AES_UNENC_PWD_3
    
        /* !Do not change, read-back/reserved addresses for JTAG SWD lock */
        0xFFFFFFFF,                                                         // JTAG/SWD Lock operation ACK
        0xFFFFFFFF,                                                         // Reserved
        0xFFFFFFFF,                                                         // Reserved
    
    /*-------IP Protection Zone 0 Group-------------------------*/
    
        /* IP Protection Zone 0 Enable
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* Start Address <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* Length <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* IP Protection Zone 0 - AES Initialization Vector [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 0 - AES CBC Security Keys [0-7] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 0 - Password to append to firmware update payload [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 0 - Encrypted update mode
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* IP Protection Zone 0 - Enable data access within protected zone
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* !Do not change, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IP Protection Zone 0 - ACK
        0xFFFFFFFF,                                                         // Reserved
        0xFFFFFFFF,                                                         // Reserved
    
    /*-------IP Protection Zone 1 Group-------------------------*/
    
        /* IP Protection Zone 1 Enable
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* Start Address <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* Length <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* IP Protection Zone 1 - AES Initialization Vector [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 1 - AES CBC Security Keys [0-7] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 1 - Password to append to firmware update payload [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 1 - Encrypted update mode
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* IP Protection Zone 1 - Enable data access within protected zone
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* !Do not change, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IP Protection Zone 1 - ACK
        0xFFFFFFFF,                                                         // Reserved
        0xFFFFFFFF,                                                         // Reserved
    
    /*-------IP Protection Zone 2 Group-------------------------*/
    
        /* IP Protection Zone 2 Enable
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* Start Address <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* Length <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* IP Protection Zone 2 - AES Initialization Vector [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 2 - AES CBC Security Keys [0-7] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 2 - Password to append to firmware update payload [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 2 - Encrypted update mode
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* IP Protection Zone 2 - Enable data access within protected zone
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* !Do not change, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IP Protection Zone 2 - ACK
        0xFFFFFFFF,                                                         // Reserved
        0xFFFFFFFF,                                                         // Reserved
    
    /*-------IP Protection Zone 3 Group-------------------------*/
    
        /* IP Protection Zone 3 Enable
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* Start Address <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* Length <0x0-0x00400000:0x00001000> */
        0xFFFFFFFF,
    
        /* IP Protection Zone 3 - AES Initialization Vector [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 3 - AES CBC Security Keys [0-7] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 3 - Password to append to firmware update payload [0-3] */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* IP Protection Zone 3 - Encrypted update mode
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* IP Protection Zone 3 - Enable data access within protected zone
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* !Do not change, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IP Protection Zone 3 - ACK
        0xFFFFFFFF,                                                         // Reserved
        0xFFFFFFFF,                                                         // Reserved
    
    /*-------BSL Configuration Group-------------------------*/
    
        /* BSL Enable
         * 0xFFFFFFFF: Disable
         * 0x00000000: Enable */
        0xFFFFFFFF,
    
        /* BSL Starting address, default pointing to TI BSL at 0x00202000 */
        0xFFFFFFFF,
    
        /* BSL Parameter
         * Use HW Invoke on Port 1, Pin 1, on HIGH
         * Use UART
         */
        0xFFFFFFFF,
    
        /* !Do not modify, reserved values */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,                                                         // BSL ACK
    
    /*----------[JTAG/SWD] Encrypted Firmware Update Group----*/
        /* Encrypted Update configuration */
        0xFFFFFFFF,                                                         // Encrypted Update Start Address
        0xFFFFFFFF,                                                         // Encrypted Update Length
        0xFFFFFFFF,                                                         // Destination address after decryption
    
        /* !Do not modify, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // Encrypted Update ACK
        0xFFFFFFFF,                                                         // Reserved
    
    /*-----IP Protection Zone 0 Firmware Update Group -------*/
        /* IP Protection Zone 0 Update configuration */
        0xFFFFFFFF,                                                         // IPP Zone 0 Start Address
        0xFFFFFFFF,                                                         // IPP Zone 0 Length
    
        /* !Do not modify, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IPP Zone 0 Update ACK
        0xFFFFFFFF,                                                         // Reserved
    
    /*-----IP Protection Zone 1 Firmware Update Group -------*/
        /* IP Protection Zone 1 Update configuration */
        0xFFFFFFFF,                                                         // IPP Zone 1 Start Address
        0xFFFFFFFF,                                                         // IPP Zone 1 Length
    
        /* !Do not modify, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IPP Zone 1 Update ACK
        0xFFFFFFFF,                                                         // Reserved
    
    /*-----IP Protection Zone 2 Firmware Update Group -------*/
        /* IP Protection Zone 2 Update configuration */
        0xFFFFFFFF,                                                         // IPP Zone 2 Start Address
        0xFFFFFFFF,                                                         // IPP Zone 2 Length
    
        /* !Do not modify, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IPP Zone 2 Update ACK
        0xFFFFFFFF,                                                         // Reserved
    
    /*-----IP Protection Zone 3 Firmware Update Group -------*/
        /* IP Protection Zone 3 Update configuration */
        0xFFFFFFFF,                                                         // IPP Zone 3 Start Address
        0xFFFFFFFF,                                                         // IPP Zone 3 Length
    
        /* !Do not modify, read-back/reserved addresses */
        0xFFFFFFFF,                                                         // IPP Zone 3 Update ACK
        0xFFFFFFFF,                                                         // Reserved
        0xFFFFFFFF,                                                         // Reserved
    
    /*-------Factory Reset Parameters Group-------------------------*/
        /* Factory Reset Enable */
        0xFFFFFFFF,
    
        /* Factory Reset Password Enable */
        0xFFFFFFFF,
        /* Factory Reset Password */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* !Do not modify, reserved values */
        0xFFFFFFFF,
        0xFFFFFFFF,
    
    
    /*-------Factory Reset Group-------------------------*/
        /* Factory Reset Password */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* !Do not modify, reserved values */
        0xFFFFFFFF,
        0xFFFFFFFF,
        0xFFFFFFFF,
    
        /* Flash MailBox End */
        0x0011E11D
    };
    
    

    Regards,

    Chris

  • Update to bring this issue to closure.

    First and foremost, when the JTAG/SWD Lock are enabled, then there is no way to connect to the device other than the BSL. I have discussed this at length with the developer and believe that the documentation needs to be updated to more clearly state this.

    Second, I was testing with revision C silicon and not revision D. Once I moved to revision D, I also bricked my device and needed to perform a factory reset to recover.

    Regards,
    Chris

**Attention** This is a public forum