FreeCalypso > hg > fc-usbser-tools
diff duart28/eeprom_rd.c @ 29:a7393d00996a
fc-duart28-conf: implement check-eeprom
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 09 Sep 2023 19:13:35 +0000 |
parents | |
children | 8de3891460db |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/duart28/eeprom_rd.c Sat Sep 09 19:13:35 2023 +0000 @@ -0,0 +1,142 @@ +/* + * This module implements the steps of reading and validating the starting + * EEPROM content. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <usb.h> +#include "../libftmini/eeprom_func.h" + +u_short eeprom[64]; + +void +read_eeprom(usbh) + usb_dev_handle *usbh; +{ + unsigned n; + + for (n = 0; n < 64; n++) + eeprom[n] = ftmini_read_eeprom_loc(usbh, n); +} + +static void +verify_nonblank() +{ + unsigned n; + + for (n = 0; n < 64; n++) { + if (eeprom[n] != 0xFFFF) + return; + } + fprintf(stderr, "error: EEPROM is blank (erased?)\n"); + exit(1); +} + +static void +verify_eeprom_chksum() +{ + u_short chksum = 0xAAAA; + unsigned n; + + for (n = 0; n < 64; n++) { + chksum ^= eeprom[n]; + chksum = (chksum << 1) | (chksum >> 15); + } + if (chksum == 0) + return; + fprintf(stderr, "error: EEPROM checksum is wrong\n"); + exit(1); +} + +static int +check_req_match() +{ + if (eeprom[0] != 0x0808) + return 0; + if (eeprom[1] != 0x0403) + return 0; + if (eeprom[2] != 0x6010 && eeprom[2] != 0x7152) + return 0; + if (eeprom[3] != 0x0500) + return 0; + if (eeprom[4] != 0x3280) + return 0; + if (eeprom[5] != 0x0000 && eeprom[5] != 0x0008) + return 0; + if (eeprom[6] != 0x0200) + return 0; + if (eeprom[7] != 0x1896) + return 0; + if (eeprom[8] != 0x12AE) + return 0; + if (eeprom[10] != 0x0046) + return 0; + if (eeprom[11] != 0x0318) + return 0; + if (eeprom[12] != 'F') + return 0; + if (eeprom[13] != 'r') + return 0; + if (eeprom[14] != 'e') + return 0; + if (eeprom[15] != 'e') + return 0; + if (eeprom[16] != 'C') + return 0; + if (eeprom[17] != 'a') + return 0; + if (eeprom[18] != 'l') + return 0; + if (eeprom[19] != 'y') + return 0; + if (eeprom[20] != 'p') + return 0; + if (eeprom[21] != 's') + return 0; + if (eeprom[22] != 'o') + return 0; + if (eeprom[23] != 0x0312) + return 0; + if (eeprom[24] != 'D') + return 0; + if (eeprom[25] != 'U') + return 0; + if (eeprom[26] != 'A') + return 0; + if (eeprom[27] != 'R') + return 0; + if (eeprom[28] != 'T') + return 0; + if (eeprom[29] != '2') + return 0; + if (eeprom[30] != '8') + return 0; + if (eeprom[31] != 'C' && eeprom[31] != 'S') + return 0; + return 1; +} + +analyze_eeprom() +{ + verify_nonblank(); + verify_eeprom_chksum(); + if (!check_req_match()) { + fprintf(stderr, + "error: EEPROM content does not match FC DUART28\n"); + exit(1); + } + if (eeprom[2] == 0x7152 && eeprom[31] == 'C') { + printf("EEPROM is programmed for DUART28C\n"); + return 'C'; + } + if (eeprom[2] == 0x6010 && eeprom[31] == 'S') { + printf("EEPROM is programmed for DUART28S\n"); + return 'C'; + } + printf("EEPROM is inconsistent between C and S configs!\n"); + return '?'; +}