From: Michael Gernoth <michael@gernoth.net>
Date: Sat, 13 Jul 2013 18:19:48 +0000 (+0200)
Subject: probably working flasher...
X-Git-Tag: v0.100~57
X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/commitdiff_plain/04e76de638c84c3cb88a7178764b700d5097e607?ds=sidebyside

probably working flasher...
---

diff --git a/flash-hmcfgusb.c b/flash-hmcfgusb.c
index 0308442..c7781a0 100644
--- a/flash-hmcfgusb.c
+++ b/flash-hmcfgusb.c
@@ -79,12 +79,14 @@ int main(int argc, char **argv)
 {
 	struct hmcfgusb_dev *dev;
 	struct recv_data rdata;
-	uint8_t out[0x40]; //FIXME!!!
-	uint8_t buf[0x80];
+	uint8_t out[4096];
+	uint8_t buf[4096];
+	uint8_t *outp;
 	int fd;
 	int r;
 	int i;
 	int cnt;
+	int pkt;
 
 	hmcfgusb_set_debug(0);
 
@@ -104,23 +106,56 @@ int main(int argc, char **argv)
 	}
 
 	cnt = 0;
+	pkt = 0;
 	do {
+		int len;
+
 		memset(buf, 0, sizeof(buf));
-		r = read(fd, buf, sizeof(buf));
+		r = read(fd, buf, 4);
 		if (r < 0) {
 			perror("read");
 			exit(EXIT_FAILURE);
 		} else if (r == 0) {
 			break;
+		} else if (r != 4) {
+			printf("can't get length information!\n");
+			exit(EXIT_FAILURE);
 		}
+
+		len = (ascii_to_nibble(buf[0]) & 0xf)<< 4;
+		len |= ascii_to_nibble(buf[1]) & 0xf;
+		len <<= 8;
+		len |= (ascii_to_nibble(buf[2]) & 0xf)<< 4;
+		len |= ascii_to_nibble(buf[3]) & 0xf;
+
+		printf("packet length: %x\n", len);
+
+		r = read(fd, buf, len * 2);
+		if (r < 0) {
+			perror("read");
+			exit(EXIT_FAILURE);
+		} else if (r < len * 2) {
+			printf("short read, aborting (%d < %d)\n", r, len * 2);
+			break;
+		}
+
 		memset(out, 0, sizeof(out));
+		outp = out;
+		*outp++ = 'W';
+		*outp++ = (pkt >> 8) & 0xff;
+		*outp++ = pkt & 0xff;
+		*outp++ = (len >> 8) & 0xff;
+		*outp++ = len & 0xff;
 		for (i = 0; i < r; i+=2) {
-			out[i/2] = (ascii_to_nibble(buf[i]) & 0xf)<< 4;
-			out[i/2] |= ascii_to_nibble(buf[i+1]) & 0xf;
+			*outp = (ascii_to_nibble(buf[i]) & 0xf)<< 4;
+			*outp |= ascii_to_nibble(buf[i+1]) & 0xf;
+			outp++;
 		}
 		cnt += r/2;
 		printf("Flashing %d bytes...\n", cnt);
-		hmcfgusb_send(dev, out, r/2, 1);
+		hexdump(out, outp-out, "F> ");
+		//hmcfgusb_send(dev, out, r/2, 1);
+		pkt++;
 	} while (r > 0);
 
 	hmcfgusb_close(dev);