diff options
| author | Keith Packard <keithp@keithp.com> | 2013-03-20 23:22:37 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2013-03-20 23:22:37 -0700 | 
| commit | 15bc83a0eaaa9a43d67fdc3e9f412d5b2c1f06dd (patch) | |
| tree | 5c6b064b893ed6d398914acb7d31abc2e1cd4251 | |
| parent | 50dd268a715224a01f8a6b481670a4ae6621cb28 (diff) | |
ao-tools: Make library support µPusb
Set baud rate to 9600, look for FTDI-style names
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | ao-tools/lib/cc-usb.c | 12 | ||||
| -rw-r--r-- | ao-tools/lib/cc-usb.h | 3 | ||||
| -rw-r--r-- | ao-tools/lib/cc-usbdev.c | 25 | 
3 files changed, 36 insertions, 4 deletions
| diff --git a/ao-tools/lib/cc-usb.c b/ao-tools/lib/cc-usb.c index 9f07e662..f8275243 100644 --- a/ao-tools/lib/cc-usb.c +++ b/ao-tools/lib/cc-usb.c @@ -254,10 +254,10 @@ cc_usb_printf(struct cc_usb *cc, char *format, ...)  }  int -cc_usb_getchar(struct cc_usb *cc) +cc_usb_getchar_timeout(struct cc_usb *cc, int timeout)  {  	while (cc->in_pos == cc->in_count) { -		if (_cc_usb_sync(cc, 5000) < 0) { +		if (_cc_usb_sync(cc, timeout) < 0) {  			fprintf(stderr, "USB link timeout\n");  			exit(1);  		} @@ -265,6 +265,12 @@ cc_usb_getchar(struct cc_usb *cc)  	return cc->in_buf[cc->in_pos++];  } +int +cc_usb_getchar(struct cc_usb *cc) +{ +	return cc_usb_getchar_timeout(cc, 5000); +} +  void  cc_usb_getline(struct cc_usb *cc, char *line, int max)  { @@ -420,6 +426,8 @@ cc_usb_open(char *tty)  	tcgetattr(cc->fd, &termios);  	save_termios = termios;  	cfmakeraw(&termios); +	cfsetospeed(&termios, B9600); +	cfsetispeed(&termios, B9600);  	tcsetattr(cc->fd, TCSAFLUSH, &termios);  	cc_usb_printf(cc, "\nE 0\nm 0\n");  	do { diff --git a/ao-tools/lib/cc-usb.h b/ao-tools/lib/cc-usb.h index e90e1195..f1193456 100644 --- a/ao-tools/lib/cc-usb.h +++ b/ao-tools/lib/cc-usb.h @@ -54,6 +54,9 @@ void  cc_queue_read(struct cc_usb *cc, uint8_t *buf, int len);  int +cc_usb_getchar_timeout(struct cc_usb *cc, int timeout); + +int  cc_usb_getchar(struct cc_usb *cc);  void diff --git a/ao-tools/lib/cc-usbdev.c b/ao-tools/lib/cc-usbdev.c index a19e231c..95bfa244 100644 --- a/ao-tools/lib/cc-usbdev.c +++ b/ao-tools/lib/cc-usbdev.c @@ -132,13 +132,25 @@ usb_tty(char *sys)  			/* Check for tty/ttyACMx style names  			 */  			tty_dir = cc_fullname(endpoint_full, "tty"); -			free(endpoint_full);  			ntty = scandir(tty_dir, &namelist,  				       dir_filter_tty,  				       alphasort);  			free (tty_dir);  			if (ntty > 0) {  				tty = cc_fullname("/dev", namelist[0]->d_name); +				free(endpoint_full); +				free(namelist); +				return tty; +			} + +			/* Check for ttyACMx style names +			 */ +			ntty = scandir(endpoint_full, &namelist, +				       dir_filter_tty, +				       alphasort); +			free(endpoint_full); +			if (ntty > 0) { +				tty = cc_fullname("/dev", namelist[0]->d_name);  				free(namelist);  				return tty;  			} @@ -197,6 +209,15 @@ dir_filter_dev(const struct dirent *d)  	return 1;  } +static int +is_am(int idVendor, int idProduct) { +	if (idVendor == 0xfffe) +		return 1; +	if (idVendor == 0x0403 && idProduct == 0x6015) +		return 1; +	return 0; +} +  struct cc_usbdevs *  cc_usbdevs_scan(void)  { @@ -220,7 +241,7 @@ cc_usbdevs_scan(void)  		dir = cc_fullname(USB_DEVICES, ents[e]->d_name);  		dev = usb_scan_device(dir);  		free(dir); -		if (dev->idVendor == 0xfffe && dev->tty) { +		if (is_am(dev->idVendor, dev->idProduct) && dev->tty) {  			if (devs->dev)  				devs->dev = realloc(devs->dev,  						    (devs->ndev + 1) * sizeof (struct usbdev *)); | 
