/** * Reads a value from bootloader * * @return value; -2 on error; exit on timeout */ long readval() { int i; int j = 257; long val = 0; while(1) { i = com_getc(TIMEOUT); if(i == -1) { printf("...Device does not answer!\n"); exit(0); } switch(j) { case 1: if(i == SUCCESS) { return val; } break; case 2: val = val * 256 + i; j= 1; break; case 3: val = val * 256 + i; j= 2; break; case 4: val = val * 256 + i; j= 3; break; case 256: j = i; break; case 257: if(i == FAIL) { return -2; } else if(i == ANSWER) { j = 256; } break; default: printf("\nError: readval, i = %i, j = %i, val = %li\n", i, j, val); return -2; } } }
/** * Try to connect a device */ void connect_device() { const char * ANIM_CHARS = "-\\|/"; const char PASSWORD[6] = {'P', 'e', 'd', 'a', 0xff, 0}; int state = 0; int in = 0; printf("Waiting for device... Press CTRL+C to exit. "); while(1) { printf("\b%c", ANIM_CHARS[state]); fflush(stdout); com_puts(PASSWORD); in = com_getc(0); if(in == CONNECT) { sendcommand(COMMAND); // Empty buffer while(1) { switch(com_getc(TIMEOUT)) { case SUCCESS: printf("\n...Connected!\n"); gettimeofday(&t_start, NULL); return; case -1: printf("\n...Connection timeout!\n\n"); exit (0); } } } state++; state = state % 4; usleep(10000);//wait 10ms } }//void connect_device()
void db_console(void) { if (i_bit(CBUS_PUT_CHAR, my_word)) { volatile u_char c = cbus_ochar; i_bit_clear(CBUS_PUT_CHAR, my_word); cnputc(c); } else if (i_bit(CBUS_GET_CHAR, my_word)) { if (cbus_wait_char) cbus_ichar = cngetc(); else cbus_ichar = cnmaygetc(); i_bit_clear(CBUS_GET_CHAR, my_word); #ifndef notdef } else if (!cnmaygetc()) { #else /* notdef */ } else if (com_is_char() && !com_getc(TRUE)) { #endif /* notdef */ simple_unlock(&db_lock); db_cpu = my_cpu; } }
/** * Checking CRC Support * * @return 2 if no crc support, 0 if crc supported, 1 fail, exit on timeout */ int check_crc() { int i; unsigned int crc1; sendcommand(CHECK_CRC); crc1 = crc; com_putc(crc1); com_putc(crc1 >> 8); i = com_getc(TIMEOUT); switch (i) { case SUCCESS: return 0; case BADCOMMAND: return 2; case FAIL: return 1; case -1: printf("...Device does not answer!\n\n"); exit (0); default: return i; } }
/** * Flashes or verify the controller */ int flash(char verify, const char * filename) { char * data = NULL; int i; int msg; unsigned char d1; unsigned long addr; unsigned long lastaddr=0; //read data from hex-file data = readHexfile(filename, flashsize, &lastaddr); if(data == NULL) { printf("Reading file failed.\n"); return 0; } printf("Highest address in hex file: 0x%05lX (%lu Bytes)\n",lastaddr,lastaddr); // Sending commands to MC if(verify == 0) { printf("Writing program memory...\n"); printf("Programming \"%s\": 00000 - 00000", filename); sendcommand(PROGRAM); } else { sendcommand(VERIFY); printf("Verifying program memory...\n"); foo = com_getc(TIMEOUT); if(foo == BADCOMMAND) { printf("Verify not available\n"); return 0; } printf( "Verify %s: 00000 - 00000", filename); } // Sending data to MC for(i = buffersize, addr = 0;; addr++) { switch(d1 = data[addr]) { case ESCAPE: case 0x13: com_putc(ESCAPE); d1 += ESC_SHIFT; default: com_putc(d1); } if(--i == 0) { printf( "\b\b\b\b\b%05lX", addr + 1); fflush(stdout); if(!verify) { msg = 0; msg = com_getc(TIMEOUTP); if (msg != CONTINUE) { printf(" failed. Did not receive CONTINUE despite more data to write. Got 0x%04X (%u)\n",(unsigned)((unsigned char)msg),(unsigned)((unsigned char)msg)); free(data); return 0; } } i = buffersize; } if(addr == lastaddr) { com_putc(ESCAPE); com_putc(ESC_SHIFT); // A5,80 = End printf("\b\b\b\b\b%05lX", addr); msg = 0; msg = com_getc(TIMEOUTP); if (msg != SUCCESS) { printf(" failed. Did not receive SUCCESS at end of programming. Got 0x%04X (%u)\n",(unsigned)((unsigned char)msg),(unsigned)((unsigned char)msg)); free(data); return 0; } else { printf(" SUCCESS\n"); } break; } } printf("\n"); free(data); return 1; }//int flash(char verify, const char * filename)