mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-07-28 04:07:47 +00:00
This makes it possible to build Puya patched versions without having to patch the files first.
150 lines
5.7 KiB
Diff
150 lines
5.7 KiB
Diff
diff -urN 2.3.0.orig/cores/esp8266/Esp.cpp 2.3.0/cores/esp8266/Esp.cpp
|
|
--- 2.3.0.orig/cores/esp8266/Esp.cpp 2016-06-21 08:06:45.000000000 +0000
|
|
+++ 2.3.0/cores/Esp.cpp 2019-01-04 16:59:09.627740200 +0100
|
|
@@ -205,7 +205,16 @@
|
|
|
|
uint32_t EspClass::getFlashChipId(void)
|
|
{
|
|
- return spi_flash_get_id();
|
|
+ static uint32_t flash_chip_id = 0;
|
|
+ if (flash_chip_id == 0) {
|
|
+ flash_chip_id = spi_flash_get_id();
|
|
+ }
|
|
+ return flash_chip_id;
|
|
+}
|
|
+
|
|
+uint8_t EspClass::getFlashChipVendorId(void)
|
|
+{
|
|
+ return (getFlashChipId() & 0x000000ff);
|
|
}
|
|
|
|
uint32_t EspClass::getFlashChipRealSize(void)
|
|
@@ -508,9 +517,61 @@
|
|
return rc == 0;
|
|
}
|
|
|
|
+#if PUYA_SUPPORT
|
|
+static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) {
|
|
+ if (data == nullptr) {
|
|
+ return 1; // SPI_FLASH_RESULT_ERR
|
|
+ }
|
|
+ // PUYA flash chips need to read existing data, update in memory and write modified data again.
|
|
+ static uint32_t *flash_write_puya_buf = nullptr;
|
|
+ int rc = 0;
|
|
+ uint32_t* ptr = data;
|
|
+
|
|
+ if (flash_write_puya_buf == nullptr) {
|
|
+ flash_write_puya_buf = (uint32_t*) malloc(PUYA_BUFFER_SIZE);
|
|
+ // No need to ever free this, since the flash chip will never change at runtime.
|
|
+ if (flash_write_puya_buf == nullptr) {
|
|
+ // Memory could not be allocated.
|
|
+ return 1; // SPI_FLASH_RESULT_ERR
|
|
+ }
|
|
+ }
|
|
+ size_t bytesLeft = size;
|
|
+ uint32_t pos = offset;
|
|
+ while (bytesLeft > 0 && rc == 0) {
|
|
+ size_t bytesNow = bytesLeft;
|
|
+ if (bytesNow > PUYA_BUFFER_SIZE) {
|
|
+ bytesNow = PUYA_BUFFER_SIZE;
|
|
+ bytesLeft -= PUYA_BUFFER_SIZE;
|
|
+ } else {
|
|
+ bytesLeft = 0;
|
|
+ }
|
|
+ rc = spi_flash_read(pos, flash_write_puya_buf, bytesNow);
|
|
+ if (rc != 0) {
|
|
+ return rc;
|
|
+ }
|
|
+ for (size_t i = 0; i < bytesNow / 4; ++i) {
|
|
+ flash_write_puya_buf[i] &= *ptr;
|
|
+ ++ptr;
|
|
+ }
|
|
+ rc = spi_flash_write(pos, flash_write_puya_buf, bytesNow);
|
|
+ pos += bytesNow;
|
|
+ }
|
|
+ return rc;
|
|
+}
|
|
+#endif
|
|
+
|
|
bool EspClass::flashWrite(uint32_t offset, uint32_t *data, size_t size) {
|
|
ets_isr_mask(FLASH_INT_MASK);
|
|
- int rc = spi_flash_write(offset, (uint32_t*) data, size);
|
|
+ int rc = 0;
|
|
+#if PUYA_SUPPORT
|
|
+ if (getFlashChipVendorId() == SPI_FLASH_VENDOR_PUYA) {
|
|
+ rc = spi_flash_write_puya(offset, data, size);
|
|
+ }
|
|
+ else
|
|
+#endif
|
|
+ {
|
|
+ rc = spi_flash_write(offset, data, size);
|
|
+ }
|
|
ets_isr_unmask(FLASH_INT_MASK);
|
|
return rc == 0;
|
|
}
|
|
diff -urN 2.3.0.orig/cores/esp8266/Esp.h 2.3.0/cores/esp8266/Esp.h
|
|
--- 2.3.0.orig/cores/esp8266/Esp.h 2016-06-21 08:06:45.000000000 +0000
|
|
+++ 2.3.0/cores/esp8266/Esp.h 2019-01-04 16:59:09.628715800 +0100
|
|
@@ -23,6 +23,53 @@
|
|
|
|
#include <Arduino.h>
|
|
|
|
+
|
|
+#ifndef PUYA_SUPPORT
|
|
+ #define PUYA_SUPPORT 0
|
|
+#endif
|
|
+#ifndef PUYA_BUFFER_SIZE
|
|
+ // Good alternative for buffer size is: SPI_FLASH_SEC_SIZE (= 4k)
|
|
+ // Always use a multiple of flash page size (256 bytes)
|
|
+ #define PUYA_BUFFER_SIZE 256
|
|
+#endif
|
|
+
|
|
+// Vendor IDs taken from Flashrom project
|
|
+// https://review.coreboot.org/cgit/flashrom.git/tree/flashchips.h?h=1.0.x
|
|
+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_UNKNOWN = 0xFF
|
|
+} SPI_FLASH_VENDOR_t;
|
|
+
|
|
/**
|
|
* AVR macros for WDT managment
|
|
*/
|
|
@@ -116,6 +163,7 @@
|
|
uint8_t getCpuFreqMHz();
|
|
|
|
uint32_t getFlashChipId();
|
|
+ uint8_t getFlashChipVendorId();
|
|
//gets the actual chip size based on the flash id
|
|
uint32_t getFlashChipRealSize();
|
|
//gets the size of the flash as set by the compiler
|