From 83f5f29cfdaa85b5b8874e29cb342a662feebff3 Mon Sep 17 00:00:00 2001 From: twischer Date: Wed, 17 Feb 2021 17:25:52 +0100 Subject: [PATCH] Support to reboot into UART download mode (#7854) without any external wiring. This patch introduces the new method Esp.rebootIntoUartDownloadMode() When the user calls this method the ESP8266 reboots into the UART download mode. In this mode the user can use esptool.py to flash a new firmware file. The following command was used to test it: $ esptool.py --before no_reset --after soft_reset --chip esp8266 \ --port /dev/ttyUSB0 --baud 460800 write_flash 0x0 firmware.bin The implementation is based on the original implementation in the boot ROM. Some parts of the original implementation can be found in [1]. This patch is a squashed and simplified version of [2]. The non squashed version might be helpful in case of debugging issues. [1] https://github.com/twischer/xtensa-subjects/blob/master/reversed/bootrom.c [2] https://github.com/twischer/Arduino/tree/reboot_uart_download_full Signed-off-by: Timo Wischer --- cores/esp8266/Esp.cpp | 10 ++ cores/esp8266/Esp.h | 6 + cores/esp8266/esp8266_undocumented.h | 35 +++++ cores/esp8266/reboot_uart_dwnld.cpp | 151 ++++++++++++++++++++++ cores/esp8266/reboot_uart_dwnld.h | 23 ++++ tools/sdk/ld/eagle.rom.addr.v6.ld | 3 + tools/sdk/lib/NONOSDK221/libmain.a | Bin 210388 -> 210288 bytes tools/sdk/lib/NONOSDK22x_190313/libmain.a | Bin 217028 -> 217072 bytes tools/sdk/lib/NONOSDK22x_190703/libmain.a | Bin 217028 -> 217072 bytes tools/sdk/lib/NONOSDK22x_191024/libmain.a | Bin 218300 -> 218344 bytes tools/sdk/lib/NONOSDK22x_191105/libmain.a | Bin 218448 -> 218492 bytes tools/sdk/lib/NONOSDK22x_191122/libmain.a | Bin 218448 -> 218492 bytes tools/sdk/lib/NONOSDK3V0/libmain.a | Bin 214236 -> 214138 bytes tools/sdk/lib/fix_sdk_libs.sh | 18 +++ 14 files changed, 246 insertions(+) create mode 100644 cores/esp8266/reboot_uart_dwnld.cpp create mode 100644 cores/esp8266/reboot_uart_dwnld.h diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index e518755f6..4b031561a 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -31,6 +31,7 @@ #include "umm_malloc/umm_malloc.h" // #include "core_esp8266_vm.h" #include +#include "reboot_uart_dwnld.h" extern "C" { #include "user_interface.h" @@ -203,6 +204,15 @@ void EspClass::restart(void) esp_yield(); } +[[noreturn]] void EspClass::rebootIntoUartDownloadMode() +{ + wdtDisable(); + /* disable hardware watchdog */ + CLEAR_PERI_REG_MASK(PERIPHS_HW_WDT, 0x1); + + esp8266RebootIntoUartDownloadMode(); +} + uint16_t EspClass::getVcc(void) { esp8266::InterruptLock lock; diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 6d990e876..d96ec9b28 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -103,6 +103,12 @@ class EspClass { void reset(); void restart(); + /** + * @brief When calling this method the ESP8266 reboots into the UART download mode without + * the need of any external wiring. This is the same mode which can also be entered by + * pulling GPIO0=low, GPIO2=high, GPIO15=low and resetting the ESP8266. + */ + [[noreturn]] void rebootIntoUartDownloadMode(); uint16_t getVcc(); uint32_t getChipId(); diff --git a/cores/esp8266/esp8266_undocumented.h b/cores/esp8266/esp8266_undocumented.h index a19835218..9a21868b3 100644 --- a/cores/esp8266/esp8266_undocumented.h +++ b/cores/esp8266/esp8266_undocumented.h @@ -6,6 +6,21 @@ #ifdef __cplusplus extern "C" { #endif +#include +#include +#include + +#define PERIPHS_DPORT_18 (PERIPHS_DPORT_BASEADDR + 0x018) +#define PERIPHS_DPORT_ICACHE_ENABLE (PERIPHS_DPORT_BASEADDR + 0x024) +/* When enabled 16K IRAM starting at 0x4010C000 is unmapped */ +#define ICACHE_ENABLE_FIRST_16K BIT3 +/* When enabled 16K IRAM starting at 0x40108000 is unmapped */ +#define ICACHE_ENABLE_SECOND_16K BIT4 +#define PERIPHS_HW_WDT (0x60000900) +#define PERIPHS_I2C_48 (0x60000a00 + 0x348) + + +extern void (*user_start_fptr)(); #ifndef XCHAL_EXCCAUSE_NUM // from tools/xtensa-lx106-elf/include/xtensa/config/core.h:629:#define XCHAL_EXCCAUSE_NUM 64 @@ -19,6 +34,12 @@ extern int rom_i2c_readReg_Mask(int, int, int, int, int); extern int uart_baudrate_detect(int, int); +/* SDK/Flash contains also an implementation of this function + * but for reboot into UART download mode the version from ROM + * has to be used because flash is not accessible. + */ +extern void rom_uart_div_modify(uint8 uart_no, uint32 DivLatchValue); + /* ROM function, uart_buff_switch(), is used to switch printing between UART0 and UART1. It updates a structure that only controls a select group of print @@ -40,6 +61,10 @@ extern void uart_buff_switch(uint8_t); */ extern int ets_uart_printf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); +extern void user_uart_wait_tx_fifo_empty(uint32_t ch, uint32_t arg2); +extern void uartAttach(); +extern void Uart_Init(uint32_t uart_no); + extern void ets_delay_us(uint32_t us); #ifndef GDBSTUB_H @@ -206,6 +231,16 @@ extern fn_c_exception_handler_t _xtos_c_handler_table[XCHAL_EXCCAUSE_NUM]; extern fn_c_exception_handler_t _xtos_set_exception_handler(int cause, fn_c_exception_handler_t fn); #endif +extern uint32_t Wait_SPI_Idle(SpiFlashChip *fc); +extern void Cache_Read_Disable(); +extern int32_t system_func1(uint32_t); +extern void clockgate_watchdog(uint32_t); +extern void pm_open_rf(); +extern void ets_install_uart_printf(uint32_t uart_no); +extern void UartDwnLdProc(uint8_t* ram_addr, uint32_t size, void (**user_start_ptr)()); +extern int boot_from_flash(); +extern void ets_run() __attribute__((noreturn)); + #ifdef __cplusplus }; #endif diff --git a/cores/esp8266/reboot_uart_dwnld.cpp b/cores/esp8266/reboot_uart_dwnld.cpp new file mode 100644 index 000000000..dce4cf0ae --- /dev/null +++ b/cores/esp8266/reboot_uart_dwnld.cpp @@ -0,0 +1,151 @@ +/* + ESP8266-specific implementation of the UART download mode + Copyright (c) 2021 Timo Wischer + 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 + + This implementation is based on the original implementation of the ROM. + It was shortend to reduce the memory usage. The complete version and the + development history can be found in: + https://github.com/twischer/Arduino/tree/reboot_uart_download_full + This might be usefull in case of issues. + */ +#include "reboot_uart_dwnld.h" +#include +#include +#include + + +static inline uint32_t __rsil_1() { + uint32_t program_state; + asm volatile("rsil %0, 1" : "=r" (program_state)); + return program_state; +} + +static inline void __wsr_intenable(uint32_t interupt_enable) { + asm volatile("wsr.intenable %0" :: "r" (interupt_enable)); +} + +static inline void __wsr_litbase(uint32_t literal_base) { + asm volatile("wsr.litbase %0" :: "r" (literal_base)); +} + +static inline void __wsr_ps(uint32_t program_state) { + asm volatile("wsr.ps %0" :: "r" (program_state)); +} + +static inline void __wsr_vecbase(uint32_t vector_base) { + asm volatile("wsr.vecbase %0" :: "r" (vector_base)); +} + +[[noreturn]] void ICACHE_RAM_ATTR esp8266UartDownloadMode() +{ + /* reverse engineered from system_restart_core() */ + /* Before disabling instruction cache and restoring instruction RAM to a + * power-on like state, SPI bus must be idle. + */ + Wait_SPI_Idle(flashchip); + + Cache_Read_Disable(); + /* This will disable the 32kB instruction cache and extend the IRAM by 32kB. + * Therefore the full 64kB of IRAM will be available for boot. + * Cache_Read_Enable() sets those bits but Cache_Read_Disable() does not clear + * them. On hardware reset those bits are cleared. Therefore clear them also + * for this reboot. + */ + CLEAR_PERI_REG_MASK(PERIPHS_DPORT_ICACHE_ENABLE, + ICACHE_ENABLE_FIRST_16K | ICACHE_ENABLE_SECOND_16K); + + /* reverse engineered from _ResetHandler() */ + /* disable all level 1 interrupts */ + __wsr_intenable(0); + /* Clear the literal base to use an offset of 0 for + * Load 32-bit PC-Relative(L32R) instructions + */ + __wsr_litbase(0); + asm volatile("rsync"); + + /* Set interrupt vector base address to system ROM */ + __wsr_vecbase(0x40000000); + /* Set interrupt level to 1. Therefore disable interrupts of level 1. + * Above levels like level 2,... might still be active if available + * on ESP8266. + */ + __rsil_1(); + + /* reverse engineered from _start() */ + /* Set stack pointer to upper end of data RAM */ + const uint32_t stack_pointer = 0x40000000; + asm volatile("mov a1, %0" :: "r" (stack_pointer)); + + /* Set the program state register + * Name Value Description + * Interrupt level disable 0 enable all interrupt levels + * Exception mode 0 normal operation + * User vector mode 1 user vector mode, exceptions need to switch stacks + * Privilege level 0 Set to Ring 0 + */ + __wsr_ps(0x20); + asm volatile("rsync"); + + /* reverse engineered from main() */ + const uint32_t uart_no = 0; + uartAttach(); + Uart_Init(uart_no); + ets_install_uart_printf(uart_no); + + /* reverse engineered from boot_from_something() */ + const uint16_t divlatch = uart_baudrate_detect(uart_no, 0); + rom_uart_div_modify(uart_no, divlatch); + UartDwnLdProc((uint8_t*)0x3fffa000, 0x2000, &user_start_fptr); + + /* reverse engineered from main() */ + if (user_start_fptr == NULL) { + if (boot_from_flash() != 0) { + ets_printf("boot_from_flash() failed\n"); + while (true); + } + } + + if (user_start_fptr) { + user_start_fptr(); + } + + ets_printf("user code done\n"); + ets_run(); +} + +[[noreturn]] void esp8266RebootIntoUartDownloadMode() +{ + /* reverse engineered from system_restart_local() */ + if (system_func1(0x4) == -1) { + clockgate_watchdog(0); + SET_PERI_REG_MASK(PERIPHS_DPORT_18, 0xffff00ff); + pm_open_rf(); + } + + user_uart_wait_tx_fifo_empty(0, 0x7a120); + user_uart_wait_tx_fifo_empty(1, 0x7a120); + ets_intr_lock(); + SET_PERI_REG_MASK(PERIPHS_DPORT_18, 0x7500); + CLEAR_PERI_REG_MASK(PERIPHS_DPORT_18, 0x7500); + SET_PERI_REG_MASK(PERIPHS_I2C_48, 0x2); + CLEAR_PERI_REG_MASK(PERIPHS_I2C_48, 0x2); + + esp8266UartDownloadMode(); +} + diff --git a/cores/esp8266/reboot_uart_dwnld.h b/cores/esp8266/reboot_uart_dwnld.h new file mode 100644 index 000000000..531471e2a --- /dev/null +++ b/cores/esp8266/reboot_uart_dwnld.h @@ -0,0 +1,23 @@ +/* + ESP8266-specific implementation of the UART download mode + Copyright (c) 2021 Timo Wischer + 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 + +[[noreturn]] void esp8266RebootIntoUartDownloadMode(); diff --git a/tools/sdk/ld/eagle.rom.addr.v6.ld b/tools/sdk/ld/eagle.rom.addr.v6.ld index e2cff957a..005dc4472 100644 --- a/tools/sdk/ld/eagle.rom.addr.v6.ld +++ b/tools/sdk/ld/eagle.rom.addr.v6.ld @@ -99,6 +99,7 @@ PROVIDE ( aes_decrypt_init = 0x40008ea4 ); PROVIDE ( aes_unwrap = 0x40009410 ); PROVIDE ( base64_decode = 0x40009648 ); PROVIDE ( base64_encode = 0x400094fc ); +PROVIDE ( boot_from_flash = 0x40001308 ); PROVIDE ( bzero = 0x4000de84 ); PROVIDE ( cmd_parse = 0x40000814 ); PROVIDE ( conv_str_decimal = 0x40000b24 ); @@ -278,6 +279,7 @@ PROVIDE ( rom_stop_tx_tone = 0x4000698c ); PROVIDE ( rom_tx_mac_disable = 0x40006a98 ); PROVIDE ( rom_tx_mac_enable = 0x40006ad4 ); PROVIDE ( rom_txtone_linear_pwr = 0x40006a1c ); +PROVIDE ( rom_uart_div_modify = 0x400039d8 ); PROVIDE ( rom_write_rfpll_sdm = 0x400078dc ); PROVIDE ( roundup2 = 0x400031b4 ); PROVIDE ( rtc_enter_sleep = 0x40002870 ); @@ -353,5 +355,6 @@ PROVIDE ( Te0 = 0x3fffccf0 ); PROVIDE ( Td0 = 0x3fffd100 ); PROVIDE ( Td4s = 0x3fffd500); PROVIDE ( rcons = 0x3fffd0f0); +PROVIDE ( user_start_fptr = 0x3fffdcd0 ); PROVIDE ( UartDev = 0x3fffde10 ); PROVIDE ( flashchip = 0x3fffc714); diff --git a/tools/sdk/lib/NONOSDK221/libmain.a b/tools/sdk/lib/NONOSDK221/libmain.a index c0e70cafeff56d23a7cd048917a0a4309c133a88..adf747690b4c866d4d5fc4fd0afd284142f43f0c 100644 GIT binary patch delta 6605 zcmdUzdr*|u6~ONLa|9DL)vtIHk^%bfszEt(pL1&e#r~1R;4m|sNGPwi6iR}*!#T`k& zA2t_vB7y(+`F9`6Q|`a4RqnQTmHTu|sGhG^ZmE|$l>1uIf2d7#R<2sOZ0@4(JvBe8Ie*|Bw|mSOt084{^RX1)uAyN^N>*kj=Sk21IXT%r--MhA zV|~`(LFq~A9*&d!(y# zv}i^br&(nmZ0^xy4^(QZ-NtodQmW%=HPQ|@_GoabBB^oKN1aKrc^rk6XcDZ36KPSq z;*{EH-6&478fSQ-DhDa`l9jb5sX6Y_v79d(i>%CvcT*EpwE8Q*$yD(v{3*Xq@ksP9pj_%OJSMWRV#TvAGK(@AP7xjsCo^h^ zJd4AJ41I~gvkm@kI1k0iif{qE#^4Rs>yM@-{K}9vTjw54^B*;&=izEL$9bLHO*lDI zsZE+=Sb*2zLz;bX0oCcuM4p`@ot+9VpibmjI$PFT?^pAB3)B*L7xg>3!CFJV2~H-# zQCh#l(C;z$ZFm)(m|)vSsP}v6nZ9$q1oRFrAb^O6kZ~l>PLUoBG;M_k-G==EgO3}08ummfRY7~d zIJj&Wd=7W}l-jEU#1niq4N^5{$o9}hMq~n9kNz&6#a{`00Z!Ar2#)EaRGsEEa4uVt zqrh)B*n%K{0f(5)O=7^Axs!Plhkt^*1}n8#>)YY0?8j-EJK!oDdNs!pyc%}4?EP>( zoUZi`!vW5KRkD30z&r#;F_3dW_*u9EZqU3P&Y*jBhH);U`N!z&ORRj?}OX4z3geH$cRmbt9f@85A!PRM@9^Hl;!?-_ZbSwOIoxpH- zluxPOXfBd7To)OE`3A4-#mxU21p5XnH3DPlVGX?WYoP?>qP;eZkHUN57HxkSu3-hg zqS>A+o~1|viOgLA&e;Bi{N1hJHHSjXuqJ|1UHQo`cI6?^m^ht%g1z4$wQ7)cuD32)sI5sX4m+6*z}-p8~TlKJ$mOxRBz~8VgE@C9@7qv7zXVI-+*U6#9^iFqqr@dfthAI zfdTMPUWKe%o6}*ZNCzH)E6~s8SrRVy_VhnE0)@sJSV@C!8hoxBtT!CKV(_mGZZ-HY zeEs3jlwXwlUmX{Q6*@qN(IA4cJIlV!(rZHQd){dw2N|#rzE8KG3>Uy@nxB9xU^b53 z;}viK=JjFoIzIxZ$PjIZ+c0nz<$m}q?7Tcagu7sw85zRcu%|Gz>IZXV4uvtX^%G#H z*lP%0h2B{+{>6sDPv8w<1`US(0Nfa+kCe=GkpLIa?+eqr4gGNVB>HS@>40BNM&O+u z8j^3rd9W-6>7iUe1MnoxFT+l;M-1*p?<~UIaI4$d=Mic@Tw26EK(~JnJ`CsBJTh8+ zjKC@4@E>qwap;yB#eOUogW4PKx$-ABwHmB7U z`l?uSm_wM`vi()D_G+su^jWd%7+)2BCMrHF*1q^#*XD$LNs@ADu1js;j~P#G)?2R7 zhs8?18;#0GjETHIBdNg;i)-t6WaZl*7W=PlV<r(uJk3l+`dJDXNZ7NcKm@mij~P H?B)Lg@lh{& delta 6588 zcmdUzdvMg%701tSlaL1~h7d@?qgfOIl}CbM2@oXGv=u5Zg%~?1R1zj=8e&Nu9I;D_ zw$-s1U8YMVXjIy!2#5{SO~+W{h%pt~Nie03g@}@Ap~aGEBaNN(@j1V}zwC1VsQ%#$ z(=++)-p~1-d+z)G7W)32-u;*K`rP2`g1NJb0&`}~@%!`rYVn_bf1q$~)Zt&3CL)6( zx#vI2Cn)kv>8E?%I4NR3z3C#K;&Db4%g{5nL!6-}7!Q}B931M&WoVqXgR!Z&EFB2O zt;OZ&!2k35``R1DceGc0T~oz(qB{1xmnc4c{#Y))^N0TDGv$*4j2`-W*@oul5}(g( zz9oB&FF|I`484>)z4=tGfB&SoD`a;5EUu7Q?v+uHpC1Sm`u%ePfg*pXVCU+#rxYrogby7o*c>1CTwKr{r4Xa)m}_V zZOarHNLJ6cKZu}4t!1ppO>W%cGYdz1UKuCS?;{q+i13YX`Nk#9qxBzzzxI~zs?@g6 ziPWNIhF&|9mz19&vM=N;8x?Lm>6;Pm>Gk=;JF=aO@In1pmhJe%Gfw$3Li?6ygx+1A z(R^jseOEO5dw&!7q>&fo&n*muM~-u*Uy&<^3XUZv%yTjSDAo{ zaOdm3@$M|_JSI|+6rF{<@c1LXT6Zc2xaO)A@uA%wpUGK^R;A7sb_o99{uy1DgLCihdp){YXg-%6_FPf_NbGQ@q9H5VI3G9_6O3Cy9aIhA!Vo@EGcvne== z@LbJzCMzDeBtYawi_74gY>ka3thMy57C&O~&UmJMc{<(!zhLn%Ek0s#x5cL|K5OyE zaa^gJdN>EGo~_#g`2_&muxeY>SMUc#*O!Al$>t?*9vYPs7$vK)m=IcRz| zbO!!l#eZn=zb#H6R|Z#4m8qYp=fGHo?zHhZ2K^$3DQg4s;jL7dV0d+W1$-57Bl>Wo zZ-r08d4@x9$}kbGBsbp+a1n>K*l-8jgwBO8L2dAq25{BwW8IYd;em-F8%>2_BtOeZ zU2J$FyoH2WhUdcduy>emg&W~1M*jxf#O+XL_;L6cIu}IHZSX}L{WzXA0mtB}3{S5$ z?NATg0v}{umHXh%5sb)mco?J6^R&;6PY^%snQr2Iix&(r^REH74mqN{&f+?_l!LXL zSna?LOaHOOhv81*pEvRC@D|<)Y$Lb+8F&|*rR%Q=_0Kcy&?xwjzC(gJX2@jp+cU!S(3Z zP*!~b+y>7yyb>PBV*R}Yl~#hyaD%(vnjk^8!&wBg>~6wca21?l_Q21r`mb8tVR5(1 zI{%pVxW@`OZ}EV|32a!;w0^q9Iq=~zB5Tof2Bus3BDg5XE33o=tj4i5{uKuAguQeA z5ZnrPn)oMS&$I)(;d)-G+D~opMYsXxu(

yceEixCah);FxS2|HLr>R~yde%x=jQ zSz>r5?3p%L0;haQ4{@}Cm6m=7{0{X?jb3Nz!8EG+xrV$R?;@ZWzRgs4$*Rx_H=%n8 zyDhy3&f*vA1E&5zEIm=D(wGil#BjQvF)P-Ad;)fo!26l93~qwG4pzbC9AfWXu+2)i z!{TQxZnpT1pyhZQ9;AWU^iJ3C9K4Db!M6KEYFi6YlhCSOpJnCt4RVjY+O zZ;Rsv@L@O-tsrIaPPXum4BrcTrVVU|OUcebaXY*lUKhtN!&_i3KlEU-{2oU=4(}$s z2sgpkn*{0HIEB~IL37bur8kfp;* zowYL!`~)uNp4@E`{tEU?8$51tkHr@)PQAjb9lhwX;I;x0nvA~x3vu-0;IeW@PzL)s z6*m~Jwi0Zycn4fhe5Hv$Wa+K&AUfN~&3_`M2i>c;A4fU!{geq9p~Ez$#auoH(Y+t3 zGc0``ytPo|4q|l)ZiA@Z1VNvjSeT_+9w>G@$*|2L5X4`g6Du-TOf^68207a1GpzzM8VupQpMz z|9oq}605>p@TxCxTbT;?!SBE|2+2S@m1sD)co*@3Qn>*lXYIz&RX) zRJdR&I64$#+QBOxPB^KFDX;DF%=Vb92yCXe7qT*`S5KXKG44sA+46WM;uxjJcd zMP+5}+RfGOXJy^mO|^9!H`PRb+U0C?A|D@je&|c8s9ImUIsDoQXH;A2`>BYDNtYRgcMxJoSN-;6(PHaZ=uk6u0{dH~kl43@|qU diff --git a/tools/sdk/lib/NONOSDK22x_190313/libmain.a b/tools/sdk/lib/NONOSDK22x_190313/libmain.a index a19b330c106e7d3af624db0cbce96b850b1ccb83..66403108294655fd464ab1347be5f3d28a62b3cb 100644 GIT binary patch delta 1345 zcmX>ypZCLj-U*WRW`;(FhGyobrV0uM3LtXG7N zARI8%M3bAW7?HMl9?N1O zp5n^llGNPzw9>p}!_5xju}n<*`jZz*>TW(Od18ksQjub4U;r#nK;-6Cm-wSqu}Xmz zn3M>5<$jJ)K-yy(qhhh7~`;0siC>C#@`<=1+3FD3Fl6RQO z8IMe#c!$ZK@y_&zAnMI@!@EE#WqKo!V&X`ce(5fgAEVB6#d|=}fa!%G>dN$kAj)LA z;C-g~j8mp>ybt6lOlN$+q|GQWUH1W#GTV`j3=BdNlh1unV)a?c$S`O6Mt^4E?Gqj_ HndAci%jjB( delta 1306 zcmew`pZCao-U*WRrlv+F=4K`)MhXfB3LtGw zgT!N)m>Kl-CvTM0-F#Q_#12uUBE-_b#8^SW(7?oO^R7$$(W+RbKne`Z%uIl^p`nqv z*<`-nf0oeMVM^?I*u8RzG3fGu`zLQ#s>`>3i=m`7<7v&U+U~U6>vV zqCBRr1yW3J;-~++%jCx>Fx~eaP}F4lToAQm`dbhsG2Qk)(|pE?>38n~c`Va)A24Zi lGKexTXaS2d*~y8Qq*=FYWME*O-uQq?nbBbT(g#f5`2fsVKP3PF diff --git a/tools/sdk/lib/NONOSDK22x_190703/libmain.a b/tools/sdk/lib/NONOSDK22x_190703/libmain.a index 1213ceb8fd38a13dc40a2559d4a4aac36b871445..cd5fd1e8452150d1b4593f6e9846bdf6c472c6c9 100644 GIT binary patch delta 1345 zcmX>ypZCLj-U*WRW`;(FhGym_W(o=h3LtSVoUFk79Re(O7`9Km&&VTzV)6F5-x;f)Fy5Fhd55W- z@yPUvcbNPc?@WIPqTWn5ybGjKrZ)m9CXR&Zm+mt8G3rcLyayBwm|h5?u1r4&qD-a> z-e;Q6IA!|A`#_$;bjAlv+Kd9zbssP(vmM#Uz#t?s`P>I3R-cuO40EP$^k){{KH&kA GNj?C}iarV0uM3LtGw zgT!N)m>Kl-CvTM0-F#Q_#12uUBE-_b#8^SW(7?oO^R7$$(W+RbKne`Z%uIl^p`nqv z*<`-nf0oeMVM^?I*u8RzG3fGu`zLQ#s>`>3i=m`7<7v&U+U~U6>vV zqCBRr1yW3J;-~++%jCx>Fx~eaP}F4lToAQm`dbhsG2Qk)(|pE?>38n~c`Va)A24Zi lGKexTXaS2d*~y8Qq*=FYWME*O-uQq?nbBbT(g#f5`2ee~KNbK0 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libmain.a b/tools/sdk/lib/NONOSDK22x_191024/libmain.a index 58779578adcd34c504189184c52bb4fb8b4d969f..cd01e1a36520be4dc6ae84472ba08645af11469f 100644 GIT binary patch delta 1340 zcmdn9lJ~_*-U*WRW`;(FhGyo*CJG7$3Lth`F0LMll42*DGkIWeWc0JrB17JDO?s`N}42T2jk>X+? z95B@5pXuoq2Bud(7??iTFfe^>K;VB83`{`G%$mc%%zXqW*2X7^Cb!vwg;SWPxU#q; zH8(!3G%wk3vx9gn6O+FF=i{SP7DnUfMp4Y-0XIpKUx*56j*_o8L;#* zG&D4}G@HC{gBqjD_Ju}_n>TW@N-!{l081T)?Y>VKc_dJ*-X8gfar+a-AJYXNGL4HX#GAtVz7=)(#K4ns7T(Q0IDU)|T09;BHuK)l5 delta 1293 zcmaE{l6TKa-U*WRrshV5MrKBa<_Zc13LtupDT2Jt8Ou!~yk4aWN1M z7|QX_^t6M4>D3tqrVj!POkYC~`0pDACLm^JbzorTo`Dyu6H)+`-)zIeDZDvIJcfyx zL0^CJMoHbxcO_HyiXs&smIfxq3JQh>CT5$%uJcE$VwD0ZFfcPS0n&zs#%31N^@mg!p`GWj#gOlN%rq;#f-f~Y0amx3sd z>0d!q&UDwuKx)GDsUS*Z`cn{9GTrnE(|pD&)2}`O@)D-2K4sEoWSAcKlu4QG%0>nT TR*A_~UzHepw$FXab! diff --git a/tools/sdk/lib/NONOSDK22x_191105/libmain.a b/tools/sdk/lib/NONOSDK22x_191105/libmain.a index 2bc98579331c2ee46b099bf50fe5d3d612f8be50..0f66ab6b02627435bf70d53eaf3825280cc530f9 100644 GIT binary patch delta 1350 zcmcbxiucbd-U*WRW`;(FhGyo5CJG7$3Lth`F0LMll42*DGkIWeWc0JrB17JDO?s`N}42T2jk>X+? z95B@5pXr$g1Jmms2Br@e7?{3^An?C63`{`G%*MdL%oBkVYvYqdliO^;!YRyCTv=R_ znj4>1nwM<2*+D#(iAi67@R&h(`ZnaUX_ zOqYGcupDT2Jt8Ou!~yk4aWN1M z7|QX_^h}0<>2(4F(}yJtOkZCh@V^EICLm^Jy~4oEqk|W#6H)+`-)zIeDZDvIJcfyx zL0^CJMoHbxcO_HyiXs&smIfxq3JQh>CT5$%uJcE$VwD0ZFfcPS0n&zsriNyd&uvg+ z+_Qb75##fX+gChcWR=*y^ADr=Q$~U57auZ}GnP#Ee8l9>*fV`5h?+C~C5RH4ZuuBU z?U>#PqV7z;38EOLYd!%|Ez>K36w{N$>8GAB&0}<#p7|6gdSUv`r%c+M45ADSTEJpV ecDkYwqckhWCI$x9>AcUFlo=Ja8$M(5&IbTBF7=K8 diff --git a/tools/sdk/lib/NONOSDK22x_191122/libmain.a b/tools/sdk/lib/NONOSDK22x_191122/libmain.a index 77b7de1b96a2a0b3f5044dce113bad6f9da47e6a..260be180beca494b5587159e49d6a8822fd3e6fd 100644 GIT binary patch delta 1350 zcmcbxiucbd-U*WRW`;(FhGu4#W(o=h3Lth0G0#ou15sLfHgXzy!q1Yzz#{JP|mtHa$d>y?+?RpEBx9U;2=#oN>Z* z*+)$Nj4P(+f~XzS_kt*c>Aa7D)RpP6AnM2TwIE7n`d<*WV7l)UCVwV|r0MgXFwJ93 zm~Q(NDEel4?^7miP61H{1}&hqveN~P7^PVyHZd>=O@H{5NtxAV6(hr($sfN6ZupDT2Jt8Ou!~yk4aWN1M z7|QX_^h}0<>2(4F(}yJtOkZCh@V^EICLm^Jy~4oEqk|W#6H)+`-)zIeDZDvIJcfyx zL0^CJMoHbxcO_HyiXs&smIfxq3JQh>CT5$%uJcE$VwD0ZFfcPS0n&zsriNyd&uvg+ z+_Qb75##fX+gChcWR=*y^ADr=Q$~U57auZ}GnP#Ee8l9>*fV`5h?+C~C5RH4ZuuBU z?U>#PqV7z;38EOLYd!%|Ez>K36w{N$>8GAB&0}<#p7|6gdSUv`r%c+M45ADSTEJpV ecDkYwqckhWCI$x9>AcUFlo=Ja8$M(5&IbS+LG^+F diff --git a/tools/sdk/lib/NONOSDK3V0/libmain.a b/tools/sdk/lib/NONOSDK3V0/libmain.a index e93201c52022db2c4bb50500fd6d36e62fca7bb8..fb5242f1be7e37b6ba39e30d448f1c172ef78818 100644 GIT binary patch delta 6737 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