mirror of
https://github.com/clockworkpi/PicoCalc.git
synced 2026-03-24 04:52:38 +01:00
add pico_multi_booter code
This commit is contained in:
66
Code/pico_multi_booter/picomite/MMtftp.c
Normal file
66
Code/pico_multi_booter/picomite/MMtftp.c
Normal file
@@ -0,0 +1,66 @@
|
||||
#include "MMBasic_Includes.h"
|
||||
#include "Hardware_Includes.h"
|
||||
#include "lwip/apps/tftp_common.h"
|
||||
#include "lwip/apps/tftp_server.h"
|
||||
struct tftp_context ctx;
|
||||
int tftp_fnbr;
|
||||
void* tftp_open(const char* fname, const char* fmode, u8_t write){
|
||||
if (!InitSDCard()) return NULL;
|
||||
BYTE mode = 0;
|
||||
tftp_fnbr=FindFreeFileNbr();
|
||||
if (write){
|
||||
mode = FA_WRITE | FA_CREATE_ALWAYS;
|
||||
if(!optionsuppressstatus)MMPrintString("TFTP request to create ");
|
||||
}
|
||||
else {
|
||||
mode = FA_READ;
|
||||
if(!optionsuppressstatus)MMPrintString("TFTP request to read ");
|
||||
}
|
||||
if(!optionsuppressstatus)MMPrintString(strcmp(fmode,"octet")==0? "binary file : " : "ascii file : ");
|
||||
if(!optionsuppressstatus)MMPrintString((char *)fname);
|
||||
if(!optionsuppressstatus)PRet();
|
||||
if (!BasicFileOpen((char *)fname, tftp_fnbr, mode))
|
||||
return NULL;
|
||||
return &tftp_fnbr;
|
||||
}
|
||||
|
||||
void tftp_close(void* handle){
|
||||
// int nbr;
|
||||
int fnbr=*(int *)handle;
|
||||
FileClose(fnbr);
|
||||
if(!optionsuppressstatus)MMPrintString("TFTP transfer complete\r\n");
|
||||
}
|
||||
int tftp_read(void* handle, void* buf, int bytes){
|
||||
int n_read;
|
||||
int fnbr=*(int *)handle;
|
||||
if(filesource[fnbr]==FATFSFILE) f_read(FileTable[fnbr].fptr, buf, bytes, (UINT *)&n_read);
|
||||
else n_read=lfs_file_read(&lfs, FileTable[fnbr].lfsptr, buf, bytes);
|
||||
return n_read;
|
||||
}
|
||||
int tftp_write(void* handle, struct pbuf* p){
|
||||
int nbr;
|
||||
int fnbr=*(int *)handle;
|
||||
if(filesource[fnbr]==FATFSFILE) f_write(FileTable[fnbr].fptr, p->payload, p->tot_len, (UINT *)&nbr);
|
||||
else {
|
||||
nbr=FSerror=lfs_file_write(&lfs, FileTable[fnbr].lfsptr, p->payload, p->tot_len);
|
||||
}
|
||||
if(FSerror>0)FSerror=0;
|
||||
ErrorCheck(tftp_fnbr);
|
||||
return nbr;
|
||||
}
|
||||
void tftp_error(void* handle, int err, const char* msg, int size){
|
||||
int fnbr=*(int *)handle;
|
||||
ForceFileClose(fnbr);
|
||||
MMPrintString("TFTP Error: ");
|
||||
MMPrintString((char *)msg);
|
||||
PRet();
|
||||
}
|
||||
int cmd_tftp_server_init(void){
|
||||
ctx.open=tftp_open;
|
||||
ctx.close=tftp_close;
|
||||
ctx.error=tftp_error;
|
||||
ctx.write=tftp_write;
|
||||
ctx.read=tftp_read;
|
||||
tftp_init_server(&ctx);
|
||||
return 1;
|
||||
}
|
||||
Reference in New Issue
Block a user