⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 term.c

📁 这是一个非常有价值的参考代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -