⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsldemo.c

📁 MSP430操作TUSB3410,USB接口芯片的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:

		/* 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 + -