# HG changeset patch # User Mychaela Falconia # Date 1591339581 0 # Node ID 44cdfc4fed4cbed95fe5f9c030e193fa5a417a46 # Parent c1f72d807250bdadcbfc1ed9ed36fad4f9f2d662 fc-loadtool: flash prot-reg command implemented diff -r c1f72d807250 -r 44cdfc4fed4c loadtools/flash.h --- a/loadtools/flash.h Sat May 23 03:39:48 2020 +0000 +++ b/loadtools/flash.h Fri Jun 05 06:46:21 2020 +0000 @@ -58,6 +58,7 @@ int (*unlock_sector)(); int (*erase_sector)(); int (*prep_for_program)(); + int (*read_prot_reg)(); char *loadagent_setbase_cmd; char *loadagent_program_cmd; char *loadagent_binmode_cmd; diff -r c1f72d807250 -r 44cdfc4fed4c loadtools/flashops.c --- a/loadtools/flashops.c Sat May 23 03:39:48 2020 +0000 +++ b/loadtools/flashops.c Fri Jun 05 06:46:21 2020 +0000 @@ -90,6 +90,7 @@ .unlock_sector = amd_invalid, .erase_sector = amd_sector_erase, .prep_for_program = noop, + .read_prot_reg = amd_invalid, .loadagent_setbase_cmd = "AMFB", .loadagent_program_cmd = "AMFW", .loadagent_binmode_cmd = "AMFWB", @@ -262,6 +263,25 @@ return(0); } +intel_read_prot_reg(bi, data) + struct flash_bank_info *bi; + uint16_t *data; +{ + int stat, i; + + if (do_w16(bi->base_addr, 0x90)) { + fprintf(stderr, + "unexpected response to w16 for Read ID command\n"); + return(-1); + } + for (i = 0; i < 9; i++) { + stat = do_r16(bi->base_addr + 0x100 + i * 2, data + i); + if (stat) + return(stat); /* error msg already printed */ + } + return(0); +} + struct flash_cmdset flash_cmdset_intel = { .cmdset_name = "Intel", .reset_cmd = intel_reset_cmd, @@ -269,6 +289,7 @@ .unlock_sector = intel_sector_unlock, .erase_sector = intel_sector_erase, .prep_for_program = intel_clear_sr, + .read_prot_reg = intel_read_prot_reg, .loadagent_setbase_cmd = "INFB", .loadagent_program_cmd = "INFW", .loadagent_binmode_cmd = "INFWB", @@ -282,6 +303,7 @@ .unlock_sector = intel_sector_unlock, .erase_sector = intel_sector_erase, .prep_for_program = intel_w30_clear_sr, + .read_prot_reg = intel_read_prot_reg, .loadagent_setbase_cmd = "INFB", .loadagent_program_cmd = "INFW", .loadagent_binmode_cmd = "INFWB", diff -r c1f72d807250 -r 44cdfc4fed4c loadtools/flmain.c --- a/loadtools/flmain.c Sat May 23 03:39:48 2020 +0000 +++ b/loadtools/flmain.c Fri Jun 05 06:46:21 2020 +0000 @@ -98,6 +98,7 @@ extern int flashcmd_progbin_wrap(); extern int flashcmd_program_m0(); extern int flashcmd_program_srec(); +extern int flashcmd_protreg(); extern int flashcmd_quickprog(); extern int flashcmd_reset(); extern int flashcmd_sectors(); @@ -123,6 +124,7 @@ {"program-bin", flashcmd_progbin_wrap}, {"program-m0", flashcmd_program_m0}, {"program-srec", flashcmd_program_srec}, + {"prot-reg", flashcmd_protreg}, {"quickprog", flashcmd_quickprog}, {"reset", flashcmd_reset}, {"sectors", flashcmd_sectors}, diff -r c1f72d807250 -r 44cdfc4fed4c loadtools/flmisc.c --- a/loadtools/flmisc.c Sat May 23 03:39:48 2020 +0000 +++ b/loadtools/flmisc.c Fri Jun 05 06:46:21 2020 +0000 @@ -121,6 +121,31 @@ format); } +flashcmd_protreg(argc, argv, bank) + char **argv; +{ + struct flash_bank_info *bi; + uint16_t data[9]; + int rc; + + if (argc > 2) { + fprintf(stderr, "error: too many arguments\n"); + return(-1); + } + if (flash_detect(bank, 0) < 0) + return(-1); + bi = flash_bank_info + bank; + rc = bi->ops->read_prot_reg(bi, data); + if (rc) + return(rc); + printf("Lock word: %04X\n", data[0]); + printf("Factory words: %04X %04X %04X %04X\n", data[1], data[2], + data[3], data[4]); + printf("User words: %04X %04X %04X %04X\n", data[5], data[6], data[7], + data[8]); + return(0); +} + flashcmd_quickprog(argc, argv, bank) char **argv; {