📄 term.c
字号:
fprintf(stderr, "Usage: send <byte1> <byte2> <byte3> <byte4>\n"); return -1; } /* number of bytes to write at the specified address */ len = argc - 1; /* load command bytes */ for (i=1; i<argc; i++) { cmd[i-1] = strtoul(argv[i], &e, 0); if (*e || (e == argv[i])) { fprintf(stderr, "%s (send): can't parse byte \"%s\"\n", progname, argv[i]); return -1; } } pgm->err_led(pgm, OFF); pgm->cmd(pgm, cmd, res); /* * display results */ fprintf(stderr, "results:"); for (i=0; i<len; i++) fprintf(stderr, " %02x", res[i]); fprintf(stderr, "\n"); fprintf(stdout, "\n"); return 0;}int cmd_erase(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ fprintf(stderr, "%s: erasing chip\n", progname); pgm->chip_erase(pgm, p); return 0;}int cmd_part(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ fprintf(stdout, "\n"); avr_display(stdout, p, "", 0); fprintf(stdout, "\n"); return 0;}int cmd_sig(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int i; int rc; AVRMEM * m; rc = avr_signature(pgm, p); if (rc != 0) { fprintf(stderr, "error reading signature data, rc=%d\n", rc); } m = avr_locate_mem(p, "signature"); if (m == NULL) { fprintf(stderr, "signature data not defined for device \"%s\"\n", p->desc); } else { fprintf(stdout, "Device signature = 0x"); for (i=0; i<m->size; i++) fprintf(stdout, "%02x", m->buf[i]); fprintf(stdout, "\n\n"); } return 0;}int cmd_quit(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ return 1;}int cmd_parms(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ if (pgm->print_parms == NULL) { fprintf(stderr, "%s (parms): the %s programmer does not support " "adjustable parameters\n", progname, pgm->type); return -1; } pgm->print_parms(pgm); return 0;}int cmd_vtarg(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int rc; double v; char *endp; if (argc != 2) { fprintf(stderr, "Usage: vtarg <value>\n"); return -1; } v = strtod(argv[1], &endp); if (endp == argv[1]) { fprintf(stderr, "%s (vtarg): can't parse voltage \"%s\"\n", progname, argv[1]); return -1; } if (pgm->set_vtarget == NULL) { fprintf(stderr, "%s (vtarg): the %s programmer cannot set V[target]\n", progname, pgm->type); return -2; } if ((rc = pgm->set_vtarget(pgm, v)) != 0) { fprintf(stderr, "%s (vtarg): failed to set V[target] (rc = %d)\n", progname, rc); return -3; } return 0;}int cmd_fosc(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int rc; double v; char *endp; if (argc != 2) { fprintf(stderr, "Usage: fosc <value>[M|k] | off\n"); return -1; } v = strtod(argv[1], &endp); if (endp == argv[1]) { if (strcmp(argv[1], "off") == 0) v = 0.0; else { fprintf(stderr, "%s (fosc): can't parse frequency \"%s\"\n", progname, argv[1]); return -1; } } if (*endp == 'm' || *endp == 'M') v *= 1e6; else if (*endp == 'k' || *endp == 'K') v *= 1e3; if (pgm->set_fosc == NULL) { fprintf(stderr, "%s (fosc): the %s programmer cannot set oscillator frequency\n", progname, pgm->type); return -2; } if ((rc = pgm->set_fosc(pgm, v)) != 0) { fprintf(stderr, "%s (fosc): failed to set oscillator_frequency (rc = %d)\n", progname, rc); return -3; } return 0;}int cmd_sck(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int rc; double v; char *endp; if (argc != 2) { fprintf(stderr, "Usage: sck <value>\n"); return -1; } v = strtod(argv[1], &endp); if (endp == argv[1]) { fprintf(stderr, "%s (sck): can't parse period \"%s\"\n", progname, argv[1]); return -1; } v *= 1e-6; /* Convert from microseconds to seconds. */ if (pgm->set_sck_period == NULL) { fprintf(stderr, "%s (sck): the %s programmer cannot set SCK period\n", progname, pgm->type); return -2; } if ((rc = pgm->set_sck_period(pgm, v)) != 0) { fprintf(stderr, "%s (sck): failed to set SCK period (rc = %d)\n", progname, rc); return -3; } return 0;}int cmd_varef(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int rc; double v; char *endp; if (argc != 2) { fprintf(stderr, "Usage: varef <value>\n"); return -1; } v = strtod(argv[1], &endp); if (endp == argv[1]) { fprintf(stderr, "%s (varef): can't parse voltage \"%s\"\n", progname, argv[1]); return -1; } if (pgm->set_varef == NULL) { fprintf(stderr, "%s (varef): the %s programmer cannot set V[aref]\n", progname, pgm->type); return -2; } if ((rc = pgm->set_varef(pgm, v)) != 0) { fprintf(stderr, "%s (varef): failed to set V[aref] (rc = %d)\n", progname, rc); return -3; } return 0;}int cmd_help(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int i; fprintf(stdout, "Valid commands:\n\n"); for (i=0; i<NCMDS; i++) { fprintf(stdout, " %-6s : ", cmd[i].name); fprintf(stdout, cmd[i].desc, cmd[i].name); fprintf(stdout, "\n"); } fprintf(stdout, "\nUse the 'part' command to display valid memory types for use with the\n" "'dump' and 'write' commands.\n\n"); return 0;}int tokenize(char * s, char *** argv){ int i, n, l, nargs, offset; int len, slen; char * buf; int bufsize; char ** bufv; char * q, * r; char * nbuf; char ** av; slen = strlen(s); /* * initialize allow for 20 arguments, use realloc to grow this if * necessary */ nargs = 20; bufsize = slen + 20; buf = malloc(bufsize); bufv = (char **) malloc(nargs*sizeof(char *)); for (i=0; i<nargs; i++) { bufv[i] = NULL; } buf[0] = 0; n = 0; l = 0; nbuf = buf; r = s; while (*r) { nexttok(r, &q, &r); strcpy(nbuf, q); bufv[n] = nbuf; len = strlen(q); l += len + 1; nbuf += len + 1; nbuf[0] = 0; n++; if ((n % 20) == 0) { /* realloc space for another 20 args */ bufsize += 20; nargs += 20; buf = realloc(buf, bufsize); bufv = realloc(bufv, nargs*sizeof(char *)); nbuf = &buf[l]; for (i=n; i<nargs; i++) bufv[i] = NULL; } } /* * We have parsed all the args, n == argc, bufv contains an array of * pointers to each arg, and buf points to one memory block that * contains all the args, back to back, seperated by a nul * terminator. Consilidate bufv and buf into one big memory block * so that the code that calls us, will have an easy job of freeing * this memory. */ av = (char **) malloc(slen + n + (n+1)*sizeof(char *)); q = (char *)&av[n+1]; memcpy(q, buf, l); for (i=0; i<n; i++) { offset = bufv[i] - buf; av[i] = q + offset; } av[i] = NULL; free(buf); free(bufv); *argv = av; return n;}int do_cmd(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]){ int i; int hold; int len; len = strlen(argv[0]); hold = -1; for (i=0; i<NCMDS; i++) { if (strcasecmp(argv[0], cmd[i].name) == 0) { return cmd[i].func(pgm, p, argc, argv); } else if (strncasecmp(argv[0], cmd[i].name, len)==0) { if (hold != -1) { fprintf(stderr, "%s: command \"%s\" is ambiguous\n", progname, argv[0]); return -1; } hold = i; } } if (hold != -1) return cmd[hold].func(pgm, p, argc, argv); fprintf(stderr, "%s: invalid command \"%s\"\n", progname, argv[0]); return -1;}char * terminal_get_input(const char *prompt){#if defined(HAVE_LIBREADLINE) && !defined(WIN32NATIVE) char *input; input = readline(prompt); if ((input != NULL) && (strlen(input) >= 1)) add_history(input); return input;#else char input[256]; printf("%s", prompt); if (fgets(input, sizeof(input), stdin)) { /* FIXME: readline strips the '\n', should this too? */ return strdup(input); } else return NULL;#endif}int terminal_mode(PROGRAMMER * pgm, struct avrpart * p){ char * cmdbuf; int i; char * q; int rc; int argc; char ** argv; rc = 0; while ((cmdbuf = terminal_get_input("avrdude> ")) != NULL) { /* * find the start of the command, skipping any white space */ q = cmdbuf; while (*q && isspace(*q)) q++; /* skip blank lines and comments */ if (!*q || (*q == '#')) continue; /* tokenize command line */ argc = tokenize(q, &argv); fprintf(stdout, ">>> "); for (i=0; i<argc; i++) fprintf(stdout, "%s ", argv[i]); fprintf(stdout, "\n"); /* run the command */ rc = do_cmd(pgm, p, argc, argv); free(argv); if (rc > 0) { rc = 0; break; } free(cmdbuf); } return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -