mirror of
https://github.com/jeelabs/esp-link.git
synced 2026-03-03 07:54:00 +01:00
rewrote flash handlers
This commit is contained in:
6
Makefile
6
Makefile
@@ -76,7 +76,7 @@ LIBS = c gcc hal phy pp net80211 wpa main lwip
|
||||
# compiler flags using during compilation of source files
|
||||
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 \
|
||||
-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
|
||||
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 >$@
|
||||
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 '}' \
|
||||
-e '/^ irom0_0_seg/ s/2B000/32000/' \
|
||||
-e '/^ irom0_0_seg/ s/2B000/38000/' \
|
||||
$(SDK_LDDIR)/eagle.app.v6.new.512.app1.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 '}' \
|
||||
-e '/^ irom0_0_seg/ s/2B000/32000/' \
|
||||
-e '/^ irom0_0_seg/ s/2B000/38000/' \
|
||||
$(SDK_LDDIR)/eagle.app.v6.new.512.app2.ld >$@
|
||||
|
||||
blankflash:
|
||||
|
||||
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
BIN
html/cats/junge-katze-iv_01.jpg
Normal file
BIN
html/cats/junge-katze-iv_01.jpg
Normal file
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 />
|
||||
<!--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 /-->
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <gpio.h>
|
||||
#include <mem.h>
|
||||
#include <osapi.h>
|
||||
#include <upgrade.h>
|
||||
#include <user_interface.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;
|
||||
}
|
||||
|
||||
//Cgi that allows the ESPFS image to be replaced via http POST
|
||||
int ICACHE_FLASH_ATTR cgiUploadEspfs(HttpdConnData *connData) {
|
||||
// Return which firmware needs to be uploaded next
|
||||
int ICACHE_FLASH_ATTR cgiGetFirmwareNext(HttpdConnData *connData) {
|
||||
if (connData->conn==NULL) {
|
||||
//Connection aborted. Clean up.
|
||||
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){
|
||||
// The uploaded file is too large
|
||||
os_printf("ESPFS file 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);
|
||||
|
||||
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;
|
||||
}
|
||||
*/
|
||||
|
||||
// The source should be 4byte aligned, so go ahead and flash whatever we have
|
||||
int address = ESPFS_POS + connData->post->received - connData->post->buffLen;
|
||||
if(connData->post->len > FIRMWARE_SIZE){
|
||||
// The uploaded file is too large
|
||||
os_printf("Firmware image too large\n");
|
||||
httpdStartResponse(connData, 400);
|
||||
httpdHeader(connData, "Content-Type", "text/plain");
|
||||
httpdEndHeaders(connData);
|
||||
httpdSend(connData, "Firmware image loo large.\r\n", -1);
|
||||
return HTTPD_CGI_DONE;
|
||||
}
|
||||
|
||||
uint8 id = system_upgrade_userbin_check();
|
||||
|
||||
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){
|
||||
// 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);
|
||||
}
|
||||
|
||||
// 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);
|
||||
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){
|
||||
httpdSend(connData, "Finished uploading", -1);
|
||||
// TODO: verify the firmware (is there a checksum or something???)
|
||||
httpdStartResponse(connData, 200);
|
||||
httpdEndHeaders(connData);
|
||||
return HTTPD_CGI_DONE;
|
||||
} else {
|
||||
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"
|
||||
|
||||
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[]={
|
||||
{"/", 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},
|
||||
{"/index.tpl", cgiEspFsTemplate, tplCounter},
|
||||
{"/led.cgi", cgiLed, NULL},
|
||||
{"/updateweb.cgi", cgiUploadEspfs, NULL},
|
||||
|
||||
//Routines to make the /wifi URL and everything beneath it work.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user