diff options
Diffstat (limited to 'cctools/lib/cp-usb-async.c')
| -rw-r--r-- | cctools/lib/cp-usb-async.c | 188 | 
1 files changed, 0 insertions, 188 deletions
| diff --git a/cctools/lib/cp-usb-async.c b/cctools/lib/cp-usb-async.c deleted file mode 100644 index 6539394b..00000000 --- a/cctools/lib/cp-usb-async.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright © 2008 Keith Packard <keithp@keithp.com> - * - * 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. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ - -#include <stdio.h> -#include <errno.h> -#include <stdlib.h> -#include <unistd.h> -#include "cp-usb-async.h" -#include "ccdbg-debug.h" - -#define MAX_OUTSTANDING		256 -#define CP_TIMEOUT		1000	/* ms */ - -struct cp_usb_packet { -	struct libusb_transfer	*transfer; -	enum { packet_read, packet_write } direction; -	unsigned char		data[9]; -	uint8_t			*valuep; -}; - -struct cp_usb_async { -	libusb_context		*ctx; -	libusb_device_handle	*handle; -	struct cp_usb_packet	packet[MAX_OUTSTANDING]; -	int			p, ack; -	uint8_t			value; -	uint8_t			set; -}; - -struct cp_usb_async * -cp_usb_async_open(void) -{ -	struct cp_usb_async *cp; -	int ret; - -	cp = calloc(sizeof (struct cp_usb_async), 1); -	if (!cp) -		return NULL; -	ret = libusb_init(&cp->ctx); -	if (ret) { -		free(cp); -		return NULL; -	} -	cp->handle = libusb_open_device_with_vid_pid(cp->ctx, -						     0x10c4, 0xea60); -	cp->ack = -1; -	if (!cp->handle) { -		libusb_exit(cp->ctx); -		free(cp); -		return NULL; -	} -	cp->value = 0; -	cp->set = 0; -	return cp; -} - -void -cp_usb_async_close(struct cp_usb_async *cp) -{ -	libusb_close(cp->handle); -	libusb_exit(cp->ctx); -	free(cp); -} - -static void -cp_usb_async_transfer_callback(struct libusb_transfer *transfer) -{ -	struct cp_usb_async *cp = transfer->user_data; -	int p; - -	for (p = 0; p < cp->p; p++) -		if (cp->packet[p].transfer == transfer) -			break; -	if (p == cp->p) { -		fprintf(stderr, "unknown transfer\n"); -		return; -	} -	switch (cp->packet[p].direction) { -	case packet_read: -		ccdbg_debug(CC_DEBUG_USB_ASYNC, "ack read %d 0x%02x\n", -			    p, cp->packet[p].data[8]); -		*cp->packet[p].valuep = cp->packet[p].data[8]; -		break; -	case packet_write: -		ccdbg_debug(CC_DEBUG_USB_ASYNC, "ack write %d\n", p); -		break; -	} -	if (p > cp->ack) -		cp->ack = p; -} - -void -cp_usb_async_write(struct cp_usb_async *cp, uint8_t mask, uint8_t value) -{ -	int	p; -	uint16_t gpio_set; -	int	ret; - -	if (cp->set) { -		value = (cp->value & ~mask) | (value & mask); -		mask = value ^ cp->value; -	} -	cp->set = 1; -	cp->value = value; -	gpio_set = ((uint16_t) value << 8) | mask; -	if (cp->p == MAX_OUTSTANDING) -		cp_usb_async_sync(cp); -	p = cp->p; -	if (!cp->packet[p].transfer) -		cp->packet[p].transfer = libusb_alloc_transfer(0); -	cp->packet[p].direction = packet_write; -	libusb_fill_control_setup(cp->packet[p].data, -				  0x40,			/* request */ -				  0xff,			/* request type */ -				  0x37e1,		/* value */ -				  gpio_set,		/* index */ -				  0);			/* length */ - -	libusb_fill_control_transfer(cp->packet[p].transfer, -				     cp->handle, -				     cp->packet[p].data, -				     cp_usb_async_transfer_callback, -				     cp, -				     CP_TIMEOUT); -	ccdbg_debug(CC_DEBUG_USB_ASYNC, "Write packet %d 0x%x 0x%x\n", p, mask, value); -	ret = libusb_submit_transfer(cp->packet[p].transfer); -	if (ret) -		fprintf(stderr, "libusb_submit_transfer failed %d\n", ret); -	cp->p++; -} - -void -cp_usb_async_read(struct cp_usb_async *cp, uint8_t *valuep) -{ -	int	p; -	int	ret; - -	if (cp->p == MAX_OUTSTANDING) -		cp_usb_async_sync(cp); -	p = cp->p; -	if (!cp->packet[p].transfer) -		cp->packet[p].transfer = libusb_alloc_transfer(0); -	cp->packet[p].valuep = valuep; -	cp->packet[p].direction = packet_read; -	libusb_fill_control_setup(cp->packet[p].data, -				  0xc0,			/* request */ -				  0xff,			/* request type */ -				  0x00c2,		/* value */ -				  0,			/* index */ -				  1);			/* length */ - -	libusb_fill_control_transfer(cp->packet[p].transfer, -				     cp->handle, -				     cp->packet[p].data, -				     cp_usb_async_transfer_callback, -				     cp, -				     CP_TIMEOUT); -	ccdbg_debug(CC_DEBUG_USB_ASYNC, "Read packet %d\n", p); -	ret = libusb_submit_transfer(cp->packet[p].transfer); -	if (ret) -		fprintf(stderr, "libusb_submit_transfer failed %d\n", ret); -	cp->p++; -} - -void -cp_usb_async_sync(struct cp_usb_async *cp) -{ -	while (cp->ack < cp->p - 1) { -		libusb_handle_events(cp->ctx); -	} -	cp->p = 0; -	cp->ack = -1; -} | 
