📄 bsldemo.c
字号:
/* Read actual InfoA segment Content. */
printf("Read InfoA Segment...\n");
/* Transmit password to get access to protected BSL functions. */
if ((error= txPasswd(passwdFile)) != ERR_NONE)
{
return(signOff(error, TRUE)); /* Password was transmitted! */
}
if (toDo.MSP430X) if (bslTxRx(BSL_MEMOFFSET, 0, 0, NULL, blkin) !=0) return (signOff(error, TRUE));
if ((error= bslTxRx(BSL_RXBLK, /* Command: Read/Receive Block */
0x010C0, /* Start address */
0x40, /* No. of bytes to read */
NULL, infoA)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
}
else
{
toDo.RestoreInfoA = 0;
}
if (toDo.MassErase)
{
int i;
/* Erase the flash memory completely (with mass erase command): */
printf("Mass Erase...\n");
for (i= 0; i < meraseCycles; i++)
{
if (i == 1)
{
printf("Additional mass erase cycles...\n");
}
if ((error= bslTxRx(BSL_MERAS, /* Command: Mass Erase */
0xff00, /* Any address within flash memory. */
0xa506, /* Required setting for mass erase! */
NULL, blkin)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
}
passwdFile= NULL; /* No password file required! */
}
#ifdef NEW_BSL
} /* if ((newBSLFile == NULL) || (passwdFile == NULL)) */
#endif /* NEW_BSL */
/* Transmit password to get access to protected BSL functions. */
if (!(toDo.UserCalled))
if ((error= txPasswd(passwdFile)) != ERR_NONE)
{
return(signOff(error, TRUE)); /* Password was transmitted! */
}
/* Read actual bootstrap loader version (FRGR: complete Chip ID). */
if (toDo.MSP430X) if (bslTxRx(BSL_MEMOFFSET, 0, 0, NULL, blkin) !=0) return (signOff(error, TRUE));
if ((error= bslTxRx(BSL_RXBLK, /* Command: Read/Receive Block */
0x0ff0, /* Start address */
14, /* No. of bytes to read */
NULL, blkin)) == ERR_NONE)
{
memcpy(&devTypeHi,&blkin[0x00], 1);
memcpy(&devTypeLo,&blkin[0x01], 1);
memcpy(&devProcHi,&blkin[0x02], 1);
memcpy(&devProcLo,&blkin[0x03], 1);
memcpy(&bslVerHi, &blkin[0x0A], 1);
memcpy(&bslVerLo, &blkin[0x0B], 1);
printf("BSL version: %X.%02X", bslVerHi,bslVerLo);
printf(" - Family member: %02X%02X", devTypeHi, devTypeLo);
printf(" - Process: %02X%02X\n", devProcHi, devProcLo);
bslVer= (bslVerHi << 8) | bslVerLo;
if (bslVer < 0x0150) bslerrbuf = 0x021E; else bslerrbuf = 0x0200;
if (bslVer <= 0x0110)
{
#ifdef WORKAROUND
#ifdef NEW_BSL
if (newBSLFile == NULL)
{
#endif /* NEW_BSL */
printf("Patch for flash programming required!\n");
patchRequired= TRUE;
#ifdef NEW_BSL
}
#endif /* NEW_BSL */
#endif /* WORKAROUND */
BSLMemAccessWarning= 1;
}
else
{
BSLMemAccessWarning= 0; /* Fixed in newer versions of BSL. */
}
}
if (patchRequired || ((newBSLFile != NULL) && (bslVer <= 0x0110)))
{
/* Execute function within bootstrap loader
* to prepare stack pointer for the following patch.
* This function will lock the protected functions again.
*/
printf("Load PC with 0x0C22...\n");
if ((error= bslTxRx(BSL_LOADPC, /* Command: Load PC */
0x0C22, /* Address to load into PC */
0, /* No additional data! */
NULL, blkin)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
/* Re-send password to re-gain access to protected functions. */
if ((error= txPasswd(passwdFile)) != ERR_NONE)
{
return(signOff(error, TRUE)); /* Password was transmitted! */
}
}
#ifdef NEW_BSL
if (newBSLFile != NULL)
{
WORD startaddr; /* used twice: vector or start address */
startaddr = readStartAddrTIText(newBSLFile);
if (startaddr == 0)
{
startaddr = 0x0300;
}
printf("Load");
if (bslVer >= 0x0140) printf("/Verify");
printf(" new BSL \"%s\" into RAM at 0x%04X...\n", newBSLFile, startaddr);
if ((error= programTIText(newBSLFile, /* File to program */
ACTION_PROGRAM)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
if (bslVer < 0x0140)
{
printf("Verify new BSL \"%s\"...\n", newBSLFile);
if ((error= programTIText(newBSLFile, /* File to verify */
ACTION_VERIFY)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
}
/* Read startvector/loaded model of NEW bootstrap loader: */
if ((error= bslTxRx(BSL_RXBLK, startaddr, 4, NULL, blkin)) == ERR_NONE)
{
memcpy(&startaddr, &blkin[0], 2);
memcpy(&loadedModel, &blkin[2], 2);
if (loadedModel != SMALL_RAM_model)
{
loadedModel= LARGE_RAM_model;
bslerrbuf = 0x0200;
printf("Start new BSL (LARGE model > 1K Bytes) at 0x%04X...\n", startaddr);
}
else
printf("Start new BSL (SMALL model < 512 Bytes) at 0x%04X...\n", startaddr);
error= bslTxRx(BSL_LOADPC, /* Command: Load PC */
startaddr,/* Address to load into PC */
0, /* No additional data! */
NULL, blkin);
}
if (error != ERR_NONE)
{
return(signOff(error, FALSE));
}
/* BSL-Bugs should be fixed within "new" BSL: */
BSLMemAccessWarning= 0;
patchRequired= FALSE;
patchLoaded= FALSE;
if (loadedModel != SMALL_RAM_model)
{
/* Re-send password to re-gain access to protected functions. */
if ((error= txPasswd(passwdFile)) != ERR_NONE)
{
return(signOff(error, TRUE)); /* Password was transmitted! */
}
}
}
#endif/* NEW_BSL */
#ifdef WORKAROUND
if (patchRequired)
{
printf("Load and verify patch \"%s\"...\n", patchFile);
/* Programming and verification is done in one pass.
* The patch file is only read and parsed once.
*/
if ((error= programTIText(patchFile, /* File to program */
ACTION_PROGRAM | ACTION_VERIFY)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
patchLoaded= TRUE;
}
#endif /* WORKAROUND */
#ifdef NEW_BSL
if ((newBSLFile != NULL) && (passwdFile != NULL) && toDo.MassErase)
{
/* Erase the flash memory completely (with mass erase command): */
printf("Mass Erase...\n");
if ((error= bslTxRx(BSL_MERAS, /* Command: Mass Erase */
0xff00, /* Any address within flash memory. */
0xa506, /* Required setting for mass erase! */
NULL, blkin)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
passwdFile= NULL; /* No password file required! */
}
#endif /* NEW_BSL*/
/* FRGR */
if (toDo.SpeedUp) // 0:9600, 1:19200, 2:38400 (3:56000 not applicable)
{
DWORD BR; // Baudrate
if ((devTypeHi == 0xF1) || (devTypeHi == 0x12)) // F1232 / F1xx
{
BYTE BCSCTL1, DCOCTL; // Basic Clock Module Registers
switch (speed) // for F148, F149, F169
{ //Rsel DCO
case 0: BR = CBR_9600; BCSCTL1 = 0x85; DCOCTL = 0x80; break;// 5 4
case 1: BR = CBR_19200; BCSCTL1 = 0x86; DCOCTL = 0xE0; break;// 6 7
case 2: BR = CBR_38400; BCSCTL1 = 0x87; DCOCTL = 0xE0; break;// 7 7
default: BR = CBR_9600; BCSCTL1 = 0x85; DCOCTL = 0x80; speed = 0;
}
_addr = (BCSCTL1 << 8) + DCOCTL;// D2, D1: values for CPU frequency
}
else if (devTypeHi == 0xF4)
{
BYTE SCFI0, SCFI1; // FLL+ Registers
switch (speed) // for F448, F449
{ //NDCO FN_x
case 0: BR = CBR_9600; SCFI1 = 0x98; SCFI0= 0x00; break;// 19 0
case 1: BR = CBR_19200; SCFI1 = 0xB0; SCFI0= 0x00; break;// 22 0
case 2: BR = CBR_38400; SCFI1 = 0xC8; SCFI0= 0x00; break;// 25 0
default: BR = CBR_9600; SCFI1 = 0x98; SCFI0= 0x00; speed = 0;
}
_addr = (SCFI1 << 8) + SCFI0; // D2, D1: values for CPU frequency
}
else if (devTypeHi == 0xF2)
{
BYTE BCSCTL1, DCOCTL; // Basic Clock Module Registers
switch (speed) // for F2xx
{ //Rsel DCO
case 0: BR = CBR_9600; BCSCTL1 = 0x88; DCOCTL = 0x80; break;// 5 4
case 1: BR = CBR_19200; BCSCTL1 = 0x8B; DCOCTL = 0x80; break;// 6 7
case 2: BR = CBR_38400; BCSCTL1 = 0x8C; DCOCTL = 0x80; break;// 7 7
default: BR = CBR_9600; BCSCTL1 = 0x88; DCOCTL = 0x80; speed = 0;
}
_addr = (BCSCTL1 << 8) + DCOCTL;// D2, D1: values for CPU frequency
}
_len = speed; // D3: index for baudrate (speed)
if (BR != comGetBaudrate()) // change only if not same speed
{
printf("Change Baudrate ");
error= bslTxRx(BSL_SPEED, // Command: Change Speed
_addr, // Mandatory code
_len, // Mandatory code
NULL, blkin);
if (error == ERR_NONE)
{
printf("from %d ", comGetBaudrate());
comChangeBaudrate(BR);
delay(10);
printf("to %d Baud (Mode: %d)\n", comGetBaudrate(),speed);
}
else
{
printf("command not accepted. Baudrate remains at %d Baud\n", comGetBaudrate());
}
}
}
Time_PRG_starts = GetTickCount();
//printf("Start time measurement for pure Prog/Verify cycle...\n");
if (!toDo.OnePass)
{
if (toDo.EraseCheck)
{
/* Parse file in TXT-Format and check the erasure of required flash cells. */
printf("Erase Check by file \"%s\"...\n", filename);
if ((error= programTIText(filename, ACTION_ERASE_CHECK)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
}
if (toDo.FastCheck)
{
/* Parse file in TXT-Format and check the erasure of required flash cells. */
printf("Fast E-Check by file \"%s\"...\n", filename);
if ((error= programTIText(filename, ACTION_ERASE_CHECK_FAST)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
}
if (toDo.Program)
{
/* Parse file in TXT-Format and program data into flash memory. */
printf("Program \"%s\"...\n", filename);
if ((error= programTIText(filename, ACTION_PROGRAM)) != ERR_NONE)
{
if (newBSLFile == NULL)
return(signOff(ERR_VERIFY_FAILED, FALSE));
else
{
// read out error address+3 from RAM (error address buffer)
if ((loadedModel == LARGE_RAM_model) || (loadedModel == SMALL_RAM_model))
{
if (toDo.MSP430X)
if (bslTxRx(BSL_MEMOFFSET, 0, 0, NULL, blkin) !=0) signOff(error, TRUE);
if ((error= bslTxRx(BSL_RXBLK, bslerrbuf, 2, NULL, blkin)) == ERR_NONE)
{
_err = (blkin[1] << 8) + blkin[0];
printf("Verification Error at 0x%04X\n", _err-3);
}
else
return(signOff(error, FALSE));
}
else
return(signOff(ERR_VERIFY_FAILED, FALSE));
}
}
else
{
printf("%i bytes programmed.\n", byteCtr);
}
}
if (toDo.Verify)
{
if ((toDo.Program) && ((bslVer >= 0x0140) || (newBSLFile != NULL)))
{
printf("Verify... already done during programming.\n");
}
else
{
/* Verify programmed data: */
printf("Verify\"%s\"...\n", filename);
if ((error= programTIText(filename, ACTION_VERIFY)) != ERR_NONE)
{
return(signOff(error, FALSE));
}
}
}
}
else
{
unsigned action= 0;
if (toDo.EraseCheck)
{
action |= ACTION_ERASE_CHECK; printf("EraseCheck ");
}
if (toDo.FastCheck)
{
action |= ACTION_ERASE_CHECK_FAST; printf("EraseCheckFast ");
}
if (toDo.Program)
{
action |= ACTION_PROGRAM; printf("Program ");
}
if (toDo.Verify)
{
action |= ACTION_VERIFY; printf("Verify ");
}
if (action != 0)
{
printf("\"%s\" ...\n", filename);
error= programTIText(filename, action);
if (error != ERR_NONE)
{
return(signOff(error, FALSE));
}
else
{
printf("%i bytes programmed.\n", byteCtr);
}
}
}
if (toDo.RestoreInfoA)
{
unsigned long startaddr = 0x10C0;
WORD len = 0x40;
printf("Restore InfoA Segment...\n");
/* Restore actual InfoA segment Content. */
if (toDo.MSP430X) if (bslTxRx(BSL_MEMOFFSET, 0, 0, NULL, blkin) !=0) return (signOff(error, TRUE));
while ((len > 0) && (infoA[0x40-len] == 0xff))
{
len --;
startaddr++;
}
if (len > 0)
{
memcpy(blkout, &infoA[startaddr - 0x10C0], len);
if (error= programBlk(startaddr, len, ACTION_PROGRAM))
{
return(signOff(error, FALSE));
}
}
}
if (toDo.Dump2file)
{
BYTE* DataPtr = NULL;
BYTE* BytesPtr = NULL;
long byteCount = readLen;
long addrCount = readStart;
BytesPtr = DataPtr = (BYTE*) malloc(sizeof(BYTE) * readLen);
printf("Read memory to file: %s Start: 0x%-4X Length 0x%-4X\n", readfilename, readStart, readLen);
if (toDo.MSP430X) {
if (error = bslTxRx(BSL_MEMOFFSET, 0, (WORD)(addrCount>>16), NULL, blkin) !=ERR_NONE) return(signOff(error, FALSE));
addrCount = addrCount & 0xFFFF;
}
while (byteCount > 0)
{
if (byteCount > maxData)
{ /* Read data. */
printf(" Read memory Start: 0x%-4X Length %d\n", (readStart & 0xFFFF0000)+addrCount, maxData);
if ((error= bslTxRx(BSL_RXBLK, /* Command: Read/Receive Block */
(WORD)addrCount, /* Start address */
(WORD)maxData, /* No. of bytes to read */
NULL, BytesPtr)) != ERR_NONE) return(signOff(error, FALSE));
}
else
{
/* Read data. */
printf(" Read memory Start: 0x%-4X Length %d\n", (readStart & 0xFFFF0000)+addrCount, byteCount);
if ((error= bslTxRx(BSL_RXBLK, /* Command: Read/Receive Block */
(WORD)addrCount, /* Start address */
(WORD)byteCount, /* No. of bytes to read */
NULL, BytesPtr)) != ERR_NONE) return(signOff(error, FALSE));
}
byteCount -= maxData;
addrCount += maxData;
BytesPtr += maxData;
}
StartTITextOutput(readfilename);
WriteTITextBytes((unsigned long) readStart, (WORD) (readLen/2), DataPtr);
FinishTITextOutput();
if (DataPtr != NULL) free (DataPtr);
if (toDo.MSP430X)
if (error = bslTxRx(BSL_MEMOFFSET, 0, (WORD)(0),NULL, blkin) !=0) return (error);
}
if (toDo.EraseSegment)
{
long addrCount = readStart;
printf("Erase Segment: 0x%-4X\n", readStart);
if (toDo.MSP430X) {
if (error = bslTxRx(BSL_MEMOFFSET, 0, (WORD)(addrCount>>16), NULL, blkin) !=ERR_NONE) return(signOff(error, FALSE));
addrCount = addrCount & 0xFFFF;
}
if (error = bslTxRx(BSL_ERASE, addrCount, 0xA502, NULL, blkin) !=ERR_NONE) return(signOff(error, FALSE));
if (toDo.MSP430X)
if (error = bslTxRx(BSL_MEMOFFSET, 0, (WORD)(0),NULL, blkin) !=0) return (error);
}
if (toDo.UserCalled)
{
toDo.UserCalled = 0;
//bslReset(0); /* Reset MSP430 and start user program. */
printf("No Device reset - BSL called from user program ---------------------\n");
//delay(100);
goto Repeat;
}
Time_BSL_stops = GetTickCount();
return(signOff(ERR_NONE, FALSE));
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -