# HG changeset patch # User Mychaela Falconia # Date 1583258120 0 # Node ID 761e8b0c65b01c20c98b2b6068679509c7e051b3 # Parent 0da2cf5a999cf8c7dbb7dcb8a6fc68a3849e3f64 loadagent: first step in implementation of binary flash programming diff -r 0da2cf5a999c -r 761e8b0c65b0 target-utils/loadagent/amdflash.c --- a/target-utils/loadagent/amdflash.c Tue Mar 03 06:06:17 2020 +0000 +++ b/target-utils/loadagent/amdflash.c Tue Mar 03 17:55:20 2020 +0000 @@ -88,3 +88,39 @@ } } } + +amdflash_binary_prog(offset, nwords, data) + u32 offset; + unsigned nwords; + u16 *data; +{ + volatile u16 *flashptr; + int i; + + flashptr = (volatile u16 *)(base_addr + offset); + while (nwords) { + if (*flashptr != 0xFFFF) { + serial_out(0x15); /* NAK */ + printf("ERROR: flash not blank at %08X\n", + (u_long) flashptr); + return(-1); + } + *(volatile u16 *)(base_addr + 0xAAA) = 0xAA; + *(volatile u16 *)(base_addr + 0x554) = 0x55; + *(volatile u16 *)(base_addr + 0xAAA) = 0xA0; + *flashptr = *data; + for (i = 10000; i; i--) + if (*flashptr == *data) + break; + if (!i) { + serial_out(0x15); /* NAK */ + printf("ERROR: flash write timeout at %08X\n", + (u_long) flashptr); + return(-1); + } + flashptr++; + data++; + nwords--; + } + return(0); +} diff -r 0da2cf5a999c -r 761e8b0c65b0 target-utils/loadagent/intelflash.c --- a/target-utils/loadagent/intelflash.c Tue Mar 03 06:06:17 2020 +0000 +++ b/target-utils/loadagent/intelflash.c Tue Mar 03 17:55:20 2020 +0000 @@ -80,6 +80,43 @@ } } +intelflash_binary_prog(offset, nwords, data) + u32 offset; + unsigned nwords; + u16 *data; +{ + volatile u16 *flashptr; + u16 stat; + int i; + + flashptr = (volatile u16 *)(base_addr + offset); + while (nwords) { + *flashptr = 0x40; + *flashptr = *data; + for (i = 10000; i; i--) { + stat = *flashptr; + if (stat & 0x80) + break; + } + if (!i) { + serial_out(0x15); /* NAK */ + printf("ERROR: flash write timeout at %08X\n", + (u_long) flashptr); + return(-1); + } + if (stat & 0x10) { + serial_out(0x15); /* NAK */ + printf("ERROR: program operation failed at %08X\n", + (u_long) flashptr); + return(-1); + } + flashptr++; + data++; + nwords--; + } + return(0); +} + void cmd_intel_rewrite_sector(argbulk) char *argbulk;