summaryrefslogtreecommitdiff
path: root/dev-embedded/smdk-dltool
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2018-07-14 21:03:06 +0100
committerV3n3RiX <venerix@redcorelinux.org>2018-07-14 21:03:06 +0100
commit8376ef56580626e9c0f796d5b85b53a0a1c7d5f5 (patch)
tree7681bbd4e8b05407772df40a4bf04cbbc8afc3fa /dev-embedded/smdk-dltool
parent30a9caf154332f12ca60756e1b75d2f0e3e1822d (diff)
gentoo resync : 14.07.2018
Diffstat (limited to 'dev-embedded/smdk-dltool')
-rw-r--r--dev-embedded/smdk-dltool/Manifest8
-rw-r--r--dev-embedded/smdk-dltool/files/smdk-dltool-0.20-add-S3C64xx-support.patch66
-rw-r--r--dev-embedded/smdk-dltool/files/smdk-dltool-0.20-build.patch20
-rw-r--r--dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0-r1.patch359
-rw-r--r--dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0.patch338
-rw-r--r--dev-embedded/smdk-dltool/metadata.xml8
-rw-r--r--dev-embedded/smdk-dltool/smdk-dltool-0.20-r3.ebuild34
-rw-r--r--dev-embedded/smdk-dltool/smdk-dltool-0.20-r4.ebuild34
8 files changed, 867 insertions, 0 deletions
diff --git a/dev-embedded/smdk-dltool/Manifest b/dev-embedded/smdk-dltool/Manifest
new file mode 100644
index 000000000000..469efaadeff0
--- /dev/null
+++ b/dev-embedded/smdk-dltool/Manifest
@@ -0,0 +1,8 @@
+AUX smdk-dltool-0.20-add-S3C64xx-support.patch 2057 BLAKE2B fec0c1684e5b94231fe5eafbbf53f82d0f1a77a21b7a59c0fe56564841e341fbb806ed5aea15aaef41ef2b9fcc9a552b57326058c7ac275d1c37e93e910fa1f8 SHA512 7ae02b298390ab3bbdfe27c3f5cea55c8f2b75f60853227f37adee7a547ef2d1069286a633e2017a79440f257c25d4f26fe1eaad0ef51c04a067af8d1b815d64
+AUX smdk-dltool-0.20-build.patch 430 BLAKE2B 8a4bbe4170780554f7171f0fd5bc548367688240bfebab40f51c4efbad44df7f6b6fe2c1c700e908275fd9f38ee17ab39ba23843a176daf45a407c7e432ac6b6 SHA512 8bd0918ebe2f7f583dd076ed9b4cc01e6d9dc397fe52981e97029727872552d4d01838c1602d170d2c1bb92e9a4759fef7eecc31336bcad22adb2c0e84e5d297
+AUX smdk-dltool-0.20-libusb-1.0-r1.patch 8859 BLAKE2B 333b774375e8ea48e811cd54fe6e6bbfa0c8c5ece0fa2cda806a6d60022b4f791ed06131930e829cab5ca5600bb1948ab8f852542048f9fcb2967e4682c51457 SHA512 7c1a39c7b6da1e2aecd651be6d78ec30383cd9a7858c40477e84bddd2cb80b8138a6cae55e3f6be71bd8aad03ff31dc3250f1579c63c106953fef2fb62e3e3bf
+AUX smdk-dltool-0.20-libusb-1.0.patch 8207 BLAKE2B 499e1abf30b30960cbf998a9c06ca22062b8231938fb1ff87e9877fe4613e94c79c0561a67b885a21a11fb56dc670917f82737ca8597c37f723f5e63df3b9c9a SHA512 2c3f47ac0fbf573b8be17721639123607ec4aaf69e1eef602089d75ef614ba761b6f6d0182cbaa0abc57ef0bd5a2c61120b3369c9c73c29cd466fda3f5a99ab4
+DIST smdk-tools-v0.20.tar.gz 5170 BLAKE2B c414938ff98155dd16f64378a5c3524bb2fd7e21b074cb6e656ffc2aa5b7b8cc8cbe27600472a8ef20570818e253f63f1b1460784200aaf0a4fb321f79b0cfdc SHA512 2b0fd113bc9e6e6c07ad4163d404bffa8044150a2da55a8903192b9dcbead5e31d97a9315b561526f0cb2a65e415f34941bea0db3ac40e73048901fe95ff3a17
+EBUILD smdk-dltool-0.20-r3.ebuild 834 BLAKE2B 1146b2cadeb55606412fa197fc3dd33ef48dbefb0c758c5cbcb17b439790e9354535d6c61307dab6a18bf1b2a087fbee9fb301ae53128d61e618c0938d8b2293 SHA512 e9286ccb956faeceffd459c523442a2dd09f329c4d3514e5d55f57f2256bceb6ff73f0acdc83ebcb54f37855f007a6d8f7c6a92876b269e7e44f6be212013843
+EBUILD smdk-dltool-0.20-r4.ebuild 837 BLAKE2B 244d5dfd17acc0fd6763b25bc1c4e4dc2616ab8e49f094584a0d9b99168e308c9804e5d6d0341d3dfc9b30e07f1cc9543056d2882329a5d6a97f789c00ba6340 SHA512 0b9edf675277de1100212371edbdbf0a2a35cf10ad6801b5d88b52b9d4c22b09c9c07e6e436c31ad188c664adc43e5334df6d9589eb842aa97b08446ddb9ba30
+MISC metadata.xml 247 BLAKE2B e46b8f2d053251af5cb591bb2ee5e35089c4e8174ee2e7a3c504db23f844b65083d4a3e5198da3977ad3e98b67cab2e0de686a3c62009b487c1e64785a8ff65d SHA512 15df289e0f962f564551f61ada3cfef0311f6af639887def780bf5ad3be105515c8d24c950ff340ed35d89b9cd994af3540322b684c5dec3b43ec6bb0041aa4e
diff --git a/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-add-S3C64xx-support.patch b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-add-S3C64xx-support.patch
new file mode 100644
index 000000000000..5b615aeb119b
--- /dev/null
+++ b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-add-S3C64xx-support.patch
@@ -0,0 +1,66 @@
+From ed9e5da97fdb40082aca7acbdce5286b530fb2ba Mon Sep 17 00:00:00 2001
+From: Maurus Cuelenaere <mcuelenaere@gmail.com>
+Date: Mon, 11 Jan 2010 01:55:34 +0100
+Subject: [PATCH] Add S3C64xx support
+
+Author: unknown
+URL: http://dev.odroid.com/frs/download.php/22/Linux-dltool.tar.gz
+---
+ dltool/dltool.c | 19 ++++++++++++++-----
+ 1 files changed, 14 insertions(+), 5 deletions(-)
+
+diff --git a/dltool/dltool.c b/dltool/dltool.c
+index 4e2d238..e76e607 100644
+--- a/dltool/dltool.c
++++ b/dltool/dltool.c
+@@ -26,6 +26,8 @@ char *dl_file = "download.dat";
+ char *dl_udev = NULL;
+ char *dl_ubus = NULL;
+
++int ep_out = 0;
++
+ #define DBG(x) if (debug) { printf x; }
+
+ void write_u32(unsigned char *dp, unsigned long val)
+@@ -120,9 +122,15 @@ int verify_device(struct usb_device *dev)
+ DBG(("\t=> idVendor %x\n", dev->descriptor.idVendor));
+ DBG(("\t=> idProduct %x\n", dev->descriptor.idProduct));
+
+- if (dev->descriptor.idVendor == 0x5345 &&
+- dev->descriptor.idProduct == 0x1234)
++ if (dev->descriptor.idVendor == 0x5345 && dev->descriptor.idProduct == 0x1234) {
++ ep_out = 3;
++ return 1;
++ }
++ else if(dev->descriptor.idVendor == 0x4e8 && dev->descriptor.idProduct == 0x1234){
++ printf("S3C64XX Detected!\n");
++ ep_out = 2;
+ return 1;
++ }
+
+ return 0;
+ }
+@@ -180,9 +188,9 @@ int main(int argc, char **argv)
+ usb_dev_handle *devh;
+ int ret;
+
+- printf("SMDK42XX USB Download Tool\n");
++ printf("SMDK42XX,S3C64XX USB Download Tool\n");
+ printf("Version 0.20 (c) 2004,2005,2006"
+- "Ben Dooks <ben-linux@fluff.org>\n");
++ " Ben Dooks <ben-linux@fluff.org>\n");
+ printf("\n");
+
+ while (1) {
+@@ -309,7 +317,8 @@ int main(int argc, char **argv)
+ 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, 3, (void *)dl_data, dl_size, 5*1000*1000);
++ ret = usb_bulk_write(devh, ep_out, (void *)dl_data, dl_size, 5*1000*1000);
+ printf("=> usb_bulk_write() returned %d\n", ret);
+
+ if (ret != dl_size) {
+--
+1.7.0.4
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
new file mode 100644
index 000000000000..c6e3b767394b
--- /dev/null
+++ b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-build.patch
@@ -0,0 +1,20 @@
+respect env build settings
+
+--- a/releases/smdk-tools-v0.20/dltool/Makefile
++++ b/releases/smdk-tools-v0.20/dltool/Makefile
+@@ -7,8 +7,13 @@
+
+ .PHONY: clean
+
+-dltool: dltool.c
+- $(CC) -O2 -Wall -g -lusb -o smdk-usbdl dltool.c
++CFLAGS ?= -O2 -g
++CFLAGS += -Wall
++PKG_CONFIG ?= pkg-config
++CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libusb)
++LDLIBS = $(shell $(PKG_CONFIG) --libs libusb)
++
++all: dltool
+
+ clean:
+ -rm smdk-usbdl
diff --git a/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0-r1.patch b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0-r1.patch
new file mode 100644
index 000000000000..15afd1380984
--- /dev/null
+++ b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0-r1.patch
@@ -0,0 +1,359 @@
+migrate to libusb-1 by me (Mike Frysinger)
+
+workaround kernel/libusb transfer sizes by Julius Werner
+
+--- 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
+@@ -7,15 +7,25 @@
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
++#include <sys/param.h>
+
+ #include <stdlib.h>
+ #include <string.h>
+ #include <stdio.h>
+ #include <getopt.h>
+ #include <fcntl.h>
++#include <errno.h>
++#include <unistd.h>
+
+
+-#include <usb.h>
++#include <libusb.h>
++
++/* The kernel USB layer is restrictive in the max size in a single URB.
++ * When we exceed that, the kernel throws ENOMEM, but the libusb layer
++ * doesn't handle things gracefully. So manually split up into chunks
++ * ourselves so we can avoid that failure case.
++ */
++#define CHUNKSIZE (1 << 18)
+
+ unsigned int debug = 0;
+ unsigned long dl_addr = 0x30000000L;
+@@ -23,12 +33,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 +128,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 +198,12 @@ struct option long_opts[] = {
+ .val = 'x',
+ },
+ {
++ .name = "help",
++ .has_arg = 0,
++ .flag = NULL,
++ .val = 'h',
++ },
++ {
+ .name = NULL
+ }
+ };
+@@ -181,12 +212,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 +230,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 +251,134 @@ 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");
+
+- for (dev = busp->devices; dev != NULL; dev = dev->next) {
+- DBG(("dev %p filename %s\n", dev, dev->filename));
++ 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);
+
+- if (!verify_device(dev))
+- continue;
++ DBG(("bus %u; dev %u (%p)\n", bus_num, dev_num, dev));
+
+- if (flg_show) {
+- printf("bus %s: device %s\n",
+- busp->dirname, dev->filename);
+- continue;
+- }
++ if (dl_ubus >= 0 && bus_num != dl_ubus)
++ continue;
+
+- found = dev;
++ if (!verify_device(dev))
++ continue;
+
+- if (dl_udev) {
+- if (strcmp(dev->filename, dl_udev) == 0) {
+- result = dev;
+- break;
+- }
+- }
++ if (flg_show) {
++ printf("bus %u: device %u\n", bus_num, dev_num);
++ continue;
+ }
+
+- if (result != NULL)
+- break;
++ if (dl_udev >= 0 && dev_num != dl_udev)
++ continue;
++
++ 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) {
++ /*
++ * Seems to break some recovery modes :(
++ * http://crosbug.com/26083
++ * These fail:
++ * smdk-dltool -a 0x02021400 -f bl1.bin
++ * smdk-dltool -a 0x02023400 -f bl2.bin
++ */
++#if 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);
++#endif
++ } 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);
+- printf("=> usb_bulk_write() returned %d\n", ret);
+-
+- if (ret != dl_size) {
+- printf("failed to write %ld bytes\n", dl_size);
++ transferred = 0;
++ while (transferred < dl_size) {
++ int actual, expected = MIN(dl_size - transferred, CHUNKSIZE);
++ ret = libusb_bulk_transfer(devh, ep_out, dl_data + transferred,
++ expected, &actual, 5 * 1000 * 1000);
++ printf("=> usb_bulk_write(%d) returned %d, wrote %d\n",
++ expected, ret, actual);
++ transferred += actual;
++
++ if (ret || (expected != actual)) {
++ printf("failed to write %ld bytes (wrote %d): %s\n",
++ dl_size, transferred, strerror(errno));
++ ret = 1;
++ break;
++ }
+ }
+
+ free(dl_data);
+
+- usb_release_interface(devh, 0);
+- usb_close(devh);
++ libusb_release_interface(devh, 0);
++ libusb_close(devh);
++ libusb_exit(ctx);
+
+- return 0;
++ return ret;
+ }
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 000000000000..889a439c7fb0
--- /dev/null
+++ b/dev-embedded/smdk-dltool/files/smdk-dltool-0.20-libusb-1.0.patch
@@ -0,0 +1,338 @@
+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 +204,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 +222,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 +243,127 @@ 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) {
++ /*
++ * Seems to break some recovery modes :(
++ * http://crosbug.com/26083
++ * These fail:
++ * smdk-dltool -a 0x02021400 -f bl1.bin
++ * smdk-dltool -a 0x02023400 -f bl2.bin
++ */
++#if 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);
++#endif
++ } 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): %s\n",
++ dl_size, transferred, strerror(errno));
++ ret = 1;
+ }
+
+ free(dl_data);
+
+- usb_release_interface(devh, 0);
+- usb_close(devh);
++ libusb_release_interface(devh, 0);
++ libusb_close(devh);
++ libusb_exit(ctx);
+
+- return 0;
++ return ret;
+ }
diff --git a/dev-embedded/smdk-dltool/metadata.xml b/dev-embedded/smdk-dltool/metadata.xml
new file mode 100644
index 000000000000..71b1461e1146
--- /dev/null
+++ b/dev-embedded/smdk-dltool/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<maintainer type="project">
+ <email>embedded@gentoo.org</email>
+ <name>Embedded Gentoo</name>
+</maintainer>
+</pkgmetadata>
diff --git a/dev-embedded/smdk-dltool/smdk-dltool-0.20-r3.ebuild b/dev-embedded/smdk-dltool/smdk-dltool-0.20-r3.ebuild
new file mode 100644
index 000000000000..d15dedcb728c
--- /dev/null
+++ b/dev-embedded/smdk-dltool/smdk-dltool-0.20-r3.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="4"
+
+inherit toolchain-funcs eutils
+
+DESCRIPTION="Tool to communicate with Samsung SMDK boards"
+HOMEPAGE="http://www.fluff.org/ben/smdk/tools/"
+SRC_URI="http://www.fluff.org/ben/smdk/tools/downloads/smdk-tools-v${PV}.tar.gz"
+
+# Email sent to author on 2012-01-18 querying about license
+LICENSE="all-rights-reserved"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+RESTRICT="mirror bindist"
+
+RDEPEND="virtual/libusb:1"
+DEPEND="${RDEPEND}"
+
+S=${WORKDIR}/releases/smdk-tools-v${PV}/dltool
+
+src_prepare() {
+ epatch "${FILESDIR}"/${P}-add-S3C64xx-support.patch
+ epatch "${FILESDIR}"/${P}-build.patch
+ epatch "${FILESDIR}"/${P}-libusb-1.0.patch
+ tc-export CC PKG_CONFIG
+}
+
+src_install() {
+ newbin dltool smdk-usbdl
+ dodoc readme.txt
+}
diff --git a/dev-embedded/smdk-dltool/smdk-dltool-0.20-r4.ebuild b/dev-embedded/smdk-dltool/smdk-dltool-0.20-r4.ebuild
new file mode 100644
index 000000000000..a0fec4846a4f
--- /dev/null
+++ b/dev-embedded/smdk-dltool/smdk-dltool-0.20-r4.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="4"
+
+inherit toolchain-funcs eutils
+
+DESCRIPTION="Tool to communicate with Samsung SMDK boards"
+HOMEPAGE="http://www.fluff.org/ben/smdk/tools/"
+SRC_URI="http://www.fluff.org/ben/smdk/tools/downloads/smdk-tools-v${PV}.tar.gz"
+
+# Email sent to author on 2012-01-18 querying about license
+LICENSE="all-rights-reserved"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+RESTRICT="mirror bindist"
+
+RDEPEND="virtual/libusb:1"
+DEPEND="${RDEPEND}"
+
+S=${WORKDIR}/releases/smdk-tools-v${PV}/dltool
+
+src_prepare() {
+ epatch "${FILESDIR}"/${P}-add-S3C64xx-support.patch
+ epatch "${FILESDIR}"/${P}-build.patch
+ epatch "${FILESDIR}"/${P}-libusb-1.0-r1.patch
+ tc-export CC PKG_CONFIG
+}
+
+src_install() {
+ newbin dltool smdk-usbdl
+ dodoc readme.txt
+}