gps4020_download.c

来自「eCos操作系统源码」· C语言 代码 · 共 185 行

C
185
字号
//-------------------------------------------------------------------//// gps4020_download.c////-------------------------------------------------------------------//// Copyright (C) 2003, MLB Associates.//// Routine to download code into main [external] SRAM and then// execute it.////-------------------------------------------------------------------//#define DEBUG_DOWNLOADextern void tty_init(void);extern unsigned char tty_getc(int chan);extern void tty_putc(int chan, char c);extern void tty_puts(int chan, char *c);extern void tty_puthex(int chan, unsigned long val, int width);typedef int bool;#define false 0#define true  1// Validate a hex character__inline__ static bool_is_hex(char c){    return (((c >= '0') && (c <= '9')) ||            ((c >= 'A') && (c <= 'F')) ||                        ((c >= 'a') && (c <= 'f')));}// Convert a single hex nibble__inline__ static int_from_hex(char c) {    int ret = 0;    if ((c >= '0') && (c <= '9')) {        ret = (c - '0');    } else if ((c >= 'a') && (c <= 'f')) {        ret = (c - 'a' + 0x0a);    } else if ((c >= 'A') && (c <= 'F')) {        ret = (c - 'A' + 0x0A);    }    return ret;}//// Process the next hex value from a string//unsigned long_hex(char **_cp){    unsigned long val;    unsigned char *cp = *_cp;    val = 0;    while (_is_hex(*cp)) {        val = (val << 4) | _from_hex(*cp++);    }    *_cp = cp;    return val;}//// Simple GDB protocol handler// Only three commands are handled://   $M<loc>,<len>:<data...>#<cksum>//     $M20000000,10:0e0000ea18f09fe518f09fe518f09fe5#59//   $P<reg>=<val>#<cksum>//   $c#<cksum>// <cksum> is a simple accumulation of all of the ASCII// characters following the "$"static char_getc(void){    char c;    c = tty_getc(0);#ifdef DEBUG_DOWNLOAD    tty_putc(1, c);#endif    return c;}void GDB_protocol(void){    char c;    unsigned char cksum, _cksum;    unsigned char line[64];    char *cp;    bool eol, ok;    unsigned char *loc;    unsigned long len;    unsigned char val;    void (*entry_address)(void);    while (true) {        // Wait for a '$'        do {            c = _getc();            // HACK - '>>' indicates to jump to FLASH/ROM            if (c == '>') {                c = _getc();                if (c == '>') {                    entry_address = (void *)0x60000000;                    (*entry_address)();                }            }        } while (c != '$');        cksum = 0;        eol = false;        cp = line;        while (!eol) {            c = _getc();            if (c != '#') {                cksum += c;                *cp++ = c;                *cp = '\0';            } else {                c = _getc();                _cksum = _from_hex(c) << 4;                c = _getc();                _cksum |= _from_hex(c);                ok = (cksum == _cksum);                tty_putc(0, ok ? '+' : '-');                eol = true;            }        }#ifdef DEBUG_DOWNLOAD        tty_puts(1, ok ? " = OK\n" : " = BAD\n");#endif        if (ok) {            // Empty "OK" message            tty_puts(0, "#00");            // Process command            cp = line;            switch (*cp++) {            case 'M':                loc = (unsigned char *)_hex(&cp);                if (*cp++ != ',') continue;                len = _hex(&cp);                if (*cp++ != ':') continue;                while (len-- > 0) {                    val = _from_hex(*cp++) << 4;                    val |= _from_hex(*cp++);                    *loc++ = val;                }                break;            case 'P':                // Ignore register #                cp += 2;                if (*cp++ != '=') continue;                entry_address = (void *)_hex(&cp);                break;            case 'c':                (*entry_address)();                break;            default:                tty_puts(0, "** unknown command: $");                tty_puts(0, line);            }        }    }}intmain(void){    tty_init();    // Change 0x6XXXXXXX to use external ROM    *(volatile short *)0x4010100C |= (1<<9);    tty_puts(0, "Ready to download >>");#ifdef DEBUG_DOWNLOAD    tty_puts(1, "... GDB data:\n");#endif    GDB_protocol();    return 0;  // Never happens!}

⌨️ 快捷键说明

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