📄 main_lpcusbboot.c
字号:
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 + -