FreeCalypso > hg > freecalypso-tools
annotate loadtools/flamdsec.c @ 1012:11391cb6bdc0
patch from fixeria: doc change from SE K2x0 to K2xx
Since their discovery in late 2022, Sony Ericsson K200 and K220 phones
were collectively referred to as SE K2x0 in FreeCalypso documentation.
However, now that SE K205 has been discovered as yet another member
of the same family (same PCBA in different case), it makes more sense
to refer to the whole family as SE K2xx.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 23 Sep 2024 12:23:20 +0000 |
parents | ad3041e19884 |
children |
rev | line source |
---|---|
977
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
2 * This module is a place to implement commands and functions for |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
3 * sector write-protection (locking and unlocking, checking current |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
4 * lock state) on AMD-style flash chips. |
977
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 */ |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/types.h> |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdint.h> |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdlib.h> |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
11 #include <string.h> |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
12 #include <strings.h> |
994
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
13 #include <time.h> |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
14 #include <unistd.h> |
977
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include "flash.h" |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 extern struct flash_bank_info flash_bank_info[2]; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
19 /* |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
20 * Some common functions for Spansion PL-N flash: common between |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
21 * flash lock-state retrieval and active PPB programming. |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
22 */ |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
23 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
24 static |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
25 pln_special_mode_entry(base_addr, mode_opc) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
26 uint32_t base_addr; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
27 uint16_t mode_opc; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
28 { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
29 if (do_w16(base_addr + 0xAAA, 0xAA)) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
30 bad_w16: fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
31 "unexpected response to w16 in PL-N special mode entry sequence - aborting\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
32 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
33 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
34 if (do_w16(base_addr + 0x554, 0x55)) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
35 goto bad_w16; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
36 if (do_w16(base_addr + 0xAAA, mode_opc)) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
37 goto bad_w16; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
38 return(0); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
39 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
40 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
41 static |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
42 pln_special_mode_exit(base_addr) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
43 uint32_t base_addr; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
44 { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
45 if (do_w16(base_addr, 0x90)) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
46 bad_w16: fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
47 "unexpected response to w16 in PL-N special mode exit sequence - aborting\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
48 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
49 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
50 if (do_w16(base_addr, 0x00)) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
51 goto bad_w16; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
52 return(0); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
53 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
54 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
55 /* |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
56 * flash lock-state implementation with its helper functions. |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
57 */ |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
58 |
977
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 static |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 issue_read_id(base_addr) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 uint32_t base_addr; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 if (do_w16(base_addr + 0xAAA, 0xAA)) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 bad_w16: fprintf(stderr, |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 "unexpected response to w16 in read ID cmd sequence - aborting\n"); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 if (do_w16(base_addr + 0x554, 0x55)) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 goto bad_w16; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 if (do_w16(base_addr + 0xAAA, 0x90)) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 goto bad_w16; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 return(0); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 static |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 issue_reset_cmd(base_addr) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 uint32_t base_addr; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 if (do_w16(base_addr + 0xAAA, 0xF0)) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 fprintf(stderr, |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 "unexpected response to w16 when resetting flash to read mode!\n"); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 return(0); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 static |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 read_mode_lock_word(base_addr, word_offset, retp) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 uint32_t base_addr, word_offset; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 uint16_t *retp; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 if (do_w16(base_addr + 0xAAA, 0xAA)) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 bad_w16: fprintf(stderr, |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 "unexpected response to w16 in mode lock query sequence - aborting\n"); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 if (do_w16(base_addr + 0x554, 0x55)) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 goto bad_w16; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 if (do_w16(base_addr + 0xAAA, 0x60)) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 goto bad_w16; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 if (do_w16(base_addr + word_offset, 0x48)) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 goto bad_w16; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 if (do_r16(base_addr + word_offset, retp) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 return(0); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 flashcmd_lock_state(argc, argv, bank) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 char **argv; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 struct flash_bank_info *bi; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 struct amd_lock_info *li; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 struct lock_group_desc *grp; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 uint32_t offset, part_addr; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 uint16_t word; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 unsigned ng, nb; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 if (argc > 2) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 fprintf(stderr, "error: too many arguments\n"); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 if (flash_detect(bank, 0) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 bi = flash_bank_info + bank; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 li = bi->amd_lock; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 if (!li) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 fprintf(stderr, |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 "Operation not supported for this flash chip type\n"); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 offset = 0; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 for (ng = 0; ng < li->ngroups; ng++) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 grp = li->groups + ng; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 if (grp->part_begin) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 part_addr = bi->base_addr + offset; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 if (issue_read_id(part_addr) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 if (offset == 0 && li->have_status_word_3) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 if (do_r16(bi->base_addr + 6, &word) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 printf("Global status word 3: %04X\n", word); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 if (offset == 0 && li->have_status_word_7) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 if (do_r16(bi->base_addr + 0xE, &word) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 printf("Global status word 7: %04X\n", word); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 for (nb = 0; nb < grp->nblocks; nb++) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 if (do_r16(bi->base_addr + offset + 4, &word) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 printf("Sector%s at 0x%X: %s\n", |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 grp->is_group ? " group" : "", offset, |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 (word & 1) ? "locked" : "unlocked"); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 offset += grp->block_size; |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 if (grp->part_end) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 if (issue_reset_cmd(part_addr) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 if (li->have_mode_lock_bits) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 if (read_mode_lock_word(bi->base_addr, 0x14, &word) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 printf("Password Protection Mode lock: %04X\n", word); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 if (issue_reset_cmd(bi->base_addr) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 if (read_mode_lock_word(bi->base_addr, 0x24, &word) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 printf("Persistent Protection Mode lock: %04X\n", word); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 if (issue_reset_cmd(bi->base_addr) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 if (li->have_pln_lock_reg) { |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 if (pln_special_mode_entry(bi->base_addr, 0x40) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 if (do_r16(bi->base_addr, &word) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 printf("PL-N Lock Register: %04X\n", word); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 if (pln_special_mode_exit(bi->base_addr) < 0) |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 return(-1); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 } |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 return(0); |
511e2b85c115
fc-loadtool: implement flash lock-state command
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 } |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
185 |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
186 /* |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
187 * Here comes a version of the above lock-state checking code, |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
188 * modified for use from within ppb-program-all and ppb-erase-all |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
189 * functions for chips that don't do this work internally. |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
190 */ |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
191 |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
192 static |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
193 int_lock_state_check(bi, sought_state) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
194 struct flash_bank_info *bi; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
195 { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
196 struct amd_lock_info *li = bi->amd_lock; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
197 struct lock_group_desc *grp; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
198 uint32_t offset, part_addr; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
199 uint16_t word; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
200 unsigned ng, nb; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
201 int lock_state; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
202 |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
203 offset = 0; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
204 for (ng = 0; ng < li->ngroups; ng++) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
205 grp = li->groups + ng; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
206 if (grp->part_begin) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
207 part_addr = bi->base_addr + offset; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
208 if (issue_read_id(part_addr) < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
209 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
210 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
211 for (nb = 0; nb < grp->nblocks; nb++) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
212 if (do_r16(bi->base_addr + offset + 4, &word) < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
213 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
214 lock_state = word & 1; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
215 if (lock_state != sought_state) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
216 break; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
217 offset += grp->block_size; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
218 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
219 if (lock_state != sought_state) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
220 if (issue_reset_cmd(part_addr) < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
221 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
222 return(0); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
223 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
224 if (grp->part_end) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
225 if (issue_reset_cmd(part_addr) < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
226 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
227 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
228 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
229 return(1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
230 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
231 |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
232 /* |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
233 * Spansion PL-J PPB write functions, referenced from lock_info structures |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
234 * in fldevs.c device descriptions. |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
235 */ |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
236 |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
237 static |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
238 plj_ppb_write_op(base_addr, is_erase, retp) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
239 uint32_t base_addr; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
240 uint16_t *retp; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
241 { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
242 if (do_w16(base_addr + 0xAAA, 0xAA)) { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
243 bad_w16: fprintf(stderr, |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
244 "unexpected response to w16 in PPB command sequence - aborting\n"); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
245 return(-1); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
246 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
247 if (do_w16(base_addr + 0x554, 0x55)) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
248 goto bad_w16; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
249 if (do_w16(base_addr + 0xAAA, 0x60)) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
250 goto bad_w16; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
251 if (do_w16(base_addr + 4, is_erase ? 0x60 : 0x68)) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
252 goto bad_w16; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
253 usleep(1200); /* per S29PL-J datasheet */ |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
254 if (do_w16(base_addr + 4, is_erase ? 0x40 : 0x48)) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
255 goto bad_w16; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
256 if (do_r16(base_addr + 4, retp) < 0) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
257 return(-1); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
258 return(0); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
259 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
260 |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
261 plj_ppb_program_one(bi, sector_addr) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
262 struct flash_bank_info *bi; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
263 uint32_t sector_addr; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
264 { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
265 uint16_t stat; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
266 unsigned pulsecnt; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
267 int rc; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
268 |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
269 for (pulsecnt = 0; pulsecnt < 25; ) { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
270 rc = plj_ppb_write_op(bi->base_addr + sector_addr, 0, &stat); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
271 if (rc < 0) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
272 return(rc); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
273 pulsecnt++; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
274 if (!(stat & 1)) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
275 continue; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
276 printf("PPB 0x%X programmed with %u pulse%s\n", sector_addr, |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
277 pulsecnt, pulsecnt > 1 ? "s" : ""); |
982
1c5b485f10ba
fc-loadtool flash: do AMD reset after PL-J PPB write operations
Mychaela Falconia <falcon@freecalypso.org>
parents:
981
diff
changeset
|
278 return amd_reset_cmd(bi); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
279 } |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
280 fprintf(stderr, "PPB 0x%X programming FAILED, tried %u pulses\n", |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
281 sector_addr, pulsecnt); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
282 return(-1); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
283 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
284 |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
285 plj_ppb_program_all(bi) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
286 struct flash_bank_info *bi; |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
287 { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
288 struct amd_lock_info *li = bi->amd_lock; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
289 struct lock_group_desc *grp; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
290 uint32_t offset; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
291 unsigned ng, nb; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
292 int rc; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
293 |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
294 offset = 0; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
295 for (ng = 0; ng < li->ngroups; ng++) { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
296 grp = li->groups + ng; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
297 for (nb = 0; nb < grp->nblocks; nb++) { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
298 rc = plj_ppb_program_one(bi, offset); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
299 if (rc < 0) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
300 return(rc); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
301 offset += grp->block_size; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
302 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
303 } |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
304 printf("Verifying PPB programming\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
305 rc = int_lock_state_check(bi, 1); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
306 if (rc < 0) |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
307 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
308 if (rc) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
309 return(0); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
310 fprintf(stderr, "flash error: one or more PPBs failed to program\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
311 return(-1); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
312 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
313 |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
314 static |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
315 plj_ppb_erase_cycle(bi) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
316 struct flash_bank_info *bi; |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
317 { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
318 uint16_t stat; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
319 unsigned pulsecnt; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
320 int rc; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
321 |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
322 printf("Performing PPB erase cycle\n"); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
323 for (pulsecnt = 0; pulsecnt < 1000; ) { |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
324 rc = plj_ppb_write_op(bi->base_addr, 1, &stat); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
325 if (rc < 0) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
326 return(rc); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
327 pulsecnt++; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
328 if (stat & 1) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
329 continue; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
330 printf("PPB erase cycle succeeded after %u pulse%s\n", |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
331 pulsecnt, pulsecnt > 1 ? "s" : ""); |
982
1c5b485f10ba
fc-loadtool flash: do AMD reset after PL-J PPB write operations
Mychaela Falconia <falcon@freecalypso.org>
parents:
981
diff
changeset
|
332 return amd_reset_cmd(bi); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
333 } |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
334 fprintf(stderr, "PPB erase cycle FAILED, tried %u pulses\n", pulsecnt); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
335 return(-1); |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
336 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
337 |
993
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
338 plj_ppb_erase_all_single(bi, raw_mode) |
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
339 struct flash_bank_info *bi; |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
340 { |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
341 unsigned pulsecnt; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
342 uint16_t stat; |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
343 int rc; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
344 |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
345 if (raw_mode) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
346 return plj_ppb_erase_cycle(bi); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
347 printf("Programming all PPBs before erase cycle\n"); |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
348 rc = plj_ppb_program_all(bi); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
349 if (rc < 0) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
350 return(-1); |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
351 printf("Entering PPB erase and verify loop\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
352 for (pulsecnt = 0; ; ) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
353 if (pulsecnt >= 1000) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
354 fprintf(stderr, |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
355 "flash error: unable to complete PPB erase after %u pulses\n", |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
356 pulsecnt); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
357 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
358 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
359 rc = plj_ppb_write_op(bi->base_addr, 1, &stat); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
360 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
361 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
362 pulsecnt++; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
363 if (stat & 1) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
364 continue; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
365 putchar('.'); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
366 fflush(stdout); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
367 rc = amd_reset_cmd(bi); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
368 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
369 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
370 rc = int_lock_state_check(bi, 0); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
371 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
372 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
373 if (rc) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
374 break; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
375 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
376 printf("\nPPB erase complete, total pulses: %u\n", pulsecnt); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
377 return(0); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
378 } |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
379 |
993
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
380 plj_ppb_erase_all_dualbank(dummy_bi, raw_mode) |
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
381 void *dummy_bi; |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
382 { |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
383 unsigned pulsecnt; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
384 uint16_t stat; |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
385 int rc; |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
386 |
993
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
387 if (flash_detect(0, 0) < 0) |
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
388 return(-1); |
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
389 if (flash_detect(1, 0) < 0) |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
390 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
391 if (flash_bank_info[0].device != flash_bank_info[1].device) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
392 fprintf(stderr, "error: mismatch between two flash banks\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
393 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
394 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
395 if (raw_mode) |
993
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
396 return plj_ppb_erase_cycle(&flash_bank_info[0]); |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
397 printf("Programming all PPBs in flash bank 0\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
398 rc = plj_ppb_program_all(&flash_bank_info[0]); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
399 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
400 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
401 printf("Programming all PPBs in flash bank 1\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
402 rc = plj_ppb_program_all(&flash_bank_info[1]); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
403 if (rc < 0) |
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
404 return(-1); |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
405 printf("Entering PPB erase and verify loop\n"); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
406 for (pulsecnt = 0; ; ) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
407 if (pulsecnt >= 1000) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
408 fprintf(stderr, |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
409 "flash error: unable to complete PPB erase after %u pulses\n", |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
410 pulsecnt); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
411 return(-1); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
412 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
413 rc = plj_ppb_write_op(flash_bank_info[0].base_addr, 1, &stat); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
414 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
415 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
416 pulsecnt++; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
417 if (stat & 1) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
418 continue; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
419 putchar('.'); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
420 fflush(stdout); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
421 rc = amd_reset_cmd(&flash_bank_info[0]); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
422 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
423 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
424 rc = int_lock_state_check(&flash_bank_info[0], 0); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
425 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
426 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
427 if (!rc) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
428 continue; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
429 rc = int_lock_state_check(&flash_bank_info[1], 0); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
430 if (rc < 0) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
431 return(rc); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
432 if (rc) |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
433 break; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
434 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
435 printf("\nPPB erase complete, total pulses: %u\n", pulsecnt); |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
436 return(0); |
979
c5133c3c11b1
fc-loadtool flash: implement PL-J PPB programming functions
Mychaela Falconia <falcon@freecalypso.org>
parents:
977
diff
changeset
|
437 } |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
438 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
439 /* |
994
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
440 * Spansion PL-N PPB write functions, referenced from lock_info structures |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
441 * in fldevs.c device descriptions. |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
442 */ |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
443 |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
444 static |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
445 pln_ppb_write_op(oper_addr, write1, write2, expect_stat) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
446 uint32_t oper_addr; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
447 uint16_t write1, write2, expect_stat; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
448 { |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
449 int rc; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
450 uint16_t read_stat, prev_stat; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
451 time_t start_time, curtime; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
452 |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
453 rc = pln_special_mode_entry(oper_addr, 0xC0); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
454 if (rc < 0) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
455 return(rc); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
456 if (do_w16(oper_addr, write1)) { |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
457 bad_w16: fprintf(stderr, |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
458 "unexpected response to w16 in PPB command sequence - aborting\n"); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
459 return(-1); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
460 } |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
461 if (do_w16(oper_addr, write2)) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
462 goto bad_w16; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
463 printf("Polling for completion status\n"); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
464 usleep(10000); /* make sure we don't get state before op starts */ |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
465 start_time = time(0); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
466 rc = do_r16(oper_addr, &read_stat); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
467 if (rc < 0) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
468 return(rc); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
469 for (;;) { |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
470 prev_stat = read_stat; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
471 rc = do_r16(oper_addr, &read_stat); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
472 if (rc < 0) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
473 return(rc); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
474 if (read_stat == expect_stat && prev_stat == expect_stat) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
475 break; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
476 curtime = time(0); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
477 if (curtime >= start_time + 10) { |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
478 fprintf(stderr, "operation timeout, aborting\n"); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
479 return(-1); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
480 } |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
481 } |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
482 printf("Operation completed successfully\n"); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
483 return pln_special_mode_exit(oper_addr); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
484 } |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
485 |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
486 pln_ppb_program_one(bi, sector_addr) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
487 struct flash_bank_info *bi; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
488 uint32_t sector_addr; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
489 { |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
490 printf("Issuing PPB Program command\n"); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
491 return pln_ppb_write_op(bi->base_addr + sector_addr, 0xA0, 0, 0); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
492 } |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
493 |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
494 pln_ppb_erase_all(bi, raw_mode) |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
495 struct flash_bank_info *bi; |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
496 { |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
497 printf("Issuing All PPB Erase command\n"); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
498 return pln_ppb_write_op(bi->base_addr, 0x80, 0x30, 1); |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
499 } |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
500 |
ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
Mychaela Falconia <falcon@freecalypso.org>
parents:
993
diff
changeset
|
501 /* |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
502 * Front end functions for PPB operation commands. |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
503 */ |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
504 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
505 flashcmd_ppb_program(argc, argv, bank) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
506 char **argv; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
507 { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
508 struct flash_bank_info *bi; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
509 struct amd_lock_info *li; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
510 u_long offset_arg; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
511 struct sector_info *sp; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
512 char *strtoul_endp; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
513 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
514 if (argc != 3) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
515 inv: fprintf(stderr, "usage: %s %s sector-offset\n", |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
516 argv[0], argv[1]); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
517 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
518 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
519 offset_arg = strtoul(argv[2], &strtoul_endp, 16); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
520 if (*strtoul_endp) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
521 goto inv; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
522 if (flash_detect(bank, 0) < 0) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
523 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
524 bi = flash_bank_info + bank; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
525 li = bi->amd_lock; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
526 if (!li || !li->ppb_program_one) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
527 fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
528 "Operation not supported for this flash chip type\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
529 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
530 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
531 if (offset_arg >= bi->geom->total_size) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
532 fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
533 "error: specified offset exceeds flash bank size (0x%lx)\n", |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
534 (u_long) bi->geom->total_size); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
535 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
536 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
537 if (get_flash_sector_table(bi) < 0) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
538 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
539 for (sp = bi->sectors; sp->size; sp++) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
540 if (sp->start == offset_arg) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
541 break; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
542 if (!sp->size) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
543 fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
544 "error: specified offset not aligned to a flash sector boundary\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
545 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
546 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
547 return li->ppb_program_one(bi, sp->start); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
548 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
549 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
550 flashcmd_ppb_program_all(argc, argv, bank) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
551 char **argv; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
552 { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
553 struct flash_bank_info *bi; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
554 struct amd_lock_info *li; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
555 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
556 if (argc > 2) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
557 fprintf(stderr, "error: too many arguments\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
558 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
559 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
560 if (flash_detect(bank, 0) < 0) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
561 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
562 bi = flash_bank_info + bank; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
563 li = bi->amd_lock; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
564 if (!li || !li->ppb_program_all) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
565 fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
566 "Operation not supported for this flash chip type\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
567 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
568 } |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
569 return li->ppb_program_all(bi); |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
570 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
571 |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
572 flashcmd_ppb_erase_all(argc, argv, bank) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
573 char **argv; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
574 { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
575 struct flash_bank_info *bi; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
576 struct amd_lock_info *li; |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
577 int raw_mode; |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
578 |
983
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
579 switch (argc) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
580 case 2: |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
581 raw_mode = 0; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
582 break; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
583 case 3: |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
584 if (!strcmp(argv[2], "raw")) { |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
585 raw_mode = 1; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
586 break; |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
587 } |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
588 /* FALL THRU */ |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
589 default: |
0407d14fb854
PL-J flash PPB ops: rework for full verification of lock state
Mychaela Falconia <falcon@freecalypso.org>
parents:
982
diff
changeset
|
590 fprintf(stderr, "usage: %s %s [raw]\n", argv[0], argv[1]); |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
591 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
592 } |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
593 if (flash_detect(bank, 0) < 0) |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
594 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
595 bi = flash_bank_info + bank; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
596 li = bi->amd_lock; |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
597 if (!li || !li->ppb_erase_all) { |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
598 fprintf(stderr, |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
599 "Operation not supported for this flash chip type\n"); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
600 return(-1); |
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
601 } |
993
84c9869a3659
flash PPB erase: make internal API more consistent
Mychaela Falconia <falcon@freecalypso.org>
parents:
983
diff
changeset
|
602 return li->ppb_erase_all(bi, raw_mode); |
981
f21798eb13cf
fc-loadtool: implement flash ppb-* commands
Mychaela Falconia <falcon@freecalypso.org>
parents:
979
diff
changeset
|
603 } |