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