pull/30/head
parent
cebc0aa65f
commit
ccb87593e8
@ -0,0 +1,80 @@ |
||||
/*
|
||||
Some flash handling cgi routines. Used for reading the existing flash and updating the ESPFS image. |
||||
*/ |
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------------------- |
||||
* "THE BEER-WARE LICENSE" (Revision 42): |
||||
* Jeroen Domburg <jeroen@spritesmods.com> wrote this file. As long as you retain
|
||||
* this notice you can do whatever you want with this stuff. If we meet some day,
|
||||
* and you think this stuff is worth it, you can buy me a beer in return.
|
||||
* ---------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
|
||||
#include <string.h> |
||||
#include <osapi.h> |
||||
#include "user_interface.h" |
||||
#include "mem.h" |
||||
#include "httpd.h" |
||||
#include "cgiflash.h" |
||||
#include "io.h" |
||||
#include <ip_addr.h> |
||||
#include "espmissingincludes.h" |
||||
#include "../include/httpdconfig.h" |
||||
|
||||
|
||||
//Cgi that reads the SPI flash. Assumes 512KByte flash.
|
||||
int ICACHE_FLASH_ATTR cgiReadFlash(HttpdConnData *connData) { |
||||
int *pos=(int *)&connData->cgiData; |
||||
if (connData->conn==NULL) { |
||||
//Connection aborted. Clean up.
|
||||
return HTTPD_CGI_DONE; |
||||
} |
||||
|
||||
if (*pos==0) { |
||||
os_printf("Start flash download.\n"); |
||||
httpdStartResponse(connData, 200); |
||||
httpdHeader(connData, "Content-Type", "application/bin"); |
||||
httpdEndHeaders(connData); |
||||
*pos=0x40200000; |
||||
return HTTPD_CGI_MORE; |
||||
} |
||||
//Send 1K of flash per call. We will get called again if we haven't sent 512K yet.
|
||||
espconn_sent(connData->conn, (uint8 *)(*pos), 1024); |
||||
*pos+=1024; |
||||
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) { |
||||
if (connData->conn==NULL) { |
||||
//Connection aborted. Clean up.
|
||||
return HTTPD_CGI_DONE; |
||||
} |
||||
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\nContent-Type: text/plain\r\nContent-Length: 24\r\n\r\nESPFS image loo large.\r\n", -1); |
||||
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(address % SPI_FLASH_SEC_SIZE == 0){ |
||||
// We need to erase this block
|
||||
os_printf("Erasing flash at %d\n", address/SPI_FLASH_SEC_SIZE); |
||||
spi_flash_erase_sector(address/SPI_FLASH_SEC_SIZE); |
||||
} |
||||
// Write the data
|
||||
os_printf("Writing at: 0x%x\n", address); |
||||
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); |
||||
return HTTPD_CGI_DONE; |
||||
} else { |
||||
return HTTPD_CGI_MORE; |
||||
} |
||||
} |
@ -0,0 +1,9 @@ |
||||
#ifndef CGIFLASH_H |
||||
#define CGIFLASH_H |
||||
|
||||
#include "httpd.h" |
||||
|
||||
int cgiReadFlash(HttpdConnData *connData); |
||||
int cgiUploadEspfs(HttpdConnData *connData); |
||||
|
||||
#endif |
Loading…
Reference in new issue