예제 #1
0
/**
 * 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;
        }
    }
}
예제 #2
0
/**
 * 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()
예제 #3
0
파일: db_mp.c 프로젝트: LastAvenger/gnumach
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;
			}
}
예제 #4
0
/**
 * 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;
    }
}
예제 #5
0
/**
 * 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)