//gcc -o test_ez_wr test_ez_wr.c -lusb

#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <stdarg.h>
#include <usb.h>
//#include <unistd.h>
//#include <sys/time.h>
//#include <ctype.h>
//#include <assert.h>
//Define
#define USB_VENDOR 0x04B4
#define USB_PRODUCT 0x8613
#define TIMEOUT (5*1000)
#define EP6	0x86
#define EP2	0x02  //For writing
/* Init USB */
struct usb_bus *USB_init()
{
	usb_init();
	usb_find_busses();
	usb_find_devices();
	return(usb_get_busses());
}

/* Find USB device  */
struct usb_device *USB_find(struct usb_bus *busses, struct usb_device *dev)
{
	struct usb_bus *bus;
	for(bus=busses; bus; bus=bus->next){
		for(dev=bus->devices; dev; dev=dev->next) {
			if( (dev->descriptor.idVendor==USB_VENDOR) && (dev->descriptor.idProduct==USB_PRODUCT) ){
				return( dev );
			}
		}
	}
	return( NULL );
}
/* USB Open */
struct usb_dev_handle *USB_open(struct usb_device *dev)
{
	struct usb_dev_handle *udev = NULL;

	udev=usb_open(dev);
	if( (udev=usb_open(dev))==NULL ){
		printf("usb_open Error.(%s)\n",usb_strerror());
		exit(1);
	}

	if( usb_set_configuration(udev,dev->config->bConfigurationValue)<0 ){
		if( usb_detach_kernel_driver_np(udev,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
			printf("usb_set_configuration Error.\n");
			printf("usb_detach_kernel_driver_np Error.(%s)\n",usb_strerror());
 		}
	}

	if( usb_claim_interface(udev,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
		if( usb_detach_kernel_driver_np(udev,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
			printf("usb_claim_interface Error.\n");
			printf("usb_detach_kernel_driver_np Error.(%s)\n",usb_strerror());
		}
	}

	if( usb_claim_interface(udev,dev->config->interface->altsetting->bInterfaceNumber)<0 ){
		printf("usb_claim_interface Error.(%s)\n",usb_strerror());
	}

	return(udev);
}

/* USB Close */
void USB_close(struct usb_dev_handle *dh)
{
	if(usb_release_interface(dh, 0)){
		printf("usb_release_interface() failed. (%s)\n",usb_strerror());
		usb_close(dh);
	}
	if( usb_close(dh)<0 ){
		printf("usb_close Error.(%s)\n",usb_strerror());
	}
}

/* USB altinterface */
void USB_altinterface(struct usb_dev_handle *dh,int tyep)
{
	if(usb_set_altinterface(dh,tyep)<0)
	{
		fprintf(stderr,"Failed to set altinterface %d: %s\n", 1,usb_strerror());
		USB_close(dh);
	}
}


main()
{
	struct usb_bus *bus;
	struct usb_device *dev;
	usb_dev_handle *dh;
	unsigned char buf[512];
	int ret;
	/* Initialize */
	bus=USB_init();
	dev=USB_find(bus,dev);
	if( dev==NULL ){ exit(1); }
	printf("Initialize OK\n");
	/*-------------*/
	/* Device Open */
	/*-------------*/
	dh=USB_open(dev);
	if( dh==NULL ){ exit(2); }
	printf("Device Open OK\n");
	strcpy(buf,"This_is_test");
	printf("Start Write data for EP6\n");
	printf("Sending Data=(%s)\n", buf);
	USB_altinterface(dh,1);
	ret = usb_bulk_write(dh,EP2, buf, sizeof(buf), TIMEOUT);
	if(ret<0){
		fprintf(stderr,"usb_bulk_write() failed? buf(%d) usb(%d)\n",sizeof(buf), ret);
		fprintf(stderr,"usb_bulk_write error.(%s)\n",usb_strerror());
		USB_close(dh);
		return 1;
	}
	printf("Data sending is OK\n\n");
	printf("Start Read data from EP6\n");
	USB_altinterface(dh,1);
	ret = usb_bulk_read(dh,EP6, buf, sizeof(buf), TIMEOUT);
	if(ret<0){
		fprintf(stderr,"usb_bulk_read() failed? buf(%d) usb(%d)\n",sizeof(buf), ret);
		fprintf(stderr,"usb_bulk_read error.(%s)\n",usb_strerror());
		USB_close(dh);
		return 1;
	}
	printf("usb_bulk_read() finished\n");
	fwrite(buf, 1, sizeof(buf), stdout);

	USB_close(dh);
	printf("USB End\n");
	return 0;
}


