From 32bd42b0281237d29e18bb769afad02bc6782a64 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 6 Jun 2016 14:37:39 +0800 Subject: [PATCH] Store git version of the core in the compiled binary (#2099) * Store git version of the core in the compiled binary * Don't update version number when using boards manager package --- bootloaders/eboot/eboot.c | 17 +++++++++++++++++ bootloaders/eboot/eboot.elf | Bin 9839 -> 10352 bytes cores/esp8266/Esp.cpp | 13 +++++++++++++ cores/esp8266/Esp.h | 1 + cores/esp8266/core_esp8266_main.cpp | 13 +++++++++++++ cores/esp8266/core_version.h | 6 ++++++ package/build_boards_manager_package.sh | 14 +++++++++++--- platform.txt | 8 +++++++- tools/sdk/ld/eagle.app.v6.common.ld | 1 + 9 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 cores/esp8266/core_version.h diff --git a/bootloaders/eboot/eboot.c b/bootloaders/eboot/eboot.c index f53d3c9125..69bc692e97 100644 --- a/bootloaders/eboot/eboot.c +++ b/bootloaders/eboot/eboot.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "flash.h" #include "eboot_command.h" @@ -17,6 +18,20 @@ extern void ets_wdt_enable(void); extern void ets_wdt_disable(void); +int print_version(const uint32_t flash_addr) +{ + uint32_t ver; + if (SPIRead(flash_addr + APP_START_OFFSET + sizeof(image_header_t) + sizeof(section_header_t), &ver, sizeof(ver))) { + return 1; + } + const char* __attribute__ ((aligned (4))) fmtt = "v%08x\n\0\0"; + uint32_t fmt[2]; + fmt[0] = ((uint32_t*) fmtt)[0]; + fmt[1] = ((uint32_t*) fmtt)[1]; + ets_printf((const char*) fmt, ver); + return 0; +} + int load_app_from_flash_raw(const uint32_t flash_addr) { image_header_t image_header; @@ -114,6 +129,8 @@ void main() { int res = 9; struct eboot_command cmd; + + print_version(0); if (eboot_command_read(&cmd) == 0) { // valid command was passed via RTC_MEM diff --git a/bootloaders/eboot/eboot.elf b/bootloaders/eboot/eboot.elf index aa61b97f02ff5a2a8444a08fc5e81495fe8b7727..1ccbe25fc312cfa70690fa91a8737c38c2aa678f 100755 GIT binary patch delta 4370 zcmZWsdvH|M89(Pf_L1G}-s~nDLN;u2^G3*qfU-(-mkbCDQI>}@!6Gs41`xS9?)|v;T>8N|Wz(M;sU?iD?z+6WFEXSvMt}SmxBuNPacgZPpVpcTgR%6i zk&3QmsS`~sRV)^h#bPj3%o&9H&w%|Yq5WqMyG{hk)qtMIMlvR`9t_owY~Bsiv;g*|*TN!#MvLL1CNhTlM( zSs3RV33NZk*AwMwX_QQ?>xt|4e28h{*GWmxe6^FWCg^{RUu%g@>_hxq+>C4J0fChj zW??5!lF}?>`PH`dGHIRE|AA;`VURB+9vxmTyu-Pa9Lte4X*lkny5Q%FLPrg`#%xz}XX5rUCZ8c}G5QnZ#~)j(s4~8r`8jJM zA)dZ-M(R3o)D@$h$_|US^;UjR=&rbnHnhscRjv;G2vh|z;%ameN?Z^RyG#lDE{K<1 zrkA9zUocWPQy{5mn-u}~yxdzVV^}*p8h;us--#xySlzCIk{(6VhexNFs=04Psi=zk z9tc(L@`2O#pi$=cN{PoS_4?bSc!E6FFCc|SKSBzRdpi+Le@PPeGdxGEdnd8n69Uoi zgT2e6R-FcQZz4s6Vl(%RgsTa2cQsmdE@8#pLwFux)!j;M{f%ffrgf4-!$B~J*QA4U z-$nXn(la+UJyUZnw(<9fYke23=M*e8tzsdFH;IOORm=x1O^}uK0PfXlc2G3RPMd2* zt0!D*Q0xAH+9;WL+)u(@t0SA;%tz!-i2Zj0L|OT98b7aU1}9e;luw_ALEv*Vyo#Wb zzd5*TaDwq_@>cSja56zxdq(Qg!EGZ`j7Q&_%C0#p zKR||!&FG&U#s)hJ%BQE1tkrd+-L>&^QZ&7W92^)@V5{fX~g3lR^BTr--eiSF&2|c7cGdA%l8?yC_G_x*lV1p#IB-Dl>BOF zRIcbCp&tLZN6&%g$$u-wyuR#Mz#ahn3P#(b;A^%*|mwh^c1U(6Y2 z0djmh1yS=WT!u;NA<90;weLiO_B<&81J(6R-<=|JswdzjkkaDreI`Y_S zRVC1LaAFYCwU2UE^Z(fs%#36iznk`zntyjs^-Cz<9Od)?!cYKqB`w?bSV;$(hF7ka4P>~mM@OTRH_rNGtL913lFGU=M z%Ys%ESCY~q7YTvwN&me2x8|Z_pWM05P5+@eoOfKVyC~={dzK+MOjrj`);OJX z*Wi?akcETHhfW!*^zjNFav@h43%bZ92hybGJlq4XYRis#6-9q^CKXu3m(mI7TsR1d z^AR)1&R~~Y_Yx*y@QkEsI|%AZQ|d-$!?0IR&iDF`mhPOH;h*C zx@D_NiL0b7lUPBkdIM~x&xr6E+`;e*p;f$=ZNS3f-innml34L@H2|w#KU(h9WUJ4- zSMea{g_&L9Yq^Hwc}l!l*(koKT>hj!%8+CD4|CBgTwWa*F(aGWM zql4M{%+SDu_@L?XeB-}?z(>_Mf&y--kglr>#8AdE&scmXiUUje2ggq)8#Ha70JPh!%{g+yv^S`OXG@$3S3*V!{Snw1*)ia&ZMlMTEn?$2!1Xpx z00YthayWu51$98DudR@HE*O$eIC2~JfKtcLL+&ic3ney$osD+fkz*<8U6>A9iupe& z$HLOiB&G|Lg0|Uj=Ct;N>5ZHmdS}I(bKek;)K)1&y7*nKsdwYddr+LNZFHS*W4T;H ziJE#G8*_(PUKbYKQA7EKA+C?M=%+D-X~CmmaUg2w?UI~Oja80V{sWbJ*Q3OAgirsaFelSMe=Ia{uCgj#T^Fp1Q=dyOz2K%Il z#90vEsvwN`YeAjw4dT-zrv)Pleg|l8i9fw`IU^4-&h7(W>Q67%A6~{%AkzO)Tm~fp zIC~t5?5x-j>j;(loq~AttavE4M;V$Gq55kS+`k*@I}`}_flJSdSL-_(=nEW{GV}~) zesc-`C-4PP(GXiidu0?>l%R&~?Yw{ykMkMNxg@nTz$o~`VxS?G+fouM11WvwJ65CM z3-L?*UEhlG6Y!Ks@0IzABNfrtz}}}R?)3!-NaZ`l9EZ4Ce8cKdp7Yj zOYhz9eCNC8o_p`P_jz{kX8)=BMe#4)@w*vgxy1$j3E!;37(FT&UV1L5qPNLc7*y(u z#bT^jbj6E#cN}zRB3hF1voQm4#g=^bS`z(-E^v z`hYbYTXv-wTCUhVrt!OCXvPlmawYkJkfaWNQFKb}{8wU&bRRz_&Pd-vlHq7~j0*~H zzG;wS)vS9c9NZY=CraaXU9=Mw1$A6>%39I0 z@jV3XFYw(ab?FHTuSXRfd7017s_*jdm zrx=nF4oj;>=*lgz(xMx1{+8Hd(W{6}A;w;jumlaqg?aG{OCY~VW(*aDpTaNW&ATPW zWIX+|?)Xi#^pg}dJ(gp#VtE{8Crg&IAZ4x{L!&fI zs?SkJtL0%ds#UIi9jw+Ru{@J~)Rk#z64Vjq+8uby4TL3aC*c5LS&PxTnHYsB>#0La z76t;geTG&$L;fY?XWA0N?IkU#14dp{?`Z-xs zR`hdx#4&$fLs%;8b-qR(AFYg37<7$ivW(YJNU0EaWycv`M+V>Q8c#C5-oRVjM-cI6 zpq(@~9yI0a+($wGi0Dm3x6wi@+;Iyg!l%ws*55W9W{^Qg4>`VRT3a0?=L4p--5DV3L9*n+`MmQjl5VFMa$%k3 zTtVLa4r9#1D|zS3Ga^cfSS8_DPc#d{jE_^mwvkS+?1|LJo*LG6h!%MLL%*R+w8op}a#TCAiD-YKe z;FbU9a{mD?%Cj8J?7`SknX-RQH`nWdCgjvCf>?+ILf5%hGX8DC|F7-Y<)kh=Ch z>ez!DvE3QZd%4ZF+P22Vy;wa5lbvMrdAm_M7KO{s1+O&>Z=-{;D)0aBi#YG|Qg>Sm z>+?p@(H`M3zZogy@AFo3j~1_gdaa*C4)yjJbn+zU-Qq9KrU4r#71pdBF;MnKDEPe# zp>Bsk0h@A)SGyqS^Y-{r-?a21;%uCG)U}MSs=V0Yz(s{Y*#N5B{0@|BlzjAinO2a! zC_Z(E#OK~V(O11%qZo3{%&)6`+^=Hed6frmsmjDo6N@iA>-`qPE8{I!*$k|h@0ka@ zr#SDK`D@JvF5)4-i27QTgPBB14EQ!U4vl5g`^Sb;&B+6a2{GmCa%6{-xpZc1C_R=M zepGzq+b!aC_lPI!?%bU|GMqa+KFkhg#`ZTGFZx(z6RFe$%O1!~(YZYaMJ>zB^%XlT<}CGVH1adv3x8G4f(Bja=@q=rsJV|8jZmdroABk*$SR;nSTSg z7Pqz``YjA+sl!!Z+GgrJ4~)hLN*Fa^@D|+T_=o8QZOaszQj>Z_6@CU%ecjJCRjT=d?0R}WQ!Lt4>kpBXC9dW#(G3b^)X%LZMyLzdK zv2n2@*sAtmNtVwX4O+M~J1>qm2dH_eIiQy_ceA--4#}5i^}=T*rH>J%>M7dj_M2cHPV-E3^x+GF0;t(zkHP890bkCoqn_wHhdO(Y%>b0MGjdic)&0@`@~(*OVf diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 0ea0fef1dd..cd0786a08f 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -158,6 +158,19 @@ uint32_t EspClass::getChipId(void) return system_get_chip_id(); } +extern "C" uint32_t core_version; +extern "C" const char* core_release; + +String EspClass::getCoreVersion() +{ + if (core_release != NULL) { + return String(core_release); + } + char buf[12]; + snprintf(buf, sizeof(buf), "%08x", core_version); + return String(buf); +} + const char * EspClass::getSdkVersion(void) { return system_get_sdk_version(); diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 83f4b1b73d..c506a525f1 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -106,6 +106,7 @@ class EspClass { uint32_t getChipId(); const char * getSdkVersion(); + String getCoreVersion(); uint8_t getBootVersion(); uint8_t getBootMode(); diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index f63fe24f52..634eb7902b 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -31,6 +31,8 @@ extern "C" { #include "user_interface.h" #include "cont.h" } +#include + #define LOOP_TASK_PRIORITY 1 #define LOOP_QUEUE_SIZE 1 @@ -38,6 +40,16 @@ extern "C" { struct rst_info resetInfo; +extern "C" { +extern const uint32_t __attribute__((section(".ver_number"))) core_version = ARDUINO_ESP8266_GIT_VER; +const char* core_release = +#ifdef ARDUINO_ESP8266_RELEASE + ARDUINO_ESP8266_RELEASE; +#else + NULL; +#endif +} // extern "C" + int atexit(void (*func)()) { return 0; } @@ -134,6 +146,7 @@ void init_done() { system_set_os_print(1); gdb_init(); do_global_ctors(); + printf("\n%08x\n", core_version); esp_schedule(); } diff --git a/cores/esp8266/core_version.h b/cores/esp8266/core_version.h new file mode 100644 index 0000000000..09e384c1fd --- /dev/null +++ b/cores/esp8266/core_version.h @@ -0,0 +1,6 @@ +#define ARDUINO_ESP8266_GIT_VER 0x00000000 + +// ARDUINO_ESP8266_RELEASE is defined for released versions as a string containing the version name, i.e. "2_3_0_RC1" +// ARDUINO_ESP8266_RELEASE is used in the core internally. Please use ESP.getCoreVersion() function instead. + +// ARDUINO_ESP8266_RELEASE_ are defined for releases, for use in #ifdef... constructs diff --git a/package/build_boards_manager_package.sh b/package/build_boards_manager_package.sh index f713b1c692..8859603d80 100755 --- a/package/build_boards_manager_package.sh +++ b/package/build_boards_manager_package.sh @@ -46,8 +46,8 @@ rm exclude.txt # Get additional libraries (TODO: add them as git submodule or subtree?) -# SoftwareSerial version 2.2 -wget -q -O SoftwareSerial.zip https://github.com/plerup/espsoftwareserial/archive/097712eb07f5b3a70ef419b6e7a7ed2ada5aab85.zip +# SoftwareSerial library +wget -q -O SoftwareSerial.zip https://github.com/plerup/espsoftwareserial/archive/3.1.0.zip unzip -q SoftwareSerial.zip rm -rf SoftwareSerial.zip mv espsoftwareserial-* SoftwareSerial @@ -66,9 +66,17 @@ cat $srcdir/platform.txt | \ $SED 's/runtime.tools.xtensa-lx106-elf-gcc.path={runtime.platform.path}\/tools\/xtensa-lx106-elf//g' | \ $SED 's/runtime.tools.esptool.path={runtime.platform.path}\/tools\/esptool//g' | \ $SED 's/tools.esptool.path={runtime.platform.path}\/tools\/esptool/tools.esptool.path=\{runtime.tools.esptool.path\}/g' | \ -$SED 's/tools.mkspiffs.path={runtime.platform.path}\/tools\/mkspiffs/tools.mkspiffs.path=\{runtime.tools.mkspiffs.path\}/g' \ +$SED 's/tools.mkspiffs.path={runtime.platform.path}\/tools\/mkspiffs/tools.mkspiffs.path=\{runtime.tools.mkspiffs.path\}/g' |\ +$SED 's/recipe.hooks.core.prebuild.1.pattern.*//g' \ > $outdir/platform.txt +# Put core version and short hash of git version into core_version.h +ver_define=`echo $ver | tr "[:lower:].-" "[:upper:]_"` +echo Ver define: $ver_define +echo \#define ARDUINO_ESP8266_GIT_VER 0x`git rev-parse --short=8 HEAD 2>/dev/null` >$outdir/cores/esp8266/core_version.h +echo \#define ARDUINO_ESP8266_RELEASE_$ver_define >>$outdir/cores/esp8266/core_version.h +echo \#define ARDUINO_ESP8266_RELEASE \"$ver_define\" >>$outdir/cores/esp8266/core_version.h + # Zip the package pushd package/versions/$ver echo "Making $package_name.zip" diff --git a/platform.txt b/platform.txt index d1bce473ad..209a4c8c3d 100644 --- a/platform.txt +++ b/platform.txt @@ -22,7 +22,7 @@ build.lwip_flags=-DLWIP_OPEN_SRC compiler.path={runtime.tools.xtensa-lx106-elf-gcc.path}/bin/ compiler.sdk.path={runtime.platform.path}/tools/sdk -compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/lwip/include" +compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/lwip/include" "-I{build.path}/core" compiler.c.cmd=xtensa-lx106-elf-gcc compiler.c.flags=-c {compiler.warning_flags} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections @@ -63,6 +63,12 @@ compiler.ar.extra_flags= compiler.objcopy.eep.extra_flags= compiler.elf2hex.extra_flags= +## generate file with git version number +## needs bash, git, and echo +recipe.hooks.core.prebuild.1.pattern=bash -c "mkdir -p {build.path}/core && echo \#define ARDUINO_ESP8266_GIT_VER 0x`git --git-dir {runtime.platform.path}/.git rev-parse --short=8 HEAD 2>/dev/null || echo ffffffff` >{build.path}/core/core_version.h" +## windows-compatible version may be added later +recipe.hooks.core.prebuild.1.pattern.windows= + ## Compile c files recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" diff --git a/tools/sdk/ld/eagle.app.v6.common.ld b/tools/sdk/ld/eagle.app.v6.common.ld index 90d9fc18ce..ac03c8987b 100644 --- a/tools/sdk/ld/eagle.app.v6.common.ld +++ b/tools/sdk/ld/eagle.app.v6.common.ld @@ -152,6 +152,7 @@ SECTIONS .irom0.text : ALIGN(4) { _irom0_text_start = ABSOLUTE(.); + *(.ver_number) *.c.o( EXCLUDE_FILE (umm_malloc.c.o) .literal*, \ EXCLUDE_FILE (umm_malloc.c.o) .text*) *.cpp.o(.literal*, .text*)