forked from esp8266/Arduino
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
XMC flash support - WIP (esp8266#6725)
* Move the spi vendor list from Esp.h to its own header in eboot. * Fix ifdef issue with spi_vendors.h * Add initFlashQuirks() for any chip specific flash initialization. Called from user_init(). * namespace experimental for initFlashQuirks() * Slow down flash access during eboot firmware copy Part 1 - still some work to do * Slow down flash access during eboot firmware copy on XMC chips Part 2 - Identify the chip type. Note: there may still be issues with the access speed change. This is very much experimental. * Commit eboot.elf Co-authored-by: Develo <[email protected]> Co-authored-by: Earle F. Philhower, III <[email protected]>
- Loading branch information
1 parent
2de9242
commit 9b41d9a
Showing
10 changed files
with
346 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/* | ||
spi_vendors.h - Vendor IDs for SPI chips | ||
Copyright (c) 2019 Mike Nix. All rights reserved. | ||
This file is part of the esp8266 core for Arduino environment. | ||
This library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
This library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with this library; if not, write to the Free Software | ||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#ifndef __SPI_VENDORS_H__ | ||
#define __SPI_VENDORS_H__ | ||
|
||
// Vendor IDs taken from Flashrom project | ||
// https://review.coreboot.org/cgit/flashrom.git/tree/flashchips.h?h=1.0.x | ||
// Moved here from ../../cores/esp8266/Esp.h | ||
typedef enum { | ||
SPI_FLASH_VENDOR_ALLIANCE = 0x52, /* Alliance Semiconductor */ | ||
SPI_FLASH_VENDOR_AMD = 0x01, /* AMD */ | ||
SPI_FLASH_VENDOR_AMIC = 0x37, /* AMIC */ | ||
SPI_FLASH_VENDOR_ATMEL = 0x1F, /* Atmel (now used by Adesto) */ | ||
SPI_FLASH_VENDOR_BRIGHT = 0xAD, /* Bright Microelectronics */ | ||
SPI_FLASH_VENDOR_CATALYST = 0x31, /* Catalyst */ | ||
SPI_FLASH_VENDOR_EON = 0x1C, /* EON Silicon Devices, missing 0x7F prefix */ | ||
SPI_FLASH_VENDOR_ESMT = 0x8C, /* Elite Semiconductor Memory Technology (ESMT) / EFST Elite Flash Storage */ | ||
SPI_FLASH_VENDOR_EXCEL = 0x4A, /* ESI, missing 0x7F prefix */ | ||
SPI_FLASH_VENDOR_FIDELIX = 0xF8, /* Fidelix */ | ||
SPI_FLASH_VENDOR_FUJITSU = 0x04, /* Fujitsu */ | ||
SPI_FLASH_VENDOR_GIGADEVICE = 0xC8, /* GigaDevice */ | ||
SPI_FLASH_VENDOR_HYUNDAI = 0xAD, /* Hyundai */ | ||
SPI_FLASH_VENDOR_INTEL = 0x89, /* Intel */ | ||
SPI_FLASH_VENDOR_ISSI = 0xD5, /* ISSI Integrated Silicon Solutions, see also PMC. */ | ||
SPI_FLASH_VENDOR_MACRONIX = 0xC2, /* Macronix (MX) */ | ||
SPI_FLASH_VENDOR_NANTRONICS = 0xD5, /* Nantronics, missing prefix */ | ||
SPI_FLASH_VENDOR_PMC = 0x9D, /* PMC, missing 0x7F prefix */ | ||
SPI_FLASH_VENDOR_PUYA = 0x85, /* Puya semiconductor (shanghai) co. ltd */ | ||
SPI_FLASH_VENDOR_SANYO = 0x62, /* Sanyo */ | ||
SPI_FLASH_VENDOR_SHARP = 0xB0, /* Sharp */ | ||
SPI_FLASH_VENDOR_SPANSION = 0x01, /* Spansion, same ID as AMD */ | ||
SPI_FLASH_VENDOR_SST = 0xBF, /* SST */ | ||
SPI_FLASH_VENDOR_ST = 0x20, /* ST / SGS/Thomson / Numonyx (later acquired by Micron) */ | ||
SPI_FLASH_VENDOR_SYNCMOS_MVC = 0x40, /* SyncMOS (SM) and Mosel Vitelic Corporation (MVC) */ | ||
SPI_FLASH_VENDOR_TENX = 0x5E, /* Tenx Technologies */ | ||
SPI_FLASH_VENDOR_TI = 0x97, /* Texas Instruments */ | ||
SPI_FLASH_VENDOR_TI_OLD = 0x01, /* TI chips from last century */ | ||
SPI_FLASH_VENDOR_WINBOND = 0xDA, /* Winbond */ | ||
SPI_FLASH_VENDOR_WINBOND_NEX = 0xEF, /* Winbond (ex Nexcom) serial flashes */ | ||
SPI_FLASH_VENDOR_XMC = 0x20, /* Wuhan Xinxin Semiconductor Manufacturing Corp */ | ||
|
||
SPI_FLASH_VENDOR_UNKNOWN = 0xFF | ||
} SPI_FLASH_VENDOR_t; | ||
|
||
#endif // __SPI_VENDORS_H__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
/* | ||
flash_quirks.cpp - Chip specific flash init | ||
Copyright (c) 2019 Mike Nix. All rights reserved. | ||
This file is part of the esp8266 core for Arduino environment. | ||
This library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
This library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with this library; if not, write to the Free Software | ||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#include <c_types.h> | ||
#include "spi_flash.h" | ||
|
||
#include "spi_utils.h" | ||
#include "flash_quirks.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
namespace experimental { | ||
|
||
static int get_flash_mhz() { | ||
// FIXME: copied from Esp.cpp - we really should define the magic values | ||
uint32_t data; | ||
uint8_t * bytes = (uint8_t *) &data; | ||
// read first 4 byte (magic byte + flash config) | ||
if(spi_flash_read(0x0000, &data, 4) == SPI_FLASH_RESULT_OK) { | ||
switch (bytes[3] & 0x0F) { | ||
case 0x0: // 40 MHz | ||
return 40; | ||
case 0x1: // 26 MHz | ||
return 26; | ||
case 0x2: // 20 MHz | ||
return 20; | ||
case 0xf: // 80 MHz | ||
return 80; | ||
default: // fail? | ||
return 0; | ||
} | ||
} | ||
return 0; | ||
} | ||
|
||
/* initFlashQuirks() | ||
* Do any chip-specific initialization to improve performance and reliability. | ||
*/ | ||
void initFlashQuirks() { | ||
using namespace experimental; | ||
uint32_t vendor = spi_flash_get_id() & 0x000000ff; | ||
|
||
switch (vendor) { | ||
case SPI_FLASH_VENDOR_XMC: | ||
uint32_t SR3, newSR3; | ||
if (SPI0Command(SPI_FLASH_CMD_RSR3, &SR3, 0, 8)==SPI_RESULT_OK) { // read SR3 | ||
newSR3=SR3; | ||
if (get_flash_mhz()>26) { // >26Mhz? | ||
// Set the output drive to 100% | ||
newSR3 &= ~(SPI_FLASH_SR3_XMC_DRV_MASK << SPI_FLASH_SR3_XMC_DRV_S); | ||
newSR3 |= (SPI_FLASH_SR3_XMC_DRV_100 << SPI_FLASH_SR3_XMC_DRV_S); | ||
} | ||
if (newSR3 != SR3) { // only write if changed | ||
if (SPI0Command(SPI_FLASH_CMD_WEVSR,NULL,0,0)==SPI_RESULT_OK) // write enable volatile SR | ||
SPI0Command(SPI_FLASH_CMD_WSR3,&newSR3,8,0); // write to SR3 | ||
SPI0Command(SPI_FLASH_CMD_WRDI,NULL,0,0); // write disable - probably not needed | ||
} | ||
} | ||
} | ||
} | ||
|
||
} // namespace experimental | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
/* | ||
flash_quirks.h | ||
Copyright (c) 2019 Mike Nix. All rights reserved. | ||
This file is part of the esp8266 core for Arduino environment. | ||
This library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
This library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with this library; if not, write to the Free Software | ||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#ifndef FLASH_QUIRKS_H | ||
#define FLASH_QUIRKS_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#include "spi_vendors.h" | ||
#include "spi_flash_defs.h" | ||
|
||
namespace experimental { | ||
|
||
void initFlashQuirks(); | ||
|
||
} // namespace experimental | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
|
||
#endif // FLASH_QUIRKS_H |
Oops, something went wrong.