FreeCalypso > hg > freecalypso-sw
annotate target-utils/libload/amdflash.c @ 923:10b4bed10192
gsm-fw/L1: fix for the DSP patch corruption bug
The L1 code we got from the LoCosto fw contains a feature for DSP CPU load
measurement. This feature is a LoCosto-ism, i.e., not applicable to earlier
DBB chips (Calypso) with their respective earlier DSP ROMs. Most of the
code dealing with that feature is conditionalized as #if (DSP >= 38),
but one spot was missed, and the MCU code was writing into an API word
dealing with this feature. In TCS211 this DSP API word happens to be
used by the DSP code patch, hence that write was corrupting the patched
DSP code.
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 19 Oct 2015 17:13:56 +0000 (2015-10-19) |
parents | cc1d2413991a |
children |
rev | line source |
---|---|
63
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
1 /* |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
2 * This module implements the AMFB and AMFW commands for programming |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
3 * AMD-style flash memories. Syntax: |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
4 * |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
5 * AMFB <baseaddr> -- sets the base address for subsequent AMFW commands |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
6 * AMFW <offset> <hexstring> -- the actual flash write operation |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
7 * |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
8 * The flash memory is assumed to be 16 bits wide. The hex string |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
9 * argument to the AMFW command is just data, with no header, address, |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
10 * length, checksum or other additions. The number of hex digits in the |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
11 * string must be a multiple of 4, and the byte order is the same as |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
12 * that of TI's *.m0 files: we interpret the string as consisting of |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
13 * 16-bit words rather than bytes. |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
14 * |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
15 * The address to which each flash write is directed is the sum of the |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
16 * base given to AMFB and the offset given to AMFW. The fixed offsets |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
17 * of 0xAAA and 0x554 (0x555 and 0x2AA in words) prescribed for the flash |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
18 * programming command sequence are also made from the base set with AMFB. |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
19 */ |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
20 |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
21 #include <sys/types.h> |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
22 #include "types.h" |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
23 |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
24 static u32 base_addr; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
25 |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
26 void |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
27 cmd_AMFB(argbulk) |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
28 char *argbulk; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
29 { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
30 char *argv[2]; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
31 u_long addr; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
32 |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
33 if (parse_args(argbulk, 1, 1, argv, 0) < 0) |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
34 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
35 if (parse_hexarg(argv[0], 8, &addr) < 0) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
36 printf("ERROR: argument must be a valid 32-bit hex address\n"); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
37 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
38 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
39 if (addr & 1) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
40 printf("ERROR: odd address\n"); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
41 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
42 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
43 base_addr = addr; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
44 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
45 |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
46 void |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
47 cmd_AMFW(argbulk) |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
48 char *argbulk; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
49 { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
50 char *argv[3], *s; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
51 u_long offset; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
52 volatile u16 *flashptr; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
53 u32 datum; /* needs to be u32 for decode_hex_digits() */ |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
54 int i; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
55 |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
56 if (parse_args(argbulk, 2, 2, argv, 0) < 0) |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
57 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
58 if (parse_hexarg(argv[0], 8, &offset) < 0) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
59 printf("ERROR: offset argument must a valid 32-bit hex value\n"); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
60 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
61 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
62 if (offset & 1) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
63 printf("ERROR: odd offset argument\n"); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
64 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
65 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
66 flashptr = (volatile u16 *)(base_addr + offset); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
67 for (s = argv[1]; *s; flashptr++, s += 4) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
68 if (decode_hex_digits(s, 4, &datum) < 0) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
69 printf("ERROR: bad AMFW hex string argument\n"); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
70 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
71 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
72 if (*flashptr != 0xFFFF) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
73 printf("ERROR: flash not blank at %08X\n", |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
74 (u_long) flashptr); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
75 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
76 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
77 *(volatile u16 *)(base_addr + 0xAAA) = 0xAA; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
78 *(volatile u16 *)(base_addr + 0x554) = 0x55; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
79 *(volatile u16 *)(base_addr + 0xAAA) = 0xA0; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
80 *flashptr = datum; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
81 for (i = 10000; i; i--) |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
82 if (*flashptr == datum) |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
83 break; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
84 if (!i) { |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
85 printf("ERROR: flash write timeout at %08X\n", |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
86 (u_long) flashptr); |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
87 return; |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
88 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
89 } |
cc1d2413991a
loadagent: AMD flash write implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
90 } |