diff --git a/.travis.yml b/.travis.yml index 361104f0..b5c78c1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,44 +15,29 @@ before_script: - git clone https://github.com/esp8266/Arduino.git esp8266 - cd esp8266/tools - python get.py - - cd .. - - echo 'build.flash_ld=eagle.flash.4m.ld' >> platform.txt - - echo 'build.flash_freq=40' >> platform.txt - - echo 'build.flash_size=4M' >> platform.txt - - echo 'build.flash_mode=dio' >> platform.txt - - echo 'build.f_cpu=160000000L' >> platform.txt - - echo 'build.flash_flags=-DFLASHMODE_DIO' >> platform.txt - - sed -i "s/build.lwip_lib=-llwip_gcc/build.lwip_lib=-llwip2-536-feat/g" ./platform.txt - - sed -i "s/build.lwip_include=lwip/build.lwip_include=lwip2/g" ./platform.txt - - sed -i "s/build.lwip_flags=-DLWIP_OPEN_SRC/build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0/g" ./platform.txt - - sed -i "s/generic.build.f_cpu=80000000L/generic.build.f_cpu=160000000L/g" ./boards.txt - cd $HOME/arduino_ide/hardware - mkdir esp32 - cd esp32 - git clone https://github.com/espressif/arduino-esp32.git esp32 - cd esp32/tools - python get.py - - cd .. - - echo 'build.flash_freq=40m' >> platform.txt - - echo 'build.partitions=min_spiffs' >> platform.txt - - sed -i "s/{build.partitions}.csv/min_spiffs.csv/g" ./platform.txt - - sed -i "s/esp32.menu.PartitionScheme.default.build.partitions=default/esp32.menu.PartitionScheme.default.build.partitions=min_spiffs/g" ./boards.txt - - sed -i "s/esp32.build.partitions=default/esp32.build.partitions=min_spiffs/g" ./boards.txt - mv $TRAVIS_BUILD_DIR/libraries/ESP32SSDP $HOME/arduino_ide/libraries/ - mv $TRAVIS_BUILD_DIR/libraries/arduinoWebSockets $HOME/arduino_ide/libraries/ - mv $TRAVIS_BUILD_DIR/libraries/DHT_sensor_library_for_ESPx $HOME/arduino_ide/libraries/ - mv $TRAVIS_BUILD_DIR/libraries/oled-ssd1306 $HOME/arduino_ide/libraries/ - mv $TRAVIS_BUILD_DIR/libraries/TFT_eSPI $HOME/arduino_ide/libraries/ + - echo "patch esp8266 core to revert pgmspace commit" + - cp -f $TRAVIS_BUILD_DIR/patch/pgmspace.h $HOME/arduino_ide/hardware/esp8266com/esp8266/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h script: - cd $TRAVIS_BUILD_DIR - source command.sh - export PATH="$HOME/arduino_ide:$PATH" - - arduino --board esp8266com:esp8266:generic --save-prefs - - arduino --get-pref sketchbook.path + - rm -f $HOME/.arduino15/preferences.txt + - arduino --board esp8266com:esp8266:generic:eesz=4M3M,xtal=160,FlashMode=dio,FlashFreq=40,sdk=nonosdk221,ip=lm2f,dbg=Disabled,vt=flash,exception=disabled,ssl=basic --save-prefs - build_sketch esp3d/esp3d.ino - - arduino --board esp32:esp32:esp32 --save-prefs - - echo "custom_PartitionScheme=esp32_min_spiffs" >> $HOME/.arduino15/preferences.txt + - rm -f $HOME/.arduino15/preferences.txt + - arduino --board esp32:esp32:esp32:PartitionScheme=min_spiffs,FlashFreq=80,PSRAM=disabled,CPUFreq=240,FlashMode=qio,FlashSize=4M,DebugLevel=none --pref compiler.warning_level=all --save-prefs - sed -i "s/\/\/#define BLUETOOTH_FEATURE/#define BLUETOOTH_FEATURE/g" $TRAVIS_BUILD_DIR/esp3d/configuration.h - build_sketch esp3d/esp3d.ino diff --git a/patch/pgmspace.h b/patch/pgmspace.h new file mode 100644 index 00000000..9b61bec2 --- /dev/null +++ b/patch/pgmspace.h @@ -0,0 +1,114 @@ +/* PGMSPACE.H - Accessor utilities/types for accessing PROGMEM data */ + +#ifndef _PGMSPACE_H_ +#define _PGMSPACE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ICACHE_RODATA_ATTR + #define ICACHE_RODATA_ATTR __attribute__((section(".irom.text"))) +#endif +#ifndef PROGMEM + // The following two macros cause a parameter to be enclosed in quotes + // by the preopressor (i.e. for concatenating ints to strings) + #define __STRINGIZE_NX(A) #A + #define __STRINGIZE(A) __STRINGIZE_NX(A) + // Since __section__ is supposed to be only use for global variables, + // there could be conflicts when a static/inlined function has them in the + // same file as a non-static PROGMEM object. + // Ref: https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html + // Place each progmem object into its own named section, avoiding conflicts + #define PROGMEM __attribute__((section( "\".irom.text." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\""))) +#endif +#ifndef PGM_P + #define PGM_P const char * +#endif +#ifndef PGM_VOID_P + #define PGM_VOID_P const void * +#endif + +// PSTR() macro modified to start on a 32-bit boundary. This adds on average +// 1.5 bytes/string, but in return memcpy_P and strcpy_P will work 4~8x faster +#ifndef PSTR + #define PSTR(s) (__extension__({static const char __c[] __attribute__((__aligned__(4))) PROGMEM = (s); &__c[0];})) +#endif + +// Flash memory must be read using 32 bit aligned addresses else a processor +// exception will be triggered. +// The order within the 32 bit values are: +// -------------- +// b3, b2, b1, b0 +// w1, w0 + +#define pgm_read_with_offset(addr, res) \ + asm("extui %0, %1, 0, 2\n" /* Extract offset within word (in bytes) */ \ + "sub %1, %1, %0\n" /* Subtract offset from addr, yielding an aligned address */ \ + "l32i.n %1, %1, 0x0\n" /* Load word from aligned address */ \ + "slli %0, %0, 3\n" /* Mulitiply offset by 8, yielding an offset in bits */ \ + "ssr %0\n" /* Prepare to shift by offset (in bits) */ \ + "srl %0, %1\n" /* Shift right; now the requested byte is the first one */ \ + :"=r"(res), "=r"(addr) \ + :"1"(addr) \ + :); + +static inline uint8_t pgm_read_byte_inlined(const void* addr) { + register uint32_t res; + pgm_read_with_offset(addr, res); + return (uint8_t) res; /* This masks the lower byte from the returned word */ +} + +/* Although this says "word", it's actually 16 bit, i.e. half word on Xtensa */ +static inline uint16_t pgm_read_word_inlined(const void* addr) { + register uint32_t res; + pgm_read_with_offset(addr, res); + return (uint16_t) res; /* This masks the lower half-word from the returned word */ +} + +#define pgm_read_byte(addr) pgm_read_byte_inlined(addr) +#define pgm_read_word(addr) pgm_read_word_inlined(addr) +#ifdef __cplusplus + #define pgm_read_dword(addr) (*reinterpret_cast(addr)) + #define pgm_read_float(addr) (*reinterpret_cast(addr)) + #define pgm_read_ptr(addr) (*reinterpret_cast(addr)) +#else + #define pgm_read_dword(addr) (*(const uint32_t*)(addr)) + #define pgm_read_float(addr) (*(const float*)(addr)) + #define pgm_read_ptr(addr) (*(const void* const*)(addr)) +#endif + +#define pgm_read_byte_near(addr) pgm_read_byte(addr) +#define pgm_read_word_near(addr) pgm_read_word(addr) +#define pgm_read_dword_near(addr) pgm_read_dword(addr) +#define pgm_read_float_near(addr) pgm_read_float(addr) +#define pgm_read_ptr_near(addr) pgm_read_ptr(addr) +#define pgm_read_byte_far(addr) pgm_read_byte(addr) +#define pgm_read_word_far(addr) pgm_read_word(addr) +#define pgm_read_dword_far(addr) pgm_read_dword(addr) +#define pgm_read_float_far(addr) pgm_read_float(addr) +#define pgm_read_ptr_far(addr) pgm_read_ptr(addr) + +#define _SFR_BYTE(n) (n) + +#ifdef __PROG_TYPES_COMPAT__ + +typedef void prog_void; +typedef char prog_char; +typedef unsigned char prog_uchar; +typedef int8_t prog_int8_t; +typedef uint8_t prog_uint8_t; +typedef int16_t prog_int16_t; +typedef uint16_t prog_uint16_t; +typedef int32_t prog_int32_t; +typedef uint32_t prog_uint32_t; + +#endif // defined(__PROG_TYPES_COMPAT__) + +#ifdef __cplusplus +} +#endif + +#endif