FreeCalypso > hg > freecalypso-hwlab
changeset 44:6a2886f9943e
ftee-gen2232h: same change as in ftee-gen2232c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 22 Apr 2019 08:40:26 +0000 |
parents | ea0b5aed9a9c |
children | 1f3a4115375f |
files | fteeprom/ftee-gen2232h.c |
diffstat | 1 files changed, 64 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/fteeprom/ftee-gen2232h.c Mon Apr 22 07:07:39 2019 +0000 +++ b/fteeprom/ftee-gen2232h.c Mon Apr 22 08:40:26 2019 +0000 @@ -4,6 +4,9 @@ #include <strings.h> #include <stdio.h> #include <stdlib.h> +#include <unistd.h> + +char *configfile, *serial; u_short vid = 0x0403, pid = 0x6010; char *manuf, *product; @@ -12,20 +15,60 @@ unsigned maxpower = 100; u_char group0, group1, group2, group3; -u_short eeprom[64]; -unsigned eeprom_string_ptr = 0x0D; +u_short eeprom[128]; +u_char eeprom_chip = 0x46; +unsigned eeprom_size, eeprom_string_ptr; + +process_cmdline(argc, argv) + char **argv; +{ + int c; + extern int optind; -read_config_file(filename) - char *filename; + while ((c = getopt(argc, argv, "bB")) != EOF) { + switch (c) { + case 'b': + eeprom_chip = 0x56; + continue; + case 'B': + eeprom_chip = 0x66; + continue; + default: + /* error msg already printed */ + exit(1); + } + } + if (argc < optind + 1 || argc > optind + 2) { + fprintf(stderr, + "usage: %s [options] config-file [serial-num]\n", + argv[0]); + exit(1); + } + configfile = argv[optind]; + serial = argv[optind+1]; +} + +init_eeprom_size() +{ + if (eeprom_chip == 0x46) { + eeprom_size = 64; + eeprom_string_ptr = 0x0D; + } else { + eeprom_size = 128; + eeprom_string_ptr = 0x4D; + } +} + +read_config_file() { FILE *inf; char linebuf[1024]; int lineno; char *cp, *np; - inf = fopen(filename, "r"); + inf = fopen(configfile, "r"); if (!inf) { - perror(filename); + perror(configfile); exit(1); } for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) { @@ -33,7 +76,7 @@ if (!cp) { fprintf(stderr, "%s line %d: too long or unterminated\n", - filename, lineno); + configfile, lineno); exit(1); } *cp = '\0'; @@ -50,7 +93,7 @@ if (*cp == '\0' || *cp == '#') { fprintf(stderr, "%s line %d: \"%s\" setting without argument\n", - filename, lineno, np); + configfile, lineno, np); exit(1); } if (!strcmp(np, "vid")) @@ -81,17 +124,17 @@ group3 = strtoul(cp, 0, 16); else { fprintf(stderr, "%s line %d: unknown \"%s\" setting\n", - filename, lineno, np); + configfile, lineno, np); exit(1); } } fclose(inf); if (!manuf) { - fprintf(stderr, "error: manuf not set in %s\n", filename); + fprintf(stderr, "error: manuf not set in %s\n", configfile); exit(1); } if (!product) { - fprintf(stderr, "error: product not set in %s\n", filename); + fprintf(stderr, "error: product not set in %s\n", configfile); exit(1); } } @@ -101,7 +144,7 @@ { unsigned longlen, startptr; - if (63 - eeprom_string_ptr < strlen(str) + 1) { + if (eeprom_size - 1 - eeprom_string_ptr < strlen(str) + 1) { fprintf(stderr, "error: strings are too long\n"); exit(1); } @@ -113,8 +156,7 @@ return (longlen << 8) | 0x80 | (startptr << 1); } -fill_eeprom(serial) - char *serial; +fill_eeprom() { u_char byte09; @@ -136,7 +178,7 @@ eeprom[9] = write_string(serial); else eeprom[9] = 0; - eeprom[12] = 0x46; + eeprom[12] = eeprom_chip; } do_checksum() @@ -144,18 +186,18 @@ u_short chksum = 0xAAAA; unsigned n; - for (n = 0; n < 63; n++) { + for (n = 0; n < eeprom_size - 1; n++) { chksum ^= eeprom[n]; chksum = (chksum << 1) | (chksum >> 15); } - eeprom[63] = chksum; + eeprom[n] = chksum; } emit_output() { unsigned n, col; - for (n = 0; n < 64; n++) { + for (n = 0; n < eeprom_size; n++) { col = n & 7; if (col == 0) printf("%02X:", n * 2); @@ -168,13 +210,10 @@ main(argc, argv) char **argv; { - if (argc < 2 || argc > 3) { - fprintf(stderr, "usage: %s config-file [serial-num]\n", - argv[0]); - exit(1); - } - read_config_file(argv[1]); - fill_eeprom(argv[2]); + process_cmdline(argc, argv); + read_config_file(); + init_eeprom_size(); + fill_eeprom(); do_checksum(); emit_output(); exit(0);