From f45467233ef95024e634f008e5d93adf092e842f Mon Sep 17 00:00:00 2001
From: Antonio Ospite <ao2@ao2.it>
Date: Tue, 5 Jan 2016 23:11:53 +0100
Subject: [PATCH 1/1] kinect_upload_fw: factor out an upload_firmware function

---
 kinect_upload_fw/kinect_upload_fw.c | 99 ++++++++++++++++++++-----------------
 1 file changed, 54 insertions(+), 45 deletions(-)

diff --git a/kinect_upload_fw/kinect_upload_fw.c b/kinect_upload_fw/kinect_upload_fw.c
index 8092422..d6522ff 100644
--- a/kinect_upload_fw/kinect_upload_fw.c
+++ b/kinect_upload_fw/kinect_upload_fw.c
@@ -137,44 +137,8 @@ static int get_reply(void) {
 	return res;
 }
 
-int main(int argc, char** argv) {
-	char default_filename[] = "firmware.bin";
-	char* filename = default_filename;
-	int res = 0;
-
-	if (argc == 2) {
-		filename = argv[1];
-	}
-
-	FILE* fw = fopen(filename, "rb");
-	if (fw == NULL) {
-		fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno));
-		return errno;
-	}
-
-	libusb_init(NULL);
-	libusb_set_debug(NULL, 3);
-
-	dev = libusb_open_device_with_vid_pid(NULL, KINECT_AUDIO_VID, KINECT_AUDIO_PID);
-	if (dev == NULL) {
-		fprintf(stderr, "Couldn't open device.\n");
-		res = -ENODEV;
-		goto fail_libusb_open;
-	}
-
-	int current_configuration = -1;
-	libusb_get_configuration(dev, &current_configuration);
-	if (current_configuration != KINECT_AUDIO_CONFIGURATION)
-		libusb_set_configuration(dev, KINECT_AUDIO_CONFIGURATION);
-
-	libusb_claim_interface(dev, KINECT_AUDIO_INTERFACE);
-
-	current_configuration = -1;
-	libusb_get_configuration(dev, &current_configuration);
-	if (current_configuration != KINECT_AUDIO_CONFIGURATION) {
-		res = -ENODEV;
-		goto cleanup;
-	}
+static int upload_firmware(FILE *fw) {
+	int res;
 
 	seq = 1;
 
@@ -194,18 +158,18 @@ int main(int argc, char** argv) {
 	res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, (unsigned char*)&cmd, sizeof(cmd), &transferred, 0);
 	if (res != 0 || transferred != sizeof(cmd)) {
 		LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd));
-		goto cleanup;
+		goto out;
 	}
 	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.
 	if (res < 0) {
 		LOG("get_first_reply() failed");
-		goto cleanup;
+		goto out;
 	}
 
 	res = get_reply(); // I'm not sure why we do this twice here, but maybe it'll make sense later.
 	if (res < 0) {
 		LOG("First get_reply() failed");
-		goto cleanup;
+		goto out;
 	}
 	seq++;
 
@@ -233,7 +197,7 @@ int main(int argc, char** argv) {
 		res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, (unsigned char*)&cmd, sizeof(cmd), &transferred, 0);
 		if (res != 0 || transferred != sizeof(cmd)) {
 			LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd));
-			goto cleanup;
+			goto out;
 		}
 		int bytes_sent = 0;
 		while (bytes_sent < read) {
@@ -242,14 +206,14 @@ int main(int argc, char** argv) {
 			res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, &page[bytes_sent], to_send, &transferred, 0);
 			if (res != 0 || transferred != to_send) {
 				LOG("Error: res: %d\ttransferred: %d (expected %d)\n", res, transferred, to_send);
-				goto cleanup;
+				goto out;
 			}
 			bytes_sent += to_send;
 		}
 		res = get_reply();
 		if (res < 0) {
 			LOG("get_reply failed");
-			goto cleanup;
+			goto out;
 		}
 
 		addr += (uint32_t)read;
@@ -265,10 +229,55 @@ int main(int argc, char** argv) {
 	res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, (unsigned char*)&cmd, sizeof(cmd), &transferred, 0);
 	if (res != 0 || transferred != sizeof(cmd)) {
 		LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd));
-		goto cleanup;
+		goto out;
 	}
 	res = get_reply();
 	seq++;
+
+out:
+	return res;
+}
+
+int main(int argc, char** argv) {
+	char default_filename[] = "firmware.bin";
+	char* filename = default_filename;
+	int res = 0;
+
+	if (argc == 2) {
+		filename = argv[1];
+	}
+
+	FILE* fw = fopen(filename, "rb");
+	if (fw == NULL) {
+		fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno));
+		return errno;
+	}
+
+	libusb_init(NULL);
+	libusb_set_debug(NULL, 3);
+
+	dev = libusb_open_device_with_vid_pid(NULL, KINECT_AUDIO_VID, KINECT_AUDIO_PID);
+	if (dev == NULL) {
+		fprintf(stderr, "Couldn't open device.\n");
+		res = -ENODEV;
+		goto fail_libusb_open;
+	}
+
+	int current_configuration = -1;
+	libusb_get_configuration(dev, &current_configuration);
+	if (current_configuration != KINECT_AUDIO_CONFIGURATION)
+		libusb_set_configuration(dev, KINECT_AUDIO_CONFIGURATION);
+
+	libusb_claim_interface(dev, KINECT_AUDIO_INTERFACE);
+
+	current_configuration = -1;
+	libusb_get_configuration(dev, &current_configuration);
+	if (current_configuration != KINECT_AUDIO_CONFIGURATION) {
+		res = -ENODEV;
+		goto cleanup;
+	}
+
+	res = upload_firmware(fw);
 	// Now the device reenumerates.
 
 cleanup:
-- 
2.1.4