summaryrefslogtreecommitdiffstats
path: root/utils/hwstub/lib
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-02-04 00:10:41 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2014-02-10 23:14:24 +0100
commitc17d30f20466861a244c603665c580feb7758abf (patch)
treec5044f599f89d89de0b1419bd40e92211f8c8b8a /utils/hwstub/lib
parent6d64111b3c2f772cfc3539bb13851f78d4b55870 (diff)
downloadrockbox-c17d30f20466861a244c603665c580feb7758abf.tar.gz
rockbox-c17d30f20466861a244c603665c580feb7758abf.tar.bz2
rockbox-c17d30f20466861a244c603665c580feb7758abf.zip
utils/hwstub: completely rework the protocol, drop unused features
The protocol has evolved a lot during the 2.x.y lifetime, bringing more features which later got unused. This commit removes all the unused stuff and simplifies everything: - drop the feature mask: everything is mandatory or stalled on error - remove the info request and put all static information in standard USB descriptors which are part of the configuration descriptor (and can be retrieved using the standard GetDescriptor request). - remove the USB interface, we had only one anyway - remove all endpoint descriptors - remove the exit/atexit stuff, it never worked as intended anyway - update the hwstub library and make it able to handle any device - update the tools (mostly renaming and removing of code) Change-Id: I1872bba7f4177fc3891180e8f944aab88f5bde31
Diffstat (limited to 'utils/hwstub/lib')
-rw-r--r--utils/hwstub/lib/hwstub.c121
-rw-r--r--utils/hwstub/lib/hwstub.h23
2 files changed, 35 insertions, 109 deletions
diff --git a/utils/hwstub/lib/hwstub.c b/utils/hwstub/lib/hwstub.c
index 41842fb181..67a797ddfe 100644
--- a/utils/hwstub/lib/hwstub.c
+++ b/utils/hwstub/lib/hwstub.c
@@ -19,69 +19,55 @@
*
****************************************************************************/
#include "hwstub.h"
+#include <string.h>
+#include <stdlib.h>
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
-/* requires then ->handle field only */
-int hwstub_probe(struct hwstub_device_t *dev)
+struct hwstub_device_t
{
+ libusb_device_handle *handle;
+ int intf;
+ int bulk_in;
+ int bulk_out;
+ int int_in;
+};
+
+struct hwstub_device_t *hwstub_open(libusb_device_handle *handle)
+{
+ struct hwstub_device_t *dev = malloc(sizeof(struct hwstub_device_t));
+ memset(dev, 0, sizeof(struct hwstub_device_t));
+ dev->handle = handle;
libusb_device *mydev = libusb_get_device(dev->handle);
int config_id;
libusb_get_configuration(dev->handle, &config_id);
- struct libusb_config_descriptor *config;
- libusb_get_active_config_descriptor(mydev, &config);
-
- const struct libusb_endpoint_descriptor *endp = NULL;
- int intf;
- for(intf = 0; intf < config->bNumInterfaces; intf++)
- {
- if(config->interface[intf].num_altsetting != 1)
- continue;
- const struct libusb_interface_descriptor *interface =
- &config->interface[intf].altsetting[0];
- if(interface->bNumEndpoints != 3 ||
- interface->bInterfaceClass != HWSTUB_CLASS ||
- interface->bInterfaceSubClass != HWSTUB_SUBCLASS ||
- interface->bInterfaceProtocol != HWSTUB_PROTOCOL)
- continue;
- dev->intf = intf;
- dev->bulk_in = dev->bulk_out = dev->int_in = -1;
- for(int ep = 0; ep < interface->bNumEndpoints; ep++)
- {
- endp = &interface->endpoint[ep];
- if((endp->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_INTERRUPT &&
- (endp->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN)
- dev->int_in = endp->bEndpointAddress;
- if((endp->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK &&
- (endp->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN)
- dev->bulk_in = endp->bEndpointAddress;
- if((endp->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK &&
- (endp->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT)
- dev->bulk_out = endp->bEndpointAddress;
- }
- if(dev->bulk_in == -1 || dev->bulk_out == -1 || dev->int_in == -1)
- continue;
- break;
- }
- if(intf == config->bNumInterfaces)
- return 1;
+ struct libusb_device_descriptor dev_desc;
+ libusb_get_device_descriptor(mydev, &dev_desc);
+ if(dev_desc.bDeviceClass != HWSTUB_CLASS ||
+ dev_desc.bDeviceSubClass != HWSTUB_SUBCLASS ||
+ dev_desc.bDeviceProtocol != HWSTUB_PROTOCOL)
+ goto Lerr;
+ return dev;
- return libusb_claim_interface(dev->handle, intf);
+Lerr:
+ free(dev);
+ return NULL;
}
int hwstub_release(struct hwstub_device_t *dev)
{
- return libusb_release_interface(dev->handle, dev->intf);
+ free(dev);
+ return 0;
}
-int hwstub_get_info(struct hwstub_device_t *dev, uint16_t idx, void *info, size_t sz)
+int hwstub_get_desc(struct hwstub_device_t *dev, uint16_t desc, void *info, size_t sz)
{
return libusb_control_transfer(dev->handle,
- LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
- HWSTUB_GET_INFO, 0, idx, info, sz, 1000);
+ LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
+ LIBUSB_REQUEST_GET_DESCRIPTOR, desc << 8, 0, info, sz, 1000);
}
int hwstub_get_log(struct hwstub_device_t *dev, void *buf, size_t sz)
@@ -126,50 +112,3 @@ int hwstub_jump(struct hwstub_device_t *dev, uint32_t addr)
LIBUSB_ENDPOINT_OUT, HWSTUB_JUMP, addr & 0xffff, addr >> 16, NULL, 0,
1000);
}
-
-const char *hwstub_get_product_string(struct usb_resp_info_stmp_t *stmp)
-{
- switch(stmp->chipid)
- {
- case 0x3700: return "STMP 3700";
- case 0x37b0: return "STMP 3770";
- case 0x3780: return "STMP 3780 / i.MX233";
- default: return "unknown";
- }
-}
-
-const char *hwstub_get_rev_string(struct usb_resp_info_stmp_t *stmp)
-{
- switch(stmp->chipid)
- {
- case 0x37b0:
- case 0x3780:
- switch(stmp->rev)
- {
- case 0: return "TA1";
- case 1: return "TA2";
- case 2: return "TA3";
- case 3: return "TA4";
- default: return "unknown";
- }
- break;
- default:
- return "unknown";
- }
-}
-
-int hwstub_atexit(struct hwstub_device_t *dev, int method)
-{
- return libusb_control_transfer(dev->handle,
- LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_DEVICE |
- LIBUSB_ENDPOINT_OUT, HWSTUB_ATEXIT, 0, method, NULL, 0,
- 1000);
-}
-
-int hwstub_exit(struct hwstub_device_t *dev)
-{
- return libusb_control_transfer(dev->handle,
- LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_DEVICE |
- LIBUSB_ENDPOINT_OUT, HWSTUB_EXIT, 0, 0, NULL, 0,
- 1000);
-}
diff --git a/utils/hwstub/lib/hwstub.h b/utils/hwstub/lib/hwstub.h
index f89bce5de9..69fdc63988 100644
--- a/utils/hwstub/lib/hwstub.h
+++ b/utils/hwstub/lib/hwstub.h
@@ -34,22 +34,15 @@ extern "C" {
*
*/
-struct hwstub_device_t
-{
- libusb_device_handle *handle;
- int intf;
- int bulk_in;
- int bulk_out;
- int int_in;
-};
+struct hwstub_device_t;
-/* Requires then ->handle field only. Returns 0 on success */
-int hwstub_probe(struct hwstub_device_t *dev);
-/* Returns 0 on success */
+/* Returns NULL on error */
+struct hwstub_device_t *hwstub_open(libusb_device_handle *handle);
+/* Returns 0 on success. Does *NOT* close the usb handle */
int hwstub_release(struct hwstub_device_t *dev);
/* Returns number of bytes filled */
-int hwstub_get_info(struct hwstub_device_t *dev, uint16_t idx, void *info, size_t sz);
+int hwstub_get_desc(struct hwstub_device_t *dev, uint16_t desc, void *info, size_t sz);
/* Returns number of bytes filled */
int hwstub_get_log(struct hwstub_device_t *dev, void *buf, size_t sz);
/* Returns number of bytes written/read or <0 on error */
@@ -57,12 +50,6 @@ int hwstub_rw_mem(struct hwstub_device_t *dev, int read, uint32_t addr, void *bu
/* Returns <0 on error */
int hwstub_call(struct hwstub_device_t *dev, uint32_t addr);
int hwstub_jump(struct hwstub_device_t *dev, uint32_t addr);
-/* Returns <0 on error */
-int hwstub_atexit(struct hwstub_device_t *dev, int action);
-int hwstub_exit(struct hwstub_device_t *dev);
-
-const char *hwstub_get_product_string(struct usb_resp_info_stmp_t *stmp);
-const char *hwstub_get_rev_string(struct usb_resp_info_stmp_t *stmp);
#ifdef __cplusplus
} // extern "C"