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

📄 main_lpcusbboot.c

📁 NXP(原飞利浦)的LPC214X系列ARM上的USB在系统升级的源代码,极力推荐!!开发者主页: http://www.simonqian.com/en/LPCUSBBoot/
💻 C
📖 第 1 页 / 共 2 页
字号:
		for (j=0; j<((n+2)/3); j++) {
			for (k=0; k<4; k++) {
				tmp[k] = (char)VCOM_getchar();
				if ((tmp[k] < 33) || (tmp[k] > 96))
					return 0;
			}

			UU_Decode(tmp, tmp_code);

			for (k=0; (k<3) && ((j * 3 + k) < n); k++) {
				buf[i + j * 3 + k] = tmp_code[k];
				UU_chksum_val += tmp_code[k];
			}
		}
		VCOM_getln(tmp, sizeof(tmp));
		if (tmp[0] != '\0')
			return 0;

		i += n;
		if((++l >= 20) || (i >= iLen)) {
			l = 0;
			VCOM_getln(tmp, sizeof(tmp));
			if (!getNum(tmp, &chk_sum, '\0'))
				return 0;

			if(chk_sum == UU_chksum_val) {
				VCOM_putln("OK");
#if DBG_LEVEL >= 3
DBG("UU_Line OK\n");
#endif
			}
			else {
				i = resend_addr;
				VCOM_putln("RESEND");
#if DBG_LEVEL >= 3
DBG("UU_Line Fail,%d != %d\n", UU_chksum_val, chk_sum);
#endif
			}
			UU_chksum_val = 0;
			resend_addr = i;
		}
	}

	return i;
}


static int UU_putdata(int iLen, const char *buf) {
	int i = 0, j, k, l = 0, n, resend_addr = 0;
	char tmp[11], tmp_code[3];

	UU_chksum_val = 0;
	while(i < iLen) {
		n = iLen - i;
		if (n > 45)
			n = 45;

		VCOM_putchar(n + 0x20);
		for (j=0; j<((n+2)/3); j++) {
			for(k=0; k<3; k++) {
				if (i + j * 3 + k < iLen) {
					UU_chksum_val += buf[i + j * 3 + k];
					tmp_code[k] = buf[i + j * 3 + k];
				}
				else {
					tmp_code[k] = 0;
				}
			}

			UU_Encode(tmp_code, tmp);

			for (k=0; k<4; k++) {
				VCOM_putchar(tmp[k]);
			}
		}
		VCOM_putln("");

		i += n;
		if((++l >= 20) || (i >= iLen)) {
			l = 0;
			sprintf(tmp, "%d", UU_chksum_val);
			VCOM_putln(tmp);
			UU_chksum_val = 0;

			VCOM_getln(tmp,sizeof(tmp));
			if (!strcmp(tmp,"OK")) {
			}
			else if (!strcmp(tmp,"RESEND")) {
				i = resend_addr;
			}
			else
				return 0;
			resend_addr = i;
		}
	}

	return iLen;
}

static void ISP_Answer(U32 result) {
	char buf[11];

	sprintf(buf, "%d", result);
	VCOM_putln(buf);
}

#if DBG_LEVEL >= 1
static void ISP_DebugInfo(const char *cmd, U32 *para, U32 errorCode) {
	DBG("%s: ", cmd);
	switch(errorCode) {
	case LPCARM_ISP_CMD_SUCCESS:					DBG("LPCARM_ISP_CMD_SUCCESS");break;
	case LPCARM_ISP_INVALID_COMMAND:				DBG("LPCARM_ISP_INVALID_COMMAND");break;
	case LPCARM_ISP_SRC_ADDR_ERROR:					DBG("LPCARM_ISP_SRC_ADDR_ERROR");break;
	case LPCARM_ISP_DST_ADDR_ERROR:					DBG("LPCARM_ISP_DST_ADDR_ERROR");break;
	case LPCARM_ISP_SRC_ADDR_NOT_MAPPED:			DBG("LPCARM_ISP_SRC_ADDR_NOT_MAPPED");break;
	case LPCARM_ISP_DST_ADDR_NOT_MAPPED:			DBG("LPCARM_ISP_DST_ADDR_NOT_MAPPED");break;
	case LPCARM_ISP_COUNT_ERROR:					DBG("LPCARM_ISP_COUNT_ERROR");break;
	case LPCARM_ISP_INVALID_SECTOR:					DBG("LPCARM_ISP_INVALID_SECTOR");break;
	case LPCARM_ISP_SECTOR_NOT_BLANK:				DBG("LPCARM_ISP_SECTOR_NOT_BLANK");break;
	case LPCARM_ISP_SECTOR_NOT_PREPARED:			DBG("LPCARM_ISP_SECTOR_NOT_PREPARED");break;
	case LPCARM_ISP_COMPARE_ERROR:					DBG("LPCARM_ISP_COMPARE_ERROR");break;
	case LPCARM_ISP_BUSY:							DBG("LPCARM_ISP_BUSY");break;
	case LPCARM_ISP_PARAM_ERROR:					DBG("LPCARM_ISP_PARAM_ERROR");break;
	case LPCARM_ISP_ADDR_ERROR:						DBG("LPCARM_ISP_ADDR_ERROR");break;
	case LPCARM_ISP_ADDR_NOT_MAPPED:				DBG("LPCARM_ISP_ADDR_NOT_MAPPED");break;
	case LPCARM_ISP_CMD_LOCKED:						DBG("LPCARM_ISP_CMD_LOCKED");break;
	case LPCARM_ISP_INVALID_CODE:					DBG("LPCARM_ISP_INVALID_CODE");break;
	case LPCARM_ISP_INVALID_BAUD_RATE:				DBG("LPCARM_ISP_INVALID_BAUD_RATE");break;
	case LPCARM_ISP_INVALID_STOP_BIT:				DBG("LPCARM_ISP_INVALID_STOP_BIT");break;
	case LPCARM_ISP_CODE_READ_PROTECTION_ENALBE:	DBG("LPCARM_ISP_CODE_READ_PROTECTION_ENALBE");break;
	default:										DBG("Am I all right?");break;
	}
	DBG(",0x%08X,0x%08X,0x%08X\n", para[0], para[1], para[2]);
}
#endif

/*************************************************************************
	main
	====
**************************************************************************/
int main(void)
{
	char bufLine[CMD_LINE_LEN];
	U32 para[3], errorCode;
	int c;
	
	// PLL and MAM
	Initialize();
	bChipEncrypted = (*(U32*)(0x1FC + APP_START) == 0x87654321);

	// init DBG
	ConsoleInit(60000000 / (16 * BAUD_RATE));

#if DBG_LEVEL >= 1
	DBG("Initialising USB stack\n");
#endif

	// initialise stack
	USBInit();

	// register descriptors
	USBRegisterDescriptors(abDescriptors);

	// register class request handler
	USBRegisterRequestHandler(REQTYPE_TYPE_CLASS, HandleClassRequest, abClassReqData);

	// register endpoint handlers
	USBHwRegisterEPIntHandler(INT_IN_EP, NULL);
	USBHwRegisterEPIntHandler(BULK_OUT_EP, BulkIO);
	USBHwRegisterEPIntHandler(BULK_IN_EP, BulkIO);

	// register frame handler
	USBHwRegisterFrameHandler(USBFrameHandler);

	// enable bulk-in interrupts on NAKs
	USBHwNakIntEnable(INACK_BI);

	// initialise VCOM
	VCOM_init();

#if DBG_LEVEL >= 1
	DBG("Starting USB communication\n");
#endif

	// connect to bus
	USBHwConnect(TRUE);

	// Sync to host
Sync:
	c = VCOM_getchar();
	if (c == '?') {
Sync_Send:
		VCOM_putln("Synchronized");
		Sync_Mode = Sync_Mode_WaitOSC;
		CDC_enable_echo = 1;
	}
	else {
		goto Sync;
	}

	while (1) {
		memset(bufLine, 0, sizeof(bufLine));
		c = VCOM_getln(bufLine, sizeof(bufLine));
		if (Sync_Mode == Sync_Mode_WaitSync)
			goto Sync;
		else if (Sync_Mode == Sync_Mode_SendSync)
			goto Sync_Send;
		if (c) {
//			lpcisp_processcmd(bufLine);
			if (Sync_Mode == Sync_Mode_ReadOSC) {
				if (getNum(bufLine, &IAP_FCCLK, '\0')) {
					VCOM_putln("OK");
					Sync_Mode = Sync_Mode_Synced;
#if DBG_LEVEL >= 1
					DBG("Sync: OK\n");
#endif
					continue;
				}
				else {
					goto Sync;
				}
			}

			// Process commands
			if ((Sync_Mode == Sync_Mode_WaitOSC) && !strcmp(bufLine, "Synchronized")) {
				VCOM_putln("OK");
				Sync_Mode = Sync_Mode_ReadOSC;
			}
			else if ((bufLine[0] == 'A') && (c == 3)) {
				// Set Echo
				c = parseParas(&bufLine[1], 1, para, '\0');
				if (c && ((para[0] == 0) || (para[0] == 1))) {
					CDC_enable_echo = para[0];
					errorCode = LPCARM_ISP_CMD_SUCCESS;
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Set Echo", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'B') {
				// Set Baudrate
				c = parseParas(&bufLine[1], 1, para, '\0');
				if (c) {
					errorCode = LPCARM_ISP_CMD_SUCCESS;
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Set Baudrate", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'C') {
				// Copy RAM2Flash
				c = parseParas(&bufLine[1], 3, para, '\0');
				if (c) {
					if (!bChipEncrypted && (para[0] >= APP_START)) {
						errorCode = IAP_RamToFlash(para[0], para[1], para[2]);
					}
					else {
						errorCode = LPCARM_ISP_CODE_READ_PROTECTION_ENALBE;
					}
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Copy RAM2Flash", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'E') {
				// Erase Sector
				bUnlocked = 0;

				c = parseParas(&bufLine[1], 2, para, '\0');
				if (c) {
#if Boot_Position == Boot_Position_TOP
					if (para[0] <= Boot_Sect_End)
						para[0] = Boot_Sect_End + 1;
#elif Boot_Position == Boot_Position_BOTTOM
					if (para[1] >= Boot_Sect_Begin)
						para[1] = Boot_Sect_Begin - 1;
#else
#endif
					if (!bChipEncrypted) {
						errorCode = IAP_EraseSector((U8)para[0], (U8)para[1]);
					}
					else {
#if Boot_Position == Boot_Position_TOP
						if ((para[0] == (Boot_Sect_End + 1)) && (para[1] == LPCARM_MaxSect)) {
#elif Boot_Position == Boot_Position_BOTTOM
						if ((para[0] == 0) && (para[1] == (Boot_Sect_Begin - 1))) {
#else
#endif
							errorCode = IAP_EraseSector((U8)para[0], (U8)para[1]);
							bChipEncrypted = 0;
						}
						else {
							errorCode = LPCARM_ISP_CODE_READ_PROTECTION_ENALBE;
						}
					}
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Copy RAM2Flash", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'G') {
				// Run
				c = parseParas(&bufLine[1], 1, para ,' ');
				para[1] = bufLine[2 + c];
				if (c && (bufLine[1 + c] == ' ') && (bufLine[3 + c] == '\0') && ((para[1] == 'T') || (para[1] == 'A'))) {
					if (!(para[0] & 0x03)) {
						if (((para[0] >= 0x40000000) && (para[0] < LPCARM_MemTop)) || ((para[0] >= APP_START) && (para[0] < APP_END))) {
							if (!bChipEncrypted) {
								para[0] |= (para[1] == 'T');
								//((void (*)(void))para[0])();
								errorCode = LPCARM_ISP_CMD_SUCCESS;
							}
							else {
								errorCode = LPCARM_ISP_CODE_READ_PROTECTION_ENALBE;
							}
						}
						else {
							errorCode = LPCARM_ISP_ADDR_NOT_MAPPED;
						}
					}
					else {
						errorCode = LPCARM_ISP_ADDR_ERROR;
					}
					
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Run", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'I') {
				// Check Blank Sector
				c = parseParas(&bufLine[1], 2, para, '\0');
				if (c) {
#if Boot_Position == Boot_Position_TOP
					if (para[0] <= Boot_Sect_End)
						para[0] = Boot_Sect_End + 1;
#elif Boot_Position == Boot_Position_BOTTOM
					if (para[1] >= Boot_Sect_Begin)
						para[1] = Boot_Sect_Begin - 1;
#else
#endif
					errorCode = IAP_BlankCheck((U8)para[0], (U8)para[1]);
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Copy RAM2Flash", para, errorCode);
#endif
			}
			else if ((bufLine[0] == 'J') && (c == 1)) {
				// Read Chip ID
				ISP_Answer(LPCARM_ISP_CMD_SUCCESS);
				errorCode = IAP_ReadPartID();
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				DBG("Read ChipID: OK,%d\n", errorCode);
#endif
			}
			else if ((bufLine[0] == 'K') && (c == 1)) {
				// Read Boot version
				ISP_Answer(LPCARM_ISP_CMD_SUCCESS);
				errorCode = IAP_ReadBootID();
				ISP_Answer(errorCode & 0xFF);
				ISP_Answer((errorCode >> 8) & 0xFF);
#if DBG_LEVEL >= 1
				DBG("Read Boot_ver: OK,%d.%d\n", (errorCode >> 8) & 0xFF, errorCode & 0xFF);
#endif
			}
			else if (bufLine[0] == 'M') {
				// Compare RAM2Flash
				c = parseParas(&bufLine[1], 3, para, '\0');
				if (c) {
					errorCode = IAP_Compare(para[0], para[1], para[2]);
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Copy RAM2Flash", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'P') {
				// Prepare Sector
				c = parseParas(&bufLine[1], 2, para, '\0');
				if (c) {
#if Boot_Position == Boot_Position_TOP
					if (para[0] <= Boot_Sect_End)
						para[0] = Boot_Sect_End + 1;
#elif Boot_Position == Boot_Position_BOTTOM
					if (para[1] >= Boot_Sect_Begin)
						para[1] = Boot_Sect_Begin - 1;
#else
#endif
					errorCode = IAP_SelectSector((U8)para[0], (U8)para[1]);
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Copy RAM2Flash", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'R') {
				// Read RAM
				c = parseParas(&bufLine[1], 2, para, '\0');
				if (c) {
					if (!(para[0] & 0x3)) {
						if (((para[0] >= 0x40000000) && (para[0] < LPCARM_MemTop)) || (para[0] < LPCARM_FlashSize)) {
							if (!(para[1] % 4)) {
								if (!bChipEncrypted) {
									errorCode = LPCARM_ISP_CMD_SUCCESS;
									ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
									ISP_DebugInfo("Read RAM", para, errorCode);
#endif
									c = UU_putdata((int)para[1], (char*)para[0]);
#if DBG_LEVEL >= 1
									if ((U32)c == para[1]) {
										DBG("Read RAM: UU_putdata OK,%d\n", c);
									}
									else {
										DBG("Read RAM: UU_putdata error,%d\n", c);
									}
#endif
								}
								else {
									errorCode = LPCARM_ISP_CODE_READ_PROTECTION_ENALBE;
								}
							}
							else {
								errorCode = LPCARM_ISP_COUNT_ERROR;
							}
						}
						else {
							errorCode = LPCARM_ISP_ADDR_NOT_MAPPED;
						}
					}
					else {
						errorCode = LPCARM_ISP_ADDR_ERROR;
					}
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}

				if (errorCode != LPCARM_ISP_CMD_SUCCESS) {
					ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
					ISP_DebugInfo("Read RAM", para, errorCode);
#endif
				}
			}
			else if (bufLine[0] == 'U') {
				// Unlock Sector
				c = parseParas(&bufLine[1], 1, para, '\0');
				if (c && (para[0] == LPCARM_Unlock_Code)) {
					bUnlocked = 1;
					errorCode = LPCARM_ISP_CMD_SUCCESS;
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}
				ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("Unlock Sector", para, errorCode);
#endif
			}
			else if (bufLine[0] == 'W') {
				// Write RAM
				c = parseParas(&bufLine[1], 2, para, '\0');
				if (c) {
					if (!(para[0] & 0x03)) {
						if ((para[0] >= 0x40000000) && (para[0] < LPCARM_MemTop)) {
							if (!(para[1] % 4)) {
								if (!bChipEncrypted) {
									errorCode = LPCARM_ISP_CMD_SUCCESS;
									ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
									ISP_DebugInfo("Write RAM", para, errorCode);
#endif
									c = UU_getdata((int)para[1], (char*)para[0]);
#if DBG_LEVEL >= 1
									if ((U32)c >= para[1]) {
										DBG("Write RAM: UU_getdata OK,%d\n", c);
									}
									else {
										DBG("Write RAM: UU_getdata error,%d\n", c);
									}
#endif
								}
								else {
									errorCode = LPCARM_ISP_CODE_READ_PROTECTION_ENALBE;
								}
							}
							else {
								errorCode = LPCARM_ISP_COUNT_ERROR;
							}
						}
						else {
							errorCode = LPCARM_ISP_ADDR_NOT_MAPPED;
						}
					}
					else {
						errorCode = LPCARM_ISP_ADDR_ERROR;
					}
				}
				else {
					errorCode = LPCARM_ISP_PARAM_ERROR;
				}

				if (errorCode != LPCARM_ISP_CMD_SUCCESS) {
					ISP_Answer(errorCode);
#if DBG_LEVEL >= 1
					ISP_DebugInfo("Write RAM", para, errorCode);
#endif
				}
			}
			else {
				// Invalid Command
				ISP_Answer(LPCARM_ISP_INVALID_COMMAND);
#if DBG_LEVEL >= 1
				ISP_DebugInfo("", para, errorCode);
#endif
			}
		}
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -