diff options
Diffstat (limited to 'dev-embedded/smdk-dltool')
8 files changed, 869 insertions, 0 deletions
diff --git a/dev-embedded/smdk-dltool/Manifest b/dev-embedded/smdk-dltool/Manifest new file mode 100644 index 000000000000..f66c88ad49ab --- /dev/null +++ b/dev-embedded/smdk-dltool/Manifest @@ -0,0 +1,10 @@ +AUX smdk-dltool-0.20-add-S3C64xx-support.patch 2057 SHA256 46515ec624570fc9d04d136fb7fc8a4a53cbbdadade7a3c9695e6458aeda2e83 SHA512 7ae02b298390ab3bbdfe27c3f5cea55c8f2b75f60853227f37adee7a547ef2d1069286a633e2017a79440f257c25d4f26fe1eaad0ef51c04a067af8d1b815d64 WHIRLPOOL 1e0da727e9360d385d0cacd803f9262e43099571c5fb5a3b77f3a2f384468135ef35e6fdc72dcae76889f647c6131fe7a6787d68b882bd431a73b8f2fe6e8f27 +AUX smdk-dltool-0.20-build.patch 430 SHA256 81e2059d8d6cf5a46b22c2691e122636756f3ef7bb2fb09e7ba23616643190b5 SHA512 8bd0918ebe2f7f583dd076ed9b4cc01e6d9dc397fe52981e97029727872552d4d01838c1602d170d2c1bb92e9a4759fef7eecc31336bcad22adb2c0e84e5d297 WHIRLPOOL 0c5f59170717f0d0501f1af4c3851fc1e713e62dee5c847d6c6d4948e25e25be32e6bfaf989e51469ad6c8ce281f42e45dd9cf9b46f52d60028a45a0c9cff855 +AUX smdk-dltool-0.20-libusb-1.0-r1.patch 8859 SHA256 7f5f9a30f6467813d8179ed166a9097fed5f84c65b34673a56f3fa9b4468c69a SHA512 7c1a39c7b6da1e2aecd651be6d78ec30383cd9a7858c40477e84bddd2cb80b8138a6cae55e3f6be71bd8aad03ff31dc3250f1579c63c106953fef2fb62e3e3bf WHIRLPOOL ea13b6b1b5ddf542c67fcaa2166147f9f6d14e7cf11ac1477b111acfd73095614baf789e7594e11a0107a0b667169cab36e243a7ce196c4e605c958213e720dc +AUX smdk-dltool-0.20-libusb-1.0.patch 8207 SHA256 ad6f6c8719a6cc840ef8ca4c39782bca74cb777d4383e9c1bbdc88211b9a604c SHA512 2c3f47ac0fbf573b8be17721639123607ec4aaf69e1eef602089d75ef614ba761b6f6d0182cbaa0abc57ef0bd5a2c61120b3369c9c73c29cd466fda3f5a99ab4 WHIRLPOOL 34757c6beedb4af6f8f3fd4f2cc5600488f4b855c36388b2ba4629a5f71f8e278851e32ea6017ebc09b54e357a9185eaeff1b38fb7c1df61df8b38475f9c8ea9 +DIST smdk-tools-v0.20.tar.gz 5170 SHA256 fdda1a8ddb8b71a7a74e8efc85bd08ba8cb953a61eb610b846cf291436426e48 SHA512 2b0fd113bc9e6e6c07ad4163d404bffa8044150a2da55a8903192b9dcbead5e31d97a9315b561526f0cb2a65e415f34941bea0db3ac40e73048901fe95ff3a17 WHIRLPOOL d5feafc17e497a955135fa2c9a3e7857a8779c81ba124879a6aa57b495c9ac25452d1b63106abb4120daef0b8c131734da91c94f0400f03eb41688aa7825daba +EBUILD smdk-dltool-0.20-r3.ebuild 834 SHA256 772c7c8f19ccedd3e58a29864071f0f58682b443524a68e2d13952679c431a1c SHA512 e9286ccb956faeceffd459c523442a2dd09f329c4d3514e5d55f57f2256bceb6ff73f0acdc83ebcb54f37855f007a6d8f7c6a92876b269e7e44f6be212013843 WHIRLPOOL 07ff1ef1c96086b15a8b05bcffa537499a0c4f98b026c31a0d15d2e0b9aecc9b689a203fb4ee1ab68e9575c5dcb2d7ecbf33d9f492593ff77000e49d0ccbf3cd +EBUILD smdk-dltool-0.20-r4.ebuild 837 SHA256 1a286836fac97b07333ecf008987d7d38dbf4213078584294c6dcc2ebab4f927 SHA512 0b9edf675277de1100212371edbdbf0a2a35cf10ad6801b5d88b52b9d4c22b09c9c07e6e436c31ad188c664adc43e5334df6d9589eb842aa97b08446ddb9ba30 WHIRLPOOL 0baa5d7fa2b94d6236e4a05f4958ec4e07d4e237e8396ba05565760ce6d7eab76316a0ccc06fc3cf3b8b962d97f605f9b4479f6cf12ed93ef382adc5e54ee2f4 +MISC ChangeLog 2694 SHA256 5891cb7c7c5c4e447ba08348da7e1d2cdb633190702772794ef7bbd1f7af8459 SHA512 c9844df42f6e475d89c72f6d4043b45ce7f9fcecf6eb3e2bd117d7b8e36d02a72ce40def96725dc245125d61e4c78ad5b4a50bec075dd83bada4612c8fc496bf WHIRLPOOL bb2d70e47f2ce72c8576da67731d24e5f1f19707dae0081b4da047b798041c89018a6f3b756fd7813c33d4ea68a4f76b7837f75da88e9469674f80e4fdf8daff +MISC ChangeLog-2015 1846 SHA256 242a4a41ecefd62a4c6706dac29b103527d842de1eaa622eb3e6b6593d622dd7 SHA512 9dde877aaf6f97efc8d81f23e4afc6fb8f09217291c2cfb066d77dce63f9eafe7b48763208453385db3e29e36ab2cc0a10e6c2d0ea28e1672c25e420df1929cb WHIRLPOOL 32f0bf1a5a2cfe1728ca026dc665acbbf447c87a67b15f930065a9a0e01b1fe7a56a237ac1c8a6b95cada2565ec4aa82cb727eefdd115d53968d26653fb2b4d2 +MISC metadata.xml 247 SHA256 751aa1f012df292bed9716a5c6a7e64114b695d2ba0c0572fc7e87fc3bbcebc5 SHA512 15df289e0f962f564551f61ada3cfef0311f6af639887def780bf5ad3be105515c8d24c950ff340ed35d89b9cd994af3540322b684c5dec3b43ec6bb0041aa4e WHIRLPOOL b6c074cf39f6ec1e2d085151836db47f9a4d71bcc9cc3296889bfa10172c7f07837ca79c8613f9c483b1332683e78eebe88e0a433a7caf801fc7ccac2552cd53 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 +} |