diff duart28/eeprom_wr.c @ 31:530ec3792de8

fc-duart28-conf: implement set command
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 09 Sep 2023 19:40:58 +0000
parents duart28/eeprom_rd.c@8de3891460db
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/duart28/eeprom_wr.c	Sat Sep 09 19:40:58 2023 +0000
@@ -0,0 +1,49 @@
+/*
+ * This module implements the final step of modifying the EEPROM
+ * for the desired configuration.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <usb.h>
+#include "../libftmini/eeprom_func.h"
+
+extern u_short eeprom[64];
+
+static void
+recompute_checksum()
+{
+	u_short chksum = 0xAAAA;
+	unsigned n;
+
+	for (n = 0; n < 63; n++) {
+		chksum ^= eeprom[n];
+		chksum = (chksum << 1) | (chksum >> 15);
+	}
+	eeprom[63] = chksum;
+}
+
+void
+update_eeprom(usbh, newconf)
+	usb_dev_handle *usbh;
+{
+	switch (newconf) {
+	case 'C':
+		eeprom[2] = 0x7152;
+		break;
+	case 'S':
+		eeprom[2] = 0x6010;
+		break;
+	default:
+		fprintf(stderr, "BUG: wrong argument to update_eeprom()\n");
+		abort();
+	}
+	eeprom[31] = newconf;
+	recompute_checksum();
+	ftmini_write_eeprom_loc(usbh, 2, eeprom[2]);
+	ftmini_write_eeprom_loc(usbh, 31, eeprom[31]);
+	ftmini_write_eeprom_loc(usbh, 63, eeprom[63]);
+}