mirror of
git://projects.qi-hardware.com/ben-wpan.git
synced 2024-11-25 18:57:11 +02:00
tools/usbwait/: new tool to wait for a USB device to appear
- usbwait/usbwait.c: update the USB device tree until the specified device is detected - usbwait/Makefile: build usbwait (host only) - Makefile (DIRS, BEN_DIRS, upload): separated subdirectories with tools that can run on the Ben from those that can't - Makefile (DIRS): added usbwait/
This commit is contained in:
parent
55d220b400
commit
7037858a3e
@ -11,8 +11,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
DIRS=atrf-id atrf-path atrf-proxy atrf-reset atrf-rssi atrf-trim atrf-txrx \
|
BEN_DIRS=atrf-id atrf-path atrf-proxy atrf-reset atrf-rssi atrf-trim \
|
||||||
atrf-xmit atrf-xtal
|
atrf-txrx atrf-xmit atrf-xtal
|
||||||
|
DIRS=$(BEN_DIRS) usbwait
|
||||||
TARGET_ONLY_DIRS=lib
|
TARGET_ONLY_DIRS=lib
|
||||||
|
|
||||||
ifeq ($(TARGET),ben_jlime)
|
ifeq ($(TARGET),ben_jlime)
|
||||||
@ -27,4 +28,5 @@ include ../makefiles/Makefile.recurse
|
|||||||
.PHONY: upload
|
.PHONY: upload
|
||||||
|
|
||||||
upload:
|
upload:
|
||||||
scp `for n in $(DIRS); do echo $$n/$$n; done` $(HOST):/usr/bin/
|
scp `for n in $(BEN_DIRS); do \
|
||||||
|
echo $$n/$$n; done` $(HOST):/usr/bin/
|
||||||
|
40
tools/usbwait/Makefile
Normal file
40
tools/usbwait/Makefile
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# usbwait/Makefile - Wait for an USB device to appear
|
||||||
|
#
|
||||||
|
# Written 2011 by Werner Almesberger
|
||||||
|
# Copyright 2011 Werner Almesberger
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
MAIN = usbwait
|
||||||
|
|
||||||
|
ifeq ($(TARGET),)
|
||||||
|
TARGET = host
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TARGET),host)
|
||||||
|
|
||||||
|
include ../Makefile.common
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
.PHONY: all install uninstall clean spotless
|
||||||
|
|
||||||
|
all:
|
||||||
|
|
||||||
|
install:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(MAIN).o
|
||||||
|
|
||||||
|
spotless: clean
|
||||||
|
rm -f $(MAIN)
|
||||||
|
|
||||||
|
endif
|
102
tools/usbwait/usbwait.c
Normal file
102
tools/usbwait/usbwait.c
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* usbwait/usbwait.c - Wait for a USB device to appear
|
||||||
|
*
|
||||||
|
* Written 2011 by Werner Almesberger
|
||||||
|
* Copyright 2011 Werner Almesberger
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "usbopen.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFAULT_POLL_S 0.1
|
||||||
|
|
||||||
|
|
||||||
|
static useconds_t interval_us = DEFAULT_POLL_S*1000000;
|
||||||
|
static unsigned long timeout = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static void wait_for_usb(void)
|
||||||
|
{
|
||||||
|
struct timeval to, now;
|
||||||
|
|
||||||
|
gettimeofday(&to, NULL);
|
||||||
|
to.tv_sec += timeout;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
usb_rescan();
|
||||||
|
if (open_usb(0, 0))
|
||||||
|
return;
|
||||||
|
if (timeout) {
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
if (now.tv_sec > to.tv_sec)
|
||||||
|
break;
|
||||||
|
if (now.tv_sec == to.tv_sec &&
|
||||||
|
now.tv_usec > to.tv_usec)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (usleep(interval_us) < 0) {
|
||||||
|
perror("usleep");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "timeout\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void usage(const char *name)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: %s [-i poll_s] [-p path] [-t timeout_s] [vendor]:[product]\n\n"
|
||||||
|
" -i poll_s poll interval in seconds (default: %g s)\n"
|
||||||
|
" -p path USB device path\n"
|
||||||
|
" -t timeout_s timeout in seconds (default: infinite)\n"
|
||||||
|
, name, DEFAULT_POLL_S);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "i:p:t:")) != EOF)
|
||||||
|
switch (c) {
|
||||||
|
case 'i':
|
||||||
|
interval_us = strtod(optarg, &end)*1000000;
|
||||||
|
if (*end || interval_us < 0)
|
||||||
|
usage(*argv);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
restrict_usb_path(optarg);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
timeout = strtoul(optarg, &end, 0);
|
||||||
|
if (*end || !timeout)
|
||||||
|
usage(*argv);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(*argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc != optind+1)
|
||||||
|
usage(*argv);
|
||||||
|
|
||||||
|
parse_usb_id(argv[optind]);
|
||||||
|
wait_for_usb();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user