Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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() ----- */