1 /*
2  * This file is part of the flashrom project.
3  *
4  * Copyright (C) 2007, 2008 Carl-Daniel Hailfinger
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  */
15 
16 #ifndef __SPI_H__
17 #define __SPI_H__ 1
18 
19 /*
20  * Contains the generic SPI headers
21  */
22 
23 #define JEDEC_MAX_ADDR_LEN	0x04
24 
25 /* Read Electronic ID */
26 #define JEDEC_RDID		0x9f
27 #define JEDEC_RDID_OUTSIZE	0x01
28 /* INSIZE may be 0x04 for some chips*/
29 #define JEDEC_RDID_INSIZE	0x03
30 
31 /* Some ST M95X model */
32 #define ST_M95_RDID		0x83
33 #define ST_M95_RDID_3BA_OUTSIZE	0x04	/* 8b op, 24bit addr where size >64KiB */
34 #define ST_M95_RDID_2BA_OUTSIZE	0x03	/* 8b op, 16bit addr where size <=64KiB */
35 #define ST_M95_RDID_OUTSIZE_MAX 0x04	/* ST_M95_RDID_3BA_OUTSIZE */
36 #define ST_M95_RDID_INSIZE	0x03
37 
38 /* Some Atmel AT25F* models have bit 3 as don't care bit in commands */
39 #define AT25F_RDID		0x15	/* 0x15 or 0x1d */
40 #define AT25F_RDID_OUTSIZE	0x01
41 #define AT25F_RDID_INSIZE	0x02
42 
43 /* Read Electronic Manufacturer Signature */
44 #define JEDEC_REMS		0x90
45 #define JEDEC_REMS_OUTSIZE	0x04
46 #define JEDEC_REMS_INSIZE	0x02
47 
48 /* Read Serial Flash Discoverable Parameters (SFDP) */
49 #define JEDEC_SFDP		0x5a
50 #define JEDEC_SFDP_OUTSIZE	0x05	/* 8b op, 24b addr, 8b dummy */
51 /*      JEDEC_SFDP_INSIZE : any length */
52 
53 /* Read Electronic Signature */
54 #define JEDEC_RES		0xab
55 #define JEDEC_RES_OUTSIZE	0x04
56 /* INSIZE may be 0x02 for some chips*/
57 #define JEDEC_RES_INSIZE	0x01
58 
59 /* Write Enable */
60 #define JEDEC_WREN		0x06
61 #define JEDEC_WREN_OUTSIZE	0x01
62 #define JEDEC_WREN_INSIZE	0x00
63 
64 /* Write Disable */
65 #define JEDEC_WRDI		0x04
66 #define JEDEC_WRDI_OUTSIZE	0x01
67 #define JEDEC_WRDI_INSIZE	0x00
68 
69 /* Chip Erase 0x60 is supported by Macronix/SST chips. */
70 #define JEDEC_CE_60		0x60
71 #define JEDEC_CE_60_OUTSIZE	0x01
72 #define JEDEC_CE_60_INSIZE	0x00
73 
74 /* Chip Erase 0x62 is supported by Atmel AT25F chips. */
75 #define JEDEC_CE_62		0x62
76 #define JEDEC_CE_62_OUTSIZE	0x01
77 #define JEDEC_CE_62_INSIZE	0x00
78 
79 /* Chip Erase 0xc7 is supported by SST/ST/EON/Macronix chips. */
80 #define JEDEC_CE_C7		0xc7
81 #define JEDEC_CE_C7_OUTSIZE	0x01
82 #define JEDEC_CE_C7_INSIZE	0x00
83 
84 /* Block Erase 0x50 is supported by Atmel AT26DF chips. */
85 #define JEDEC_BE_50		0x50
86 #define JEDEC_BE_50_OUTSIZE	0x04
87 #define JEDEC_BE_50_INSIZE	0x00
88 
89 /* Block Erase 0x52 is supported by SST and old Atmel chips. */
90 #define JEDEC_BE_52		0x52
91 #define JEDEC_BE_52_OUTSIZE	0x04
92 #define JEDEC_BE_52_INSIZE	0x00
93 
94 /* Block Erase 0x81 is supported by Atmel AT26DF chips. */
95 #define JEDEC_BE_81		0x81
96 #define JEDEC_BE_81_OUTSIZE	0x04
97 #define JEDEC_BE_81_INSIZE	0x00
98 
99 /* Block Erase 0xc4 is supported by Micron chips. */
100 #define JEDEC_BE_C4		0xc4
101 #define JEDEC_BE_C4_OUTSIZE	0x04
102 #define JEDEC_BE_C4_INSIZE	0x00
103 
104 /* Block Erase 0xd8 is supported by EON/Macronix chips. */
105 #define JEDEC_BE_D8		0xd8
106 #define JEDEC_BE_D8_OUTSIZE	0x04
107 #define JEDEC_BE_D8_INSIZE	0x00
108 
109 /* Block Erase 0xd7 is supported by PMC chips. */
110 #define JEDEC_BE_D7		0xd7
111 #define JEDEC_BE_D7_OUTSIZE	0x04
112 #define JEDEC_BE_D7_INSIZE	0x00
113 
114 /* Sector Erase 0x20 is supported by Macronix/SST chips. */
115 #define JEDEC_SE		0x20
116 #define JEDEC_SE_OUTSIZE	0x04
117 #define JEDEC_SE_INSIZE		0x00
118 
119 /* Page Erase 0xDB */
120 #define JEDEC_PE		0xDB
121 #define JEDEC_PE_OUTSIZE	0x04
122 #define JEDEC_PE_INSIZE		0x00
123 
124 /* Read Status Register */
125 #define JEDEC_RDSR		0x05
126 #define JEDEC_RDSR_OUTSIZE	0x01
127 #define JEDEC_RDSR_INSIZE	0x01
128 
129 /* Status Register Bits */
130 #define SPI_SR_WIP	(0x01 << 0)
131 #define SPI_SR_WEL	(0x01 << 1)
132 #define SPI_SR_AAI	(0x01 << 6)
133 
134 /* Write Status Enable */
135 #define JEDEC_EWSR		0x50
136 #define JEDEC_EWSR_OUTSIZE	0x01
137 #define JEDEC_EWSR_INSIZE	0x00
138 
139 /* Write Status Register */
140 #define JEDEC_WRSR		0x01
141 #define JEDEC_WRSR_OUTSIZE	0x02
142 #define JEDEC_WRSR_INSIZE	0x00
143 
144 /* Enter 4-byte Address Mode */
145 #define JEDEC_ENTER_4_BYTE_ADDR_MODE	0xB7
146 
147 /* Exit 4-byte Address Mode */
148 #define JEDEC_EXIT_4_BYTE_ADDR_MODE	0xE9
149 
150 /* Write Extended Address Register */
151 #define JEDEC_WRITE_EXT_ADDR_REG	0xC5
152 
153 /* Read Extended Address Register */
154 #define JEDEC_READ_EXT_ADDR_REG		0xC8
155 
156 /* Read the memory */
157 #define JEDEC_READ		0x03
158 #define JEDEC_READ_OUTSIZE	0x04
159 /*      JEDEC_READ_INSIZE : any length */
160 
161 /* Read the memory (with delay after sending address) */
162 #define JEDEC_READ_FAST		0x0b
163 
164 /* Write memory byte */
165 #define JEDEC_BYTE_PROGRAM		0x02
166 #define JEDEC_BYTE_PROGRAM_OUTSIZE	0x05
167 #define JEDEC_BYTE_PROGRAM_INSIZE	0x00
168 
169 /* Write AAI word (SST25VF080B) */
170 #define JEDEC_AAI_WORD_PROGRAM			0xad
171 #define JEDEC_AAI_WORD_PROGRAM_OUTSIZE		0x06
172 #define JEDEC_AAI_WORD_PROGRAM_CONT_OUTSIZE	0x03
173 #define JEDEC_AAI_WORD_PROGRAM_INSIZE		0x00
174 
175 /* Read the memory with 4-byte address
176    From ANY mode (3-bytes or 4-bytes) it works with 4-byte address */
177 #define JEDEC_READ_4BA		0x13
178 
179 /* Read the memory with 4-byte address (and delay after sending address)
180    From ANY mode (3-bytes or 4-bytes) it works with 4-byte address */
181 #define JEDEC_READ_4BA_FAST	0x0c
182 
183 /* Write memory byte with 4-byte address
184    From ANY mode (3-bytes or 4-bytes) it works with 4-byte address */
185 #define JEDEC_BYTE_PROGRAM_4BA	0x12
186 
187 /* Error codes */
188 #define SPI_GENERIC_ERROR	-1
189 #define SPI_INVALID_OPCODE	-2
190 #define SPI_INVALID_ADDRESS	-3
191 #define SPI_INVALID_LENGTH	-4
192 #define SPI_FLASHROM_BUG	-5
193 #define SPI_PROGRAMMER_ERROR	-6
194 
195 #endif		/* !__SPI_H__ */
196