#include <errno.h>
#include <libusb.h>
+#include "endian.h"
+
static libusb_device_handle *dev;
unsigned int seq;
} status_code;
#define LOG(...) printf(__VA_ARGS__)
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+static inline uint32_t fn_le32(uint32_t d)
+{
+ return (d<<24) | ((d<<8)&0xFF0000) | ((d>>8)&0xFF00) | (d>>24);
+}
+#else
#define fn_le32(x) (x)
-// TODO: support architectures that aren't little-endian
+#endif
static void dump_bl_cmd(bootloader_command cmd) {
int i;
res = libusb_bulk_transfer(dev, 0x81, reply.dump, 512, &transferred, 0);
if (res != 0 || transferred != sizeof(status_code)) {
- LOG("Error reading reply: %d\ttransferred: %d (expected %lu)\n", res, transferred, sizeof(status_code));
+ LOG("Error reading reply: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(status_code));
return res;
}
if (fn_le32(reply.buffer.magic) != 0x0a6fe000) {
int main(int argc, char** argv) {
char default_filename[] = "firmware.bin";
char* filename = default_filename;
+ int res = 0;
if (argc == 2) {
filename = argv[1];
dev = libusb_open_device_with_vid_pid(NULL, 0x045e, 0x02ad);
if (dev == NULL) {
fprintf(stderr, "Couldn't open device.\n");
- return 1;
+ res = -ENODEV;
+ goto fail_libusb_open;
}
libusb_set_configuration(dev, 1);
LOG("About to send: ");
dump_bl_cmd(cmd);
- int res;
int transferred;
res = libusb_bulk_transfer(dev, 1, (unsigned char*)&cmd, sizeof(cmd), &transferred, 0);
if (res != 0 || transferred != sizeof(cmd)) {
- LOG("Error: res: %d\ttransferred: %d (expected %lu)\n", res, transferred, sizeof(cmd));
+ LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd));
goto cleanup;
}
res = get_first_reply(); // This first one doesn't have the usual magic bytes at the beginning, and is 96 bytes long - much longer than the usual 12-byte replies.
// Send it off!
res = libusb_bulk_transfer(dev, 1, (unsigned char*)&cmd, sizeof(cmd), &transferred, 0);
if (res != 0 || transferred != sizeof(cmd)) {
- LOG("Error: res: %d\ttransferred: %d (expected %lu)\n", res, transferred, sizeof(cmd));
+ LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd));
goto cleanup;
}
int bytes_sent = 0;
dump_bl_cmd(cmd);
res = libusb_bulk_transfer(dev, 1, (unsigned char*)&cmd, sizeof(cmd), &transferred, 0);
if (res != 0 || transferred != sizeof(cmd)) {
- LOG("Error: res: %d\ttransferred: %d (expected %lu)\n", res, transferred, sizeof(cmd));
+ LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd));
goto cleanup;
}
res = get_reply();
cleanup:
libusb_close(dev);
+fail_libusb_open:
libusb_exit(NULL);
- return 0;
+ fclose(fw);
+ return res;
}