static device_t bsl_open(const struct device_args *args) { struct bsl_device *dev; dev = malloc(sizeof(*dev)); if (!dev) { pr_error("bsl: can't allocate memory"); return NULL; } memset(dev, 0, sizeof(*dev)); dev->base.type = &device_bsl; if (args->flags & DEVICE_FLAG_TTY) dev->serial = comport_open(args->path, 460800); else dev->serial = ti3410_open(args->path, args->requested_serial); if (!dev->serial) { free(dev); return NULL; } if (enter_via_fet(dev) < 0) printc_err("bsl: warning: FET firmware not responding\n"); delay_ms(500); /* Show chip info */ if (bsl_xfer(dev, CMD_TX_DATA, 0xff0, NULL, 0x10) < 0) { printc_err("bsl: failed to read chip info\n"); goto fail; } if (dev->reply_len < 0x16) { printc_err("bsl: missing chip info\n"); goto fail; } printc_dbg("Device ID: 0x%02x%02x\n", dev->reply_buf[4], dev->reply_buf[5]); printc_dbg("BSL version is %x.%02x\n", dev->reply_buf[14], dev->reply_buf[15]); return (device_t)dev; fail: dev->serial->ops->destroy(dev->serial); free(dev); return NULL; }
int main(int argc, char **argv) { int opt = 0; int retval = 0; int iRecv = 0; int i; char *dev_name = NULL; int baudrate = 115200; char *settings = "8N1N"; unsigned char aucBuf[512]; unsigned char disp_mode = 0x00; struct sigaction sigact; struct option long_options[] = { {"device", required_argument, NULL, 'd'}, {"baudrate", required_argument, NULL, 'b'}, {"settings", required_argument, NULL, 's'}, {"ioctl", required_argument, NULL, 'i'}, {"hex", no_argument, NULL, 'x'}, {"version", no_argument, NULL, 'v'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; while ((opt = getopt_long(argc, argv, "d:b:s:ivh", long_options, NULL)) != -1) { switch (opt) { case 'd': dev_name = optarg; break; case 'b': baudrate = atoi(optarg); break; case 's': /* Default settings as 8N1N */ settings = optarg; break; case 'i': if (5 != argc) { usage(argv[0]); } else { do_ioctl(argv[2], atoi(argv[3]), atoi(argv[4])); } return 0; case 'x': /* Display receive data as Hex mode */ disp_mode = 0x01; break; case 'v': /* version */ print_version(argv[0]); return 0; case 'h': /* help */ usage(argv[0]); return 0; default: break; } /* end of "switch(opt)" */ } if (argc < 2) { usage(argv[0]); return 0; } COM_PORT *comport = NULL; if (NULL == (comport = comport_init(dev_name, baudrate, settings))) { printf("Comport initialize failure.\n"); return -1; } if ((retval = comport_open(comport)) < 0) { printf("Failed to open %s with baudrate %d, %s. RetCode [0x%02x]", dev_name, baudrate, settings, retval); return -1; } nonblock(); /* Process level signal handler */ sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigact.sa_handler = signal_handler; sigaction(SIGTERM, &sigact, NULL); /* catch terminate signal */ sigaction(SIGINT, &sigact, NULL); /* catch interrupt signal */ sigaction(SIGSEGV, &sigact, NULL); /* catch segmentation faults */ sigaction(SIGTSTP, &sigact, NULL); /* catch ctrl+Z */ sigaction(SIGSTOP, &sigact, NULL); /* catch ctrl+Z */ while (0x01 == g_ucProcToken) { retval = comport_recv(comport, aucBuf, sizeof(aucBuf) - 1, &iRecv, 10); if (0x00 == retval && 0 < iRecv) { for (i = 0; i < iRecv; i++) { if (0 == disp_mode) printf("%c", aucBuf[i]); else printf("%02X ", aucBuf[i]); } fflush(stdout); } if (0 != kbhit()) { iRecv = fgetc(stdin); if (10 == iRecv) { aucBuf[0] = 13; } else { aucBuf[0] = iRecv; } comport_send(comport, aucBuf, 1); } else if (0x00 != g_ucCtrlZ) { g_ucCtrlZ = 0x00; aucBuf[0] = 0x1A; comport_send(comport, aucBuf, 1); } } comport_term(comport); return 0; } /* ----- End of main() ----- */