From caf4e690c87b4910ac41f818f0982ffb0212c7ec Mon Sep 17 00:00:00 2001 From: mikee47 Date: Wed, 10 Mar 2021 17:18:44 +0000 Subject: [PATCH] Fork rboot with sming branch, add partition table support --- .gitmodules | 2 +- Sming/Components/rboot/.patches/rboot.patch | 402 ------------------ .../rboot/.patches/rboot/README.rst | 349 --------------- Sming/Components/rboot/rboot | 2 +- 4 files changed, 2 insertions(+), 753 deletions(-) delete mode 100644 Sming/Components/rboot/.patches/rboot.patch delete mode 100644 Sming/Components/rboot/.patches/rboot/README.rst diff --git a/.gitmodules b/.gitmodules index 84a5e304aa..85003018ee 100644 --- a/.gitmodules +++ b/.gitmodules @@ -63,7 +63,7 @@ ignore = dirty [submodule "rboot"] path = Sming/Components/rboot/rboot - url = https://github.com/raburton/rboot.git + url = https://github.com/mikee47/rboot ignore = dirty [submodule "spiffs"] path = Sming/Components/spiffs/spiffs diff --git a/Sming/Components/rboot/.patches/rboot.patch b/Sming/Components/rboot/.patches/rboot.patch deleted file mode 100644 index b8cd1ce078..0000000000 --- a/Sming/Components/rboot/.patches/rboot.patch +++ /dev/null @@ -1,402 +0,0 @@ -diff --git a/Makefile b/Makefile -index 638a8f7..5176f8f 100644 ---- a/Makefile -+++ b/Makefile -@@ -58,6 +58,19 @@ endif - ifeq ($(RBOOT_IROM_CHKSUM),1) - CFLAGS += -DBOOT_IROM_CHKSUM - endif -+ifneq ($(RBOOT_ROM0_ADDR),) -+ CFLAGS += -DBOOT_ROM0_ADDR=$(RBOOT_ROM0_ADDR) -+endif -+ifneq ($(RBOOT_ROM1_ADDR),) -+ CFLAGS += -DBOOT_ROM1_ADDR=$(RBOOT_ROM1_ADDR) -+endif -+ifneq ($(RBOOT_ROM2_ADDR),) -+ CFLAGS += -DBOOT_ROM2_ADDR=$(RBOOT_ROM2_ADDR) -+endif -+ifeq ($(RBOOT_SILENT),1) -+ CFLAGS += -DBOOT_SILENT=$(RBOOT_SILENT) -+endif -+ - ifneq ($(RBOOT_EXTRA_INCDIR),) - CFLAGS += $(addprefix -I,$(RBOOT_EXTRA_INCDIR)) - endif - -diff --git a/rboot.c b/rboot.c -index d622f97..5e254fa 100644 ---- a/rboot.c -+++ b/rboot.c -@@ -13,6 +13,12 @@ - #define UART_CLK_FREQ (26000000 * 2) - #endif - -+#ifndef BOOT_SILENT -+#define echof(fmt, ...) ets_printf(fmt, ##__VA_ARGS__) -+#else -+#define echof(fmt, ...) -+#endif -+ - static uint32_t check_image(uint32_t readpos) { - - uint8_t buffer[BUFFER_SIZE]; -@@ -257,8 +263,30 @@ static uint8_t calc_chksum(uint8_t *start, uint8_t *end) { - // created on first boot or in case of corruption - static uint8_t default_config(rboot_config *romconf, uint32_t flashsize) { - romconf->count = 2; -+#ifdef BOOT_ROM0_ADDR -+ romconf->roms[0] = BOOT_ROM0_ADDR; -+#else - romconf->roms[0] = SECTOR_SIZE * (BOOT_CONFIG_SECTOR + 1); -+#endif -+ -+#ifdef BOOT_ROM1_ADDR -+ romconf->roms[1] = BOOT_ROM1_ADDR; -+#else - romconf->roms[1] = (flashsize / 2) + (SECTOR_SIZE * (BOOT_CONFIG_SECTOR + 1)); -+#endif -+ -+#if defined(BOOT_BIG_FLASH) && defined(BOOT_GPIO_ENABLED) -+ if(flashsize > 0x200000) { -+ romconf->count += 1; -+#ifdef BOOT_ROM2_ADDR -+ romconf->roms[2] = BOOT_ROM2_ADDR; -+#else -+ romconf->roms[2] = 0x310000; -+#endif -+ romconf->gpio_rom = 2; -+} -+#endif -+ - #ifdef BOOT_GPIO_ENABLED - romconf->mode = MODE_GPIO_ROM; - #endif -@@ -306,100 +334,100 @@ uint32_t NOINLINE find_image(void) { - ets_delay_us(BOOT_DELAY_MICROS); - #endif - -- ets_printf("\r\nrBoot v1.4.2 - richardaburton@gmail.com\r\n"); -+ echof("\r\nrBoot v1.4.2 - richardaburton@gmail.com\r\n"); - - // read rom header - SPIRead(0, header, sizeof(rom_header)); - - // print and get flash size -- ets_printf("Flash Size: "); -+ echof("Flash Size: "); - flag = header->flags2 >> 4; - if (flag == 0) { -- ets_printf("4 Mbit\r\n"); -+ echof("4 Mbit\r\n"); - flashsize = 0x80000; - } else if (flag == 1) { -- ets_printf("2 Mbit\r\n"); -+ echof("2 Mbit\r\n"); - flashsize = 0x40000; - } else if (flag == 2) { -- ets_printf("8 Mbit\r\n"); -+ echof("8 Mbit\r\n"); - flashsize = 0x100000; - } else if (flag == 3 || flag == 5) { -- ets_printf("16 Mbit\r\n"); -+ echof("16 Mbit\r\n"); - #ifdef BOOT_BIG_FLASH - flashsize = 0x200000; - #else - flashsize = 0x100000; // limit to 8Mbit - #endif - } else if (flag == 4 || flag == 6) { -- ets_printf("32 Mbit\r\n"); -+ echof("32 Mbit\r\n"); - #ifdef BOOT_BIG_FLASH - flashsize = 0x400000; - #else - flashsize = 0x100000; // limit to 8Mbit - #endif - } else if (flag == 8) { -- ets_printf("64 Mbit\r\n"); -+ echof("64 Mbit\r\n"); - #ifdef BOOT_BIG_FLASH - flashsize = 0x800000; - #else - flashsize = 0x100000; // limit to 8Mbit - #endif - } else if (flag == 9) { -- ets_printf("128 Mbit\r\n"); -+ echof("128 Mbit\r\n"); - #ifdef BOOT_BIG_FLASH - flashsize = 0x1000000; - #else - flashsize = 0x100000; // limit to 8Mbit - #endif - } else { -- ets_printf("unknown\r\n"); -+ echof("unknown\r\n"); - // assume at least 4mbit - flashsize = 0x80000; - } - - // print spi mode -- ets_printf("Flash Mode: "); -+ echof("Flash Mode: "); - if (header->flags1 == 0) { -- ets_printf("QIO\r\n"); -+ echof("QIO\r\n"); - } else if (header->flags1 == 1) { -- ets_printf("QOUT\r\n"); -+ echof("QOUT\r\n"); - } else if (header->flags1 == 2) { -- ets_printf("DIO\r\n"); -+ echof("DIO\r\n"); - } else if (header->flags1 == 3) { -- ets_printf("DOUT\r\n"); -+ echof("DOUT\r\n"); - } else { -- ets_printf("unknown\r\n"); -+ echof("unknown\r\n"); - } - - // print spi speed -- ets_printf("Flash Speed: "); -+ echof("Flash Speed: "); - flag = header->flags2 & 0x0f; -- if (flag == 0) ets_printf("40 MHz\r\n"); -- else if (flag == 1) ets_printf("26.7 MHz\r\n"); -- else if (flag == 2) ets_printf("20 MHz\r\n"); -- else if (flag == 0x0f) ets_printf("80 MHz\r\n"); -- else ets_printf("unknown\r\n"); -+ if (flag == 0) echof("40 MHz\r\n"); -+ else if (flag == 1) echof("26.7 MHz\r\n"); -+ else if (flag == 2) echof("20 MHz\r\n"); -+ else if (flag == 0x0f) echof("80 MHz\r\n"); -+ else echof("unknown\r\n"); - - // print enabled options - #ifdef BOOT_BIG_FLASH -- ets_printf("rBoot Option: Big flash\r\n"); -+ echof("rBoot Option: Big flash\r\n"); - #endif - #ifdef BOOT_CONFIG_CHKSUM -- ets_printf("rBoot Option: Config chksum\r\n"); -+ echof("rBoot Option: Config chksum\r\n"); - #endif - #ifdef BOOT_GPIO_ENABLED -- ets_printf("rBoot Option: GPIO rom mode (%d)\r\n", BOOT_GPIO_NUM); -+ echof("rBoot Option: GPIO rom mode (%d)\r\n", BOOT_GPIO_NUM); - #endif - #ifdef BOOT_GPIO_SKIP_ENABLED -- ets_printf("rBoot Option: GPIO skip mode (%d)\r\n", BOOT_GPIO_NUM); -+ echof("rBoot Option: GPIO skip mode (%d)\r\n", BOOT_GPIO_NUM); - #endif - #ifdef BOOT_RTC_ENABLED -- ets_printf("rBoot Option: RTC data\r\n"); -+ echof("rBoot Option: RTC data\r\n"); - #endif - #ifdef BOOT_IROM_CHKSUM -- ets_printf("rBoot Option: irom chksum\r\n"); -+ echof("rBoot Option: irom chksum\r\n"); - #endif -- ets_printf("\r\n"); -+ echof("\r\n"); - - // read boot config - SPIRead(BOOT_CONFIG_SECTOR * SECTOR_SIZE, buffer, SECTOR_SIZE); -@@ -410,7 +438,7 @@ uint32_t NOINLINE find_image(void) { - #endif - ) { - // create a default config for a standard 2 rom setup -- ets_printf("Writing default boot config.\r\n"); -+ echof("Writing default boot config.\r\n"); - ets_memset(romconf, 0x00, sizeof(rboot_config)); - romconf->magic = BOOT_CONFIG_MAGIC; - romconf->version = BOOT_CONFIG_VERSION; -@@ -433,10 +461,10 @@ uint32_t NOINLINE find_image(void) { - - if (rtc.next_mode & MODE_TEMP_ROM) { - if (rtc.temp_rom >= romconf->count) { -- ets_printf("Invalid temp rom selected.\r\n"); -+ echof("Invalid temp rom selected.\r\n"); - return 0; - } -- ets_printf("Booting temp rom.\r\n"); -+ echof("Booting temp rom.\r\n"); - temp_boot = 1; - romToBoot = rtc.temp_rom; - } -@@ -447,10 +475,10 @@ uint32_t NOINLINE find_image(void) { - if (perform_gpio_boot(romconf)) { - #if defined(BOOT_GPIO_ENABLED) - if (romconf->gpio_rom >= romconf->count) { -- ets_printf("Invalid GPIO rom selected.\r\n"); -+ echof("Invalid GPIO rom selected.\r\n"); - return 0; - } -- ets_printf("Booting GPIO-selected rom.\r\n"); -+ echof("Booting GPIO-selected rom.\r\n"); - romToBoot = romconf->gpio_rom; - gpio_boot = 1; - #elif defined(BOOT_GPIO_SKIP_ENABLED) -@@ -462,7 +490,7 @@ uint32_t NOINLINE find_image(void) { - #endif - updateConfig = 1; - if (romconf->mode & MODE_GPIO_ERASES_SDKCONFIG) { -- ets_printf("Erasing SDK config sectors before booting.\r\n"); -+ echof("Erasing SDK config sectors before booting.\r\n"); - for (sec = 1; sec < 5; sec++) { - SPIEraseSector((flashsize / SECTOR_SIZE) - sec); - } -@@ -474,7 +502,7 @@ uint32_t NOINLINE find_image(void) { - // gpio/temp boots will have already validated this - if (romconf->current_rom >= romconf->count) { - // if invalid rom selected try rom 0 -- ets_printf("Invalid rom selected, defaulting to 0.\r\n"); -+ echof("Invalid rom selected, defaulting to 0.\r\n"); - romToBoot = 0; - romconf->current_rom = 0; - updateConfig = 1; -@@ -486,14 +514,14 @@ uint32_t NOINLINE find_image(void) { - #ifdef BOOT_GPIO_ENABLED - if (gpio_boot && loadAddr == 0) { - // don't switch to backup for gpio-selected rom -- ets_printf("GPIO boot rom (%d) is bad.\r\n", romToBoot); -+ echof("GPIO boot rom (%d) is bad.\r\n", romToBoot); - return 0; - } - #endif - #ifdef BOOT_RTC_ENABLED - if (temp_boot && loadAddr == 0) { - // don't switch to backup for temp rom -- ets_printf("Temp boot rom (%d) is bad.\r\n", romToBoot); -+ echof("Temp boot rom (%d) is bad.\r\n", romToBoot); - // make sure rtc temp boot mode doesn't persist - rtc.next_mode = MODE_STANDARD; - rtc.chksum = calc_chksum((uint8_t*)&rtc, (uint8_t*)&rtc.chksum); -@@ -504,7 +532,7 @@ uint32_t NOINLINE find_image(void) { - - // check we have a good rom - while (loadAddr == 0) { -- ets_printf("Rom %d at %x is bad.\r\n", romToBoot, romconf->roms[romToBoot]); -+ echof("Rom %d at %x is bad.\r\n", romToBoot, romconf->roms[romToBoot]); - // for normal mode try each previous rom - // until we find a good one or run out - updateConfig = 1; -@@ -512,7 +540,7 @@ uint32_t NOINLINE find_image(void) { - if (romToBoot < 0) romToBoot = romconf->count - 1; - if (romToBoot == romconf->current_rom) { - // tried them all and all are bad! -- ets_printf("No good rom available.\r\n"); -+ echof("No good rom available.\r\n"); - return 0; - } - loadAddr = check_image(romconf->roms[romToBoot]); -@@ -543,7 +571,7 @@ uint32_t NOINLINE find_image(void) { - system_rtc_mem(RBOOT_RTC_ADDR, &rtc, sizeof(rboot_rtc_data), RBOOT_RTC_WRITE); - #endif - -- ets_printf("Booting rom %d at %x, load addr %x.\r\n", romToBoot, romconf->roms[romToBoot], loadAddr); -+ echof("Booting rom %d at %x, load addr %x.\r\n", romToBoot, romconf->roms[romToBoot], loadAddr); - // copy the loader to top of iram - ets_memcpy((void*)_text_addr, _text_data, _text_len); - // return address to load from -diff --git a/appcode/rboot-api.c b/appcode/rboot-api.c -index eb4d028..bf276a7 100644 ---- a/appcode/rboot-api.c -+++ b/appcode/rboot-api.c -@@ -9,7 +9,7 @@ - #include - // c_types.h needed for spi_flash.h - #include --#include -+#include - - #include "rboot-api.h" - -@@ -33,7 +33,7 @@ static uint8_t calc_chksum(uint8_t *start, uint8_t *end) { - // get the rboot config - rboot_config ICACHE_FLASH_ATTR rboot_get_config(void) { - rboot_config conf; -- spi_flash_read(BOOT_CONFIG_SECTOR * SECTOR_SIZE, (uint32_t*)&conf, sizeof(rboot_config)); -+ flashmem_read(&conf, BOOT_CONFIG_SECTOR * SECTOR_SIZE, sizeof(rboot_config)); - return conf; - } - -@@ -43,7 +43,7 @@ rboot_config ICACHE_FLASH_ATTR rboot_get_config(void) { - // updates checksum automatically (if enabled) - bool ICACHE_FLASH_ATTR rboot_set_config(rboot_config *conf) { - uint8_t *buffer; -- buffer = (uint8_t*)pvPortMalloc(SECTOR_SIZE, 0, 0); -+ buffer = (uint8_t*)os_malloc(SECTOR_SIZE); - if (!buffer) { - //os_printf("No ram!\r\n"); - return false; -@@ -53,12 +53,12 @@ bool ICACHE_FLASH_ATTR rboot_set_config(rboot_config *conf) { - conf->chksum = calc_chksum((uint8_t*)conf, (uint8_t*)&conf->chksum); - #endif - -- spi_flash_read(BOOT_CONFIG_SECTOR * SECTOR_SIZE, (uint32_t*)((void*)buffer), SECTOR_SIZE); -+ flashmem_read(buffer, BOOT_CONFIG_SECTOR * SECTOR_SIZE, SECTOR_SIZE); - memcpy(buffer, conf, sizeof(rboot_config)); -- spi_flash_erase_sector(BOOT_CONFIG_SECTOR); -- spi_flash_write(BOOT_CONFIG_SECTOR * SECTOR_SIZE, (uint32_t*)((void*)buffer), SECTOR_SIZE); -+ flashmem_erase_sector(BOOT_CONFIG_SECTOR); -+ flashmem_write(buffer, BOOT_CONFIG_SECTOR * SECTOR_SIZE, SECTOR_SIZE); - -- vPortFree(buffer, 0, 0); -+ os_free(buffer); - return true; - } - -@@ -103,7 +103,7 @@ bool ICACHE_FLASH_ATTR rboot_write_end(rboot_write_status *status) { - - // function to do the actual writing to flash - // call repeatedly with more data (max len per write is the flash sector size (4k)) --bool ICACHE_FLASH_ATTR rboot_write_flash(rboot_write_status *status, uint8_t *data, uint16_t len) { -+bool ICACHE_FLASH_ATTR rboot_write_flash(rboot_write_status *status, const uint8_t *data, uint16_t len) { - - bool ret = false; - uint8_t *buffer; -@@ -114,7 +114,7 @@ bool ICACHE_FLASH_ATTR rboot_write_flash(rboot_write_status *status, uint8_t *da - } - - // get a buffer -- buffer = (uint8_t *)pvPortMalloc(len + status->extra_count, 0, 0); -+ buffer = (uint8_t *)os_malloc(len + status->extra_count); - if (!buffer) { - //os_printf("No ram!\r\n"); - return false; -@@ -141,18 +141,18 @@ bool ICACHE_FLASH_ATTR rboot_write_flash(rboot_write_status *status, uint8_t *da - lastsect = ((status->start_addr + len) - 1) / SECTOR_SIZE; - while (lastsect > status->last_sector_erased) { - status->last_sector_erased++; -- spi_flash_erase_sector(status->last_sector_erased); -+ flashmem_erase_sector(status->last_sector_erased); - } - - // write current chunk - //os_printf("write addr: 0x%08x, len: 0x%04x\r\n", status->start_addr, len); -- if (spi_flash_write(status->start_addr, (uint32_t *)((void*)buffer), len) == SPI_FLASH_RESULT_OK) { -+ if (flashmem_write(buffer, status->start_addr, len) == len) { - ret = true; - status->start_addr += len; - } - //} - -- vPortFree(buffer, 0, 0); -+ os_free(buffer); - return ret; - } - -diff --git a/appcode/rboot-api.h b/appcode/rboot-api.h -index a98c209..ec4f0e5 100644 ---- a/appcode/rboot-api.h -+++ b/appcode/rboot-api.h -@@ -93,7 +93,7 @@ bool ICACHE_FLASH_ATTR rboot_write_end(rboot_write_status *status); - * of OTA data is received over the network. - * @note Call rboot_write_init before calling this function to get the rboot_write_status structure - */ --bool ICACHE_FLASH_ATTR rboot_write_flash(rboot_write_status *status, uint8_t *data, uint16_t len); -+bool ICACHE_FLASH_ATTR rboot_write_flash(rboot_write_status *status, const uint8_t *data, uint16_t len); - - #ifdef BOOT_RTC_ENABLED - /** @brief Get rBoot status/control data from RTC data area - diff --git a/Sming/Components/rboot/.patches/rboot/README.rst b/Sming/Components/rboot/.patches/rboot/README.rst deleted file mode 100644 index e365cdb1f0..0000000000 --- a/Sming/Components/rboot/.patches/rboot/README.rst +++ /dev/null @@ -1,349 +0,0 @@ -================================================== -rBoot - An open source boot loader for the ESP8266 -================================================== - -by Richard A Burton, richardaburton@gmail.com -http://richard.burtons.org/ - -rBoot is designed to be a flexible open source boot loader, a -replacement for the binary blob supplied with the SDK. It has the -following advantages over the Espressif loader: - -- Open source (written in C). -- Supports up to 256 roms. -- Roms can be variable size. -- Able to test multiple roms to find a valid backup (without - resetting). -- Flash layout can be changed on the fly (with care and appropriately - linked rom images). -- GPIO support for rom selection. -- Wastes no stack space (SDK boot loader uses 144 bytes). -- Documented config structure to allow easy editing from user code. -- Can validate .irom0.text section with checksum. -- Temporary next-boot rom selection. - -Limitations -=========== - -The ESP8266 can only map 8Mbits (1MB) of flash to memory, but which -8Mbits to map is selectable. This allows individual roms to be up to 1MB -in size, so long as they do not straddle an 8Mbit boundary on the flash. -This means you could have four 1MB roms or 8 512KB roms on a 32Mbit -flash (such as on the ESP-12), or a combination. Note, however, that you -could not have, for example, a 512KB rom followed immediately by a 1MB -rom because the 2nd rom would then straddle an 8MBit boundary. By -default support for using more than the first 8Mbit of the flash is -disabled, because it requires several steps to get it working. See below -for instructions. - -Building -======== - -A Makefile is included, which should work with the gcc xtensa cross -compiler. There are two source files, the first is compiled and included -as data in the second. When run this code is copied to memory and -executed (there is a good reason for this, see my blog for an -explanation). The make file will handle this for you, but you’ll need my -esptool2 (see github). - -To use the Makefile set ``SDK_BASE`` to point to the root of the -Espressif SDK and either set ``XTENSA_BINDIR`` to the gcc xtensa bin -directory or include it in your ``PATH``. These can be set as -environment variables or by editing the Makefile. - -Two small assembler stub functions allow the bootloader to launch the -user code without reserving any space on the stack (while the SDK boot -loader uses 144 bytes). This compiles fine with GCC, but if you use -another compiler and it will not compile/work for you then uncomment the -``#define BOOT_NO_ASM`` in ``rboot.h`` to use a C version of these -functions (this uses 32 bytes). - -Tested with SDK v2.2 and GCC v4.8.5. - -Installation -============ - -Simply write rboot.bin to the first sector of the flash. Remember to set -your flash size correctly with your chosen flash tool (e.g. for -esptool.py use the ``-fs`` option). When run rBoot will create it’s own -config at the start of sector two for a simple two rom system. You can -can then write your two roms to flash addresses ``0x2000`` and (half -chip size + ``0x2000``). E.g. for 8Mbit flash: -``esptool.py write_flash -fs 8m 0x0000 rboot.bin 0x2000 user1.bin 0x82000 user2.bin`` - -Note: your device may need other options specified. E.g. The nodemcu -devkit v1.0 (commonly, but incorrectly, sold as v2) also needs the -``-fm dio`` option. - -For more interesting rom layouts you’ll need to write an rBoot config -sector manually, see next step. - -The two testload bin files can be flashed in place of normal user roms -for testing rBoot. You do not need these for normal use. - -rBoot Config -============ - -:: - - typedef struct { - uint8_t magic; // our magic - uint8_t version; // config struct version - uint8_t mode; // boot loader mode - uint8_t current_rom; // currently selected rom - uint8_t gpio_rom; // rom to use for gpio boot - uint8_t count; // number of roms in use - uint8_t unused[2]; // padding - uint32_t roms[MAX_ROMS]; // flash addresses of the roms - #ifdef BOOT_CONFIG_CHKSUM - uint8_t chksum; // boot config chksum - #endif - } rboot_config; - -Write a config structure as above to address ``0x1000`` on the flash. If -you want more than 4 roms (default) just increase MAX_ROMS when you -compile rBoot. Think about how you intend to layout your flash before -you start! Rom addresses must be sector aligned i.e start on a multiple -of 4096. - -- ``magic`` should have value ``0xe1`` (defined as - ``BOOT_CONFIG_MAGIC``). -- ``version`` is used in case the config structure changes after - deployment. It is defined as ``0x01`` (``BOOT_CONFIG_VERSION``). I - don’t intend to increase this, but you should if you choose to - reflash the bootloader after deployment and the config structure has - changed. -- ``mode`` can be ``0x00`` (``MODE_STANDARD``) or ``0x01`` - (``MODE_GPIO_ROM``). See below for an explanation of - ``MODE_GPIO_ROM``. There is also an optional extra mode flag ``0x04`` - (``MODE_GPIO_ERASES_SDKCONFIG``), see below for details. -- ``current_rom`` is the rom to boot, numbered ``0`` to ``count-1``. -- ``gpio_rom`` is the rom to boot when the GPIO is triggered at boot. -- ``count`` is the number of roms available (may be less than - ``MAX_ROMS``, but not more). -- ``unused[2]`` is padding so the ``uint32_t`` rom addresses are 4 - bytes aligned. -- ``roms`` is the array of flash address for the roms. The default - generated config will contain two entries: ``0x00002000`` and - ``0x00082000``. -- ``chksum`` (if enabled, not by deafult) should be the xor of ``0xef`` - followed by each of the bytes of the config structure up to (but - obviously not including) the chksum byte itself. - -Default config -============== - -A default config sector will be created on boot if one does not exists, -or if an existing config is corrupted, and the default rom will be set -to rom 0. If you want to have a very customised config for which the -default would not be suitable, you can override the implementation in -the ``rboot.h`` header file. See the comments and example code in -``rboot.h`` for more information. - -GPIO boot mode -============== - -.. envvar:: RBOOT_GPIO_ENABLED - -If rBoot is compiled with ``BOOT_GPIO_ENABLED`` set in ``rboot.h`` (or -``RBOOT_GPIO_ENABLED`` set in the Makefile), then GPIO boot -functionality will be included in the rBoot binary. The feature can then -be enabled by setting the rboot_config ``mode`` field to -``MODE_GPIO_ROM``. You must also set ``gpio_rom`` in the config to -indicate which rom to boot when the GPIO is activated at boot. - -If the GPIO input pin reads high at boot then rBoot will start the -currently selected normal or temp rom (as appropriate). However if the -GPIO is pulled low then the rom indicated in config option ``gpio_rom`` -is started instead. - -The default GPIO is 16, but this can be overriden in the Makefile -(``RBOOT_GPIO_NUMBER``) or ``rboot.h`` (``BOOT_GPIO_NUM``). If GPIOs -other than 16 are used, the internal pullup resistor is enabled before -the pin is read and disabled immediately afterwards. For pins that -default on reset to configuration other than GPIO input, the pin mode is -changed to input when reading but changed back before rboot continues. - -After a GPIO boot the ``current_rom`` field will be updated in the -config, so the GPIO booted rom should change this again if required. - -GPIO boot skip mode -=================== - -.. envvar:: RBOOT_GPIO_SKIP_ENABLED - -If rBoot is compiled with ``BOOT_GPIO_SKIP_ENABLED`` set in ``rboot.h`` -(or ``RBOOT_GPIO_SKIP_ENABLED`` set in the Makefile), then a GPIO can be -used to skip to the next rom at boot. The feature must then be enabled -by setting the rboot_config ‘mode’ field to ``MODE_GPIO_SKIP``. This -means you do not need to have a dedicated GPIO boot rom. If you have a -rom that is technically good (valid checksum, etc.) but has operational -problems, e.g. wifi doesn’t work or it crashes on boot, rBoot will not -be able to detect that and switch rom automatically. In this scenario -rebooting the device while pulling the GPIO low will force rBoot to skip -this rom and try the next one instead. In a simple two rom setup this -simply toggles booting of the other rom. - -``RBOOT_GPIO_SKIP_ENABLED`` and ``RBOOT_GPIO_ENABLED`` cannot be used at -the same time. ``BOOT_GPIO_NUM`` is used to select the GPIO pin, as with -``RBOOT_GPIO_ENABLED``. - -Erasing SDK configuration on GPIO boot (rom or skip mode) -========================================================= - -If you set the ``MODE_GPIO_ERASES_SDKCONFIG`` flag in the configuration -like this: ``conf.mode = MODE_GPIO_ROM|MODE_GPIO_ERASES_SDKCONFIG``; -then a GPIO boot will also the erase the Espressif SDK persistent -settings store in the final 16KB of flash. This includes removing -calibration constants, saved SSIDs, etc. - -Note that ``MODE_GPIO_ERASES_SDKCONFIG`` is a flag, so it has to be set -as well as ``MODE_GPIO_ROM`` to take effect. - -Linking user code -================= - -Each rom will need to be linked with an appropriate linker file, -specifying where it will reside on the flash. If you are only flashing -one rom to multiple places on the flash it must be linked multiple times -to produce the set of rom images. This is the same as with the SDK -loader. - -Because there are endless possibilities for layout with this loader I -don’t supply sample linker files. Instead I’ll tell you how to make -them. - -For each rom slot on the flash take a copy of the ``eagle.app.v6.ld`` -linker script from the sdk. You then need to modify just one line in it -for each rom: -``irom0_0_seg : org = 0x40240000, len = 0x3C000`` - -Change the org address to be ``0x40200000`` (base memory mapped location -of the flash) + flash address + ``0x10`` (offset of data after the -header). The logical place for your first rom is the third sector, -address ``0x2000``. ``0x40200000 + 0x2000 + 0x10 = 0x40202010`` If you -use the default generated config the loader will expect to find the -second rom at flash address half-chip-size + ``0x2000`` -(e.g. ``0x82000`` on an 8MBit flash) so the ``irom0_0_seg`` should be: -``0x40200000 + 0x82000 + 0x10 = 0x40282010`` Due to the limitation of -mapped flash (max 8MBit) if you use a larger chip and do not have big -flash support enabled the second rom in the default config will still be -placed at ``0x082000``, not truly half-chip-size + ``0x2000``. Ideally -you should also adjust the len to help detect over sized sections at -link time, but more important is the overall size of the rom which you -need to ensure fits in the space you have allocated for it in your flash -layout plan. - -Then simply compile and link as you would normally for OTA updates with -the SDK boot loader, except using the linker scripts you’ve just -prepared rather than the ones supplied with the SDK. Remember when -building roms to create them as ‘new’ type roms (for use with SDK boot -loader v1.2+). Or if using my esptool2 use the ``-boot2`` option. Note: -the test loads included with rBoot are built with ``-boot0`` because -they do not contain a ``.irom0.text`` section (and so the value of -``irom0_0_seg`` in the linker file is irrelevant to them) but ‘normal’ -user apps always do. - -irom checksum -============= - -The SDK boot loader checksum only covers sections loaded into ram (data -and some code). Most of the SDK and user code remains on the flash and -that is not included in the checksum. This means you could attempt to -boot a corrupt rom and, because it looks ok to the boot loader, there -will be no attempt to switch to a backup rom. rBoot improves on this by -allowing the ``.irom0.text`` section to be included in the checksum. To -enable this uncomment ``#define BOOT_IROM_CHKSUM`` in ``rboot.h`` and -build your roms with esptool2 using the ``-iromchksum`` option. - -.. _big_flash_support: - -Big flash support -================= - -This only needs to be enabled if you wish to be able to memory map more -than the first 8MBit of the flash. Note you can still only map 8Mbit at -a time. Use this if you want to have multiple 1MB roms, or more smaller -roms than will fit in 8Mbits. If you have a large flash but only need, -for example, two 512KB roms you do not need to enable this mode. - -Support in rBoot is enabled by uncommenting the -``#define BOOT_BIG_FLASH`` in ``rboot.h``. - -Thinking about your linker files is either simpler or more complicated, -depending on your usage of the flash. If you intend to use multiple 1MB -roms you will only need one linker file and you only need to link once -for OTA updates. Although when you perform an OTA update the rom will be -written to a different position on the flash, each 8Mbit of flash is -mapped (separately) to ``0x40200000``. So when any given rom is run the -code will appear at the same place in memory regardless of where it is -on the flash. Your base address for the linker would be ``0x40202010``. -(Actually all but the first rom could base at ``0x40200010`` (because -they don’t need to leave space for rBoot and config) but then you’re -just making it more complicated again!) - -If you wanted eight 512KB roms you would need two linker files - one for -the first half of any given 8Mbits of flash and another for the second -half. Just remember you are really laying out within a single 8MBit -area, which can then be replicated multiple times on the flash. - -Now the clever bit - rBoot needs to hijack the memory mapping code to -select which 8Mbits gets mapped. There is no API for this, but we can -override the SDK function. First we need to slightly modify the SDK -library ``libmain.a``, like so: - -:: - - xtensa-lx106-elf-objcopy -W Cache_Read_Enable_New libmain.a libmain2.a - -This produces a version of libmain with a ‘weakened’ -``Cache_Read_Enable_New`` function, which we can then override with our -own. Modify your Makefile to link against the library ``main2`` instead -of ``main``. - -Next add ``rboot-bigflash.c`` (from the ``appcode`` directory) & -``rboot.h`` to your project - this adds the replacement -``Cache_Read_Enable_New`` to your code. - -Getting gcc to apply the override correctly can be slightly tricky (I’m -not sure why, it shouldn’t be). One option is to add -``-u Cache_Read_Enable_New`` to your ``LD_FLAGS`` and change the order -of objects on the LD command so your ``objects/.a`` file is before the -libraries. Another way that seems easier was to -``#include rboot-bigflash.c`` into the main .c file, rather than -compiling it to a separate object file. I can’t make any sense of that, -but I suggest you uncomment the message in the ``Cache_Read_Enable_New`` -function when you first build with it, to make sure you are getting your -version into the rom. - -Now when rBoot starts your rom, the SDK code linked in it that normally -performs the memory mapping will delegate part of that task to rBoot -code (linked in your rom, not in rBoot itself) to choose which part of -the flash to map. - -Temporary boot option and rBoot<–>app communication -=================================================== - -.. envvar:: RBOOT_RTC_ENABLED - -To enable communication between rBoot and your app you should enable the -``BOOT_RTC_ENABLED`` option in ``rboot.h``. rBoot will then use the RTC -data area to pass a structure with boot information which can be read by -the app. This will allow the app to determine the boot mode (normal, -temporary or GPIO) and the booted rom (even if it is a tempoary boot). -Your app can also update this structure to communicate with rBoot when -the device is next rebooted, e.g. to instruct it to temporarily boot a -different rom to the one saved in the config. See the api documentation -and/or the rBoot sample project for more details. Note: the message -“don’t use rtc mem data”, commonly seen on startup, comes from the sdk -and is not related to this rBoot feature. - -Integration into other frameworks -================================= - -If you wish to integrate rBoot into a development framework (e.g. Sming) -you can set the define ``RBOOT_INTEGRATION`` and at compile time the -file ``rboot-integration.h`` will be included into the source. This -should allow you to set some platform specific options without having to -modify the source of rBoot which makes it easier to integrate and -maintain. diff --git a/Sming/Components/rboot/rboot b/Sming/Components/rboot/rboot index 614f33685d..e1256bfc0a 160000 --- a/Sming/Components/rboot/rboot +++ b/Sming/Components/rboot/rboot @@ -1 +1 @@ -Subproject commit 614f33685d0dd990fc4202f2409b0d2365eeaef3 +Subproject commit e1256bfc0af0b0afa31942319cb8335fbe76089e