rewrote flash handlers

v0.9.0
Thorsten von Eicken 10 years ago
parent 597eb0e32d
commit 4ae00fa045
  1. 6
      Makefile
  2. 0
      html/cats/junge-katze-iv.jpg-
  3. BIN
      html/cats/junge-katze-iv_01.jpg
  4. 2
      html/index.tpl
  5. 1
      include/esp8266.h
  6. 78
      user/cgiflash.c
  7. 6
      user/cgiflash.h
  8. 6
      user/user_main.c

@ -76,7 +76,7 @@ LIBS = c gcc hal phy pp net80211 wpa main lwip
# compiler flags using during compilation of source files # compiler flags using during compilation of source files
CFLAGS = -Os -ggdb -std=c99 -Werror -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \ CFLAGS = -Os -ggdb -std=c99 -Werror -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \
-nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH -D_STDINT_H \ -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH -D_STDINT_H \
-Wno-address -DESPFS_POS=$(ESPFS_POS) -DESPFS_SIZE=$(ESPFS_SIZE) -Wno-address -DFIRMWARE_SIZE=$(ESP_FLASH_MAX)
# linker flags used to generate the main object file # linker flags used to generate the main object file
LDFLAGS = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static LDFLAGS = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static
@ -235,11 +235,11 @@ build/eagle.esphttpd.v6.ld: $(SDK_LDDIR)/eagle.app.v6.ld
$(SDK_LDDIR)/eagle.app.v6.ld >$@ $(SDK_LDDIR)/eagle.app.v6.ld >$@
build/eagle.esphttpd1.v6.ld: $(SDK_LDDIR)/eagle.app.v6.new.512.app1.ld build/eagle.esphttpd1.v6.ld: $(SDK_LDDIR)/eagle.app.v6.new.512.app1.ld
$(Q) sed -e '/\.irom\.text/{' -e 'a . = ALIGN (4);' -e 'a *(.espfs)' -e '}' \ $(Q) sed -e '/\.irom\.text/{' -e 'a . = ALIGN (4);' -e 'a *(.espfs)' -e '}' \
-e '/^ irom0_0_seg/ s/2B000/32000/' \ -e '/^ irom0_0_seg/ s/2B000/38000/' \
$(SDK_LDDIR)/eagle.app.v6.new.512.app1.ld >$@ $(SDK_LDDIR)/eagle.app.v6.new.512.app1.ld >$@
build/eagle.esphttpd2.v6.ld: $(SDK_LDDIR)/eagle.app.v6.new.512.app2.ld build/eagle.esphttpd2.v6.ld: $(SDK_LDDIR)/eagle.app.v6.new.512.app2.ld
$(Q) sed -e '/\.irom\.text/{' -e 'a . = ALIGN (4);' -e 'a *(.espfs)' -e '}' \ $(Q) sed -e '/\.irom\.text/{' -e 'a . = ALIGN (4);' -e 'a *(.espfs)' -e '}' \
-e '/^ irom0_0_seg/ s/2B000/32000/' \ -e '/^ irom0_0_seg/ s/2B000/38000/' \
$(SDK_LDDIR)/eagle.app.v6.new.512.app2.ld >$@ $(SDK_LDDIR)/eagle.app.v6.new.512.app2.ld >$@
blankflash: blankflash:

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -18,7 +18,7 @@ been loaded <b>%counter%</b> times.
<p>And because we're on the Internets now, here are the required pictures of cats:<br /> <p>And because we're on the Internets now, here are the required pictures of cats:<br />
<!--img src="cats/cross-eyed-cat.jpg"><br /--> <!--img src="cats/cross-eyed-cat.jpg"><br /-->
<img src="cats/junge-katze-iv.jpg"><br /> <img src="cats/junge-katze-iv_01.jpg"><br />
<!--img src="cats/kitten-loves-toy.jpg"><br /--> <!--img src="cats/kitten-loves-toy.jpg"><br /-->
</p> </p>
</div> </div>

@ -12,6 +12,7 @@
#include <gpio.h> #include <gpio.h>
#include <mem.h> #include <mem.h>
#include <osapi.h> #include <osapi.h>
#include <upgrade.h>
#include <user_interface.h> #include <user_interface.h>
#include "espmissingincludes.h" #include "espmissingincludes.h"

@ -39,37 +39,89 @@ int ICACHE_FLASH_ATTR cgiReadFlash(HttpdConnData *connData) {
if (*pos>=0x40200000+(512*1024)) return HTTPD_CGI_DONE; else return HTTPD_CGI_MORE; if (*pos>=0x40200000+(512*1024)) return HTTPD_CGI_DONE; else return HTTPD_CGI_MORE;
} }
//Cgi that allows the ESPFS image to be replaced via http POST // Return which firmware needs to be uploaded next
int ICACHE_FLASH_ATTR cgiUploadEspfs(HttpdConnData *connData) { int ICACHE_FLASH_ATTR cgiGetFirmwareNext(HttpdConnData *connData) {
if (connData->conn==NULL) { if (connData->conn==NULL) {
//Connection aborted. Clean up. //Connection aborted. Clean up.
return HTTPD_CGI_DONE; return HTTPD_CGI_DONE;
} }
/* TODO: fix this check so it calculates the end of the irom segment minus the start of the espfs
if(connData->post->len > ESPFS_SIZE){ uint8 id = system_upgrade_userbin_check();
httpdStartResponse(connData, 200);
httpdHeader(connData, "Content-Type", "text/plain");
httpdEndHeaders(connData);
httpdSend(connData, (id == 1 ? "user1.bin" : "user2.bin"), -1);
os_printf("Next firmware: user%d.bin\n", 1-id);
return HTTPD_CGI_DONE;
}
//Cgi that allows the firmware to be replaced via http POST
int ICACHE_FLASH_ATTR cgiUploadFirmware(HttpdConnData *connData) {
if (connData->conn==NULL) {
//Connection aborted. Clean up.
return HTTPD_CGI_DONE;
}
if(connData->post->len > FIRMWARE_SIZE){
// The uploaded file is too large // The uploaded file is too large
os_printf("ESPFS file too large\n"); os_printf("Firmware image too large\n");
httpdSend(connData, "HTTP/1.0 500 Internal Server Error\r\nServer: esp8266-httpd/0.3\r\nConnection: close\r\nContent-Type: text/plain\r\nContent-Length: 24\r\n\r\nESPFS image loo large.\r\n", -1); httpdStartResponse(connData, 400);
httpdHeader(connData, "Content-Type", "text/plain");
httpdEndHeaders(connData);
httpdSend(connData, "Firmware image loo large.\r\n", -1);
return HTTPD_CGI_DONE; return HTTPD_CGI_DONE;
} }
*/
// The source should be 4byte aligned, so go ahead and flash whatever we have uint8 id = system_upgrade_userbin_check();
int address = ESPFS_POS + connData->post->received - connData->post->buffLen;
int address;
if (id == 1) {
address = 4*1024; // start after 4KB boot partition
} else {
// 4KB boot, firmware1, 16KB user param, 4KB reserved
address = 4*1024 + FIRMWARE_SIZE + 16*1024 + 4*1024;
}
address += connData->post->received - connData->post->buffLen;
if(address % SPI_FLASH_SEC_SIZE == 0){ if(address % SPI_FLASH_SEC_SIZE == 0){
// We need to erase this block // We need to erase this block
os_printf("Erasing flash at %d\n", address/SPI_FLASH_SEC_SIZE); os_printf("Erasing flash at 0x%05x (id=%d)\n", address, 2-id);
spi_flash_erase_sector(address/SPI_FLASH_SEC_SIZE); spi_flash_erase_sector(address/SPI_FLASH_SEC_SIZE);
} }
// Write the data // Write the data
os_printf("Writing at: 0x%x\n", address); os_printf("Writing %d bytes at 0x%05x (%d of %d)\n", connData->post->buffSize, address,
connData->post->received, connData->post->len);
spi_flash_write(address, (uint32 *)connData->post->buff, connData->post->buffLen); spi_flash_write(address, (uint32 *)connData->post->buff, connData->post->buffLen);
os_printf("Wrote %d bytes (%dB of %d)\n", connData->post->buffSize, connData->post->received, connData->post->len);//&connData->postBuff));
if (connData->post->received == connData->post->len){ if (connData->post->received == connData->post->len){
httpdSend(connData, "Finished uploading", -1); // TODO: verify the firmware (is there a checksum or something???)
httpdStartResponse(connData, 200);
httpdEndHeaders(connData);
return HTTPD_CGI_DONE; return HTTPD_CGI_DONE;
} else { } else {
return HTTPD_CGI_MORE; return HTTPD_CGI_MORE;
} }
} }
// Handle request to reboot into the new firmware
int ICACHE_FLASH_ATTR cgiRebootFirmware(HttpdConnData *connData) {
if (connData->conn==NULL) {
//Connection aborted. Clean up.
return HTTPD_CGI_DONE;
}
// TODO: sanity-check that the 'next' partition actually contains something that looks like
// valid firmware
// This hsould probably be forked into a separate task that waits a second to let the
// current HTTP request finish...
system_upgrade_flag_set(UPGRADE_FLAG_FINISH);
system_upgrade_reboot();
httpdStartResponse(connData, 200);
httpdEndHeaders(connData);
return HTTPD_CGI_DONE;
}

@ -4,6 +4,8 @@
#include "httpd.h" #include "httpd.h"
int cgiReadFlash(HttpdConnData *connData); int cgiReadFlash(HttpdConnData *connData);
int cgiUploadEspfs(HttpdConnData *connData); int cgiGetFirmwareNext(HttpdConnData *connData);
int cgiUploadFirmware(HttpdConnData *connData);
int cgiRebootFirmware(HttpdConnData *connData);
#endif #endif

@ -53,11 +53,13 @@ should be placed above the URLs they protect.
*/ */
HttpdBuiltInUrl builtInUrls[]={ HttpdBuiltInUrl builtInUrls[]={
{"/", cgiRedirect, "/index.tpl"}, {"/", cgiRedirect, "/index.tpl"},
{"/flash.bin", cgiReadFlash, NULL}, {"/flash/download", cgiReadFlash, NULL},
{"/flash/next", cgiGetFirmwareNext, NULL},
{"/flash/upload", cgiUploadFirmware, NULL},
{"/flash/reboot", cgiRebootFirmware, NULL},
{"/led.tpl", cgiEspFsTemplate, tplLed}, {"/led.tpl", cgiEspFsTemplate, tplLed},
{"/index.tpl", cgiEspFsTemplate, tplCounter}, {"/index.tpl", cgiEspFsTemplate, tplCounter},
{"/led.cgi", cgiLed, NULL}, {"/led.cgi", cgiLed, NULL},
{"/updateweb.cgi", cgiUploadEspfs, NULL},
//Routines to make the /wifi URL and everything beneath it work. //Routines to make the /wifi URL and everything beneath it work.

Loading…
Cancel
Save