smdk-dltool: update to latest upstream version

This fixes the missing libusb SLOT depend and updates it to libusb-1.0.

BUG=chromium-os:25695
TEST=`emerge smdk-dltool` works and links against libusb-1.0
TEST=send to dianders and he said it ran fine

Change-Id: I65fc2b6385d4b52443cd40e431e1467472f6bd3d
Reviewed-on: https://gerrit.chromium.org/gerrit/15090
Reviewed-by: Doug Anderson <dianders@chromium.org>
Tested-by: Doug Anderson <dianders@chromium.org>
Commit-Ready: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-build.patch b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-build.patch
index bf4ad1b..c6e3b76 100644
--- a/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-build.patch
+++ b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-build.patch
@@ -2,7 +2,7 @@
 
 --- a/releases/smdk-tools-v0.20/dltool/Makefile
 +++ b/releases/smdk-tools-v0.20/dltool/Makefile
-@@ -7,8 +7,11 @@
+@@ -7,8 +7,13 @@
  
  .PHONY:	clean
  
@@ -10,7 +10,9 @@
 -	$(CC) -O2 -Wall -g -lusb -o smdk-usbdl dltool.c
 +CFLAGS ?= -O2 -g
 +CFLAGS += -Wall
-+LDLIBS = -lusb
++PKG_CONFIG ?= pkg-config
++CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libusb)
++LDLIBS = $(shell $(PKG_CONFIG) --libs libusb)
 +
 +all: dltool
  
diff --git a/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0.patch b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0.patch
new file mode 100644
index 0000000..408c7e4
--- /dev/null
+++ b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0.patch
@@ -0,0 +1,326 @@
+migrate to libusb-1 by me (Mike Frysinger)
+
+--- a/Makefile
++++ b/Makefile
+@@ -10,8 +10,8 @@
+ CFLAGS ?= -O2 -g
+ CFLAGS += -Wall
+ PKG_CONFIG ?= pkg-config
+-CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libusb)
+-LDLIBS = $(shell $(PKG_CONFIG) --libs libusb)
++CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libusb-1.0)
++LDLIBS = $(shell $(PKG_CONFIG) --libs libusb-1.0)
+ 
+ all: dltool
+ 
+--- a/dltool.c
++++ b/dltool.c
+@@ -13,9 +13,11 @@
+ #include <stdio.h>
+ #include <getopt.h>
+ #include <fcntl.h>
++#include <errno.h>
++#include <unistd.h>
+ 
+ 
+-#include <usb.h>
++#include <libusb.h>
+ 
+ unsigned int   debug   = 0;
+ unsigned long  dl_addr = 0x30000000L;
+@@ -23,12 +25,22 @@ unsigned long  dl_size = 0L;
+ unsigned char *dl_data = NULL;
+ 
+ char *dl_file = "download.dat";
+-char *dl_udev = NULL;
+-char *dl_ubus = NULL;
++libusb_context *ctx = NULL;
++libusb_device_handle *devh = NULL;
+ 
+ int ep_out = 0;
+ 
+ #define DBG(x) if (debug) { printf x; }
++#define err(fmt, args...) \
++	do { \
++		if (devh) \
++			libusb_close(devh); \
++		if (ctx) \
++			libusb_exit(ctx); \
++		fprintf(stderr, "dltool: " fmt "\n", ## args); \
++		exit(1); \
++	} while (0)
++#define errp(fmt, args...) err(fmt ": %s", ## args, strerror(errno))
+ 
+ void write_u32(unsigned char *dp, unsigned long val)
+ {
+@@ -108,25 +120,30 @@ void calc_cksum(unsigned char *data, ssize_t len)
+ 	cp[1] = cksum >> 8;
+ }
+ 
+-int verify_device(struct usb_device *dev)
++int verify_device(libusb_device *dev)
+ {
++	struct libusb_device_descriptor desc;
++
++	if (libusb_get_device_descriptor(dev, &desc))
++		return 0;
++
+ 	DBG(("dev %p: configurations %d\n",
+-	     dev, dev->descriptor.bNumConfigurations));
++	     dev, desc.bNumConfigurations));
+ 	
+-	if (dev->descriptor.bNumConfigurations != 1)
++	if (desc.bNumConfigurations != 1)
+ 		return 0;
+ 
+-	DBG(("\t=> bLength %d\n", dev->descriptor.bLength));
+-	DBG(("\t=> bType   %d\n", dev->descriptor.bDescriptorType));
+-	DBG(("\t=> bcdUSB  %x\n", dev->descriptor.bcdUSB));
+-	DBG(("\t=> idVendor %x\n", dev->descriptor.idVendor));
+-	DBG(("\t=> idProduct %x\n", dev->descriptor.idProduct));
++	DBG(("\t=> bLength %d\n", desc.bLength));
++	DBG(("\t=> bType   %d\n", desc.bDescriptorType));
++	DBG(("\t=> bcdUSB  %x\n", desc.bcdUSB));
++	DBG(("\t=> idVendor %x\n", desc.idVendor));
++	DBG(("\t=> idProduct %x\n", desc.idProduct));
+ 
+-	if (dev->descriptor.idVendor == 0x5345 && dev->descriptor.idProduct == 0x1234) {
++	if (desc.idVendor == 0x5345 && desc.idProduct == 0x1234) {
+ 		ep_out = 3;
+ 		return 1;
+ 	}
+-	else if(dev->descriptor.idVendor == 0x4e8 && dev->descriptor.idProduct == 0x1234){
++	else if(desc.idVendor == 0x4e8 && desc.idProduct == 0x1234){
+ 		printf("S3C64XX Detected!\n");
+ 		ep_out = 2;
+ 		return 1;
+@@ -173,6 +190,12 @@ struct option long_opts[] =  {
+ 		.val		= 'x',
+ 	},
+ 	{
++		.name		= "help",
++		.has_arg	= 0,
++		.flag		= NULL,
++		.val		= 'h',
++	},
++	{
+ 		.name		= NULL
+ 	}
+ };
+@@ -181,12 +198,14 @@ int flg_show = 0;
+ 
+ int main(int argc, char **argv)
+ {
+-	struct usb_bus *bus, *busp;
+-	struct usb_device *result = NULL;
+-	struct usb_device *found  = NULL;
++	ssize_t num_devs, i;
++	libusb_device **list;
++	libusb_device *found;
++	int dl_ubus = -1;
++	int dl_udev = -1;
++	uint8_t bus_num, dev_num;
+ 	unsigned long fsize;
+-	usb_dev_handle *devh;
+-	int ret;
++	int ret, transferred;
+ 
+ 	printf("SMDK42XX,S3C64XX USB Download Tool\n");
+ 	printf("Version 0.20 (c) 2004,2005,2006"
+@@ -197,7 +216,7 @@ int main(int argc, char **argv)
+ 		int index = 0;
+ 		int c;
+ 
+-		c = getopt_long(argc, argv, "a:b:d:f:s", long_opts, &index);
++		c = getopt_long(argc, argv, "a:b:d:f:shx", long_opts, &index);
+ 
+ 		DBG(("option index %d\n",c ));
+ 
+@@ -218,117 +237,116 @@ int main(int argc, char **argv)
+ 			break;
+ 
+ 		case 'b':
+-			dl_ubus = optarg;
++			dl_ubus = atoi(optarg);
+ 			break;
+ 
+ 		case 'd':
+-			dl_udev = optarg;
++			dl_udev = atoi(optarg);
+ 			break;
+ 
+ 		case 'x':
+ 			debug = 1;
++			break;
++
++		case 'h':
++			puts(
++				"Usage: dltool [options]\n"
++				"\n"
++				"-a <download addr>\n"
++				"-b <bus #>\n"
++				"-d <dev #>\n"
++				"-f <file>\n"
++				"-s               Show found devices\n"
++				"-x               Enable debug\n"
++			);
++			return 0;
+ 		}
+ 	}
+ 	
+-	usb_init();
+-	usb_find_busses();
+-	usb_find_devices();
+-	
+-	bus = usb_get_busses();
+-
+-	DBG(("usb_get_busses: %p\n", bus));
+-       
+-	for (busp = bus; busp != NULL; busp = busp->next) {	  
+-		struct usb_device *dev;
+-
+-		DBG(("bus %p: dirname %s\n", busp, busp->dirname));
+-
+-		if (dl_ubus) {
+-			if (strcmp(busp->dirname, dl_ubus) != 0)
+-				continue;
++	ret = libusb_init(&ctx);
++	if (ret)
++		errp("could not initialize usb stack");
++
++	bus_num = dev_num = 0;
++	found = NULL;
++	num_devs = libusb_get_device_list(ctx, &list);
++	for (i = 0; i < num_devs; ++i) {
++		libusb_device *dev = list[i];
++		bus_num = libusb_get_bus_number(dev);
++		dev_num = libusb_get_device_address(dev);
++
++		DBG(("bus %u; dev %u (%p)\n", bus_num, dev_num, dev));
++
++		if (dl_ubus >= 0 && bus_num != dl_ubus)
++			continue;
++
++		if (!verify_device(dev))
++			continue;
++
++		if (flg_show) {
++			printf("bus %u: device %u\n", bus_num, dev_num);
++			continue;
+ 		}
+ 
+-		for (dev = busp->devices; dev != NULL; dev = dev->next) {
+-			DBG(("dev %p filename %s\n", dev, dev->filename));
++		if (dl_udev >= 0 && dev_num != dl_udev)
++			continue;
+ 
+-			if (!verify_device(dev))
+-				continue;
+-
+-			if (flg_show) {
+-				printf("bus %s: device %s\n", 
+-				       busp->dirname, dev->filename);
+-				continue;
+-			}
+-
+-			found = dev;
+-
+-			if (dl_udev) {
+-				if (strcmp(dev->filename, dl_udev) == 0) {
+-					result = dev;
+-					break;
+-				}
+-			}
+-		}
+-
+-		if (result != NULL)
+-			break;
++		found = dev;
++		break;
+ 	}
+ 
+ 	if (flg_show)
+ 		return 0;
+ 
+-	DBG(("device %p, found %p\n", result, found));
++	DBG(("found %p\n", found));
+ 
+-	if (result == NULL && found != NULL)
+-		result = found;
+-
+-	if (result == NULL) {
+-		fprintf(stderr, "failed to find device\n");
+-		return 1;
+-	}
++	if (found == NULL)
++		err("failed to find device\n");
+ 
+-	printf("=> found device: bus %s, dev %s\n",
+-	       result->bus->dirname, result->filename);
++	printf("=> found device: bus %u, dev %u\n",
++	       bus_num, dev_num);
+ 
+ 	dl_data = load_file(dl_file, &dl_size, &fsize);
+-	if (dl_data == NULL) {
+-		printf("failed to load %s\n", dl_file);
+-		return 1;
+-	}
++	if (dl_data == NULL)
++		errp("failed to load %s", dl_file);
+ 
+ 	printf("=> loaded %ld bytes from %s\n", fsize, dl_file);
+ 
+-	devh = usb_open(result);
+-	if (devh == NULL) {
+-		perror("usb_open");
+-		return 1;
+-	}
++	ret = libusb_open(found, &devh);
++	if (ret == 0) {
++		uint8_t configuration;
++		struct libusb_config_descriptor *config;
++		libusb_get_active_config_descriptor(found, &config);
++		configuration = config->bConfigurationValue;
++		libusb_free_config_descriptor(config);
++		libusb_set_configuration(devh, configuration);
++	} else
++		errp("libusb_open");
+ 
+ 	DBG(("claim interface\n"));
+ 
+-	if (usb_claim_interface(devh, 0) < 0) {
+-		perror("usb_claim_interface");
+-		usb_close(devh);
+-		return 1;
+-	}
++	ret = libusb_claim_interface(devh, 0);
++	if (ret)
++		errp("libusb_claim_interface");
+ 
+ 	printf("=> Downloading %ld bytes to 0x%08lx\n", dl_size, dl_addr);
+ 
+ 	write_header(dl_data, dl_addr, dl_size);
+ 	calc_cksum(dl_data, dl_size);
+ 
+-	//ret = usb_bulk_write(devh, 3, (void *)dl_data, dl_size, 5*1000*1000);
+-	ret = usb_bulk_write(devh, ep_out, (void *)dl_data, dl_size, 5*1000*1000);
++	//ret = libusb_bulk_transfer(devh, 3, dl_data, dl_size, &transferred, 5*1000*1000);
++	ret = libusb_bulk_transfer(devh, ep_out, dl_data, dl_size, &transferred, 5*1000*1000);
+ 	printf("=> usb_bulk_write() returned %d\n", ret);
+ 
+-	if (ret != dl_size) {
+-		printf("failed to write %ld bytes\n", dl_size);
++	if (ret || transferred != dl_size) {
++		printf("failed to write %ld bytes (wrote %d)\n", dl_size, transferred);
+ 	}
+ 
+ 	free(dl_data);
+ 	
+-	usb_release_interface(devh, 0);
+-	usb_close(devh);
++	libusb_release_interface(devh, 0);
++	libusb_close(devh);
++	libusb_exit(ctx);
+ 
+ 	return 0;
+ }
diff --git a/dev-embedded/smdk-dltool/smdk-dltool-0.20.ebuild b/dev-embedded/smdk-dltool/smdk-dltool-0.20-r1.ebuild
similarity index 80%
rename from dev-embedded/smdk-dltool/smdk-dltool-0.20.ebuild
rename to dev-embedded/smdk-dltool/smdk-dltool-0.20-r1.ebuild
index 5580ca9..51b4e50 100644
--- a/dev-embedded/smdk-dltool/smdk-dltool-0.20.ebuild
+++ b/dev-embedded/smdk-dltool/smdk-dltool-0.20-r1.ebuild
@@ -1,6 +1,6 @@
 # Copyright 1999-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/dev-embedded/smdk-dltool/smdk-dltool-0.20.ebuild,v 1.1 2012/01/20 22:44:17 vapier Exp $
+# $Header: /var/cvsroot/gentoo-x86/dev-embedded/smdk-dltool/smdk-dltool-0.20-r1.ebuild,v 1.1 2012/01/30 23:35:37 vapier Exp $
 
 EAPI="4"
 
@@ -13,10 +13,10 @@
 # Email sent to author on 2012-01-18 querying about license
 LICENSE="as-is"
 SLOT="0"
-KEYWORDS="~amd64 ~x86"
+KEYWORDS="amd64 x86"
 IUSE=""
 
-RDEPEND="dev-libs/libusb"
+RDEPEND="virtual/libusb:1"
 DEPEND="${RDEPEND}"
 
 S=${WORKDIR}/releases/smdk-tools-v${PV}/dltool
@@ -24,7 +24,8 @@
 src_prepare() {
 	epatch "${FILESDIR}"/${P}-add-S3C64xx-support.patch
 	epatch "${FILESDIR}"/${P}-build.patch
-	tc-export CC
+	epatch "${FILESDIR}"/${P}-libusb-1.0.patch
+	tc-export CC PKG_CONFIG
 }
 
 src_install() {