From c60dae77b824431070782c1e4555c0fd4e91eb0a Mon Sep 17 00:00:00 2001 From: jfmartel Date: Fri, 24 Sep 2021 11:33:40 -0400 Subject: [PATCH] =?UTF-8?q?Bootloader=20fonctionnel...=20=C3=A0=20retravai?= =?UTF-8?q?ller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bootloader_PIC32.X/Source/BoardCfg.h | 49 + .../Source/BoardCfg_ChaletduinoV2.h | 166 + .../Source/BootloaderInterface.c | 1004 +++++ .../Source/BootloaderInterface.h | 174 + .../Source/BootloaderProtocol.h | 18 +- .../Source/BootloaderStateMachine.c | 870 +++-- .../Source/BootloaderStateMachine.h | 20 +- .../Source/ChaletduinoV2Board.c | 202 + Bootloader_PIC32.X/Source/DigitalIO.c | 5 + Bootloader_PIC32.X/Source/DigitalIO.h | 16 +- Bootloader_PIC32.X/Source/FatFS/ff.c | 5 +- Bootloader_PIC32.X/Source/FatFS/ffconf.h | 6 +- Bootloader_PIC32.X/Source/FatFS/mmc_drv.c | 5 +- Bootloader_PIC32.X/Source/FlashInterface.c | 1 + Bootloader_PIC32.X/Source/FlashInterface.h | 19 +- Bootloader_PIC32.X/Source/FlashMapping.h | 32 + Bootloader_PIC32.X/Source/InternalUart.c | 4 +- Bootloader_PIC32.X/Source/SPI.c | 11 +- Bootloader_PIC32.X/Source/SPI.h | 2 +- Bootloader_PIC32.X/Source/SPI_Flash.c | 448 +++ Bootloader_PIC32.X/Source/SPI_Flash.h | 48 + Bootloader_PIC32.X/Source/checksum.h | 94 + Bootloader_PIC32.X/Source/crc32.c | 131 + Bootloader_PIC32.X/Source/define.h | 8 +- Bootloader_PIC32.X/Source/main.c | 84 +- .../production/Source/BootloaderProtocol.o | Bin 17192 -> 0 bytes .../production/Source/BootloaderProtocol.o.d | 6 - .../Source/BootloaderStateMachine.o | Bin 14956 -> 17360 bytes .../Source/BootloaderStateMachine.o.d | 4 +- .../production/Source/DigitalIO.o | Bin 10156 -> 10156 bytes .../production/Source/FatFS/ff.o | Bin 46916 -> 0 bytes .../production/Source/FatFS/ff.o.d | 6 - .../production/Source/FatFS/ffsystem.o | Bin 1848 -> 0 bytes .../production/Source/FatFS/ffsystem.o.d | 5 - .../production/Source/FatFS/ffunicode.o | Bin 1848 -> 0 bytes .../production/Source/FatFS/ffunicode.o.d | 5 - .../production/Source/FatFS/mmc_drv.o | Bin 24260 -> 0 bytes .../production/Source/FatFS/mmc_drv.o.d | 5 - .../production/Source/FlashInterface.o | Bin 14032 -> 14304 bytes .../production/Source/InternalUart.o | Bin 18440 -> 18360 bytes .../production/Source/InternalUart.o.d | 6 +- .../ChaletDuino_795/production/Source/main.o | Bin 16024 -> 15560 bytes .../production/Source/main.o.d | 8 +- .../Bootloader_PIC32.X.production.elf | Bin 458017 -> 402682 bytes .../Bootloader_PIC32.X.production.hex | 3433 +++++------------ .../Bootloader_PIC32.X.production.map | 950 +++-- .../nbproject/Makefile-ChaletDuino_795.mk | 154 +- .../nbproject/Makefile-genesis.properties | 4 +- .../nbproject/configurations.xml | 235 +- .../nbproject/private/private.xml | 4 +- Bootloader_PIC32.X/procdefs.ld | 2 +- Memory map.xlsx | Bin 0 -> 12263 bytes 52 files changed, 4929 insertions(+), 3320 deletions(-) create mode 100644 Bootloader_PIC32.X/Source/BoardCfg.h create mode 100644 Bootloader_PIC32.X/Source/BoardCfg_ChaletduinoV2.h create mode 100644 Bootloader_PIC32.X/Source/BootloaderInterface.c create mode 100644 Bootloader_PIC32.X/Source/BootloaderInterface.h create mode 100644 Bootloader_PIC32.X/Source/ChaletduinoV2Board.c create mode 100644 Bootloader_PIC32.X/Source/FlashMapping.h create mode 100644 Bootloader_PIC32.X/Source/SPI_Flash.c create mode 100644 Bootloader_PIC32.X/Source/SPI_Flash.h create mode 100644 Bootloader_PIC32.X/Source/checksum.h create mode 100644 Bootloader_PIC32.X/Source/crc32.c delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/BootloaderProtocol.o delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/BootloaderProtocol.o.d delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ff.o delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ff.o.d delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o.d delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o.d delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o delete mode 100644 Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o.d create mode 100644 Memory map.xlsx diff --git a/Bootloader_PIC32.X/Source/BoardCfg.h b/Bootloader_PIC32.X/Source/BoardCfg.h new file mode 100644 index 0000000..32cceb6 --- /dev/null +++ b/Bootloader_PIC32.X/Source/BoardCfg.h @@ -0,0 +1,49 @@ +/* + * File: BoardCfg.h + * Author: JF + * + * Created on November 26, 2018, 4:50 PM + */ + +#ifndef BOARDCFG_H +#define BOARDCFG_H + +#include "define.h" + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk) +{ + unsigned int brg; + + brg = pb_clk / (2 * spi_clk); + + if(pb_clk % (2 * spi_clk)) + brg++; + + if(brg > 0x100) + brg = 0x100; + + if(brg) + brg--; + + return (unsigned char) brg; +} +// +#ifdef FUBARINO_BRD +#include "BoardCfg_Fubarino.h" +#endif + +//#ifdef PINGUINO_BRD +//#include "BoardCfg_Pinguino.h" +//#endif + +#ifdef CHALETDUINO_BRD +#include "BoardCfg_Chaletduino.h" +#endif + +#ifdef CHALETDUINO_V2_BRD +#include "BoardCfg_ChaletduinoV2.h" +#endif +int InitBoard(); + +#endif /* BOARDCFG_H */ + diff --git a/Bootloader_PIC32.X/Source/BoardCfg_ChaletduinoV2.h b/Bootloader_PIC32.X/Source/BoardCfg_ChaletduinoV2.h new file mode 100644 index 0000000..7c0afa9 --- /dev/null +++ b/Bootloader_PIC32.X/Source/BoardCfg_ChaletduinoV2.h @@ -0,0 +1,166 @@ +/* + * File: DigitalIO_Chaletduino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_CHALETDUINO_H +#define DIGITALIO_CHALETDUINO_H + + +#ifdef __cplusplus +extern "C" { +#endif + + + /* ************************************************************************** */ + /* Includes */ +#include "define.h" + /* ************************************************************************** */ + /* Defines */ + //#include +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + + //Output pins hardware definitions + // +#define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE6 +#define HEARTBEAT_LED_2_PIN LATEbits.LATE6 +#define HEARTBEAT_LED_2_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_2_SET_REG LATESET +#define HEARTBEAT_LED_2_CLEAR_REG LATECLR +#define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATE6_MASK + +#define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 +#define HEARTBEAT_LED_1_PIN LATEbits.LATE5 +#define HEARTBEAT_LED_1_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_1_SET_REG LATESET +#define HEARTBEAT_LED_1_CLEAR_REG LATECLR +#define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + +#define LORA_ACTIVITY_LED_PIN_DIR TRISFbits.TRISF1 +#define LORA_ACTIVITY_LED_PIN LATFbits.LATF1 +#define LORA_ACTIVITY_LED_TOGGLE_REG LATFINV +#define LORA_ACTIVITY_LED_SET_REG LATFSET +#define LORA_ACTIVITY_LED_CLEAR_REG LATFCLR +#define LORA_ACTIVITY_LED_TOGGLE_MASK _LATE_LATF1_MASK + + // #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + // #define GP_DEBUG_1_PIN LATEbits.LATE5 + // #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + // #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + // #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 + // #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs +#define SPI_SDO_PIN_DIR TRISGbits.TRISG8 +#define SPI_SDI_PIN_DIR TRISGbits.TRISG7 +#define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + + + + //SD Card +#define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 +#define SD_SPI_SS_PIN LATBbits.LATB13 + + //SPI Flash +#define FLASH_SS_PIN_DIR TRISEbits.TRISE3 +#define FLASH_SS_PIN LATEbits.LATE3 + + + //Wifi (WINC3400 module) +#define WIFI_SPI_SS_PIN_DIR TRISEbits.TRISE0 +#define WIFI_SPI_SS_PIN LATEbits.LATE0 +#define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 +#define WIFI_IRQ_PIN PORTDbits.RD0 + + // #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + // #define WIFI_SPI_CFG_PIN LATEbits.LATE1 +#define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 +#define WIFI_CHP_EN_PIN LATEbits.LATE2 +#define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE4 +#define WIFI_CHP_RST_PIN LATEbits.LATE4 + + //Chalet power relay +#define POWER_RELAY_ON_PIN_DIR TRISEbits.TRISE7 +#define POWER_RELAY_ON_PIN LATEbits.LATE7 //X2- +#define POWER_RELAY_OFF_PIN_DIR TRISGbits.TRISG9 +#define POWER_RELAY_OFF_PIN LATGbits.LATG9 //X3- + + //Harakiri relay +#define HARAKIRI_RELAY_ON_PIN_DIR TRISDbits.TRISD6 +#define HARAKIRI_RELAY_ON_PIN LATDbits.LATD6 + + //12V presence detection input +#define CHALET_12V_PRESENCE_PIN_DIR TRISBbits.TRISB15 +#define CHALET_12V_PRESENCE_PIN PORTBbits.RB15 //X2- + + //Battery voltage measurement (analog input) +#define BATTERY_VOLTAGE_ANALOG_PIN_DIR TRISBbits.TRISB1 //X2-7 + + // //Current sensor. Those pins tristate is controlled by the I2C module + //#define CURRENT_MODULE_I2C_SCL_PIN_DIR TRISDbits.TRISD3 + //#define CURRENT_MODULE_I2C_SDA_PIN_DIR TRISDbits.TRISD2 + + //Onboard temperature sensor (SPI) +#define TEMP_SENSOR_CS_PIN_DIR TRISDbits.TRISD4 +#define TEMP_SENSOR_CS_PIN LATDbits.LATD4 +#define TEMP_SENSOR_SPI_SDO_PIN_DIR TRISDbits.TRISD3 +#define TEMP_SENSOR_SPI_SDI_PIN_DIR TRISDbits.TRISD2 +#define TEMP_SENSOR_SPI_SCK_PIN_DIR TRISDbits.TRISD1 + + + //Analog (Hall effect) current sensor +#define CURRENT_SENSOR_IN1_PIN_DIR TRISBbits.TRISB2 +#define CURRENT_SENSOR_IN2_PIN_DIR TRISBbits.TRISB0 + + //LoRa +#define LORA_MODULE_RELAY_PIN_DIR TRISDbits.TRISD11 +#define LORA_MODULE_RELAY_PIN LATDbits.LATD11 +#define LORA_MODULE_M0_PIN_DIR TRISEbits.TRISE7 //FUCK, double assignation avec Inverter ON +#define LORA_MODULE_M0_PIN LATEbits.LATE7 +#define LORA_MODULE_M1_PIN_DIR TRISDbits.TRISD9 +#define LORA_MODULE_M1_PIN LATDbits.LATD9 +#define LORA_MODULE_INT_PIN_DIR TRISDbits.TRISD8 +#define LORA_MODULE_INT_PIN PORTDits.RD8 +#define LORA_MODULE_RX_LED_PIN_DIR TRISCbits.TRISC14 +#define LORA_MODULE_RX_LED_PIN LATCbits.LATC14 +#define LORA_MODULE_TX_LED_PIN_DIR TRISCbits.TRISC13 +#define LORA_MODULE_TX_LED_PIN LATCbits.LATC13 + + //LCD Screen +#define LCD_RS_PIN_DIR TRISDbits.TRISD5 +#define LCD_RS_PIN LATDbits.LATD5 +#define LCD_RW_PIN_DIR TRISBbits.TRISB13 +#define LCD_RW_PIN LATBbits.LATB13 +#define LCD_E_PIN_DIR TRISBbits.TRISB12 +#define LCD_E_PIN LATBbits.LATB12 +#define LCD_DB4_PIN_DIR TRISBbits.TRISB3 +#define LCD_DB4_PIN LATBbits.LATB3 +#define LCD_DB5_PIN_DIR TRISBbits.TRISB9 +#define LCD_DB5_PIN LATBbits.LATB9 +#define LCD_DB6_PIN_DIR TRISBbits.TRISB10 +#define LCD_DB6_PIN LATBbits.LATB10 +#define LCD_DB7_PIN_DIR TRISBbits.TRISB11 +#define LCD_DB7_PIN LATBbits.LATB11 + + //#define LCD_SCROLL_BTN_PIN_DIR TRISCbits.TRISC13 + //#define LCD_SCROLL_BTN_PIN PORTCbits.PORTC13 + + /* ************************************************************************** */ + /* Prototypes */ + void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/Bootloader_PIC32.X/Source/BootloaderInterface.c b/Bootloader_PIC32.X/Source/BootloaderInterface.c new file mode 100644 index 0000000..cc4626c --- /dev/null +++ b/Bootloader_PIC32.X/Source/BootloaderInterface.c @@ -0,0 +1,1004 @@ +//#include + +#include "BootloaderInterface.h" +#include "FlashMapping.h" +#include "checksum.h" + +stBootloaderFlags_t mBootloaderFlags; + +#ifdef USE_FULL_IMPLEMENTATION + + +#include "BootloaderProtocol.h" +#include "ProtocolDefs.h" +#include "BoardCfg.h" +#include "timer.h" +#include "WiFiCtrl.h" +#include "SPI_Flash.h" +#include "NetworkProtocol.h" +#include "Syslog.h" + + + + +#define BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT 25//100 //ms +#define BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase... +#define BOOTLOADER_FLASH_WRITE_POLL_TIMEOUT 25//100 //ms +#define BOOTLOADER_FLASH_WRITE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase... + + +unsigned char BootloaderBuffer[300]; +int BootloaderInterfaceState; + + +int DataChunkWritten; +int CurDataChunkIndex; +int FirmwareUploaded; +int CurDataChunkSize; + +int BooloaderFlashEraseState; +int BootloaderFlashErased; +unsigned int BootloaderCurFlashEraseAddress; +int BooloaderFlashErasePollCount; + +int BootloaderFlashWriteState; +unsigned int BootloaderCurFlashWriteAddress; +int BootloaderFlashWritePollCount; +int BootloaderFirmwareChunkWriteCount; +char* BootloaderFlashWriteDataPtr; + + +int BootloaderInterfaceInit() +{ + BootloaderProtocolInit(); + BootloaderResetStateMachine(); + BootloaderCheckFlashBootloaderData(); + update_crc_32(0,0); //Force to populate the CRC32 table... + return 1; +} + +void BootloaderInterfaceTick() +{ + BootloaderInterfaceStateMachine(BOOTLOADER_TICK_EVENT,0); +} + +void BootloaderExecuteCmd(char Cmd,int CRCValid) +{ + unsigned char *DataBufPtr = BootloaderProtocolGetDataBufferPtr(); + if(CRCValid == 0) + { + BootloaderProtocolSendFrame(Cmd,BOOTLOADER_SM_INVALID_CRC_CMD); + return; + } + switch(Cmd) + { + case BOOTLOADER_HEARTBEAT_REQUEST: + { + printf("Bootloader Heartbeat Request\n"); + *DataBufPtr = 1; + BootloaderProtocolSendFrame(BOOTLOADER_HEARTBEAT_RESPONSE,1); + break; + } + case BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST: + { + printf("BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ERASE_FLASH_CMD); + break; + } + case BOOTLOADER_INIT_UPLOAD_REQUEST: + { + printf("BOOTLOADER_INIT_UPLOAD_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INIT_UPLOAD_CMD); + break; + } + case BOOTLOADER_GET_STATE_REQUEST: + { + printf("BOOTLOADER_GET_STATE_REQUEST\n"); + BootloaderProtocolSendBootloaderState((char)BootloaderInterfaceState); + break; + } + case BOOTLOADER_SEND_DATA_CHUNK_REQUEST: + { +// printf("BOOTLOADER_SEND_DATA_CHUNK_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_NEW_DATA_CHUNK_CMD); + break; + } + case BOOTLOADER_UPLOAD_FINISHED_REQUEST: + { + printf("BOOTLOADER_UPLOAD_FINISHED_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_UPLOAD_FINISHED_CMD); + break; + } + case BOOTLOADER_EXECUTE_UPGRAGE_REQUEST: + { + printf("BOOTLOADER_EXECUTE_UPGRAGE_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD); + break; + } + case BOOTLOADER_ABORT_OPERATION_REQUEST: + { + printf("BOOTLOADER_ABORT_OPERATION_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ABORT_CMD); + } + case BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST: + { + printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_CHECK_FLASH_CMD); + break; + } + default: + { + break; + } + } +} + +void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC) +{ + printf("BootloaderProtocol detected a CRC error. Cmd: %d, RxCRC:0x%x, Expected:[0x%x]\n",Cmd,RxCRC,ExpectedCRC); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD); +} + +void BootloaderInterfaceStateMachine(int Event, int Param) +{ + + switch(BootloaderInterfaceState) + { + case BOOTLOADER_STANDBY_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + if(Param == BOOTLOADER_SM_ACTIVATE_CMD) + { + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + printf("Bootloader Interface going into active state\n"); + + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_ACTIVE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ERASE_FLASH_CMD: + { + ResetBootloaderFlashEraseStateMachine(); //Setup the state machine + BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESPONSE); + BootloaderInterfaceState = BOOTLOADER_ERASE_FLASH_STATE; + printf("Bootloader Interface going into Erase Flash state\n"); + break; + } + case BOOTLOADER_SM_INIT_UPLOAD_CMD: + { + + if(BootloaderFlashErased == 0) + { + BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_ERROR_FLASH_NOT_ERASED); + } + else + { + BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_OK); + + //TODO: Shall we prepare something before?? + BootloaderProtocolSendACK(BOOTLOADER_READY_FOR_DATA_RESPONSE); + + BootloaderInterfaceState = BOOTLOADER_RECEIVING_FIRMWARE_STATE; + printf("Bootloader Interface going into Firmware RX state\n"); + } + break; + } + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + case BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD: + { + if(FirmwareUploaded == 1) + { + //TODO: Do that! + BootloaderProtocolSendACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE); + printf("Bootloader will now upgrade and reboot!!\n"); + } + else + { + BootloaderProtocolSendNACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE); + printf("Bootloader upgrade request denied: Firmware not uploaded\n"); + } + break; + } + case BOOTLOADER_SM_CHECK_FLASH_CMD: + { + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_SUCCESS); + } + else + { + BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_FAILED); + } + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_ERASE_FLASH_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + int res = BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT); + switch(res) + { + case BOOTLOADER_FLASH_ERASE_RUNNING_RES: + { + break; + } + case BOOTLOADER_FLASH_ERASE_FINISHED_RES: + { + printf("Flash erase finished. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + BootloaderFlashErased = 1; + break; + } + case BOOTLOADER_FLASH_ERASE_ERROR_RES: + { + printf("Flash erase error. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + break; + } + case BOOTLOADER_FLASH_ERASE_ABORT_RES: + { + printf("Flash erase abort. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + break; + } + } + + + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO: stop erasing and reset SM. + //TODO invalidate data in Flash + BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT); + printf("Aborting Flash erase, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_RECEIVING_FIRMWARE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + int res = BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT); + switch(res) + { + case BOOTLOADER_FLASH_WRITING_RES: + { + break; + } + case BOOTLOADER_FLASH_WRITE_FINISHED_RES: + { + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_SUCCESS,CurDataChunkIndex); + printf("Bootloader Chunk %d successfuly written to flash\n",CurDataChunkIndex); + CurDataChunkIndex++; + break; + } + case BOOTLOADER_FLASH_WRITE_ERROR_RES: + { + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR,CurDataChunkIndex); + BootloaderResetStateMachine(); + printf("Bootloader Flash write error. Aborting and going into STANDBY state\n"); + break; + } + case BOOTLOADER_FLASH_WRITE_ABORT_RES: + { + break; + } + } + + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_NEW_DATA_CHUNK_CMD: + { + + //TODO:Check data validity + //TODO: Write data to flash + + //Extract index from buffer + unsigned int DataChunkIndex = 0; + unsigned int DataChunkSize = 0; + DataChunkSize = 0; + +// DataChunkIndex = BootloaderBuffer[0]; +// DataChunkIndex <<= 8; +// DataChunkIndex += BootloaderBuffer[1]; +// DataChunkIndex <<= 8; +// DataChunkIndex += BootloaderBuffer[2]; +// DataChunkIndex <<= 8; +// DataChunkIndex += BootloaderBuffer[3]; + DataChunkIndex = BootloaderBytesToInt(&BootloaderBuffer[0]); + +// DataChunkSize = BootloaderBuffer[4]; +// DataChunkSize <<= 8; +// DataChunkSize += BootloaderBuffer[5]; +// DataChunkSize <<= 8; +// DataChunkSize += BootloaderBuffer[6]; +// DataChunkSize <<= 8; +// DataChunkSize += BootloaderBuffer[7]; + DataChunkSize = BootloaderBytesToInt(&BootloaderBuffer[4]); + + + BootloaderFlashWriteDataPtr = &BootloaderBuffer[8]; + + //Check CRC + + + + if(CurDataChunkIndex != DataChunkIndex) + { + //Error... abort. + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX,CurDataChunkIndex); + printf("Bootloader Interface ABORTING UPLOAD. Received invalid chunk index. Rx: [%d] - Expected: [%d]\n", DataChunkIndex,CurDataChunkIndex); + ResetBootloaderFlashWriteStateMachine(); + + } + else + { + CurDataChunkSize = DataChunkSize; + BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT); + printf("Bootloader Interface. Rx new data chunk. Writing to flash. Index: %d\n", DataChunkIndex); + } + + break; + } + case BOOTLOADER_SM_INVALID_CRC_CMD: + { + //BootloaderProtocol determined the CRC of the chunk was invalid. + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND,CurDataChunkIndex); + printf("Bootloader Interface invalid chunk CRC. Requesting resend chunk index [%d]\n", CurDataChunkIndex); + break; + } + case BOOTLOADER_SM_UPLOAD_FINISHED_CMD: + { + printf("Bootloader Interface firmware upload finished. Check flash integrity.\n"); + + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + //BootloaderProtocolSendACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE); + BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_SUCCESS); + FirmwareUploaded = 1; + } + else + { + printf("Firmware integrity check failed. Going back to STANDBY state.\n"); +// BootloaderProtocolSendNACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE); + BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_FAILED_FLASH_VERIFICATION_ERROR); + BootloaderResetStateMachine(); + FirmwareUploaded = 0; + } + break; + } + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Bootloader aborting firmware download. Going back to STANDBY state\n"); + BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT); + BootloaderResetStateMachine(); + break; + } + default: + { + //WHAT TO DO??? + + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_SENDING_FIRMWARE_COPY_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_PRINTING_FIRMWARE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + } + +} + +void BootloaderResetStateMachine() +{ + BootloaderInterfaceState = BOOTLOADER_STANDBY_STATE; + DataChunkWritten = 0; + CurDataChunkIndex = 0; + FirmwareUploaded = 0; + CurDataChunkIndex = 0; + FirmwareUploaded = 0; + CurDataChunkSize = 0; + + + ResetBootloaderFlashEraseStateMachine(); + ResetBootloaderFlashWriteStateMachine(); + + CloseBootloaderServer(); +} + +void BootloaderActivateBootloader() +{ + OpenBootloaderServer(); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ACTIVATE_CMD); +} +void BootloaderDeactivateBootloader() +{ + BootloaderResetStateMachine(); +// CloseBootloaderServer(); +// BootloaderIterfaceStateMachine(BOOTLOADER_SM_ABORT_CMD,0); +} + +int BootloaderFlashEraseStateMachine(int event) +{ + if(event == BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT) + { + ResetBootloaderFlashEraseStateMachine(); + return BOOTLOADER_FLASH_ERASE_ABORT_RES; + } + + switch(BooloaderFlashEraseState) + { + case BOOTLOADER_FLASH_ERASE_SECTOR_STATE: + { + if(SPIFlashErase64KSector(BootloaderCurFlashEraseAddress,0) == RET_ERROR) + { + + printf("Bootloader Interface Erasing sector %0x%x\n", BootloaderCurFlashEraseAddress); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE; + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + } + BooloaderFlashErasePollCount = 0; + TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE; + break; + } + case BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE: + { + if(IsTimerExpired(BOOTLOADER_FLASH_POLL_TIMER) == 1) + { + if(SPIFlashCheckBusy() == 0) //sector erased + { + if(BootloaderCurFlashEraseAddress == FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD) + { + //Whole bootloader partition is erased. + printf("Bootloader Interface: Last sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_FINISHED_STATE; + return BOOTLOADER_FLASH_ERASE_FINISHED_RES; + break; + } + else + { + printf("Bootloader Interface sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount); + BootloaderCurFlashEraseAddress += SPI_FLASH_64K_SECTOR_SIZE; + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE; + } + } + else + { + if(BooloaderFlashErasePollCount >= BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT) + { + printf("Bootloader Interface Flash erase error. Max poll count reached : %d!!!\n",BooloaderFlashErasePollCount); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE; + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + } + else + { + TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT); + BooloaderFlashErasePollCount++; + } + } + } + break; + } + case BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE: + { + break; + } + case BOOTLOADER_FLASH_ERASE_FINISHED_STATE: + { + return BOOTLOADER_FLASH_ERASE_FINISHED_RES; + break; + } + case BOOTLOADER_FLASH_ERASE_ERROR_STATE: + { + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + break; + } + } + + return BOOTLOADER_FLASH_ERASE_RUNNING_RES; +} + +int ResetBootloaderFlashEraseStateMachine() +{ + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE; + BootloaderCurFlashEraseAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + BooloaderFlashErasePollCount = 0; + BootloaderFlashErased = 0; +} + +int BootloaderFlashWriteStateMachine(int event) +{ + switch(BootloaderFlashWriteState) + { + case BOOTLOADER_FLASH_WRITE_STANDBY_STATE: + { + if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT) + { + //TODO: timeout + // return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + else if(event == BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT) + { + // printf("Starting writing data to Flash\nFlash Address : Data\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_BUFFER_STATE; + BootloaderFirmwareChunkWriteCount = 0; + return BOOTLOADER_FLASH_WRITING_RES; + } + break; + } + case BOOTLOADER_FLASH_WRITE_BUFFER_STATE: + { + if(BootloaderFlashWriteDataPtr == 0) + { + ResetBootloaderFlashWriteStateMachine(); + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + + while(BootloaderFirmwareChunkWriteCount < CurDataChunkSize) + { + + //printf("%d : 0x%x\n",(BootloaderCurFlashWriteAddress-FLASH_BTLDR_FIRMWARE_START_ADDRESS),(unsigned int)*BootloaderFlashWriteDataPtr); + if(SPIFlashWriteByte(BootloaderCurFlashWriteAddress++,*BootloaderFlashWriteDataPtr++,1) == RET_ERROR) + { + printf("Bootloader flash error. Aborting and going back to STANDBY\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE; + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + + + int cnt = 0; + while(1) + { + if(SPIFlashCheckBusy() == 0) + { + break; + } + if(cnt++ > 200) + { + printf("Bootloader flash write timeout error. Aborting and going back to STANDBY\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE; + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + } + + BootloaderFirmwareChunkWriteCount++; + } + + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE; + return BOOTLOADER_FLASH_WRITING_RES; + + // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + // return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + + + break; + } + case BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE: + { + if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT) + { + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + return BOOTLOADER_FLASH_WRITE_FINISHED_RES; +// if(SyslogIsBufferEmpty() == RET_OK) +// { +// BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; +// return BOOTLOADER_FLASH_WRITE_FINISHED_RES; +// } +// else +// { +// return BOOTLOADER_FLASH_WRITING_RES; +// } + } + break; + } + case BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE: + { + break; + } + case BOOTLOADER_FLASH_WRITE_FINISHED_STATE: + { + return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + break; + } + case BOOTLOADER_FLASH_WRITE_ERROR_STATE: + { + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + break; + } + + } +} + +int BootloaderPrintFlashData() +{ + +} + + +int ResetBootloaderFlashWriteStateMachine() +{ + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + BootloaderCurFlashWriteAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + BootloaderFlashWritePollCount = 0; + BootloaderFirmwareChunkWriteCount = 0; + BootloaderFlashWriteDataPtr = 0; + BootloaderFirmwareChunkWriteCount = 0; + return RET_OK; +} + +#endif + + +int BootloaderCheckFlashBootloaderData() +{ + + unsigned char FlashData[100]; + unsigned int FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + unsigned int FileHeaderCode, FirmwareFlags, NbRecords, FirmwareSize, VersionCode, CRC32; + unsigned int ComputedCRC32 = CRC_START_32; + + //SPIFlashReadBuffer(FlashData,700,FlashAddress); + + + //printf("Checking Flash bootloader data integrity... \n"); + SPIFlashReadBuffer(FlashData,FLASH_BTLDR_HEADER_SIZE,FlashAddress); + + FileHeaderCode = BootloaderBytesToInt(FlashData); + FirmwareFlags = BootloaderBytesToInt(&FlashData[4]); + NbRecords = BootloaderBytesToInt(&FlashData[8]); + FirmwareSize = BootloaderBytesToInt(&FlashData[12]); + VersionCode = BootloaderBytesToInt(&FlashData[16]); + CRC32 = BootloaderBytesToInt(&FlashData[20]); + + +// printf("File Header: Code:[0x%x] - Flags:[0x%x] - Nb Records:[%d] - Firmware Size:[%d] - Version:[0x%x] - CRC32:[0x%x]\n",FileHeaderCode,FirmwareFlags,NbRecords,FirmwareSize,VersionCode,CRC32); + + + if(FileHeaderCode != BOOTLOADER_FILE_HEADER_CODE) + { + // printf("Invalid file header code, aborting\n"); + return RET_ERROR; + } + if(NbRecords == 0) + { + // printf("No records in file (NbRecords = 0), aborting\n"); + return RET_ERROR; + } + + FlashAddress += FLASH_BTLDR_HEADER_SIZE; //point to the start of bootloader data + + int CurRecord = 0; + unsigned int Done = false; + int RecHeader, RecSize, RecStartAddress; + + //Check the header of each sector. + while(Done == false) + { + SPIFlashReadBuffer(FlashData,12,FlashAddress); + RecHeader = BootloaderBytesToInt(FlashData); + RecSize = BootloaderBytesToInt(&FlashData[4]); + RecStartAddress = BootloaderBytesToInt(&FlashData[8]); + FlashAddress += 12; + + + if(RecHeader != BOOTLOADER_RECORD_HEADER_CODE) + { + // printf("Error in record #%d. Invalid header code : [0x%x]\n",CurRecord,RecHeader); + return RET_ERROR; + } + if(RecSize == 0) + { + // printf("Error in record #%d. Invalid record size (RecordSize = 0) \n"); + return RET_ERROR; + } + +// printf("Record #%d OK! Header:[0x%x] - Size:[%d] - Start Address:[0x%x]\n",CurRecord,RecHeader,RecSize,RecStartAddress); +// while(SyslogIsBufferEmpty() == RET_ERROR) +// { +// SyslogTick(); +// TickWiFi(); +// } + + CurRecord++; + if(CurRecord == NbRecords) + { + // Done = true; + // printf("All records checked OK! Computing CRC...\n"); + Done = true; + break; + //return RET_OK; + } + else + { + FlashAddress += RecSize; + } + } + + //Now, compute whole data CRC + FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS + FLASH_BTLDR_HEADER_SIZE; + char Byte; + int i; + for(i = 0; i < FirmwareSize; i++) + { + SPIFlashReadBuffer(&Byte,1,FlashAddress++); + ComputedCRC32 = update_crc_32(ComputedCRC32,Byte); + } + ComputedCRC32 ^= 0xffffffffL; + + if(ComputedCRC32 == CRC32) + { + // printf("CRC32 matches. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32); + // printf("Flash check success. Firmware is valid\n"); + char mbuf[30]; + mbuf[0] = 'F'; + mbuf[1] = 'i'; + mbuf[2] = 'r'; + mbuf[3] = 'm'; + mbuf[4] = 'w'; + mbuf[5] = 'a'; + mbuf[6] = 'r'; + mbuf[7] = 'e'; + mbuf[8] = ' '; + mbuf[9] = 'C'; + mbuf[10] = 'h'; + mbuf[11] = 'e'; + mbuf[12] = 'c'; + mbuf[13] = 'k'; + mbuf[14] = ' '; + mbuf[15] = 's'; + mbuf[16] = 'u'; + mbuf[17] = 'c'; + mbuf[18] = 'c'; + mbuf[19] = 'e'; + mbuf[20] = 's'; + mbuf[21] = 's'; + mbuf[22] = '\n'; + mbuf[23] = '\r'; + SendInternalUartData(&mbuf[0],24); + return RET_OK; + } + else + { + // printf("CRC32 mismatch. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32); + // printf("Flash check failed.\n"); + char mbuf[30]; + mbuf[0] = 'F'; + mbuf[1] = 'i'; + mbuf[2] = 'r'; + mbuf[3] = 'm'; + mbuf[4] = 'w'; + mbuf[5] = 'a'; + mbuf[6] = 'r'; + mbuf[7] = 'e'; + mbuf[8] = ' '; + mbuf[9] = 'C'; + mbuf[10] = 'h'; + mbuf[11] = 'e'; + mbuf[12] = 'c'; + mbuf[13] = 'k'; + mbuf[14] = ' '; + mbuf[15] = 'F'; + mbuf[16] = 'a'; + mbuf[17] = 'i'; + mbuf[18] = 'l'; + mbuf[19] = 'e'; + mbuf[20] = 'd'; + mbuf[22] = '\n'; + mbuf[23] = '\r'; + SendInternalUartData(&mbuf[0],23); + return RET_ERROR; + } + + return RET_OK; + +} + +int BoootloaderGetBootloaderFlags() +{ + char BootloaderFlags[FLASH_BTLDR_FLAGS_SIZE]; + SPIFlashReadBuffer(BootloaderFlags,FLASH_BTLDR_FLAGS_SIZE,FLASH_BTLDR_FLAGS_ADDRESS); + + mBootloaderFlags.BootloaderAction = BootloaderFlags[BOOTLOADER_FLAGS_ACTION_FLAG_INDEX]; + mBootloaderFlags.BootloaderActionValidator = BootloaderFlags[BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX]; + + return RET_OK; +} + +int BootloaderBytesToInt(unsigned char *Bytes) +{ + if(Bytes == 0) + { + return 0; + } + + int Output = Bytes[0]; + Output <<= 8; + Output += Bytes[1]; + Output <<= 8; + Output += Bytes[2]; + Output <<= 8; + Output += Bytes[3]; + + return Output; +} +int BootloaderBytesToIntLittleEndian(unsigned char *Bytes) +{ + if(Bytes == 0) + { + return 0; + } + + int Output = Bytes[3]; + Output <<= 8; + Output += Bytes[2]; + Output <<= 8; + Output += Bytes[1]; + Output <<= 8; + Output += Bytes[0]; + + return Output; +} \ No newline at end of file diff --git a/Bootloader_PIC32.X/Source/BootloaderInterface.h b/Bootloader_PIC32.X/Source/BootloaderInterface.h new file mode 100644 index 0000000..ccbcf9d --- /dev/null +++ b/Bootloader_PIC32.X/Source/BootloaderInterface.h @@ -0,0 +1,174 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef BOOTLOADERINTERFACE_H +#define BOOTLOADERINTERFACE_H +#include "define.h" + +//#define USE_FULL_IMPLEMENTATION + +#define BOOTLOADER_FILE_HEADER_CODE (int)0xBAADBEEF +#define BOOTLOADER_RECORD_HEADER_CODE (int)0xDEADBEEF + +#define BOOTLOADER_FLASH_FIRMWARE_VALIDATOR 0xA8 +#define BOOTLOADER_ENTER_UPLOAD_MODE_VALIDATOR 0x5A + +typedef struct +{ + unsigned char BootloaderAction; + unsigned char BootloaderActionValidator; + +}stBootloaderFlags_t; + +extern stBootloaderFlags_t mBootloaderFlags; + +enum eBootloaderFlagsIndex +{ + BOOTLOADER_FLAGS_ACTION_FLAG_INDEX = 0, + BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX, + + + BOOTLOADER_FLAGS_MAX_INDEX = 12 +}; + +enum eBootloaderActionFlagValues +{ + BOOTLOADER_ACTION_JUMP_TO_APP_VALUE = 0, + BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE = 1, + BOOTLOADER_ACTION_ENTER_UPDATE_MODE_VALUE = 2, + + BOOTLOADER_ACTION_MAX_VALUE + +}; + +#ifdef USE_FULL_IMPLEMENTATION +enum eBootloaderStates +{ + BOOTLOADER_STANDBY_STATE, + BOOTLOADER_ACTIVE_STATE, + BOOTLOADER_ERASE_FLASH_STATE, + BOOTLOADER_RECEIVING_FIRMWARE_STATE, + BOOTLOADER_SENDING_FIRMWARE_COPY_STATE, + BOOTLOADER_PRINTING_FIRMWARE_STATE, + + BOOTLOADER_MAX_STATE +}; + +enum eBootloaderStateMachineEvents +{ + BOOTLOADER_TICK_EVENT, + BOOTLOADER_NEW_CMD_EVENT, + BOOTLOADER_TIMEOUT_EVENT, + + BOOTLOADER_MAX_EVENT +}; + +enum eBootloaderFlashEraseStates +{ + BOOTLOADER_FLASH_ERASE_SECTOR_STATE, + BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE, + BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE, + BOOTLOADER_FLASH_ERASE_FINISHED_STATE, + BOOTLOADER_FLASH_ERASE_ERROR_STATE, + + BOOTLOADER_FLASH_ERASE_MAX_STATE +}; + +enum eBootloaderFlashEraseResults +{ + BOOTLOADER_FLASH_ERASE_RUNNING_RES, + BOOTLOADER_FLASH_ERASE_FINISHED_RES, + BOOTLOADER_FLASH_ERASE_ERROR_RES, + BOOTLOADER_FLASH_ERASE_ABORT_RES, + + BOOTLOADER_FLASH_ERASE_MAX_RES +}; + +enum eBootloaderFlahsEraseSMEvents +{ + BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT, + BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT, + + BOOTLOADER_FLASH_ERASE_SM_MAX_EVENT +}; + +enum eBootloaderFlashWriteStates +{ + BOOTLOADER_FLASH_WRITE_STANDBY_STATE, + BOOTLOADER_FLASH_WRITE_BUFFER_STATE, + BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE, + BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE, + BOOTLOADER_FLASH_WRITE_FINISHED_STATE, + BOOTLOADER_FLASH_WRITE_ERROR_STATE, + + BOOTLOADER_FLASH_WRITE_MAX_STATE +}; + +enum eBootloaderFlashWriteResults +{ + BOOTLOADER_FLASH_WRITING_RES, + BOOTLOADER_FLASH_WRITE_FINISHED_RES, + BOOTLOADER_FLASH_WRITE_ERROR_RES, + BOOTLOADER_FLASH_WRITE_ABORT_RES, + + BOOTLOADER_FLASH_WRITE_MAX_RES +}; + +enum eBootloaderFlahsWriteSMEvents +{ + BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT, + BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT, + BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT, + + BOOTLOADER_FLASH_WRITE_SM_MAX_EVENT +}; + + +enum eBootloaderStateMachineCmds +{ + BOOTLOADER_SM_ACTIVATE_CMD, + BOOTLOADER_SM_ABORT_CMD, + BOOTLOADER_SM_ERASE_FLASH_CMD, + BOOTLOADER_SM_INIT_UPLOAD_CMD, + BOOTLOADER_SM_NEW_DATA_CHUNK_CMD, + BOOTLOADER_SM_UPLOAD_FINISHED_CMD, + BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD, + BOOTLOADER_SM_INVALID_CRC_CMD, + BOOTLOADER_SM_CHECK_FLASH_CMD +}; + + +extern unsigned char BootloaderBuffer[300]; + +int BootloaderInterfaceInit(); +void BootloaderExecuteCmd(char Cmd,int CRCValid); +void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC); + + +void BootloaderInterfaceTick(); +void BootloaderInterfaceStateMachine(int Event, int Param); +void BootloaderResetStateMachine(); +void BootloaderActivateBootloader(); +void BootloaderDeactivateBootloader(); + +int BootloaderFlashEraseStateMachine(int event); +int ResetBootloaderFlashEraseStateMachine(); + +int BootloaderFlashWriteStateMachine(int event); +int ResetBootloaderFlashWriteStateMachine(); +int BootloaderPrintFlashData(); +#endif + +int BootloaderCheckFlashBootloaderData(); +int BootloaderBytesToInt(unsigned char *Bytes); +int BoootloaderGetBootloaderFlags(); + + + + +#endif /* BOOTLOADERINTERFACE_H */ + diff --git a/Bootloader_PIC32.X/Source/BootloaderProtocol.h b/Bootloader_PIC32.X/Source/BootloaderProtocol.h index b3f660a..08dc694 100644 --- a/Bootloader_PIC32.X/Source/BootloaderProtocol.h +++ b/Bootloader_PIC32.X/Source/BootloaderProtocol.h @@ -4,17 +4,17 @@ #define BOOTLOADER_PROTOCOL_H #define PROTOCOL_HEADER 0xBA -#define MAX_SECTOR_SIZE 0x01000 +//#define MAX_SECTOR_SIZE 0x01000 #define MAX_RX_BUFF_SIZE 0x100 #define MAX_TX_BUFF_SIZE 0x100 -typedef struct -{ - unsigned int SectorStartAddress; - unsigned short SectorSize; - unsigned int SectorData[MAX_SECTOR_SIZE]; - -}stDataSector_t; +//typedef struct +//{ +// unsigned int SectorStartAddress; +// unsigned short SectorSize; +// unsigned int SectorData[MAX_SECTOR_SIZE]; +// +//}stDataSector_t; enum eBootloaderProtocolStates { @@ -77,7 +77,7 @@ enum eBootloaderAcknowledgement extern Bool e_CommandPending; extern Bool e_FlashUpdateMode; extern unsigned char RxDataBuffer[MAX_RX_BUFF_SIZE]; -extern stDataSector_t CurrentDataSector; +//extern stDataSector_t CurrentDataSector; diff --git a/Bootloader_PIC32.X/Source/BootloaderStateMachine.c b/Bootloader_PIC32.X/Source/BootloaderStateMachine.c index a45ac05..1e6b164 100644 --- a/Bootloader_PIC32.X/Source/BootloaderStateMachine.c +++ b/Bootloader_PIC32.X/Source/BootloaderStateMachine.c @@ -1,13 +1,13 @@ /******************************************************************************* -* * -* Copyright 2010 Rheinmetall Canada Inc. * -* * -* No part of this document may be reproduced, stored in * -* a retrieval system, or transmitted, in any form or by any means, * -* electronic, mechanical, photocopying, recording, or otherwise, * -* without the prior written permission of Rheinmetall Canada Inc. * -* * -*******************************************************************************/ + * * + * Copyright 2010 Rheinmetall Canada Inc. * + * * + * No part of this document may be reproduced, stored in * + * a retrieval system, or transmitted, in any form or by any means, * + * electronic, mechanical, photocopying, recording, or otherwise, * + * without the prior written permission of Rheinmetall Canada Inc. * + * * + *******************************************************************************/ /*---- example include file ---------------------------------------------------*/ @@ -16,6 +16,8 @@ #include "FlashInterface.h" #include "BootloaderProtocol.h" #include "InternalUart.h" +#include "BootloaderInterface.h" +#include "FlashMapping.h" #include //#include //#include @@ -24,304 +26,698 @@ unsigned int mSMState; unsigned int mPseudoTimer; extern unsigned long _app_start; +int mIsSPIFlashDetected; + void BootloaderSMInit(void) { - mSMState = SM_UPDATE_WAIT_STATE; + mSMState = SM_CHECK_BOOTLOADER_FLAGS; mPseudoTimer = 0; + mIsSPIFlashDetected = 0; } -#pragma CODE_SECTION(BootloaderSM,"ramfuncs"); +//#pragma CODE_SECTION(BootloaderSM,"ramfuncs"); void BootloaderSM(unsigned int event, unsigned int Data) { switch(mSMState) { - case SM_UPDATE_WAIT_STATE: + case SM_STANDBY_STATE: { - switch(event) - { - case SM_TICK_EVENT: - { - if(mPseudoTimer++ >= PSEUDO_TIMER_VALUE) - { - char mbuf[30]; - mbuf[0] = 'R'; - mbuf[1] = 'e'; - mbuf[2] = 'b'; - mbuf[3] = 'o'; - mbuf[4] = 'o'; - mbuf[5] = 't'; - mbuf[6] = 'i'; - mbuf[7] = 'n'; - mbuf[8] = 'g'; - mbuf[9] = ' '; - mbuf[10] = 'i'; - mbuf[11] = 'n'; - mbuf[12] = ' '; - mbuf[13] = 'a'; - mbuf[14] = 'p'; - mbuf[15] = 'p'; - mbuf[16] = '\r'; - SendInternalUartData(&mbuf[0],17); - mPseudoTimer = 0; -// #ifndef _DEBUG - JumpToApp(); -// #endif - } - break; - } - case SM_RX_CMD_EVENT: - { - if(Data == CONNECT_REQUEST_CMD) - { - mSMState = SM_IDLE_STATE; - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack - } - - //Ignore any other command received... - - break; - } - case SM_ABORT_UPDATE: - { - break; - } - } - break; //case SM_UPDATE_WAIT_STATE: + break; } - case SM_IDLE_STATE: + case SM_CHECK_BOOTLOADER_FLAGS: { switch(event) { case SM_TICK_EVENT: - { - break; - } - case SM_RX_CMD_EVENT: { - switch(Data) + //First, check if SPI flash is functionnal + if(mIsSPIFlashDetected == 0) { - case START_UPDATE_REQUEST_CMD: + //Flash is not functionnal... + //TODO: Check if we need to update via serial port + + // JumpToApp(); + } + + //Flash is detected. Check the bootloader flags... + BoootloaderGetBootloaderFlags(); + +// if(BootloaderAction == 0) +// { +// JumpToApp(); +// } +// else if(BootloaderAction == 1) +// { +// if( BootloaderAction == 0xA8) +// { +// //It's requested to write the firmware to PIC's Flash. Let's check SPI flash data integrity. +// mSMState = SM_CHECK_FIRMWARE_VALIDITY; +// } +// else +// { +// //TODO: What should we do? +// JumpToApp(); +// } +// } +// else +// { +// //TODO +// JumpToApp(); +// } + + + + switch(mBootloaderFlags.BootloaderAction) + { + case BOOTLOADER_ACTION_JUMP_TO_APP_VALUE: { - mSMState = SM_WAIT_FOR_UNLOCK_STATE; - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack + char mbuf[30]; + mbuf[0] = 'G'; + mbuf[1] = 'o'; + mbuf[2] = 'i'; + mbuf[3] = 'n'; + mbuf[4] = 'g'; + mbuf[5] = ' '; + mbuf[6] = 'S'; + mbuf[7] = 't'; + mbuf[8] = 'd'; + mbuf[9] = 'b'; + mbuf[10] = 'y'; + mbuf[11] = '\n'; + mbuf[12] = '\r'; + SendInternalUartData(&mbuf[0],13); + mSMState = SM_STANDBY_STATE; + JumpToApp(); break; } - case HEARTBEAT_REQUEST_CMD: + case BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE: { - ProtocolSendCmd(HEARTBEAT_CMD,0,0); + if( mBootloaderFlags.BootloaderActionValidator == BOOTLOADER_FLASH_FIRMWARE_VALIDATOR) + { + //It's requested to write the firmware to PIC's Flash. Let's check SPI flash data integrity. + mSMState = SM_CHECK_FIRMWARE_VALIDITY; + } + else + { + //TODO: What should we do? + JumpToApp(); + } break; } - case END_UPDATE_REQUEST_CMD: - { - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack - SoftReset(); //simply reset cpu. - break; - } - case FLASH_API_VER_REQUEST_CMD: - { - char Version; - Version = 0x01; - ProtocolSendCmd(FLASH_API_VER_CMD,&Version,1); - break; - } - case SCRUB_FLASH_REQUEST_CMD: + case BOOTLOADER_ACTION_ENTER_UPDATE_MODE_VALUE: { //TODO + JumpToApp(); + break; + } + default: + { + JumpToApp(); break; } } +// break; } + case SM_RX_CMD_EVENT: case SM_ABORT_UPDATE: + default: { - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack - SoftReset(); break; } } - break; //case SM_IDLE_STATE: + break; } - case SM_WAIT_FOR_UNLOCK_STATE: + case SM_CHECK_FIRMWARE_VALIDITY: { switch(event) { case SM_TICK_EVENT: { + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + //All is good, let's write the firmware to PIC's program Flash + mSMState = SM_ERASE_INTERNAL_FLASH; + } + else + { + //TODO: What should we do? + JumpToApp(); + } break; } - case SM_RX_CMD_EVENT: + default: { - if(Data == BOOTLOADER_UNLOCK_REQUEST_CMD) + break; + } + } + break; + } + case SM_ERASE_INTERNAL_FLASH: + { + switch(event) + { + case SM_TICK_EVENT: + { + if(FlashErase() == FLASH_STATUS_ERROR) { - if(RxDataBuffer[0] == BOOTLOADER_UNLOCK_CODE) - { - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_FLASH_ERASE); //Inform PTE that flash is being erased - - // #ifndef _DEBUG //don't touch FLASH in debug mode... - //Erase FLASH - if(FlashErase() != FLASH_STATUS_OK) - { - ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_ERASE_FLASH_FAILED); //Acknowledge... - mSMState = SM_IDLE_STATE; - break; - } - // #endif - - mSMState = SM_WAIT_FOR_NEXT_RECORD; - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); - } - else//Invalid unlock code... return to IDLE... - { - mSMState = SM_IDLE_STATE; - ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_INVALID_UNLOCK_CODE); - } + char mbuf[30]; + mbuf[0] = 'F'; + mbuf[1] = 'l'; + mbuf[2] = 'a'; + mbuf[3] = 's'; + mbuf[4] = 'h'; + mbuf[5] = ' '; + mbuf[6] = 'E'; + mbuf[7] = 'r'; + mbuf[8] = 'r'; + mbuf[9] = 'o'; + mbuf[10] = 'r'; + mbuf[11] = '\n'; + mbuf[12] = '\r'; + SendInternalUartData(&mbuf[0],13); + mSMState = SM_STANDBY_STATE; + break; } - else//If another command than UNLOCK is received... return to IDLE + else { - mSMState = SM_IDLE_STATE; - ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_UNLOCK_EXPECTED); +// mSMState = SM_STANDBY_STATE; + char mbuf[30]; + mbuf[0] = 'F'; + mbuf[1] = 'l'; + mbuf[2] = 'a'; + mbuf[3] = 's'; + mbuf[4] = 'h'; + mbuf[5] = ' '; + mbuf[6] = 'E'; + mbuf[7] = 'r'; + mbuf[8] = 'a'; + mbuf[9] = 's'; + mbuf[10] = 'e'; + mbuf[11] = 'd'; + mbuf[12] = '\n'; + mbuf[13] = '\r'; + SendInternalUartData(&mbuf[0],14); + mSMState = SM_WRITE_DATA_TO_PROGRAM_FLASH; + } + break; + } + default: + { + break; + } + } + break; + } + case SM_WRITE_DATA_TO_PROGRAM_FLASH: + { + switch(event) + { + case SM_TICK_EVENT: + { + //First, load the firmware info. + unsigned char FlashData[100]; + unsigned int FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + unsigned int FileHeaderCode, FirmwareFlags, NbRecords, FirmwareSize, VersionCode, CRC32; + // unsigned int ComputedCRC32 = CRC_START_32; - } - - break; //case SM_RX_CMD_EVENT - } - case SM_ABORT_UPDATE: - { - break; - } - } - break; //case SM_WAIT_FOR_UNLOCK_STATE: - } - case SM_WAIT_FOR_NEXT_RECORD: - { - switch(event) - { - case SM_TICK_EVENT: - { - break; - } - case SM_RX_CMD_EVENT: - { - switch(Data) + //SPIFlashReadBuffer(FlashData,700,FlashAddress); + + + //printf("Checking Flash bootloader data integrity... \n"); + SPIFlashReadBuffer(FlashData,FLASH_BTLDR_HEADER_SIZE,FlashAddress); + + FileHeaderCode = BootloaderBytesToInt(FlashData); + FirmwareFlags = BootloaderBytesToInt(&FlashData[4]); + NbRecords = BootloaderBytesToInt(&FlashData[8]); + FirmwareSize = BootloaderBytesToInt(&FlashData[12]); + VersionCode = BootloaderBytesToInt(&FlashData[16]); + CRC32 = BootloaderBytesToInt(&FlashData[20]); + + //TODO: Do we need to recheck validity? It's just been done before... + + FlashAddress += FLASH_BTLDR_HEADER_SIZE; //point to the start of bootloader data + + if(NbRecords > 0) { - case SEND_RECORD_REQUEST_CMD: + int CurRecord = 0; + unsigned int Done = false; + unsigned int RecHeader, RecSize, RecStartAddress; + while(Done == false) { - //TODO: Address check... - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_FLASH_WRITE); + SPIFlashReadBuffer(&FlashData[0],12,FlashAddress); + RecHeader = BootloaderBytesToInt(&FlashData[0]); + RecSize = BootloaderBytesToInt(&FlashData[4]); //This is in bytes + RecSize /= 4; + RecStartAddress = BootloaderBytesToInt(&FlashData[8]); + FlashAddress += 12; -// unsigned int SectorStartAddress; -// unsigned short SectorSize; -// unsigned int *RecordDataPtr; -// unsigned int data; -// -// SectorStartAddress = *(unsigned int*)(&RxDataBuffer[0]); -// SectorSize = *(unsigned short*)(&RxDataBuffer[4]); -// RecordDataPtr = (unsigned int*)&RxDataBuffer[8]; -// data = *RecordDataPtr; - - // unsigned int test = KVA_TO_PA(APPLICATION_START_ADDRESS); - + + if(RecHeader != BOOTLOADER_RECORD_HEADER_CODE) + { + //TODO: What + } + // if(RecSize == 0) + // { + //TODO: What + // return RET_ERROR; + // } + + //Load the firmware data from SPI Flash + CurrentDataSector.SectorStartAddress = RecStartAddress; + CurrentDataSector.SectorSize = RecSize; + int RecWord; + for(RecWord = 0; RecWord < RecSize; RecWord++) + { + char WordBytes[4]; + int Word; + SPIFlashReadBuffer(WordBytes,4,FlashAddress); +// Word = BootloaderBytesToInt(WordBytes); + Word = BootloaderBytesToIntLittleEndian(WordBytes); + CurrentDataSector.SectorData[RecWord] = Word; + FlashAddress += 4; + } + + + //Write it to PIC's internal flash if(CurrentDataSector.SectorStartAddress < KVA_TO_PA(APPLICATION_FLASH_START_ADDRESS)) { - ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_INVALID_ADDRESS); - break; + //TODO: Manage this! } else if(FlashProgramData((void*)(CurrentDataSector.SectorStartAddress), CurrentDataSector.SectorData , CurrentDataSector.SectorSize) != FLASH_STATUS_OK) { - ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_WRITE_FLASH_FAILED); - break; + //TODO: Manage this! + char mbuf[30]; + mbuf[0] = 'W'; + mbuf[1] = 'r'; + mbuf[2] = 'i'; + mbuf[3] = 't'; + mbuf[4] = 'e'; + mbuf[5] = ' '; + mbuf[6] = 'E'; + mbuf[7] = 'r'; + mbuf[8] = 'r'; + mbuf[9] = 'o'; + mbuf[10] = 'r'; + mbuf[11] = '\n'; + mbuf[12] = '\r'; + SendInternalUartData(&mbuf[0],13); + } + + + CurRecord++; + if(CurRecord == NbRecords) + { + Done = true; + break; } - - - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); - - - break; } - case END_UPDATE_REQUEST_CMD: - { - ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); - - #ifndef _DEBUG - JumpToApp(); - #else - mSMState = SM_IDLE_STATE; - #endif - break; - } - } - - break; //case SM_RX_CMD_EVENT: + + //Fimware is all written successfully + mSMState = SM_CHECK_PROGRAM_FLASH_VALIDITY; + + break; } - case SM_ABORT_UPDATE: + default: { break; } + + // CurrentDataSector.SectorStartAddress + break; + } + case SM_CHECK_PROGRAM_FLASH_VALIDITY: + { + switch(event) + { + case SM_TICK_EVENT: + { + //TODO: Compute CRC32... + + mSMState = SM_STANDBY_STATE; + char mbuf[30]; + mbuf[0] = 'F'; + mbuf[1] = 'l'; + mbuf[2] = 'a'; + mbuf[3] = 's'; + mbuf[4] = 'h'; + mbuf[5] = ' '; + mbuf[6] = 'P'; + mbuf[7] = 'r'; + mbuf[8] = 'o'; + mbuf[9] = 'g'; + mbuf[10] = 'r'; + mbuf[11] = 'a'; + mbuf[12] = 'm'; + mbuf[13] = 'm'; + mbuf[14] = 'e'; + mbuf[15] = 'd'; + mbuf[16] = '\n'; + mbuf[17] = '\r'; + SendInternalUartData(&mbuf[0],19); + + char toto[2]; + toto[0] = 0; + toto[1] = 0; + SPIFlashWriteBuffer(toto,2,0x000000); + JumpToApp(); + } + break; + } + default: + { + break; + } + } + break; + } + case SM_ERROR_STATE: + { + // TODO: Manage this state + break; } - break; //case SM_WAIT_FOR_NEXT_RECORD: } } -} - -void JumpToApp() -{ -// CloseInternalUart(); - void (*fptr)(void); - fptr = (void (*)(void))APPLICATION_START_ADDRESS; - fptr(); -} - - -void DownloadFlash(unsigned int StartAddress, unsigned int EndAddress) -{ - /* - unsigned int CurAddress = StartAddress; - unsigned int Data; - unsigned int delay = 0; - char Buf[100]; - int i = 0; - - while(CurAddress < EndAddress) + //void BootloaderSM(unsigned int event, unsigned int Data) + //{ + // switch(mSMState) + // { + // case SM_UPDATE_WAIT_STATE: + // { + // switch(event) + // { + // case SM_TICK_EVENT: + // { + // if(mPseudoTimer++ >= PSEUDO_TIMER_VALUE) + // { + // char mbuf[30]; + // mbuf[0] = 'R'; + // mbuf[1] = 'e'; + // mbuf[2] = 'b'; + // mbuf[3] = 'o'; + // mbuf[4] = 'o'; + // mbuf[5] = 't'; + // mbuf[6] = 'i'; + // mbuf[7] = 'n'; + // mbuf[8] = 'g'; + // mbuf[9] = ' '; + // mbuf[10] = 'i'; + // mbuf[11] = 'n'; + // mbuf[12] = ' '; + // mbuf[13] = 'a'; + // mbuf[14] = 'p'; + // mbuf[15] = 'p'; + // mbuf[16] = '\r'; + // SendInternalUartData(&mbuf[0],17); + // mPseudoTimer = 0; + //// #ifndef _DEBUG + //// JumpToApp(); + //// #endif + // } + // break; + // } + // case SM_RX_CMD_EVENT: + // { + // if(Data == CONNECT_REQUEST_CMD) + // { + // mSMState = SM_IDLE_STATE; + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack + // } + // + // //Ignore any other command received... + // + // break; + // } + // case SM_ABORT_UPDATE: + // { + // break; + // } + // } + // break; //case SM_UPDATE_WAIT_STATE: + // } + // case SM_IDLE_STATE: + // { + // switch(event) + // { + // case SM_TICK_EVENT: + // { + // break; + // } + // case SM_RX_CMD_EVENT: + // { + // switch(Data) + // { + // case START_UPDATE_REQUEST_CMD: + // { + // mSMState = SM_WAIT_FOR_UNLOCK_STATE; + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack + // break; + // } + // case HEARTBEAT_REQUEST_CMD: + // { + // ProtocolSendCmd(HEARTBEAT_CMD,0,0); + // break; + // } + // case END_UPDATE_REQUEST_CMD: + // { + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack + // SoftReset(); //simply reset cpu. + // break; + // } + // case FLASH_API_VER_REQUEST_CMD: + // { + // char Version; + // Version = 0x01; + // ProtocolSendCmd(FLASH_API_VER_CMD,&Version,1); + // break; + // } + // case SCRUB_FLASH_REQUEST_CMD: + // { + // //TODO + // break; + // } + // } + // break; + // } + // case SM_ABORT_UPDATE: + // { + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); //Bootloader ack + // SoftReset(); + // break; + // } + // } + // break; //case SM_IDLE_STATE: + // } + // case SM_WAIT_FOR_UNLOCK_STATE: + // { + // switch(event) + // { + // case SM_TICK_EVENT: + // { + // break; + // } + // case SM_RX_CMD_EVENT: + // { + // if(Data == BOOTLOADER_UNLOCK_REQUEST_CMD) + // { + // if(RxDataBuffer[0] == BOOTLOADER_UNLOCK_CODE) + // { + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_FLASH_ERASE); //Inform PTE that flash is being erased + // + // // #ifndef _DEBUG //don't touch FLASH in debug mode... + // //Erase FLASH + // if(FlashErase() != FLASH_STATUS_OK) + // { + // ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_ERASE_FLASH_FAILED); //Acknowledge... + // mSMState = SM_IDLE_STATE; + // break; + // } + // // #endif + // + // mSMState = SM_WAIT_FOR_NEXT_RECORD; + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); + // } + // else//Invalid unlock code... return to IDLE... + // { + // mSMState = SM_IDLE_STATE; + // ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_INVALID_UNLOCK_CODE); + // } + // } + // else//If another command than UNLOCK is received... return to IDLE + // { + // mSMState = SM_IDLE_STATE; + // ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_UNLOCK_EXPECTED); + // + // } + // + // break; //case SM_RX_CMD_EVENT + // } + // case SM_ABORT_UPDATE: + // { + // break; + // } + // } + // break; //case SM_WAIT_FOR_UNLOCK_STATE: + // } + // case SM_WAIT_FOR_NEXT_RECORD: + // { + // switch(event) + // { + // case SM_TICK_EVENT: + // { + // break; + // } + // case SM_RX_CMD_EVENT: + // { + // switch(Data) + // { + // case SEND_RECORD_REQUEST_CMD: + // { + // //TODO: Address check... + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_FLASH_WRITE); + // + //// unsigned int SectorStartAddress; + //// unsigned short SectorSize; + //// unsigned int *RecordDataPtr; + //// unsigned int data; + //// + //// SectorStartAddress = *(unsigned int*)(&RxDataBuffer[0]); + //// SectorSize = *(unsigned short*)(&RxDataBuffer[4]); + //// RecordDataPtr = (unsigned int*)&RxDataBuffer[8]; + //// data = *RecordDataPtr; + // + // // unsigned int test = KVA_TO_PA(APPLICATION_START_ADDRESS); + // + // if(CurrentDataSector.SectorStartAddress < KVA_TO_PA(APPLICATION_FLASH_START_ADDRESS)) + // { + // ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_INVALID_ADDRESS); + // break; + // } + // else if(FlashProgramData((void*)(CurrentDataSector.SectorStartAddress), CurrentDataSector.SectorData , CurrentDataSector.SectorSize) != FLASH_STATUS_OK) + // { + // ProtocolSendAck(PROTOCOL_NACK,RET_PROTOCOL_ERR_WRITE_FLASH_FAILED); + // break; + // } + // + // + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); + // + // + // break; + // } + // case END_UPDATE_REQUEST_CMD: + // { + // ProtocolSendAck(PROTOCOL_ACK,RET_PROTOCOL_OK); + // + // #ifndef _DEBUG + // JumpToApp(); + // #else + // mSMState = SM_IDLE_STATE; + // #endif + // break; + // } + // + // } + // + // break; //case SM_RX_CMD_EVENT: + // } + // case SM_ABORT_UPDATE: + // { + // break; + // } + // } + // break; //case SM_WAIT_FOR_NEXT_RECORD: + // } + // } + //} + + void JumpToApp() + { + // CloseInternalUart(); + char mbuf[30]; + mbuf[0] = 'R'; + mbuf[1] = 'e'; + mbuf[2] = 'b'; + mbuf[3] = 'o'; + mbuf[4] = 'o'; + mbuf[5] = 't'; + mbuf[6] = 'i'; + mbuf[7] = 'n'; + mbuf[8] = 'g'; + mbuf[9] = ' '; + mbuf[10] = 'i'; + mbuf[11] = 'n'; + mbuf[12] = ' '; + mbuf[13] = 'a'; + mbuf[14] = 'p'; + mbuf[15] = 'p'; + mbuf[16] = '\r'; + SendInternalUartData(&mbuf[0],17); + void (*fptr)(void); + fptr = (void (*)(void))APPLICATION_START_ADDRESS; + fptr(); + } + + void BootloaderSMSetSPIFlashDetected(int Detected) { - Data = (CurAddress >> 16); - sprintf(Buf, "0x%.4X",Data); - SendInternalUartData(Buf,strlen(Buf)); -// ProtocolSendCmd(FLASH_DATA_CMD,Buf,strlen(Buf)); - Data = CurAddress; - sprintf(Buf, "%.4X ",Data); - SendInternalUartData(Buf,strlen(Buf)); -// ProtocolSendCmd(FLASH_DATA_CMD,Buf,strlen(Buf)); - - for(i = 0; i < 16; i++) - { - Data = *(unsigned int*)CurAddress; - if(i != 15) - sprintf(Buf, "%.4X ",Data); - else - sprintf(Buf, "%.4X \r",Data); - - SendInternalUartData(Buf,strlen(Buf)); - // ProtocolSendCmd(FLASH_DATA_CMD,Buf,strlen(Buf)); - CurAddress++; - // while(delay++ < 5000); - - delay = 0; - } - - + mIsSPIFlashDetected = Detected; } - e_FlashUpdateMode = false; - */ - -} - - -//EOf - - + void BootloaderSMReadBootloaderFlags() + { + + } + + void DownloadFlash(unsigned int StartAddress, unsigned int EndAddress) + { + /* + unsigned int CurAddress = StartAddress; + unsigned int Data; + unsigned int delay = 0; + char Buf[100]; + int i = 0; + + while(CurAddress < EndAddress) + { + Data = (CurAddress >> 16); + sprintf(Buf, "0x%.4X",Data); + SendInternalUartData(Buf,strlen(Buf)); + // ProtocolSendCmd(FLASH_DATA_CMD,Buf,strlen(Buf)); + Data = CurAddress; + sprintf(Buf, "%.4X ",Data); + SendInternalUartData(Buf,strlen(Buf)); + // ProtocolSendCmd(FLASH_DATA_CMD,Buf,strlen(Buf)); + + for(i = 0; i < 16; i++) + { + Data = *(unsigned int*)CurAddress; + if(i != 15) + sprintf(Buf, "%.4X ",Data); + else + sprintf(Buf, "%.4X \r",Data); + + SendInternalUartData(Buf,strlen(Buf)); + // ProtocolSendCmd(FLASH_DATA_CMD,Buf,strlen(Buf)); + CurAddress++; + // while(delay++ < 5000); + + delay = 0; + } + + + } + e_FlashUpdateMode = false; + + */ + + } + + + //EOf + + diff --git a/Bootloader_PIC32.X/Source/BootloaderStateMachine.h b/Bootloader_PIC32.X/Source/BootloaderStateMachine.h index 8ad0547..f2ddd79 100644 --- a/Bootloader_PIC32.X/Source/BootloaderStateMachine.h +++ b/Bootloader_PIC32.X/Source/BootloaderStateMachine.h @@ -10,10 +10,19 @@ enum eBootloaderSMStates { - SM_UPDATE_WAIT_STATE, - SM_IDLE_STATE, - SM_WAIT_FOR_UNLOCK_STATE, - SM_WAIT_FOR_NEXT_RECORD +// SM_UPDATE_WAIT_STATE, +// SM_IDLE_STATE, +// SM_WAIT_FOR_UNLOCK_STATE, +// SM_WAIT_FOR_NEXT_RECORD + + SM_STANDBY_STATE, + SM_CHECK_BOOTLOADER_FLAGS, + SM_CHECK_FIRMWARE_VALIDITY, + SM_ERASE_INTERNAL_FLASH, + SM_WRITE_DATA_TO_PROGRAM_FLASH, + SM_CHECK_PROGRAM_FLASH_VALIDITY, + SM_ERROR_STATE + }; enum eBootloaderEvents @@ -21,6 +30,7 @@ enum eBootloaderEvents SM_TICK_EVENT, SM_RX_CMD_EVENT, SM_ABORT_UPDATE + }; @@ -28,6 +38,8 @@ void BootloaderSMInit(void); void BootloaderSM( unsigned int event, unsigned int Data ); void JumpToApp(void); void DownloadFlash(unsigned int StartAddress, unsigned int EndAddress); +void BootloaderSMSetSPIFlashDetected(int Detected); +void BootloaderSMReadBootloaderFlags(); #endif diff --git a/Bootloader_PIC32.X/Source/ChaletduinoV2Board.c b/Bootloader_PIC32.X/Source/ChaletduinoV2Board.c new file mode 100644 index 0000000..c5f538e --- /dev/null +++ b/Bootloader_PIC32.X/Source/ChaletduinoV2Board.c @@ -0,0 +1,202 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; + HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + + HEARTBEAT_LED_2_PIN = LED_OFF; + HEARTBEAT_LED_1_PIN = LED_ON; + + LORA_ACTIVITY_LED_PIN_DIR = PIN_OUTPUT; + LORA_ACTIVITY_LED_PIN = LED_OFF; + + // GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; + // GP_DEBUG_1_PIN = 0; + // GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; + // GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + + //////////////// SPI FLASH ////////////////// + + FLASH_SS_PIN_DIR = PIN_OUTPUT; + FLASH_SS_PIN = 1; + + /////////////////////////// WIFI /////////////////// + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; + // WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + // WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Falling edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 1; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); + // SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 50000); + SPI2CONbits.ON = 1; + + + //////////////// INVERTER RELAY ////////////////// + //Chalet inverter power relay + POWER_RELAY_ON_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_OFF_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_ON_PIN = 0; + POWER_RELAY_OFF_PIN = 0; + + + //////////////// HARAKIRI RELAY ////////////////// + //Harakiri relay + HARAKIRI_RELAY_ON_PIN_DIR = PIN_OUTPUT; + HARAKIRI_RELAY_ON_PIN= 0; + + //12V presence detection input + CHALET_12V_PRESENCE_PIN_DIR = PIN_INPUT; + + + //////////////// BATTERY MONITOR ////////////////// + //Battery voltage measurement (analog input) + BATTERY_VOLTAGE_ANALOG_PIN_DIR = PIN_INPUT; + + //ADC Config + + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O + AD1PCFGbits.PCFG1 = 0; + TRISBbits.TRISB1 = PIN_INPUT; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + AD1CHS = 0; + AD1CHSbits.CH0SA = 1; //AN1 + AD1CON3bits.ADCS = 0xF0; + AD1CON3bits.SAMC = 0x01; + AD1CON1bits.ON = 1; + AD1CON1bits.SAMP = 1; + + + //////////////// TEMPERATURE SENSOR ////////////////// + //Onboard temperature sensor (SPI) + TEMP_SENSOR_CS_PIN_DIR = PIN_OUTPUT; + TEMP_SENSOR_CS_PIN = 1; + TEMP_SENSOR_SPI_SDO_PIN_DIR = PIN_OUTPUT; + TEMP_SENSOR_SPI_SDI_PIN_DIR = PIN_INPUT; + TEMP_SENSOR_SPI_SCK_PIN_DIR = PIN_OUTPUT; + SPI3CON = 0; + SPI3CONbits.MSTEN = 1; + SPI3CONbits.CKE = 1; + SPI3CONbits.SMP = 0; + SPI3CONbits.CKP = 0; + SPI3BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); + SPI3CONbits.ON = 1; + + //////////////// CURRENT SENSOR ////////////////// + //Analog (Hall effect) current sensor + CURRENT_SENSOR_IN1_PIN_DIR = PIN_INPUT; //AN2 + CURRENT_SENSOR_IN2_PIN_DIR = PIN_INPUT; //AN0 + + //TODO + // AD1CHS = 0; + // AD1CHSbits.CH0SA = 1; //AN2 + // AD1CON3bits.ADCS = 0xF0; + // AD1CON3bits.SAMC = 0x01; + // AD1CON1bits.ON = 1; + // AD1CON1bits.SAMP = 1; + + + //////////////// LORA ////////////////// + LORA_MODULE_RELAY_PIN_DIR = PIN_OUTPUT; + LORA_MODULE_RELAY_PIN = 0; +// LORA_MODULE_M0_PIN_DIR = PIN_INPUT; +// LORA_MODULE_M0_PIN = 0; +// LORA_MODULE_M1_PIN_DIR = PIN_INPUT; +// LORA_MODULE_M1_PIN = 0; + LORA_MODULE_INT_PIN_DIR = PIN_INPUT; + LORA_MODULE_RX_LED_PIN_DIR = PIN_OUTPUT; + LORA_MODULE_RX_LED_PIN = LED_OFF; + LORA_MODULE_TX_LED_PIN_DIR = PIN_OUTPUT; + LORA_MODULE_TX_LED_PIN = LED_OFF; + + //////////////// LCD SCREEN ////////////////// + //LCD Screen + LCD_RS_PIN_DIR = PIN_OUTPUT; + LCD_RS_PIN = 0; + LCD_RW_PIN_DIR = PIN_OUTPUT; + LCD_RW_PIN = 0; + LCD_E_PIN_DIR = PIN_OUTPUT; + LCD_E_PIN = 0; + LCD_DB4_PIN_DIR = PIN_OUTPUT; + LCD_DB4_PIN = 0; + LCD_DB5_PIN_DIR = PIN_OUTPUT; + LCD_DB5_PIN = 0; + LCD_DB6_PIN_DIR = PIN_OUTPUT; + LCD_DB6_PIN = 0; + LCD_DB7_PIN_DIR = PIN_OUTPUT; + LCD_DB7_PIN = 0; + +// LCD_SCROLL_BTN_PIN_DIR = PIN_INPUT; + + + + + ////// MISC UNUSED STUFF /////////// + // IEC0bits.INT1IE = 0; + // IFS0bits.INT1IF = 0; + // INTCONbits.INT1EP = 1; //Rising edge + // IPC1bits.INT1IP = 2; + // IPC1bits.INT1IS = 1; + // IEC0bits.INT1IE = 1; + + + // OC3CON = 0; + // OC3R = 0; + // OC3RS = 2000; //50% PWM + // OC3CONbits.OCTSEL = 0; + // OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + + //#ifdef __32MX330F064H__ + // RPD2Rbits.RPD2R = 0b1011; //RD2 peripheral selection = OC3 + //#endif + // + // T2CONbits.TON = 0; // Disable Timer + // // T2CONbits.TCS = 0; // Select internal instruction cycle clock + // T2CONbits.TGATE = 0; // Disable Gated Timer mode + // T2CONbits.TCKPS = 0b011; // Select 1:1 Prescaler + // TMR2 = 0x00; // Clear timer register + // + // + // IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level + // IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag + // IEC0bits.T2IE = 0; // Disable Timer 2 interrupt + // T2CONbits.TON = 1; // Start Timer + // + // OC3CONbits.ON = 1; + + + + + return RET_OK; +} diff --git a/Bootloader_PIC32.X/Source/DigitalIO.c b/Bootloader_PIC32.X/Source/DigitalIO.c index 130f6f9..739e9bc 100644 --- a/Bootloader_PIC32.X/Source/DigitalIO.c +++ b/Bootloader_PIC32.X/Source/DigitalIO.c @@ -38,6 +38,11 @@ void InitDigitalIO(void) HEARTBEAT_LED_2_PIN = LED_OFF; HEARTBEAT_LED_1_PIN = LED_OFF; +// SD_SPI_CS_PIN_DIR = PIN_OUTPUT; +// SD_SPI_CS_PIN = 1; +// SD_SPI_SDI_PIN_DIR = PIN_INPUT; + + diff --git a/Bootloader_PIC32.X/Source/DigitalIO.h b/Bootloader_PIC32.X/Source/DigitalIO.h index 674b9be..c205d0d 100644 --- a/Bootloader_PIC32.X/Source/DigitalIO.h +++ b/Bootloader_PIC32.X/Source/DigitalIO.h @@ -40,8 +40,10 @@ #define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE6 #define HEARTBEAT_LED_2_PIN LATEbits.LATE6 #define SD_SPI_SDO_PIN_DIR TRISGbits.TRISG8 -#define SD_SPI_CS_PIN_DIR TRISGbits.TRISG9 -#define SD_SPI_CS_PIN LATGbits.LATG9 +#define SD_SPI_CS_PIN_DIR TRISEbits.TRISE1 +#define SD_SPI_CS_PIN LATEbits.LATE1 +//#define SD_SPI_CS_PIN_DIR TRISGbits.TRISG9 +//#define SD_SPI_CS_PIN LATGbits.LATG9 #define SD_SPI_SDI_PIN_DIR TRISGbits.TRISG7 #define SD_SPI_SCK_PIN_DIR TRISGbits.TRISG6 @@ -52,11 +54,11 @@ #define PIN_OUTPUT 0 -#define SD_SPI_SDO_PIN_DIR TRISGbits.TRISG8 -#define SD_SPI_CS_PIN_DIR TRISGbits.TRISG9 -#define SD_SPI_CS_PIN LATGbits.LATG9 -#define SD_SPI_SDI_PIN_DIR TRISGbits.TRISG7 -#define SD_SPI_SCK_PIN_DIR TRISGbits.TRISG6 +//#define SD_SPI_SDO_PIN_DIR TRISGbits.TRISG8 +//#define SD_SPI_CS_PIN_DIR TRISGbits.TRISG9 +//#define SD_SPI_CS_PIN LATGbits.LATG9 +//#define SD_SPI_SDI_PIN_DIR TRISGbits.TRISG7 +//#define SD_SPI_SCK_PIN_DIR TRISGbits.TRISG6 /* ************************************************************************** */ /* Prototypes */ diff --git a/Bootloader_PIC32.X/Source/FatFS/ff.c b/Bootloader_PIC32.X/Source/FatFS/ff.c index d29601d..e170654 100644 --- a/Bootloader_PIC32.X/Source/FatFS/ff.c +++ b/Bootloader_PIC32.X/Source/FatFS/ff.c @@ -3198,7 +3198,10 @@ BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk er ) { fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ - if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + if (move_window(fs, sect) != FR_OK) + { + return 4; /* Load boot record */ + } if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3; /* Check boot record signature (always placed here even if the sector size is >512) */ diff --git a/Bootloader_PIC32.X/Source/FatFS/ffconf.h b/Bootloader_PIC32.X/Source/FatFS/ffconf.h index 643a286..c7793ba 100644 --- a/Bootloader_PIC32.X/Source/FatFS/ffconf.h +++ b/Bootloader_PIC32.X/Source/FatFS/ffconf.h @@ -15,7 +15,7 @@ / and optional writing functions as well. */ -#define FF_FS_MINIMIZE 0 +#define FF_FS_MINIMIZE 3 /* This option defines minimization level to remove some basic API functions. / / 0: Basic functions are fully enabled. @@ -217,7 +217,7 @@ / System Configurations /---------------------------------------------------------------------------*/ -#define FF_FS_TINY 0 +#define FF_FS_TINY 1 /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) / At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. / Instead of private sector buffer eliminated from the file object, common sector @@ -233,7 +233,7 @@ #define FF_FS_NORTC 1 #define FF_NORTC_MON 1 #define FF_NORTC_MDAY 1 -#define FF_NORTC_YEAR 2017 +#define FF_NORTC_YEAR 2020 /* The option FF_FS_NORTC switches timestamp functiton. If the system does not have / any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable / the timestamp function. All objects modified by FatFs will have a fixed timestamp diff --git a/Bootloader_PIC32.X/Source/FatFS/mmc_drv.c b/Bootloader_PIC32.X/Source/FatFS/mmc_drv.c index 1c823ef..207e12b 100644 --- a/Bootloader_PIC32.X/Source/FatFS/mmc_drv.c +++ b/Bootloader_PIC32.X/Source/FatFS/mmc_drv.c @@ -131,7 +131,7 @@ static void set_fast_clk(void) unsigned WasON = SPI2CONbits.ON; SPI2CONbits.ON = 0; - SPI2BRG = SPICalculateBRG(80000000,20000000); + SPI2BRG = SPICalculateBRG(80000000,/*20000000*/200000); SPI2CONbits.ON = WasON; } @@ -144,6 +144,7 @@ static void set_fast_clk(void) static BYTE xchg_spi (BYTE dat) { + // CS_LOW(); #ifndef USE_PINGUINO while( SPI2STATbits.SPITBF == 1 ) { @@ -152,12 +153,14 @@ static BYTE xchg_spi (BYTE dat) // ---------------- // sending data // ---------------- + SPI2BUF = dat; while(SPI2STATbits.SPIRBF == 0) { } + // CS_HIGH(); return (BYTE)SPI2BUF; /* Get received byte */ } diff --git a/Bootloader_PIC32.X/Source/FlashInterface.c b/Bootloader_PIC32.X/Source/FlashInterface.c index e65dff0..70e4cf6 100644 --- a/Bootloader_PIC32.X/Source/FlashInterface.c +++ b/Bootloader_PIC32.X/Source/FlashInterface.c @@ -14,6 +14,7 @@ #include "define.h" #include "FlashInterface.h" +stDataSector_t CurrentDataSector; void InitFlashInterface(void) { diff --git a/Bootloader_PIC32.X/Source/FlashInterface.h b/Bootloader_PIC32.X/Source/FlashInterface.h index b4ef76c..5abb1d5 100644 --- a/Bootloader_PIC32.X/Source/FlashInterface.h +++ b/Bootloader_PIC32.X/Source/FlashInterface.h @@ -4,19 +4,23 @@ #include "define.h" //for CPU selection -#define APPLICATION_START_ADDRESS 0x9D003000 -#define APPLICATION_FLASH_START_ADDRESS 0x9D002000 +//#define APPLICATION_START_ADDRESS 0x9D003000 +//#define APPLICATION_FLASH_START_ADDRESS 0x9D002000 + +#define APPLICATION_START_ADDRESS 0x9D005000 +#define APPLICATION_FLASH_START_ADDRESS 0x9D004000 #define FLASH_ROW_SIZE 128 #define FLASH_ROW_SIZE_IN_BYTES (4 * FLASH_ROW_SIZE) //512 #define FLASH_PAGE_SIZE (8 * FLASH_ROW_SIZE) //1024 #define FLASH_PAGE_SIZE_IN_BYTES (4 * FLASH_PAGE_SIZE) //4096 +#define MAX_SECTOR_SIZE FLASH_PAGE_SIZE_IN_BYTES //The number of pages of application program flash #ifdef USE_675F512_CPU #define FLASH_NB_APPLICATION_PAGES (0x40000 / FLASH_PAGE_SIZE_IN_BYTES) - 2 //0x40000 is the size of the flash (32MX675F512L), the 2 first pages are reserved for bootloader. (-2) #else -#define FLASH_NB_APPLICATION_PAGES (0x80000 / FLASH_PAGE_SIZE_IN_BYTES) - 2 //0x80000 is the size of the flash (32MX795F512L), the 2 first pages are reserved for bootloader. (-2) +#define FLASH_NB_APPLICATION_PAGES (0x80000 / FLASH_PAGE_SIZE_IN_BYTES) - 4 //0x80000 is the size of the flash (32MX795F512L), the 2 first pages are reserved for bootloader. (-2) #endif @@ -24,6 +28,14 @@ #define PROGRAM_FLASH_END_ADDRESS 0x1D07FFFF +typedef struct +{ + unsigned int SectorStartAddress; + unsigned short SectorSize; + unsigned int SectorData[MAX_SECTOR_SIZE]; + +}stDataSector_t; + enum eFlashOperations { FLASH_NOP_CMD = 0X0000, @@ -39,6 +51,7 @@ enum eFlashReturnValues FLASH_STATUS_ERROR }; +extern stDataSector_t CurrentDataSector; void InitFlashInterface(void); unsigned int FlashErase(void); diff --git a/Bootloader_PIC32.X/Source/FlashMapping.h b/Bootloader_PIC32.X/Source/FlashMapping.h new file mode 100644 index 0000000..8575fb0 --- /dev/null +++ b/Bootloader_PIC32.X/Source/FlashMapping.h @@ -0,0 +1,32 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef FLASHMAPPING_H +#define FLASHMAPPING_H +#include "define.h" + +/* +0x180000 Firmware flags +0x180004 Nb Records +0x180008 Firmware Size +0x18000C Version code +*/ + +#define FLASH_END_ADDRESS 180000 + +#define FLASH_BTLDR_FIRMWARE_START_ADDRESS 0x180000 +#define FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD 0x1F0000 +#define FLASH_BTLDR_FLAGS_ADDRESS 0x000000 + + + +#define FLASH_BTLDR_HEADER_SIZE 24 +#define FLASH_BTLDR_FLAGS_SIZE 12 + + + +#endif /* HARAKIRIRELAY_H */ diff --git a/Bootloader_PIC32.X/Source/InternalUart.c b/Bootloader_PIC32.X/Source/InternalUart.c index 9b734b9..978918e 100644 --- a/Bootloader_PIC32.X/Source/InternalUart.c +++ b/Bootloader_PIC32.X/Source/InternalUart.c @@ -26,6 +26,7 @@ /* ************************************************************************** */ /* Includes */ #include "define.h" +#include "BoardCfg.h" #include "InternalUart.h" #include "uart.h" #include "BootloaderProtocol.h" @@ -501,6 +502,7 @@ int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize) #ifdef USE_SERIAL_PORT_2 U2TXREG = *p_pcDataBuf++; while(U2STAbits.TRMT == 0); + Nop(); #endif @@ -553,7 +555,7 @@ int ReadInternalUart(void) while(U2STAbits.URXDA == 1) { byte = U2RXREG; - ProtocolRxData(byte); +// ProtocolRxData(byte); count++; } #endif diff --git a/Bootloader_PIC32.X/Source/SPI.c b/Bootloader_PIC32.X/Source/SPI.c index cb0eb2d..6f427c2 100644 --- a/Bootloader_PIC32.X/Source/SPI.c +++ b/Bootloader_PIC32.X/Source/SPI.c @@ -1,17 +1,20 @@ #include "define.h" -#include "DigitalIO.h" +//#include "BoardCfg.h" #include "SPI.h" -unsigned char SPITransaction(unsigned char OutBuf) +unsigned char SPITransaction(unsigned char OutBuf, unsigned char BaudRate) { - WIFI_SPI_SS_PIN = 0; + + SPI2BRG = BaudRate; + + // WIFI_SPI_SS_PIN = 0; SPI2BUF = OutBuf; while(!SPI2STATbits.SPIRBF); OutBuf = SPI2BUF; - WIFI_SPI_SS_PIN = 1; + // WIFI_SPI_SS_PIN = 1; return OutBuf; } diff --git a/Bootloader_PIC32.X/Source/SPI.h b/Bootloader_PIC32.X/Source/SPI.h index 263cb24..b464442 100644 --- a/Bootloader_PIC32.X/Source/SPI.h +++ b/Bootloader_PIC32.X/Source/SPI.h @@ -8,7 +8,7 @@ #ifndef SPI_H #define SPI_H -unsigned char SPITransaction(unsigned char OutBuf); +unsigned char SPITransaction(unsigned char OutBuf, unsigned char Baudrate); #endif /* SPI_H */ diff --git a/Bootloader_PIC32.X/Source/SPI_Flash.c b/Bootloader_PIC32.X/Source/SPI_Flash.c new file mode 100644 index 0000000..edceaf0 --- /dev/null +++ b/Bootloader_PIC32.X/Source/SPI_Flash.c @@ -0,0 +1,448 @@ +#include "SPI_Flash.h" +#include "SPI.h" +#include "BoardCfg.h" + +unsigned char mSPIFlashBaudrate; +unsigned char mSPIFlashHighSpeedBaudrate; +unsigned char mFlashSectorBuffer[SPI_FLASH_SECTOR_SIZE]; + +int InitSPIFlash() +{ + FLASH_SS_PIN = 1; + + mSPIFlashBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 25000000); +// mSPIFlashHighSpeedBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 50000000); + mSPIFlashHighSpeedBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 35000000); +} + +int SPIFlashCheckAndConfigure() +{ + + if(SPIFlashCheckChipID() == RET_OK) + { + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_WRITE_STATUS_REG,mSPIFlashHighSpeedBaudrate); + SPITransaction(0x00,mSPIFlashHighSpeedBaudrate); //Configure for write enable the whole memory + FLASH_SS_PIN = 1; + + SPIFlashReadStatusReg(1); + + // printf("SPI Flash configured\n"); + char mbuf[30]; + mbuf[0] = 'S'; + mbuf[1] = 'P'; + mbuf[2] = 'I'; + mbuf[3] = ' '; + mbuf[4] = 'F'; + mbuf[5] = 'l'; + mbuf[6] = 'a'; + mbuf[7] = 's'; + mbuf[8] = 'h'; + mbuf[9] = ' '; + mbuf[10] = 'C'; + mbuf[11] = 'o'; + mbuf[12] = 'n'; + mbuf[13] = 'f'; + mbuf[14] = 'i'; + mbuf[15] = 'g'; + mbuf[16] = 'u'; + mbuf[17] = 'r'; + mbuf[18] = 'e'; + mbuf[19] = 'd'; + mbuf[20] = '\n'; + mbuf[21] = '\r'; + SendInternalUartData(&mbuf[0],22); + + return RET_OK; + } + + // printf("ERROR: SPI Flash not detected\n"); + return RET_ERROR; + +} + +int SPIFlashWriteEnable() +{ + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_WRITE_ENABLE,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + return RET_OK; +} + + + +unsigned char SPIFlashReadStatusReg(int print) +{ + unsigned char result; + + FLASH_SS_PIN = 0; + result = SPITransaction(SPI_FLASH_READ_STATUS_REG,mSPIFlashBaudrate); + result = SPITransaction(0x00,mSPIFlashBaudrate); //get data + FLASH_SS_PIN = 1; + + if(print) + { + // printf("Flash status register : 0x%x\n",result); + } + + return result; + +} + +int SPIFlashCheckBusy() +{ + unsigned char status = SPIFlashReadStatusReg(0); + if((status & SPI_FLASH_BUSY_MASK) != 0) + { + return 1; + } + + return 0; +} + + +int SPIFlashCheckChipID() +{ + unsigned char VendorID, ChipID; + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_READ_ID,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); //Vendor address + VendorID = SPITransaction(0x00,mSPIFlashBaudrate); //Vendor ID, should be 0xBF + ChipID = SPITransaction(0x00,mSPIFlashBaudrate); //Device ID, should be 0x41 + FLASH_SS_PIN = 1; + + if(VendorID != SPI_FLASH_VENDOR_ID || ChipID != SPI_FLASH_CHIP_ID) + { + // printf("SPI Flash detection FAILED. Vendor: 0x%x, Chip ID: 0x%x\n",VendorID,ChipID); + return RET_ERROR; + } + // printf("SPI Flash detected. Vendor: 0x%x, Chip ID: 0x%x\n",VendorID,ChipID); + return RET_OK; + +} + + +int SPIFlashReadBuffer(unsigned char *Buf, int Size, int StartAddress) +{ + if(StartAddress + Size - 1 > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_HI_SPEED_READ,mSPIFlashBaudrate); + SPITransaction(((StartAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((StartAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((StartAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction((0x00),mSPIFlashHighSpeedBaudrate); //Chip requires a dummy read in high speed + + int i; + for(i = 0; i < Size; i++) + { + unsigned char tmp; + tmp =SPITransaction(0xDE,mSPIFlashHighSpeedBaudrate); + *Buf++ = tmp; + // *Buf++ = SPITransaction(0xDE,mSPIFlashHighSpeedBaudrate); + } + + FLASH_SS_PIN = 1; + + return RET_OK; +} + +int SPIFlashEraseSector(int SectorAddress) +{ + if(SectorAddress % SPI_FLASH_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_4KB_SECOTR_ERASE,mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + SectorAddress++; + + while( SPIFlashCheckBusy() == true); + //SPIFlashWriteEnable(); + + return RET_OK; +} + +int SPIFlashErase64KSector(int SectorAddress, int Blocking) +{ + if(SectorAddress % SPI_FLASH_64K_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + if((SectorAddress + SPI_FLASH_64K_SECTOR_SIZE - 1) > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_64KB_BLOCK_ERASE,mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + if(Blocking != 0) + { + while( SPIFlashCheckBusy() == true); + // SPIFlashWriteEnable(); + } + + return RET_OK; +} + + + +int SPIFlashWriteSectorWorkingBuffer(int SectorAddress, int Erase) +{ + if(SectorAddress % SPI_FLASH_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + + if(Erase == 1) + { + SPIFlashEraseSector(SectorAddress); + } + + unsigned char *DataPtr = &mFlashSectorBuffer[0]; + int j; + for(j = 0; j < SPI_FLASH_SECTOR_SIZE; j++) + { + unsigned char curbyte; + curbyte = *DataPtr; + SPIFlashWriteEnable(); + + + + char Add1, Add2, Add3; + Add1 = (unsigned char)((SectorAddress & 0xFF0000) >> 16); + Add2 = ((unsigned char)((SectorAddress & 0x00FF00) >> 8)); + Add3 = ((unsigned char)(SectorAddress & 0x0000FF)); + + int t; + t = 0; + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)(SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction(Add1,mSPIFlashHighSpeedBaudrate); + SPITransaction(Add2,mSPIFlashHighSpeedBaudrate); + SPITransaction(Add3,mSPIFlashHighSpeedBaudrate); + + SPITransaction(curbyte,mSPIFlashHighSpeedBaudrate); +// SPITransaction(*DataPtr,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + DataPtr++; + SectorAddress++; + + while( SPIFlashCheckBusy() == true); + } + + return RET_OK; +} + +int SPIFlashWriteByte(unsigned int ByteAddress, char byte, int blocking) +{ + if(ByteAddress > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); + SPITransaction(((ByteAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((ByteAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((ByteAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction(byte,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + if(blocking) + { + while( SPIFlashCheckBusy() == true); + } + + + return RET_OK; + +} + + + +//int SPIFlashEraseSectorForWrite(unsigned char StartAddress, int Size) +//{ +// //First, let's determine which sector to erase. +// +// int NbSectors = 1; +// int FirstSector = StartAddress / 0x1000; +// int LastSector = (StartAddress + Size) / 0x1000; +// +// if(LastSector > FirstSector) +// { +// NbSectors = LastSector - FirstSector; +// } +// +// int i; +// for(i = FirstSector; i < LastSector; i++ ) //Erase each sector one by one +// { +// +// } +// +//} + +//int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress) +//{ +// //First, we need to determine if the data overlaps or uses more than one sector +// //First, let's determine which sector to erase. +// int EndAddress = StartAddress + Size - 1; +// if(EndAddress > SPI_FLASH_MAX_ADDRESS) +// { +// return RET_ERROR; +// } +// +// int NbSectors = 1; +// int FirstSector = StartAddress / SPI_FLASH_SECTOR_SIZE; +// int LastSector = EndAddress / SPI_FLASH_SECTOR_SIZE; +// +// if(LastSector > FirstSector) +// { +// NbSectors = LastSector - FirstSector + 1; +// } +// +// int i; +// int FlashAddress = StartAddress; +// int CurSector = FirstSector; +// for(i = 0; i < NbSectors; i++ ) //Read, erase and write each sector one by one +// { +// //first we need to backup the data outside our buffer. +// //TODO: optimize +// int SectorStartAddress = CurSector++ * SPI_FLASH_SECTOR_SIZE; +// int SectorEndAddress = SectorStartAddress + SPI_FLASH_SECTOR_SIZE - 1; +// if(SectorEndAddress > EndAddress) +// { +// SectorEndAddress = EndAddress; +// } +// +// SPIFlashReadBuffer(mFlashSectorBuffer,SPI_FLASH_SECTOR_SIZE,SectorStartAddress); //Get local RAM buffer of the sector +// +// //Update the data to write. +// int RAMAddress = FlashAddress - SectorStartAddress; +// int RAMSectorSize = SectorEndAddress - FlashAddress + 1; +// FlashAddress += RAMSectorSize; +// +// unsigned char* RAMPtr = &mFlashSectorBuffer[RAMAddress]; +// int j; +// for(j = 0; j < RAMSectorSize; j++) +// { +// *RAMPtr++ = *Buf++; +// } +// +// int SectorAddress = SectorStartAddress; +// RAMPtr = mFlashSectorBuffer; +// +// for(j = 0; j < SPI_FLASH_SECTOR_SIZE; j++) +// { +// SPIFlashWriteEnable(); +// +// FLASH_SS_PIN = 0; +// SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); +// SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashBaudrate); +// SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashBaudrate); +// SPITransaction((SectorAddress & 0x0000FF),mSPIFlashBaudrate); +// SPITransaction(*RAMPtr++,mSPIFlashBaudrate); +// FLASH_SS_PIN = 1; +// +// SectorAddress++; +// +// while( SPIFlashCheckBusy() == true); +// } +// } +//} + +int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress) +{ + int CurDataFlashAddress, DataFlashEndAddress; + char *DataBufPtr, *WorkPagePtr; + int WriteFinished; + + + //Init stuff + WriteFinished = 0; + DataFlashEndAddress = StartAddress + Size; //Start + size means the data at "DataFlashEndAddress" should not be written. + CurDataFlashAddress = StartAddress; + DataBufPtr = Buf; + + if(DataFlashEndAddress > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + while(WriteFinished == 0) + { + //Determine the current sector start address. + int SectorStartAddress; + SectorStartAddress = ((CurDataFlashAddress / SPI_FLASH_SECTOR_SIZE) * SPI_FLASH_SECTOR_SIZE); //Weird but it works + + //Load the sector in RAM working buffer + if(SPIFlashReadBuffer(mFlashSectorBuffer,SPI_FLASH_SECTOR_SIZE,SectorStartAddress) != RET_OK) + { + return RET_ERROR; + } + + //Set the working buffer pointer to the right value. + WorkPagePtr = &mFlashSectorBuffer[CurDataFlashAddress - SectorStartAddress]; + + //Modify the working buffer with data to write. + int SectorFinished = 0; + while(SectorFinished == 0) + { + *WorkPagePtr++ = *DataBufPtr++; + CurDataFlashAddress++; + + //Are we at the end of the buffer to write? + if(CurDataFlashAddress == DataFlashEndAddress) + { + SectorFinished = 1; + WriteFinished = 1; +// SPIFlashEraseSector(SectorStartAddress); + SPIFlashWriteSectorWorkingBuffer(SectorStartAddress,1); + + break; + } + else if(CurDataFlashAddress % SPI_FLASH_SECTOR_SIZE == 0) //Are we at the beginning of the next sector? + { + SectorFinished = 1; +// SPIFlashEraseSector(SectorStartAddress); + SPIFlashWriteSectorWorkingBuffer(SectorStartAddress,1); + + break; + } + } + + } + + return 1; +} \ No newline at end of file diff --git a/Bootloader_PIC32.X/Source/SPI_Flash.h b/Bootloader_PIC32.X/Source/SPI_Flash.h new file mode 100644 index 0000000..adea425 --- /dev/null +++ b/Bootloader_PIC32.X/Source/SPI_Flash.h @@ -0,0 +1,48 @@ +#ifndef SPI_FLASH_H /* Guard against multiple inclusion */ +#define SPI_FLASH_H + +#define SPI_FLASH_READ 0x03 +#define SPI_FLASH_HI_SPEED_READ 0x0b +#define SPI_FLASH_4KB_SECOTR_ERASE 0x20 +#define SPI_FLASH_32KB_BLOCK_ERASE 0x52 +#define SPI_FLASH_64KB_BLOCK_ERASE 0xd8 +#define SPI_FLASH_CHIP_ERASE 0x60 +#define SPI_FLASH_BYTE_PROGRAM 0x02 +#define SPI_FLASH_AAI_WORD_PROGRAM 0xad +#define SPI_FLASH_READ_STATUS_REG 0x05 +#define SPI_FLASH_ENABLE_WRITE_STATUS_REG 0x50 +#define SPI_FLASH_WRITE_STATUS_REG 0x01 +#define SPI_FLASH_WRITE_ENABLE 0x06 +#define SPI_FLASH_WRITE_DISABLE 0x04 +#define SPI_FLASH_READ_ID 0x90 +#define SPI_FLASH_READ_JEDEC_ID 0x9f +#define SPI_FLASH_ENABLE_SO_BUSY 0x70 +#define SPI_FLASH_DISABLE_SO_BUSY 0x80 + + +#define SPI_FLASH_BUSY_MASK 0x01 + +#define SPI_FLASH_VENDOR_ID 0xBF +#define SPI_FLASH_CHIP_ID 0x41 +#define SPI_FLASH_MAX_ADDRESS 0x1FFFFF +#define SPI_FLASH_SECTOR_SIZE 0x1000 +#define SPI_FLASH_64K_SECTOR_SIZE 0x10000 +#define SPI_NB_SECTORS 0x1FF //511 sectors = SPI_FLASH_MAX_ADDRESS / SPI_FLASH_SECTOR_SIZE + + +int InitSPIFlash(); +int SPIFlashCheckChipID(); +unsigned char SPIFlashReadStatusReg(int print); +int SPIFlashCheckAndConfigure(); +int SPIFlashReadBuffer(unsigned char *Buf, int Size, int StartAddress); +int SPIFlashCheckBusy(); +int SPIFlashWriteEnable(); +int SPIFlashEraseSector(int SectorAddress); +int SPIFlashErase64KSector(int SectorAddress, int Blocking); +int SPIFlashWriteSectorWorkingBuffer(int SectorAddress, int Erase); +int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress); +int SPIFlashWriteByte(unsigned int ByteAddress, char byte, int blocking); + + +#endif /* SPI_FLASH_H */ + diff --git a/Bootloader_PIC32.X/Source/checksum.h b/Bootloader_PIC32.X/Source/checksum.h new file mode 100644 index 0000000..37d4110 --- /dev/null +++ b/Bootloader_PIC32.X/Source/checksum.h @@ -0,0 +1,94 @@ +/* + * Library: libcrc + * File: include/checksum.h + * Author: Lammert Bies + * + * This file is licensed under the MIT License as stated below + * + * Copyright (c) 1999-2016 Lammert Bies + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Description + * ----------- + * The headerfile include/checksum.h contains the definitions and prototypes + * for routines that can be used to calculate several kinds of checksums. + */ + +#ifndef DEF_LIBCRC_CHECKSUM_H +#define DEF_LIBCRC_CHECKSUM_H + +#include + +/* + * #define CRC_POLY_xxxx + * + * The constants of the form CRC_POLY_xxxx define the polynomials for some well + * known CRC calculations. + */ + +#define CRC_POLY_16 0xA001 +#define CRC_POLY_32 0xEDB88320L +#define CRC_POLY_CCITT 0x1021 +#define CRC_POLY_DNP 0xA6BC +#define CRC_POLY_KERMIT 0x8408 +#define CRC_POLY_SICK 0x8005 + +/* + * #define CRC_START_xxxx + * + * The constants of the form CRC_START_xxxx define the values that are used for + * initialization of a CRC value for common used calculation methods. + */ + +#define CRC_START_8 0x00 +#define CRC_START_16 0x0000 +#define CRC_START_MODBUS 0xFFFF +#define CRC_START_XMODEM 0x0000 +#define CRC_START_CCITT_1D0F 0x1D0F +#define CRC_START_CCITT_FFFF 0xFFFF +#define CRC_START_KERMIT 0x0000 +#define CRC_START_SICK 0x0000 +#define CRC_START_DNP 0x0000 +#define CRC_START_32 0xFFFFFFFFL + +/* + * Prototype list of global functions + */ + +unsigned char * checksum_NMEA( const unsigned char *input_str, unsigned char *result ); +uint8_t crc_8( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_16( const unsigned char *input_str, size_t num_bytes ); +uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_ccitt_1d0f( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_ccitt_ffff( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_dnp( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_kermit( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_modbus( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_xmodem( const unsigned char *input_str, size_t num_bytes ); +uint8_t update_crc_8( uint8_t crc, unsigned char c ); +uint16_t update_crc_16( uint16_t crc, unsigned char c ); +uint32_t update_crc_32( uint32_t crc, unsigned char c ); +uint16_t update_crc_ccitt( uint16_t crc, unsigned char c ); +uint16_t update_crc_dnp( uint16_t crc, unsigned char c ); +uint16_t update_crc_kermit( uint16_t crc, unsigned char c ); +uint16_t update_crc_sick( uint16_t crc, unsigned char c, unsigned char prev_byte ); + +#endif // DEF_LIBCRC_CHECKSUM_H diff --git a/Bootloader_PIC32.X/Source/crc32.c b/Bootloader_PIC32.X/Source/crc32.c new file mode 100644 index 0000000..3a0f007 --- /dev/null +++ b/Bootloader_PIC32.X/Source/crc32.c @@ -0,0 +1,131 @@ +/* + * Library: libcrc + * File: src/crc32.c + * Author: Lammert Bies + * + * This file is licensed under the MIT License as stated below + * + * Copyright (c) 1999-2016 Lammert Bies + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Description + * ----------- + * The source file src/crc32.c contains the routines which are needed to + * calculate a 32 bit CRC value of a sequence of bytes. + */ + +#include +#include +#include "checksum.h" + +static void init_crc32_tab( void ); + +static bool crc_tab32_init = false; +static uint32_t crc_tab32[256]; + +/* + * uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ); + * + * The function crc_32() calculates in one pass the common 32 bit CRC value for + * a byte string that is passed to the function together with a parameter + * indicating the length. + */ + +uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ) { + + uint32_t crc; + uint32_t tmp; + uint32_t long_c; + const unsigned char *ptr; + size_t a; + + if ( ! crc_tab32_init ) init_crc32_tab(); + + crc = CRC_START_32; + ptr = input_str; + + if ( ptr != NULL ) for (a=0; a> 8) ^ crc_tab32[ tmp & 0xff ]; + + ptr++; + } + + crc ^= 0xffffffffL; + + return crc & 0xffffffffL; + +} /* crc_32 */ + +/* + * uint32_t update_crc_32( uint32_t crc, unsigned char c ); + * + * The function update_crc_32() calculates a new CRC-32 value based on the + * previous value of the CRC and the next byte of the data to be checked. + */ + +uint32_t update_crc_32( uint32_t crc, unsigned char c ) { + + uint32_t tmp; + uint32_t long_c; + + long_c = 0x000000ffL & (uint32_t) c; + + if ( ! crc_tab32_init ) init_crc32_tab(); + + tmp = crc ^ long_c; + crc = (crc >> 8) ^ crc_tab32[ tmp & 0xff ]; + + return crc & 0xffffffffL;; + +} /* update_crc_32 */ + +/* + * static void init_crc32_tab( void ); + * + * For optimal speed, the CRC32 calculation uses a table with pre-calculated + * bit patterns which are used in the XOR operations in the program. This table + * is generated once, the first time the CRC update routine is called. + */ + +static void init_crc32_tab( void ) { + + uint32_t i; + uint32_t j; + uint32_t crc; + + for (i=0; i<256; i++) { + + crc = i; + + for (j=0; j<8; j++) { + + if ( crc & 0x00000001L ) crc = ( crc >> 1 ) ^ CRC_POLY_32; + else crc = crc >> 1; + } + + crc_tab32[i] = crc; + } + + crc_tab32_init = true; + +} /* init_crc32_tab */ diff --git a/Bootloader_PIC32.X/Source/define.h b/Bootloader_PIC32.X/Source/define.h index 129b172..ffe55ec 100644 --- a/Bootloader_PIC32.X/Source/define.h +++ b/Bootloader_PIC32.X/Source/define.h @@ -26,8 +26,8 @@ /* ************************************************************************** */ /* Defines */ -#define SYS_FREQ (77824000L) -#define PERIPHERAL_FREQ (77824000L) +//#define SYS_FREQ (77824000L) +//#define PERIPHERAL_FREQ (77824000L) #define PIN_INPUT 1 #define PIN_OUTPUT 0 #define false 0 @@ -36,8 +36,10 @@ #define LSB8(x) (x & 0xFF) #define USE_BLOCKING_PRINTF #define NO_EXTERNAL_UART +#define LED_ON 0 +#define LED_OFF 1 -#define USE_675F512_CPU //For prototype board, 795F512 CPUs were backordered. +//#define USE_675F512_CPU //For prototype board, 795F512 CPUs were backordered. /* ************************************************************************** */ /* Type definitions */ diff --git a/Bootloader_PIC32.X/Source/main.c b/Bootloader_PIC32.X/Source/main.c index f52dded..130c81b 100644 --- a/Bootloader_PIC32.X/Source/main.c +++ b/Bootloader_PIC32.X/Source/main.c @@ -10,11 +10,15 @@ *******************************************************************************/ #include "define.h" +#include "BoardCfg.h" #include "InternalUart.h" #include "FlashInterface.h" #include "BootloaderProtocol.h" #include "BootloaderStateMachine.h" +#include "BootloaderInterface.h" #include "DigitalIO.h" +#include "SPI_Flash.h" +//#include "FatFS/ff.h" //#pragma config FMIIEN = OFF, FSRSSEL = PRIORITY_7, FETHIO = ON //#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF @@ -30,16 +34,27 @@ //#pragma config ICESEL = ICS_PGx1, BWP = ON -#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF, WDTPS = PS128 +//#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF, WDTPS = PS128 +//#pragma config POSCMOD = EC, FNOSC = PRIPLL, FPBDIV = DIV_1 +//#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_1 +//#pragma config ICESEL = ICS_PGx2, BWP = OFF + +#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF, WDTPS = PS4096 //Watchdog timeout = 4,096s #pragma config POSCMOD = EC, FNOSC = PRIPLL, FPBDIV = DIV_1 //#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_1 #pragma config ICESEL = ICS_PGx2, BWP = OFF +#pragma config FSOSCEN = OFF -//void _general_exception_handler(void); + +void _general_exception_handler(void); int main(void) { - +// FATFS fs; +// FRESULT fr; +// FIL fil; + char RdBuf[256]; + unsigned int rd,wr; @@ -48,19 +63,45 @@ int main(void) // INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);// configure for multi-vectored mode interrupts AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O + InitBoard(); InternalUartInit(); InitFlashInterface(); - ProtocolInit(); +// ProtocolInit(); BootloaderSMInit(); InitDigitalIO(); - OpenInternalPort(0,0,115200,INT_UART_ONE_STOP_BIT,INT_UART_NO_PARITY); + OpenInternalPort(0,0,9600,INT_UART_ONE_STOP_BIT,INT_UART_NO_PARITY); + + InitSPIFlash(); + + if(SPIFlashCheckAndConfigure() == RET_OK) + { + BootloaderSMSetSPIFlashDetected(RET_OK); + } + else + { + BootloaderSMSetSPIFlashDetected(RET_ERROR); + } + + +// fr = f_mount(&fs,"",1); +// fr = f_open(&fil,"JF.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS); +// if(fr == FR_OK) +// { +// fr = f_read(&fil,RdBuf,100,&rd); +// fr = f_write(&fil,RdBuf,rd,&wr); +// } +// else +// { +// int toto = 0xDEADBEEF; +// } +// f_close(&fil); - ProtocolSendCmd(BOOTLOADER_READY_CMD,0,0); +// ProtocolSendCmd(BOOTLOADER_READY_CMD,0,0); HEARTBEAT_LED_1_PIN = 0; - char mbuf[30]; + char mbuf[30]; mbuf[0] = 'B'; mbuf[1] = 'o'; mbuf[2] = 'o'; @@ -77,8 +118,11 @@ int main(void) mbuf[13] = '.'; mbuf[14] = '0'; mbuf[15] = '1'; - mbuf[16] = '\r'; - SendInternalUartData(&mbuf[0],17); + mbuf[16] = '\n'; + mbuf[17] = '\r'; + SendInternalUartData(&mbuf[0],18); + + int i,j; i =0; @@ -93,17 +137,17 @@ int main(void) // could flash a led HEARTBEAT_LED_2_PIN = !HEARTBEAT_LED_2_PIN; } - - if(e_CommandPending) - { - //Valid command received. - ProtocolExecCmd(); - e_CommandPending = false; - } - +// +// if(e_CommandPending) +// { +// //Valid command received. +// ProtocolExecCmd(); +// e_CommandPending = false; +// } +// BootloaderSM(SM_TICK_EVENT,SM_NULL_DATA); - if(++i >= 100000) + if(++i >= 30000) { // if(++j >= 10000000) { @@ -148,7 +192,9 @@ void _general_exception_handler(void) mbuf[18] = '\r'; SendInternalUartData(&mbuf[0],19); - SoftReset(); + SoftReset(); + + while(1); } diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/BootloaderProtocol.o b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/BootloaderProtocol.o deleted file mode 100644 index debfceed68769d62bce482ddd41457511a9371a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17192 zcmd5@Yjj-Ib>8>RXf%4+vL)NX&k+{3F-Eo|8?b{xqtVD7G?IoH$qybK>oK+kdSx`S zMV6B|GByyPfegh!hc(vU8)ny%26wjm{}WR=FIiYcAMRUj^Gh=je&FLrN9*v}iO+5D&iRz1S`>1PJb&z|8N2SQrY-s>GL>x)ejl5W zmQCdBxyoi*HnDsL2%Rr`=FpLawggt%M^JumV6lDVJorg;>X5gZTQ-zPvx*DcR`I9} zh!o8kpQ(F`jIO_+J;t~g+`Me;rtbaqOiP^yKEl3=ncKc^4*RUn{^nwS>=@#3*Bbg= zt@?pyIfZBb{9PiUlNMr6eW&flY}?1C8IO{zY+s7!1KrSVd}hE$H0J6TLBDji{@sqA zS3(at_qxrgX`i%gSd@*OZZp?^=IYe6hzITUqwRjQ9eTu@_1W=h>eO@D{F_3aIzHvy z-&DQmkQ|njDD#r){gG4#e-+2byt}B zY||2NUG2JNZ4Q6W&6er@IB{_J+JH!LejKuO->w<6(}U3_v%qoa063m<5jY-JESWn{$Lq*8{#%o;`Kg*sVi7*gRTo#v$;* zN^o9jt#itpc4{l95Vz1t^2}o(=5c)w#QpQr^y31I=U>d|9Hxx11;4egoJ*_C_;&iN z$Iw9DGj+-sOT-Ox!ZXu>4-iik8_Xr}=Rx|(d1V3anFHX~GH-10!5=dhzK?wb_igCR zx~v7(dH$+0kAInefwj=8^r2&QQdV{uDDKQSHo! z=_1FwO3R8=v5f__DBM^ive0XJ{5kil*1@ag6(ZI3a(TJ#$=Y&ux)~-H)mw!mjV&(9 zcEyI)l5Eu?r(#Wx%2_)nYprN)d8A6~(%w>I58b1^Wt+8mBQAGW%T-#TdQ>K|(x@XQ zmzQ6Pxo;JSd5pkK&3=aqIGjV&I>b%Q^BnG6!xgzIt_H{F3umP4(c!Vd zp;S6>sG+{8Nvy=^M7lq#7#N)MN`>+!7#=ApZVX?2g2kKsH zmAzWLJA=`-L^vdNT$3wFLNBqm6J$b@D-5|i9_|#oTa(KT8H%=df!(Fqb2JN+iEvcx z-I}c-n~1c6*{hj_WLWQNEmu+w1)*?_B1(NA==mQ^((}V&ClwzM@|>sIi-FQF$s z_DzbDNw^*A>g*fLj3+Z<_p%}k99)4X`~7 z7DFv|sD_Kg{=&|c1k@%IMZZi~nTGG;!*emw!rlRU7+?+1nvCg^?MaM?IP?+b=wmZ;c4?|#EE zczmEIi?3j$kP{E+5}g#KUi-%4ew6rXpA*G45y-P_h{BCA&br_)vHYPB2_&a?NaR3hPA=+DO_7pUyRt%H9WVZF{JW<9G=@g z!>K$VhZO8JT(%FW+iy6P2kaN>4j4}50Xfu78P45VR6k(o`Nmzw02U4!dY+4hkwHV} zVgnP`8M0jIGGH)py&+Y^bZnqHY}jI|Y8JX9hUJuNShO{2Sa%>{V$9H9;~C=%8y_{a z$3??P+R#qiGbKA2cVz#BF3D#9j*?!K_&&xVz`XYH0Wtd#KG&>%SQ)?*TvhroE$!mF zD^RL(-=`8Y5s$?18aY>UD&J@((%GHp4t6`EXm#l%s>4pSq8LlVlGcu(p4mDp^f*#u zJ<*fEXlNC?%dqMx^R;!QA)E;?QBg}X=vcQd$#$&0Vhc)q&$4%Hiq4=lSD$vNy6|PR z;tY+1;-Sz^L|Pm2=y4hkb?=QKpr&2bRVW5yAjb`<2caJ28N;a|7>jaDPiU%0b)qHG z-6i&6qoopJcMF&s45OZJ%U&vdOjEY=5RX(;l<2;GT$g0~I#N-K5?_=ZW>-{S*`3^L z`ID+LI(yUN&(cbKkB<8-i*?*p$GQ#qX+x@xX}wzwrTW#<(-!K)oN>D*{eEO0AL{ht zCulp|y;E1Z(^ZM(cP;**>A~H)B-?`%i{E4qw(<}C^U)By0bB0;xkp)msYh!1urw^` zh(tPcTVJbjPsE`h0{^I?)HK}L)x9eijUcH`8CpHyXr!~fEf_)Oe%;WVj_K?-YmTr5 zq}F4)BF81(wgO z9QzOUrp31W*&3R#i^dO*rZZ|`Y1_qG$m%E)er+{p+OON5?LfJ=4I2U5@+sTJJs70o zQR_=jrML5QD62@P4qyq!TZE&ce<&^9E4AdU7*A!eSk;ohVsPXT7MWTqmwBD2QXCKO zNG8JF;_bc)q9^9v^;;Sp9vw)DcMtDrbv)B6-o09?tjJ7?_bM#}D$)?H*21QWzBGKf zMoY~y?<8C33C6pVXeJ@vYfq8D%6>?SE_?~kW4^!HS2l*7O+_NrpBYUjGQH_ca9|*v z8Xp&*8ar&>6b^nYCBAtxsAsSC8nU$)uKDKEhP~P^l}xQqL0Iq=sLjlm;_(bsv<0ks zeG68hbYW`t_5y8ZQsd(FRo#JIV^u8P)!h~9iYDWGk~_n})^NOl40W`Mm8aGk><%Uq zk*mT<%=hn8(uhsA+q9~KSp+L9@7x8AQZ#o#llbN?*eu0)1)-hcP=A(zfPxqIN>xi&S9i3F0l-rXw(eE5RfQR=GaTZRy|O2q=vJ)l zR_^KKQYWw6Q-w&zyIaCRt?zZoZaYO)m`RW|Ju!qQoM*yUmB9N3RH!RX$TePE#ezAi z_^aBY!NksFFcwMfLNC~@k^;_csI&^pr=FIiuH`N%t7`4qjcx^7=O`>UCe;&V8x>V; zk$A`MV4OX`7<0UpUt4oNhd2kTuc>wcf*yx@Hch(P3mNqwkbQY-+TU z?vXtCMd5fn*@6yblf*l_Ty?1nv14*09rK!{fov8hk{yu*Chr}c;Z~&QEXAHqrdMY& z)YZ`u#JZt)wu&iAa$OPW+<_CNSym#^Xn033nhdtKBC-iQ&DkoQ>K&3aSs3CLuXMJW zDGu+6A(!ED*=!XRQ1iU`{()BcY%LYre65PvS`p)w&}}8pfhVu%#jk!oi(x~TO~Z1>c?Co zR<)~6O}03m!rLm*A=cL1cXHOqIoa|=YGgoF4_g*zdFQf5o)yNx#T%Y^L5JJw7u~`)wQ#Po_)zhBz5kXo+AKHet79F^aj_pR*18}tn#F#}k@c=c?6wlO zvB{G4rhw<~=sx#6s}p+@?P2U^zi4#pRKv?kbxkcTH_~dej}d#NVa`+9_$mh1J=!XF zMyn&S?hbf(UY?oF6~LeXYcWbmiaSo}V>R?zORwS~-FBTAT~e|J+Z=>ZHTv6gUb zII1;V7os#YkybOoIqt%xoCF-rWgK#ju$+V65mr2*94YsbR3q~x5N=R9kTjv5b#N3P?XKqFhHqD%0Fyh>Lde|Ag{ITa&(*w}W=uzlq^iXs&dOW%r zJ^VByy?B4w@+FHw`OUlv{8cYz$^+Xr4)cqmvBCZUd{H!Jz9{O;eyNm13BD*QBdBM8E zfB1~2%+6T;?I&(JcH&IuG5_RgwAQwP0 zZk)qFF70y1c6_6>@XU^{je_GeuFu~8ERB1yIZClU8y9Yk<|yMK2zODgB4kqDwwQZj zSFzdh@?k8;M`t_&Y_5m#6Bp-7B@5GTeKsDVH&;9q=B@Lz=Ey<4z79p>vvb>Z1}?d; zFpO!|(2elGH9xP`o0^jKM>&#BUu_Kg6y1wKo z7)Qn&n^^B`p~&%Q$Ml5;TmuI#!)gO-WXBJ;sA|{g%16n4K_%-AFS)O5jd2x|NoO4E z{<1+G5T2*euG*@~j!m>C{ktCN-In`T>l8sqe$7bUn`72S@ggO8xLas&C>zeQ)1jQzJAe zBzyb%(y2pK8ZwO5&B;S}AG*u;V}+4Nj7{{7fKn|vM!@l{oX7R1dq)nC(k;Vhsqe>B z%afyebg;fRlSvQuP4H0r17F<7U=G7qCi>b8aE~BoTrC5SIVO9(vJLYx3i+;Led=MV z5^f|Zs}(BnHODaSd9jSw1^7_^cj;|{4or*z)J1#l_aob-ycHjJyJz30-5t9R+? zF+GK#Ba{AE&!X1~u<@mKFIz^w@KPN7OxOcbv-PM@W=4dxnVDDs$ zwnKZE&$IS!D6qF~jmVSWoQv)9n!v~H-@~xC4;<}bD$m;cH16I0y$*XRr;{jiZcpIe zZOJd2JG6%dOV-|ZaqqVGE7#|X-t+n3Ef^N`n{BXPIuTlJTE{QMZ7cV=cr6^TFp z2|c#!T#h}w%Cb4nGT#P~HykCPqepb5hr9;|#*nL6)kq8<#)bCTR}VhUHFU8^zl(6} zIpq$zd9VD(jKdQ>SuZr}$!me-UfJWW0R3cv+z**+Wqnz49d4e^`en&SAwTRSDe6x` ze%B>`67o*;S6`Me?{ZhM@USO$S;BnF&0CgyIai3gQh5S@-Tpic+3nBsklp_L6=b(R zKZ5M`=O@&6`S*{ISKyC*e88e%P(;=<%sx2@mbtsNSLcyeuKNd>_e%>H^3s# zxa1Pt|GT4(`uNScaPg_HYMi=@9CpboasL&Ud>-zfa@0}(Lda~xslNsHYhCho+`sD- zLq808*d=#B-s;lt!Tmih`C8mx?~*x}Ou6J?-2cF3ZvygiSNX?rzsV&Z$9<4l#K@~fGa0y$bBcSFWM^`ZW? z1?2+;@+f3JE`F##Sx`PzAm33SKTse)W@H+qy=M#L?;F|Qtjm82nHT4{g{brCPQL`z#WG&uE*fd*r?!B}cArW%Yb z{7P9FYcSRtjJXD5uhH0RH1-;ey+&iN(b#J=_8N`7MyFTCUZb(sWb8FL9W?gv(|zSf zld;!i>@^vCO~zi6vDakmZKgf73F3_oKle#xfl(K#SZM*#OQu} zx5l4vIcm;X8!^K3u94oM9-Pmz=VpD3g;x#6XE8P`%ZXQs1cA= zdFb)|LA=B8_ff`#@d&U8dS3_nfG+@T;P(u^Z15F>uNvh0iF&UYeBI#B488}XeM}e1 z53XT~;baXFJm3HHZ!_ft<}1TD8@}7{2MrDxJi>Cs0sr?*_496G5Z`(OY3C6l?0?v@5c`F~}Lcfn7C0b&oP5I5HobL?Qzne1f^QQcyDSrsa`VSLP|4Ab9 z;ClvNChie=1xUYM1=6pd8U9Vfzh(Hh$-~}RAp8FwW!S?Rib6jT?Nl19CL-R;jl7A7 zxbxk?`prgeH8TI-G2^+9i2NNee1_PIJSF0}+-UgQjC`MwUj{PX?;5!d?<2NziNR(d z%cGS0@jMKF4RHYR2QvSM41a`(c5f!4-N#uD|DPnr@qQ$tzt0lU&liZyBOv4XGLZ3n zg*@W+DiQtr3Cr=kUSm1%b@F%)o3M;h{sN1xL41HdVARMlBkwcvfRQJSe8k8%18L`R z!#`>Gca8j>k*o2(XFD}Owi5t)_oKhW6gZ}Qxd_h!Y@Fo&ArVWl&k%8n_TmB{Y<-_t zDe^BwEcO1Ch|dx%%WNzyml5%~n1~JPM~GD-R})KdC{3(JT!=V@evPUR@Y;rxOa5IIh)g&pF#m=B1n zMP4G-iTs>+9`c;H1|Rrhuf^V)h)vo#M4S(-C9W6QLd5=lKXC)>6E76Gi&&3+2XQ0z zU&KwwA7X>ZcZiKR8z44e-HN{2oADfoTSP7-UL>-OcroHZyafFqZpHqIxJ_i5_z{eM z;-w;gM%<44BVLC88%@OLzlexq89t2T`9#EVBN1`DhKM*05)sEkM8xqKBI5W45pg_2 zL>#MNgK=C+L>#ve5yx&K;&>eqahxO~jwgtSxhVBBN1`jN<0ukfz zPly+boFZbJKTfU?Vyo| fh!}4-8u?}-#@k6FKSacMQ{%jOHdeA6`I^@K{buIw zUM)V-y1^t&1QJO+IM=id<13at!z=oby2~4$Fi2 zn%`wTGwG2AWn&n{s)9(d#)G$5;;CLOK~-+!e!aQhAPwcz*@8Z_$TN430>i)|;8tJ~ z*a{o~Mu2``8!!fJ2d04?zt z$M|l^pG;YZ{90%?J4g!aPjPVGt377BerkbZm;NIxcl)ISEK{&8Re z_$eTB;1(eLxfMu%ZUdq%WnR`*D$IR4NK4bE+5@VoDo;mS`sauJunKkOI%;at)n-$2}g_p$ETv%z)b zFt1d5C3sII{A)M<-D_g)&GFCSotTDTH>7OZn=9qaq%DW55BR+(=A3m97`%@@(0}?+ ziF*t8K-_<0l75_rx$S3X_1vTV3Em`&;a5XrJ2juTB7&vnPRm;8%gn@dts_f5_n1fE;TN8~G6+ zbNjD=%4gSv_y(p^RhVbEb@);(T>U zCKd-yaO^&hb~$#x1>{)#HjrcSJ3!7MF96xE?*co4F9O-G?*ZALmw=qlzi;>-0BPs% zfFr;k8vGHEar!ZkWBX+w`~MRl`~UYq_@eqh$2GQJm(zFu3O}!#G8<)8$U0o+eU!n> zJjz06PR+gN`xNiaNxVBJcUjqY>S?@#H_Ou}Hk$Wv6h0y5%ICR2zKbe=?DIT>$U&6@ z^MTBX1wg*z76KWQML@=Gu_<3-%9k1*^NEU86>toC=NMcDWK8g^?}iU5CbL{IkuM;( zI~(gc9`G|+_`3#nQ`k53VG@0qY;dg?-0KUUoH^k`9p=V#YYVsTyOq;cu{=AiosWvV zp`6P3WzDjd`{opRd<%WEtl3ssJ_cg76ct?p3S)4NRaCU8=mSO891(AcczhJXbBc;e zii(Ri&Jf9)=hDb8kuVesDl&?AYZ?=IG*M_wuf)k_8Y=j3_S5nhVd_T+9lKD)9ssYXc%n zj6S+c{iPXw5S!6;zcFvhtCaIaBIjfk9p`C$neo%8S7*AI=X7v+*1=1Q*}@9bLeX^% zzVIB)t#mktSmhAcHIzEsxrWPgRa^~@-ADV{(s_=OL#%NKm!S3-m<#^tg z7BeJLHy5hFhLUSLhx$T^Yu0wAMz2bw$6flJ zVVHHv-HNE$q1*%aQ0%BCmym>BY-c;jm?jq+a(lF?UF^6f7a1}bY3%^JO|$bg3zM;?h}hdTTS+z+ z4uRRJnb~Am?{Y1dQ4R*6aD^gfy?O{b281&;Ic>~eTxY$F=hEKT@XbZ$z#lA{W-g34dh(z0T$M-1K znnSiTyiM$3O(?g6E#WqVaYR$IoSKYHQgiGL+aBAih3JN`#p0)?VaWr|PK-sbRloZz{_H~-`E^xR;v5y)(cC@gqBZR8g8>+&g zYA+D`22EOXNru~lFn6QTW7iAA(aS*HWGMEuu(2z)Q|y~fMb%NbIa#nCOEK-{I`Jgf#PQjH;;-86ZAf7I29*`1bTmNI3|e-6ZAfBxJ;a&_XWc-OH}NjcZcB^JU-C7 z3fdScLqS`4m1>Sc`LwLb`_M)@=-_JRpbXw##rT z56B?}dkmN91M2n}PUQjng}VKQQ+YrRbrXhjcNWzL3_a7h%NW4IprK1$G>i-xIvX39 zxXO^lN|ynHfjx#)5!11O>WEP)-(CJ0 zD);kMV#cE3PP|6W(VWURnhCeZWAQ-T8AZ!xd<4~DCsHy4>&e1UTR_ij?In5~sj(jG zieWT_#O^SxddhrlU1kVp0*sYZ(+oNm*Cm;bwU%r|N&Yw3J2pjU(3-1H+f-fnGFtLm z8VN>&!4^bX8}jIJ8V$yGb|RprUDZ`620B5G8&VHKJ<8LDQ$w&b!ZAIesXWz*#&Ent z?7c=yCB*hdF#8Roo^Rt$Dt%Z}w(}4_T2fZ1`}#3mlId%*q#7mp9qcf>qWa42WM9kI zs>brqkXmFNx~_v@bxEcNM=E~F9&F|>`j<~b>;`PP^XGPD0jBP&Okgos*cJ}A z>9+2#bWg;=00RGjq0}_o-Vxsxh=h?;Ck(9~a3tK`+8hWYb59zY(=nZWu<}~AfYf?O zmt>s%O64sm$@lOVy-l6WqIu3AY7c~LF-N{5oy zNM1}!#WFL-7NSjCx?@do$%~Id^mOKJn~lvz>Bwk*Lh^R-o>s@xJ(9OmOJ$|$eUkS< zE%-}Q5H8oky3*bhe7QnP4Knj#w$K%b#=Fr>O!7W-21HrHwcc-2EByBj+?;*pL(s43dr90|alMRi@)9FDea4@8@~RW60&cpb8^ zDH@11ajt8Mwg)1t7Hbg?OSVU`g6s|j;(_jXM|WqmV@ov9W)!?xyHg6X#`CoCXh+nz znLnjlP1hunX?AK+JNCEKjfc^Jrfp4loJx-F=nl4p45RuHXzW0ox;o(!mZvh?*HEzZ zPSh@qCHm5%+!>|P0VF_Td|V2uIHveuOySUn6H;)Fjp*9TyoL<*;Gq>PqYZnRPv)@7 zNeJc4p0hKhU_4C~Z2@Uju$<18C7OqO#s{N`^h7GTt!H>5fqoRMD=dZIDtxNLU9s+t z)?B73ig*Y0=Un*`2*$%5?cH0u+B*5T@s{AT>|%PoQ%iT#ol#Jj~){gwD&7%u--HSNP=bhEdik{=&#G!~T5_vXL_=GNe%~kl*OyPHR;ZZAF z^Z8jgK~Z_48~)8IW&90GlTMmiZ>lssUbdhayZ)90clbe0EY@4PU=a#ZBYS&NOuB*b z4DVmi-WyHyji&muTy;h_#%y;?tXi-wks3#GO)oQvF7Fw~+u<|$xHyS5) z?@pw|`op)8j@HxoAh$>sJ7HN8oJi@$#VWF>VIMDF5*kgS(PB$GUcUqyx7;+;? z?VLkxR+M|_8g0+<)2R#THvbWJmbuGx0{EnQiXoLnnPV%Hy?65LLS0t!94j=sH_1~im33m><8Gy! zXMj_tbd>AV@-4%&%8Vd~Etci_I7jUEQB=09nN(lF*6iNZrtErM!lR&-s-#crYN1~X zG{mD7v3F}?l~PUf_ups(JdUASTpjG}%huB`ryJc??{o_fYT;aE@t%U!daEu~_${L4?9s6#lIv>kW?B&4q4b`wCZ^f}}Ra?a}Jk&RA;`-t~7H-Sbq# z3uow>T3TeJ)n>~h_7cOaQQFl=N0BqyDmPK9!=3Rqc({CunfemruimWSFu@SIv)fBn zn}X80s*>Qq}!@CN1@j)YLhdy0FhhEeUaqX`i+El5lXr)Kg^z^n?;+lI7 zJ|*yTf}AfU-g(8yo(U{hqFkAFF9B^?HGhD%%EN*SxC*f>CHNL{rC^$d$-LxhcNIx&*@z=SZ5 zvGW&Rv|;y#+Pc9Se7YAINF-6YFTH;((Vy5o4iXP(&q!hfcX)+yYQr54<^G7>K|a3S z+(u#lpGfWQ=}SN#Tvk7)0H1Kw+QGBTI(4YE)z{#guv->*{z)G9+<)ys&%%TFcz(!z z`7UlfbmXnK4_|la$f0&m;npLb*^hft2Yq|rK782`PwnHL81CH_4xz@;DFhhkp1#3% zjqhULg!ymZ6Hl~84nqKS$~WODef*T~lBbl)&prDd_mucv^_{dgR!p(vYdH1hADf`smW)#o4_Gc>Y;KsMHs_!wQuw!F^`&jQcoV=%LbA?3O$1J6Y^5 z`-!U8;1o@%#~0lnv+4gI%D9+v*LxANUKU<3A4?1Dsv0xn*X;ea=8(e0Z+6YgRj#|v zbZc0yTHQL+El*3awwt;pJ&RzB#Pku2%z}F(o#Tm#{?Yi*2zE!yNQB4Vv0g@p=SJPQc}y z0`llfovn4_CUdaH<0|JojEk7;$<-=I(;Zv!%*w@^b04m6at>FX12xUb3Ku`qopKC= zciDZ%5eJ_E_HgDIAg<yAOpz>u`nLQ>yeuA{Uhlf z{88R`I;C;Yxl1L6Yto5*X{o^xT94H9;)t*Y$HGI&-J?=7(x2#^7^vy#9m0V~jS{+h zdV5oeYp67A7_FO?hw&E}?(*GOMNA>aCVG>gR7;K#aC~V_;d)X%$pKQjW%w*LeWN2I zJi)3#2WxuL>C{l~1Wz~qglj2u`Ch=^L8+@AzunpIjERNdF)d^+|HU{3#pJ~I0P9na zgJ!vr)yj>WyOJpbsO=E--%XG2B=|PQI=pDl{qAAAlrO>${c!C0|46%Apo4c?#vb+l zQcuAs(Kd)X@#EHe26GzUJkG_ocy-~&-P8-0itK|E^ojj*;xdGLx4qw0BUX;HD0A#3 zaPPL)64Z8Rj~i^q-hSM>?fF;XZ|T7~7xj2e;KyyR6ZUq2qdiQz8GAS2-fi!Pu=fLS z&gJ-b1cck(Ntb_^Y%})mz`fhv1Lukyc8s9Rx&2&@y+>X4%3Ssy%&}K@o`@fub2;`N z0O9uUH0;q1`-_)*#=o!Q-tAu$_CD?yL78*=yt!Woi;1&4c^JTx-R}X%itMVeKIS(JC zW6vpf(9L`0-_JTc(UVilGo=NVd*yO>1?czY$h#psF{2kFkYC8?Si(taSH=lTn9uc@ z4qJkMryx(b z+q+!y!;lv_lO)PdL2hx$Uxyrb$$t&G-z9$wa@r-o1UbZ4lDaH;8F<(w{}l2rP9W;C zqj&FUH z%LgF4{cD8m_AdUB9<5zOzqa^n<#sE(0})ZFPm-=^($lo{pWPWpIP$jvwxN& z--dX8*iZsmON6X>#jQD&~y@1dF;`Jx;- zk|X!z$m2QktvT`+bL7V$bN<2WSo!lK$ee%tM*cly&OfV+EbsLc&~-kTbNE#gX>Poz zP9p0pQMc;>jg8nNL>ima??%NmX}(_Z>UZM?rFnt+eWCijQI)FSjTfnV{ackbDa|Hb zt9G3#R)F?t5Wq436#=Z}-l(t&H#kImw$nFSf%_EF%}wZv0=gTBH5*ddZ_@UgwEZS! zA1X$(R##wkkgNcpLjXDiphE!m55TSgR2PWGK&`P*>)17>YK<-Yg|V(@tkoKGwZ>i@ zU533n$01{{&e*Fn_UeqiI%BWS*sC-4>Wsbh#@>2kkJ~@m$6wxSq&>B-qoNKcw}I=j z=LA!>;?r$}vzujenB^vTB<1{N|CU7VA9Kh%cG|H-vL9cp6RBj+a2F0))gKpR55lsh zgM*2_J?gt^mQ%`#YfANuC&W3oa((a5DrY~BPje(Oo!XSI=&BX`V+5Y8t7e_H+@HX+ zR&c^L&1YwK`EYF$!o*h0?Y@dfi`fT!H*g| zVDPZPqXus>_<5ig_3k0|U@ig{^kU72cbvCRBm!i6To-x!MRpL`E_vvsP5C~lo@CGxBGQe3y|=8u^UD=ZOiC*MMyAb;G|&ggtIDXs_JhBI0h5dx`Lq?+w=bnknCi zd6j$!NS^aL>vPZR9e{ttL9Cq(K5FmETycd`^1b=|} zz$c7++Q`oXY3EfU?7T_53O{(&vtBun^&&>@H1eR4hmD*z@;)OUHu6y;9|L;#z#f(i zj6(wv?d||F9#Kej3QUgc*Ej7rB{; z!y4{$Y`@5D#45Bu69}I|#B;_m*JgAgso%5LXpoBt3|#{#4_f7Vv)!rhJTJ& zjK5$YmSDeY_@5E60r+R)Jdx8_G}yR5L&TTqI&5rh++RS%@}-@KpC}Q_os&c?0KZ1W z;CqY+KfXo8=KQ&JS0GlfX)nSV32`O6x3E%JFH_WF+#*T4?(e34%hYw&G^xE5z4@X=m}b0A`^$R~((BDWCN zi#$ZEhaKVu>mQ!KO$Z%(nq`mYiJ_Q zkRBp7hsenKK?+iHOJ5M8xA-BI0o;5%KsEaRdA&ULf)c z@j{W`5)ltCo;Bk!n}~SKCn6sB2h}PbbwtFYfrxlqO+-A75fP6&h=|7*iHOHZBI5BB z5%GAIhrpW%kDsZ&xSA43Dbo=o6@pVf|aga9>pnzfx-R#k0RV zA3~eqD|VQ;o$9b*+1}r6hq^kO$50O4=a&IckqL+*_QHG zKRS0RQ>rhHth$fTP;$ng2QkENTb-&ufbp&=#nGuxi%y^3%GMtntE;MF^}AB6zIE0E ze=arS!x)K#A9xbj`qG$ryX=Z_*8QlH0hN=T0d}mM2hJEfZP5NoF?_@L;ONuNDwmy= zJ2H-7Y9P08)=%LQQP2fHI{gUhI+)0^^t=nGX3ihh=!D*)& zckI!y)1T@xd9I6C1J7a&JiEuWHolCtaU<5o4rd+xG<@F~>c{+l8o#r3Zw#=yst>)h z&^sG&)pxJKeypnvSXWnCgYOXeg)&t2kJVyr^|#i0{2Tl&)*7q12Epr+`uaZwgt)a@ z_4WJe|D@h(74bHT$4@5KT3_E--%!72m56VhOQWVyVo>VX-iujB?q|F0bG{0bs}}TFI6GG%*Zh+*EG<7nd?B}sNC{e2Zx3O;Xr@S z?w-CtA{7sY0>{I<`U2tkxrLe8Tp@64Z_ln>VrAx+3gfvQq51jZ?EL6Nu8=8?7ITTw z@#&d-u4h~#`*tKoXYxBzGvkrmtvgbM`FH1vi!S|HVwdR@DHY z=QrL#&uM&NchIW#s?TpYn>Wt0_RV7e2dJF7ELbKDmyku zNnr`G@6nj|A_ohJeXr4DN9z*F2&#U-K^w9-Y(S=%?h!OUVnC*t z2K&T*$bcJ4;4ZO0YQS>mVe?@FG8a|#5Nv+TfTfT?@ezZqqawouy^kAA#fc$--X{&l zBvE04-lq&!iWBrcZ7^nuiXHSGH5h}(0e!r7h>=20{JECsq*&#(@2Z`Gq-LC{!9lNK zNTq&cB$c3VPG)>o8GxljbzjAzUYE=qW9G%`bn2;)XOfvP!D|huLOwj0R^VX+s*r~V z#f}?5g*y{Zv1Y#Y4b$zvn9bLn?jTl2J4~SvhZZeq417b+QQG=EGfV$%bQ+dFCq3(piR2~pR-JHSP zokjI21FtsjG6t|PZQv#s3?nlJF2@EY-fh4JrOSZ9z|96!5!11O>YPDqsj5-v<_*dv z*Pv)?-k|P4!o-4sy~Z=f7dCD&u*U_%NWs8P+>3Q_#vR$eq$Q>7KUkN8q~=ae0p@iL z2Z-5^@VQp?+mr!};FeYAXz3{5U4d09_iI#QX40_~ULzN4OywKR#D=n&Y%uH0qDxlY zf$FdmZ>-0*uP%}Z>XmJ%QO_ea*E7Qz%!Y{ANrS3U=4Yi=<8NssoDPQ%A=28AN6*uAIC~<6fSPtySD_e80bDeo zo`iaq7Y(MSU@Fczy`&+Z>O?4(O^SV+(NYOMPo$l*< zwWQS7eB)L~YEtYlyQ2Ea?v!84?^Bi0*?ZbQPAlo-I_@86*Kt=J%Np>522>r>dLJ^7 z>Q`uZFg%1c<9-eL{m4EJ>e=?M&~`L?NLPB$Rf+PCw1409;2|w3^4hIqVrwpW);h|*qXfPf_Qax>8HNf%M z(BZ*g44L}{19Lg1v(I*%Vhc#Ezt)nHvwzj`5F|BT{zEU6pGd8fiP%uY$@DL&>ev&` z&gZ8B6&pj_>r)^%i6|>#)tH^*`1EK&Y|CG&p#j^sI6Yq|s*R;>*J`GuqfGd<)v{^7 zZhHj>tQuvt!D{rzadfC1#xxa=+F{m?ER0S}6tI=^u6+uf^ECU0o`FtNAvYzy6pIK@ z)A(#bd`C3rZCcC~#h2EcziB3atN1dSYmn7hwvdh<9LYqp;>#|8^`v}9TXEWGnwy`< ziSIbew7OUv72gTXH8&Mcitjqj1eyw9-ldtHO=AW4a=qpTWc8QX!f-I19YHf0@!jwp z0L?kqhCiXU{EOnPss9YxYRM!c_#eWiTGh98xX~XGW5TtC46rolN6KYK?!uUw=0$ zG-Yz*#d)583dJBsIk&hdezlk|`bIeOo}BobJP4tEiPwOUQH+d#HEr0J_@$L|?O`x& zOp)`erFOAM6>R~z<8PsV?jgXbsyIJBKO3H#fdBqL|7v&}3?Cj!9*ajK2cwJvkWez2 zjVFVVXc_?xMouW$YQai26b&=TM~0)BtU_(KvKbw>+|zO>ikt{VgIeF~;@x__77TwW z;uTHQv}EueGDBM-scoUau!UBx09|T^AMK zTPWZi8O@9&Vi_#z2Zy2&sku;bc!=pWG!jlG5<%=IYA;kVq7m*lVnYX!xD{Qezp;2c zdN3Ft2}UA_YzCuwp~{eYw>WD=m`A@=7pj>gjUG=Sm*H~#g(@nbX1w`cf>y(YS}L}c zT8$TK#f(>u<4qNb5FEcbKY!b7Zel7oheZm>FnEf|P)dX$%uY8?){?cBds&U;XNqEN z;Z1;gtbBWgT&zo7vh{0l!CNwNA^&wj8O z--67u{%EeSI5VFY>&^(*sRw&RT3Nabnj5$#ZIX@FwM%mg+4^7|U!1J`aVTw? zTqqUmK+wNAnZTVp>8QWQ)ER!TIeg zsBBrQsUBbl?6K`e_I)kkol2*YjB8!ZOlXFNct;`jqy{clszv_Wh8sSZ=Dh~hvg(H9 zWVs$+akyM?TYb#UJgXV(c;MC(wcGWXS8mp3c`)uuC73^Af38;R0>DfW`|liHpA^I% ztaBSXS-0H?p3}y7&gjaV$Q+L14EdPR-KrYiuu9j|+(yH7nX`k~n+QBxo4V9$+6t@AEr5HL}#u>)Etp$JeQk82`?=!W+?gI((W|JZ<6OK9G!E8$~HH4n1l=rlfA!fT|Z*QC4lU09_R^xdkS;vkaA{ zMJA#4jgMD>YWG&&v~inOxhIRm(p*NL<>f{)sm0vV#C&#UF30vn9!1y7t#V&g^?iyv zB?Y;@`f!_5b=}X+O4S`GcN*3AncOo}T`O`=0I1^jjj!eEt1P~SfmK}_@vcN&#@vKL z=_ZEv8_op^U)JTTj?2KUbkD&{4i|2&A$SL|!fgWI;8o}MbAVj+Q|`k%Pwp$oc%bBI z(j}@sVsL~u;-^OlQ8&*y zsgRrPDdtWVrDuW{NIhe?Z|cEC;!J*WUV7#xa$`$VJ)>hYyZWF(W@L11tdP5vO0x#h zx@CSAAMM@pNxVEOfQ6;8JRsGQV+0uA6&2WMVKhHQNVg21rDuG8P927O(7~S3VzDqY zwp4`9AOCEDD%al{Q>7o&o!?H@Zvc*Eq4c~0#Z#CVTyI&QdRSf5cAmW2o`AmWnk!(H zF6rg?QU4F=@z2}f+X9GsXpe0=58EZb7e9BqZ@fjj2cd^|NXZ`c4(SOFN!h;>ReA$( zmTv~+l->4z4tuu(a~`L^%K+T=;x7N1AaneC6lJ%) z8@oh4;~0U=De}UjZrY}a`ldwAoNa-Op9LGP!I z5~!m`>Pip!?iC_8Ay?M}KZGCSO#AGsGlx)=?mm&Px+*&MD04q<+$+C4@0NK=UT745 zXY3Y(^UC!V2>xogik|}CUBWEMqx=IGUqqRIdZQmp-h%@F_SNA}q42zmXWm87fBjf; zKMHrb_=g;kqP6lw1#ihY@a1*Qk}p-rSIM`)yZ!xJ@b31$2j1P@kHNd`{VRCf>Y1la zeumO-9ah@pzfk@g7ymlS-KGAw3I3)Oca@Gp8$PLFoLzh!%FJ#3v`I5~u6Yi>4t&yK z(cWh8{5kTiDA&9AD^dP;M-2Vl;E%ZE2T)cUbEVTJQSkjPc>?80SN&n|nBwMXlN-R_ z?Xa+)1OMMHeh&PPT>KJv=74_MR8*Ua?xm?@+wiB$Ac^mW!Lw6e5Z|ELF_ZvE3DEIShHw(&k zuP23_1yZ~uPa6JSBY%K2CF<&w^5=}4|6dO4{lMt`v(bCS;BD9zQNGd8eo)^L{6AQr zHJ~ZtX#Y5A8tohY4p91ciahGyXZS~q{BeVyGx&1`f8O9P8T`ivf7#%#8oCjSEbR^$ znj)nipuP;^0a^okhr#b6r5{HAfRR69_)i)BbA~@>_%DKbvm!5%!u}6PVdoXYziRm3 z8{UiclKIh03O%mvq&3JVyGi8FNLPz|m=v#^he=yN@w1`(2~xazo+ZUA?#rb3TK6)k zAMKK2L;NNw4oenvZQMoeCB-Z504ZKov!sm}4^q6UzDbJjQvXD{PUL5#I52o&+g^`z z7wJVJ`$_TA=l^nH<6`J2=_ZlSlHxG&kEA$I|AaIEKS(=a2W{FHV}C??3H~o9(k_u3 zNw>lu(o3=bA;o#%{iNO4kC0v_@)+rMkTMt3DCmL6Pb6$=&XQkgr?)T;FQl5&w>JeUGlPA(q^&vF-o%10Ogq zgyfxFA$bqHBG-z%r-ohg$JyZQ40W{nLf3>gI2)bzfQY+8T3c@igz-C^*46{9pKNtH zMEqg#g{Y)DT3f@dZLPPqh%{~XSOmh7f?=?;ZYUBm6iuXPHWW=>iWWnmELu%pSctSW zM&wxGeTsfvOg`17J=xVprw^fR{oeYRpK3eUCejXI9ld@0P$<=*u?-fpz(xx^erTP= zItbujF%?U?l~>oKj2YU_ryaul`;COCm zMBIV~uQgyIeRLG)agA=#C@AwoX>rFj+C?;Hk-yQuN@W6|RB*54tI5`Qo6Qd*3rP}gjP24GV1i^dU0pzrjCodpaJD};z%lkXM+D1f49FDIV86H* z4R}o*91!;_25bZm&PxVlE~@T>;C$AA^(leja|YW?LrxRyo;R49Cr%0Me#c-;5;aY* zd(mL^d4krAP2g1-F_@a{F^!EHOwBcx0*z)3swR5`&S25ekWZyrLP2>0sl3Xj z)0wd}-qA6GhB=AZ!6e_l;~H~Yi7~ib5=nSMqfRqX1gA{zFx{I}_jGzxp?4b81^Giqe!+2{fqfnrBvk|3d9O9!&Ur`nujrO~_8)E@M@wLduK@Epzz4+a z$Mktt_4^e8p5XN@FO%sw_pWG*%Kd;!%zQ4D#WwOWjj4PiO=_f&FT@M>ExMtljPBq` zhcA;SnThL_Z6vJUBlWK5$MSd^lH!gUR6S*GTgMDw7r=aYGmcmcte{)!fgKIsjF!On zFiLTsEM73H4iE zGnje>vuVE5D;jE2K@6q}qvGCgtW-jb4+1%B5cPZqCusD5hFtp)9}N4Nb*vBRmU^t^ z@Mg3G1{p9zQL!?d#guI%Mc-AikBCARURO^=lkyG~=P|b@1 zu@T&BK(&S`a4$A(1FA(#f&1_d7*Nfi0Nfw$ldFd(Opsd8WB*Cy_&ZmGw8 zDzYBO)<6$~XH<+^vDkF0sjlF-5cwNeHmBnS2K^;7f?BkRA?BwIreY?BkiTp&6*4hI z{EWd=#KaKrMT4n;i6P#v7)-@W4B=ifmtNhYCk@r>8xg_^_Voe2wjJ|DtZGyZ>0{5783X$UpQiKqAHfF7Fa?Nil%x z^{!90fhvpp}tQ&6`SU^HkgXbJp1{iGMlPplqiGO3ZIo$&9f?l|@@RLXPFRcC+K-=sj^ z15j7O37E^l%=}bUTqjiTp#isPdA?Gusk?*g2DMVRQ4}G~+Mo{Uv44XDPC&5+$FKs6 zufUn}wfjfPVO$BT#W|d>S;a)O%`8;Ke@tusw&h|CHxaFc+DhfqxIt*GO~TvJC72sJ zJeeOVh`+E0sxRw5{L zx3z-XD%^TC*saf&@@JZs2hd116Hg{{;=UHtwg8eTr1)Q1UGK=^4mW$r&NO$MhK=i0 z_}tGU`HB3|A)M7-F}9o3z}K|so?5%sXc4nVi@VJroyvL#*BF`Ctlae@scazw4|lGj z*&8fIHmUjyi1$HU#G;cd;tZCN{T!We38!f1N%NATE1eyY20chg3nTh-;!RoXeD zMUvS1PK?6QCoGaUGK9TQ+<$5JPTfkRTkRH-M!FzzxS43DUy5{dWtF0C;JT~F|NTuS zSS(t&rD3n@^iJucM$<7otHkeV4laJ0<3N}0qK&@S#X#THMqG3@{}bx`b;%b0k1-AF zSEj199ADYV_m$b!zk^tt_JICx#$QdcfAo3&QKk4tp4}fwV(W+dVRQQbKb?P5CSPR| ze^CBH(`+7G7 z&GQ@QT(J!MncCT<;%xEMGC-dQmj=}M#X_23g#CEC^GCnQ%5FOA$V*4*8=Aplx+#o_9``uNXfd({z{Yw+6hCYM}bYtD8& z=%|wu&m;E0!^OC9G~rC(KLTbZ)Ds{ioKag=(Td&&d34gp5}qTa@s&xir(l=rqe0{L zP1GKb4MQTGBZ~cpH8TtB<(Uxau8%Ez3hIEOhoxn=VYOXIhJ^>V`dN)rM;(^2o%O4;8tAur%qJe_9UWxPh^rJhZBhd(VH^%t&SFo zGxO!jLS^pk?hpLdAII@Q=E^JLAg#pjli2dv#oE*~WUZ>@yscG>3$a@9Oig05Q#iWD zrk9r`hJ$jce5xX`#o6NY%3N$}x-`%a3o4US)6>=BX&NmUMB6s>g;KfbZ9j!&Y89}w zGF=9wMzSQp_>Ql_rm9orIYN45_$;xR%Hm=X*NYeej7`;Q)zb7z4K^RXTn|&cyn_E% zslxxMd9&B%H2&o#yj|P!%N-)0hQf7({b`4HRCXF2>yj$`FM+qvmgQ#rX#YWWy|96A zOAxA%&%1VUT)+dJ_})YSQDC-MzBd7Q{d>_9FYj`e?}w;+{d*UDgO&tsw))qm-V4dnzE$Kl zT~&W+$KQ|fd;iLniURQ`13UU}i{;~K+~z3TPQvb|)(FztQR@9wHx}@s{u~{*Ks|^b z;~+m{_3|Ze5P8Frpv_Z-)+k=wFaLF=(Lz3ND|PP()crEz?Erhe2aVzg-=9VaN~xis z=E!~c+gN8Dd0a@`%BCn!y*{W#&ChGt0(V0&- z*29d*A3$er>k^S4pn|D1B_e-;+J38o?_Jb?;nDg0f8x>q5%o7bI-hZmXT1M}&fL-^ zBJZQJ(bG=fv!)fdZfQar-!EMv5{6z+HneYo&KPX_b^f!EgPa<#Xr9`9`=mL4A5-!JK2M`CI3$)^`O zPfV0WThRtQ_z)f*LeE$_o*y=XAhbR$2DI3##Xc=Qp~Wp)+^WTXE&6PKL(pev`wUZ` zq3SbS_-DHw&#?6wx<13#Z}|ERU%&O%@bw$Me#6&q`1%cBzv1gQd;{cDr#x2lT<}oX zyXF>UK0EOf6AJg@rrY$I9)RRpN6Fg-@u<;nGVh$Sah)MBbvrWWGbW zTjWnEyYY=5u`uo^CF0&giCB(OV$5Tduzi>kzo#e>_j8np`#nm;9R$X>H&G()eUym% zASL1+r$pSRDG~R1O2qvFCE|XK5^=vpiMaoe5^?_}CF1@GCE^ZZOvZgJCF1U-MBJm4 xi2EcZ;+~~M+!ad1{SYPMK1YeTOISZ#Bnej{7l(7^AM-)w4U%oG#1yDJ`d{79p1}YB literal 10156 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 ByDb0! diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ff.o.d b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ff.o.d deleted file mode 100644 index 818ae8c..0000000 --- a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ff.o.d +++ /dev/null @@ -1,6 +0,0 @@ -build/ChaletDuino_795/production/Source/FatFS/ff.o: \ -Source/FatFS/ff.c \ - Source/FatFS/ff.h \ -Source/FatFS/integer.h \ -Source/FatFS/ffconf.h \ - Source/FatFS/diskio.h diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o deleted file mode 100644 index 18ff351926dbb5617f132bc159ab310706e72580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1848 zcmb7E&rcIk5T3W&(jtNdVxl4FVl-l6wn*VZA_){BCSYoigd5r2KHAlGx9)CYK&1GY+ zvAeNp9M)^gM&0lB+>Q*4lP6}aMq=OZ2ac?6ThaD@_4qg(gpur;4sESf_bk_|He6>* zo>Uuw|5`?2b<_8wj&C((aMXB?dKUubVccJRv_jGKBGL+_z8AVJPd1Ghi}DaVZ7U#6 zD~4@9h?1;UO2Ckl)F^g*uaz(grPx1DC?~;7GGZ+5LbtIljb`x`;_uWXzVXH2*zh+M zCwb)y>V9_W^)+L0&vgRdX}dk+m2}#k-|<_6M^_&0247>#>ys$KDd=Q|gKlKmuu+iM zw(=tRE+VsOMHZQM7?K&tmg^n+WOkdZFl`n`Aq#C-b>p z-;M@7iK0m!J;`+ZZdc-BOf1l}q9}0fegw{c$Q-zQPME=1lKD*mOd)j_V40_#8>eigM*&Ev>b80TMEE(U&gD@eBWK*yr{l)1n=bPG4F1UsCWk>yf?tZL4mJ$ zFX4|vl~i#320#TGPXa9O(}L#vo}$1!VoFrKw+Q5U-;tP6Bv{4k!q4|zLNo5eeXl|J zTo`|Z=Ii}b1rTRZ@HF+8;wTaGo~Aw<=COW-{ysbNVPg4%Aoo_)sKjAjtoJ6UzJG`n=bCyz}cCJ?dALM0LX9V!Z diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o.d b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o.d deleted file mode 100644 index 3a78357..0000000 --- a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffsystem.o.d +++ /dev/null @@ -1,5 +0,0 @@ -build/ChaletDuino_795/production/Source/FatFS/ffsystem.o: \ - Source/FatFS/ffsystem.c \ -Source/FatFS/ff.h \ -Source/FatFS/integer.h \ - Source/FatFS/ffconf.h diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o deleted file mode 100644 index 86a59c3af39e4529047c4c4ac49f2c3fcf4e0da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1848 zcma)6Pfrt35TCc((jtNdVxl49N;G0(wn*VZA_){BCdJes2{*F4eYC6XZryH)oYa#C zHJycIG$pW9I#tzPC?m+d>G^BB)41MD)WzrgYj} zNeGKHL)SF*oE6jJUU7E9EY20D#f&J85gB)BVqzU3kmpgCs}beI&a-{1YOUC-_Oi8G zuWf8v2i3~5RSi2`zbzx{_>oDIVqN zqrQ(k5AkKZhv1-RH!Vk8?}i4j+?VkxG~2fZoE6=-ir{>v9`kNzh?=)Q!g~cgm=pM# z_ZR7(lBZvm8`$soY;J{@Sb?`IUag_ssy?==Eh-ghKsGznJoI`Ff7m(Yy+aNjFX zJ{QLCq1k#rbpga#H2jqMOG%W7d5=?{4f9yPLVus0hA@fzL6CcDVGheQRNpP*alBOD z*hxk6*s4cNCEn$U>Im}xUx)HOxIXVSTkjW!VjVFpx}L@tS#z*kl{L?F=K7? zS|WK;vUp(#;Ej_$KNaQ)7|Lk%i~0}QydM3lQc;s|I2kbqzeb%O?U$VpuE&!x6qBwF z0X&l?M=;(0mVo*7Vk@;Xe26%#5I<3T7W`fq*v1F8SpG-02!3IUOZbL B(Hj5& diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o.d b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o.d deleted file mode 100644 index c641ffe..0000000 --- a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/ffunicode.o.d +++ /dev/null @@ -1,5 +0,0 @@ -build/ChaletDuino_795/production/Source/FatFS/ffunicode.o: \ - Source/FatFS/ffunicode.c \ -Source/FatFS/ff.h \ -Source/FatFS/integer.h \ - Source/FatFS/ffconf.h diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o deleted file mode 100644 index d8f088faaf1591cfe7cd2f776b526837ebdb5415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24260 zcmdsf4Rn>&neO|2=Oj6S1W!l^L8G2%fQS&10E!ef$vMG95{O9@6KTV$RdH1{D{qA@F?{mT(HT6pz#}V&wBqT{Dl2<9>gij65Hwq70t#YqBKLo_jXl2-ypu9MGp0vver&7WNB9p_cz!}n! z7L-c-Haeq@R2NehKckLQJv$(kc}x?>P00QFr%omH>1$CzC6pQOC}MkLlrq>XJ0&sH z!;6DIcH`srN#aoMpximt|KG&I--n9AThQ~5JjSN5@vYwJBCa2tvh5R+7xyINp44IN zp<~+D%V*l@G=0!tUPz9j5B#0!QzF&7{O!tq#(u&+XWTLEU5#<|(Xy!fN%FHFe(39C z|D^Rj-55HZ|E%*V2^8D@_;GQGmRWzJ`^MMtliNtG$E#v=S*fv!pr00_pLW8I zoIOT%9vc^<7x#SViyzC~tG>YQDC~}YsPXpK!T(PG&lKO&`C1g-C&g$xUmT2IEc@qL zHq!SLMJmN>>teL?A5qR!ZD;x>Zd&orKE^k{pSHgo*>j;p%hFQn?3MfH)P?gA;~qg> z@Utx}RYA5P-uK*rd4TfE(O-*7L|)c*&4CO*doXX!M*Ew3lUKU7{UfMn7JQqa_4N9~ znq;3bdD!QZd5~YK=bJfgT+EJ)y7{i0R-ShT`Q+2fQ*AI#j3?{rt&e|k%9FjgCxrBX zv>RXVRyoI`zfHZmV(e<2l4E;<+V{7g#%^1N#@UQ-%!^*Tp3rg6c%G?0`sYV)J;6M; z$3GUEwJk7~IDeGUR_b2m70ge?n4cn;p9z|(9 zQq>E?);=veEH5D*$u^=ce3)4jZp8j6x{v;FP4wC$h(7*%^(i0yn&sc1cBg_r3BFP} z#|>gJnxS#|Cd!e@w8frZUfrm3t?DdF8Cx+OPxSd8J_VoiP#=t|GOurNT)wJygLt2e zwsy5`>90TD9N%7DT-E(1#sT~AZ`B6lK^sKMy%>bFex@H|Jp1jwr}6a1D$H16F7#sM zYJTr8=Oa6}dD}a?>k;wG4G`~%baN+khZ(*K;cC`gHCg)g2TN?P&Pv@K@)+TwqyuPi4WK6vxzgRsRtir22wQf!~+ zv;Be3_Mg*M|Copq=G2JDAANSbwU2#`ZTzRU-5A!7#aKTUV*Qx!tsezjgnOe}`Qd>| zdGWCr#!4;v0LBY=a!uhlS(`R~O*viLc{+9+9611cd(M&Q?AgvuX0N=Zz{Ql~F0Kq$ z7Z+jt68X?~>b*_y+BNfcW~w>VeF^d*pU4dQw$8279L z`AqPu(MJS(9Ll&RaV#>Hh4SL)mUDSM5#2u!v@x6x{d1sC`?K(V#FT}3&diC?GL{oC z>D6VtTQGY9lU7}ZdA=Cygjw^gkM{geAGUDp7PQL@&A&x`^!t;Cb@07Y9q{kyXt1Eu z_~nlm`#Z;6iH?Q)QsVbR?ce@&`E;>-LGza(e)M;j*4>|v>mBDRrt{rfa~Zc;@Y9_Z zK;1jaxZa%3*VMNCy83oHe;!qTSU>KECM);Kx*FwFMgnpv$~~gx78PtmTXq)Dfo!YF zP9b)lFF)5hc{Vn~#>wcDww_5afwq?;4uJ6gc8^-!ulqfZ|8X40T#DG!Pxyj6-Q<1l2jaZLSf@Tt zjx#-!J24PCFO=g)KVogvly33 z7%xcXw<3BnEt$!M&bjA1<+)51IWJAhb15sFh#*sP{(O~OkhD~1v@0jj)`dxLm@fi4 z$;O+sXojiVMM=lJydoE?!8BGa>0Gf|Krm@xy4qJdLtR%ov(&jd%LFLJN{K%qY5bC8 z&9BZ{j7zau5Ey^&t_;=XTG^$Z%oEJ^1b0_X@?>+=5*)F)N>wS%r!+SyOIR=SWM0N{ zOi3bJ3eky8M-MvJEL#zYM&_3;D6NPzG}c#DM^;7WRYal#eS!;%}d3-*@%L9EWfJ0 zslitK79(|XDQ&E~UfflzToJ}b)caxymkR>s<}>_Ke$jPth|dBXX1QOMJA zc`E5v(=*liD zbIzqKy0lT;-6~-lWi~fc=_@K?M4*IP?NP~8qtt+G_p2nIl7{86n)1uU{RIx^bnrkEm*p(gs`IeJTs6X5(^nxJOm!CbF~Ze@&&1 zN*S%kRA%}h8t3c59Ngk&qH})3rq~9a5Olv3oQ{fHJYQwYjmb!q-2aFqvWH zK(H{4P25=5RE=sM)IvBsDQuze+bXopP9cKvT@{*EH`yWl8x@*nr*JuX@Ap(_TfV6Q zLHk=3nU-fUE1JZ8R)x0l8|$i9G_Mx-IhC4bZCQoJsi|)e_plYGO{Aku3GwqPW{lZ` z$AXu!dI-`FY)T?XPY16>O8S+I6hq(zskx=9#Ty4Nn%pq6BVz(K3z;jc>RM3CyE1&k zfHL@Vx0MA=%_*xE_a4&{=aLdSIHx@A$A`;zLJep}ac9Yi}-#37$) zV{@NoG$S5vj%Liy@Z7`!YL_OP#x%Z{V;ri`G^TMLnqN^N=UP+C259b4p=n{GiBWdH z3eQVu&ck?AVY2eD`G5*dvzv&(=7TCsganEYsm!#y8RFvpHQs@_t+LT1U*q*TtDe2g=OFA1pogroCXl$Tw zUe|cc7=WeP%;&Iq%v|2Ql7qA^)6T(m{48&dQh2QjO~_X)X)?m4Dl{RFVwBaZzz(ST zM&@i#nTd9D{qiW*jAbe_!Cqly%T;D#jWy9q8&zt8y$sG^^|hja>1t6UYF3fySB>@c z4J+y~LRY9Xo9*0K9pf@|y_LCU%rzr(Qw#%im6bY~)I{Zs>Sr~(nH6Dlxsl$WQciYk zg&Q*~uvN>XYiPGtHDvk$WoWmXRA%}CW$1!!DofM>c{@~Q`T^^OyqzjD{eUv$?NXV) zvdF$p#b&nG7{Efeip_+tVi@UBaWXbAakC1u5&?sOTU2NwW@7`@K9y!9BL>}mm2&T) zaYR`ID)k2vCI(e())$R0Y}~41v&5(vMut@E#XX)`&$y%akJyw%@4qIq3n}Se;1FQH zPGtzJ!~+pNg-8gX-W4h|x$ z>*sAsqOSef(~*+i$O^M6rmn0`a({Y<$&AX*obm##)K|4!gN|~^6dQI^S;{cE&r+G0 zmng#qY_`fwRVlk%+&L;URi$j9xTPvHLz=QH#GR`$4rw-h`IJ|+9u+nvQI8o@{txSM zC4bRN)`Ld8Ie5Ow2@`kce-39}vkl;u;of{(3)4E>GEn$M6&jbV=u0Xx9%Ex+_H*}H zVJM{Tjpl!Wwrg6jFQlE_zD#s~PyRzpM>E`SQxfjqmH%y|q`Uk@|I%rQb$~7ZAb7x7 zfT{fjmrjDIhPt{2Th>zrwjy>liB_TaJgp+LmMmM|a(z{O9Y)3h72AfZTefsbRUL-k zK^3#@=IigC%9*_96JP#Le&jaQG`B8asxLK7P0O3aF~XHijZIk1%{zJv7wmu`ja5z1!^hznF=XbF zpLYHqQ9>Sej*;HBcvp4PHR9AeEGqB-%9%3Q-rCW73uNq8Y>v;SU==9^qkMoqRF12L%HmUo}t5@p$j&&!HuD=w$4rByyV;u zgWluxcO&<-PI3N+bvi6lJG+Lvdb>K{%CCH-T;vJgNilG-@eLJkYwsQCK$mfy6pi1a z2wV}PrUA!#7@6K49}*|%SQm?D#0PHaLKn&~F?Dx`$pVdgJ)f(I_TB}8l4Pa!t znz=~L6wesy8Xgp9deZE0SAS<~M;|JDm1CsINbG~b=_cuF)sIYXV^6PiIGMP+i)X;a zsAr3|lQc(WI-Nbkx3ppsh>sv4?l`|iYj}^-|1!-F;s#Ef5w#KWGWGQL#CzI$dv5Cz zXIpBBhD@{EBFMEY)Ly6GBuUWx1t;ymX#oK?KX z>EE9$>yVl+ut7eoO;^Hovc7iA?Vp7-7$S-fK>;kPSmUan$HvQcIaUB~ha{ z#+ULdZOUXRZ>E;=R%$6d10C^RaVEMcbvc+UCCfE4+wL)K;B4hbwFgadGZCJ^?qgzG zHOFOG&<`2s$wt}Toj0Rn7%`jd(y+TbGGmZ^c(QA|bOBOt!(8mzzEUV=DH?;SS&Gh) z65BuGJ$+q6gF^!y;@sx?#@C0?oPmC`SxXDD=+9#gWLYAY*jq;&3Mb`bAUQcqn8k*3 z+h=K7iA~{+<)tR2!|GbnX$cMS22k9!RxsPB#`(L)8sM!V)mqH`b9ucXP)yzm;H(a(}Fn zxyIt-8MEwRUGOzbMujK(IgJffu~?J1Ph_Y+jSaCnc=Pujw?`atmtRoG&<_jrms98Q~;RPjEPyC>g({H7NCtB&d<|YI3CNzsbL{D!OAMe%c5;Voh_RNF`dFis%f|*~_n3uy#RtMR#d8KgV6y z)er5CIHr`&uC>DuBDS2l@P-AEd&!;wydyVe8)U%#m~=@^0v$arOF{kFhFxCAu_ zw{3Ih=PeDr1>fA-T>L7@#ndwv&J@tnzC*0Y&ZpoBw+u`Yn9ota$ex~#PJh;Gu zo)4`LjT{QS(eUo}ZGm$_aW6d=vGO$D@^nJ~s!An!cUcGA?!3^IJKXuXpk=wC^=>Se zWPSY(SU(hcisY$4_O*cxTk(3_jpezOc?~;`FWrH{pGy8d6#7=^>G~b0z@gBuccA7= zcLctB$L|A^o(trM;(>{7nG?D#wD|{ttkC}LOA&(oFQC%fLjU`&cmJ@>&Eps|U%)?w z$HD&a!mRVftbyzjc(&swHmRWYVfPUymVLpvG!FCFq)_Z(lY(<3Gw2gS&qBV_re&Qa zZ4mj-WOM8+X~)iz)@{-vr>#S+NjrW0FwV|c_x)$F`O~wc9W`}7n=i?DCaxf04`1tp zFD3Q60$xjuk9V()>1peDI3>+*HxD08#U@pr(e6G|mvEvTZv{8gg=~iz9%}vPQl3H$ z_Z>NTz%(**DC7~)FnfCAS6+tB2V9`~8vbzW5%?|Ki%z_F!m;LItAB55)EVDl=o66J|Kl$Cdp4cG#?eL1zu#fkKkr*mS&Jd8OAscG1%f$YnFGA(`eC#ii{?G zFlWN*hE>SIWIX|yWbX#w+M#QrhKzCVutXWGRH@He6WA*^YFbw>tFfH?j7nyyNue|5 z#G3s0RxQ#D-A)9@*3cAWS~J=Z6S*cDT@)#4@OB%KmadNO{(;_sb(=2v*l$`@p@n5# z{|Iid@DdD2>F}mLT!;bVLl(Qex1p}y(s?ub2c)#Gv#Wh% zU1?i;55DPAYDjBad;3t=dMfp*#Ofw_Z%=<0%CZKB)uN}o7JDhACbb7g+WR3g#d=DR zaVs)T);84Ezm6j71}Y$>9Rq!RUAXKiMQuyl;_;!L_K`Sr{`BWUsA7H)Ol#(ukKg_t z?~Q}=AkVZa=6B0=xN*k^mFI#nKlMOmx^i=-!}~qH(F1BXP(U8TsQ+<#Tr=StmpSv$ zo`2nBx#U;ihkkhW_MM^JYoK$1&mQ%DVTU|YlK!nu(Tn4t${E~ySQeiZ`0>Z36B$Er zig986ytwq>-Cyp>1tRM`XOZUF>%zO=Uhj?84((w^P1qaJJOTagZ$ARy*+5d_eKX!| zob7jn2cd`QHSy3tK6l~A?;rJM`{Ls1ZH1oSzc~EEm*-7=F(W7Zdoab`-p^n^4Vm|N zzV3m*Z}0KXCF_gHIbrWxc=!94vlwme89|!&`qwG;_WSJN;yYpQg%o?&UMUiR%zHe0 zham9#_YCaOFSZAk=7hbU;oa}w&9K+w89|!&`l`OOU-S8&SBXG1@lcOHZ{X+MQ>O;J zgz(k2T#tM9av<<^BZ)xo_ns2a(pSto_GP_TSHHda4Ty`^_(=2Y z;dR{Omj~r{r~HY5lw9~A(4PzzlxCIC4tLnAl(T3@vZWQscaN{dyEnd=o(L4=%(32} z-H*HAcPO{u$Tqw@gCFj@nZ66}+ifC#JHq};&URw@qd@B0$B`%Sa?+zne>#OzcXJ{r zjy#vb$H2MIw2vb{QqH|T%lid*FwtO+{4#~V4t|d>{nsh{H{i#7>Bp510%`vP;KD>R zI1)g)?X>3;&~-#>wV^2v~2j^mEJ z0iIlk9r?F$=@aDN!TtRel^WMSGr;}*YZAD>KTHAlw|^nHzr8O8Uzu<)UuJ>(+q)dx z-@aFX``fb$+~0n6;Qscy4&2{9tHJ&4(FX2sj~;M;d)x}{Z;wsj{`R;N+}|Geg8SpS z8yu$*ee&fY@Tf;6UmgL+)R##A26%EykuOhyC;!Q%e0c_ZR-%paDF9#S;}P)R_;?BURlf4dz$f@P`&N;USAyT=%U=urb02R6|CNug0zd5I zH-Z1b$GgEV^6^3N**?Aze2tH90dMvBa}RizFMSty@H%=Z*<9bg0t0M*r(nctW5ca8l`2@GClY$U#5L*0c&_X?wHe^Ub8%O&w;8N(M! z%GY6x^a@G&ZVRR5Wo6>~(ux(8OX8a;R!{+F%okNGoo6j2zcXUR^KG%I;swa8Uj?yx zwua?ptS>#VwJ0xRoxsb>6w87Bb2;Ta&l9`67puTyxye?8mVlL-E9P5Zl)+4qH3*bp zEU>D1iDodx)-VuEEH7iRMBEA(vZ=Twl=T%qj;jiONIrC`GT#!)Fwi+*2%Dj6ngZy@!cY$OD z_`@Odfw#E|)vx^6Thin=c?>sKs^-mJr&=X*m1IdXN+`^gk5RmDd$C+M84qT;tjdHH%v==7_ZYPHx*KO)^eJ0+RXhn~dE7csuMkMS zSb4qTD#cF4#}%JdJf`@z;t55;7KC=Q6w4HMDIQcjrudTLn~EPO=3(nXJF^vIimMd& zDn6_DQ^mzt>zOYG%-AThQ~CYMpHMug@@Eyt6kk$&O)-Qm6YcTKKa5kEa{fUE0jAL}U^SgTmC z*r?c|xJq%2;!TR3irtF6ii3)A#f^&mcW_vbU5fh@4=dsy?lS3Piu|{77^l~jpHK{8 z3r;%`#o3CziklT5QhWkPJ13M^=Gy%H_jV{>qr6w~9>u+i`xTEVzNYvaMIHf6`zXc~ z>w&c2seGg2PQ`tS{5OD@{~(a8+ ziPJ=eh&YC=Cl-i2Ks;CEt3+%*en>17`3Vsh%r6sh*L)6aySS*%CE~950wUxM#E8gs z#7f-N6E70kM643|GO<|XE5vHFD{%(aTVfRTB*IQQ>f)B*E`S)rA1e?cUrC%Las#nO z*K{J{6(b^E zONofr^+d$$Mk3<1leiLbB(4&9pST)+;R6ZA>k=a3RYpX-mJ$)Kn~8|m79!&HWg_CW zmxy>hMnt@xCL&&kiHO%vh=|wwM8xYHj19)Cl!$mOCL&%@BI31-hOt#EbXL zF4k^zJN)S=>P^JBN7plaJ~12r&Y5zA#*BLuVbWpBjO*>n?;)b@`;7Xgbdg9FHfIpClp}_@~uO{sJP#AG#L)sP>~6rhI|O{{!00JGcM< diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o.d b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o.d deleted file mode 100644 index 586f60d..0000000 --- a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o.d +++ /dev/null @@ -1,5 +0,0 @@ -build/ChaletDuino_795/production/Source/FatFS/mmc_drv.o: \ - Source/FatFS/mmc_drv.c \ -Source/DigitalIO.h \ -Source/FatFS/diskio.h \ - Source/FatFS/integer.h diff --git a/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FlashInterface.o b/Bootloader_PIC32.X/build/ChaletDuino_795/production/Source/FlashInterface.o index 7ae173cccdba30831d2727a432cd8cdf75b69f93..cc1bbd1ad91eca3f4660f1177040bdb79af3dac5 100644 GIT binary patch literal 14304 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 literal 14032 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 a%JGd*m5h+ocz}wyy3BlXAcl>aSN{j*fQhI8 literal 16024 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 XvXbGN>K{{wbY^W1&U|*-={Ox*{?GHi?>=Xr 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/InternalUart.h Source/SDCardMgr.h Source/Uart.h + Source/SPI.h + Source/SPI_Flash.h + Source/BoardCfg.h + Source/BoardCfg_ChaletduinoV2.h + Source/BootloaderInterface.h + Source/FlashMapping.h + Source/checksum.h Source/InternalUart.c Source/main.c Source/SDCardMgr.c + Source/SPI.c + Source/SPI_Flash.c + Source/ChaletduinoV2Board.c + Source/BootloaderInterface.c + Source/crc32.c Makefile + dist/ChaletDuino_795/production/Bootloader_PIC32.X.production.map @@ -304,9 +317,10 @@ - - - + + + @@ -470,7 +484,6 @@ - @@ -502,6 +515,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -535,24 +664,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bootloader_PIC32.X/nbproject/private/private.xml b/Bootloader_PIC32.X/nbproject/private/private.xml index f672858..c33242a 100644 --- a/Bootloader_PIC32.X/nbproject/private/private.xml +++ b/Bootloader_PIC32.X/nbproject/private/private.xml @@ -3,7 +3,9 @@ - file:/D:/Main/PicDev/Projets/Bootloader_PIC32/Bootloader_PIC32.X/procdefs.ld + file:/D:/Main/PicDev/Projets/BootloaderPIC32/Bootloader_PIC32.X/Source/FlashInterface.c + file:/D:/Main/PicDev/Projets/BootloaderPIC32/Bootloader_PIC32.X/Source/BootloaderInterface.c + file:/D:/Main/PicDev/Projets/BootloaderPIC32/Bootloader_PIC32.X/Source/FlashInterface.h diff --git a/Bootloader_PIC32.X/procdefs.ld b/Bootloader_PIC32.X/procdefs.ld index 499fdca..ed84c00 100644 --- a/Bootloader_PIC32.X/procdefs.ld +++ b/Bootloader_PIC32.X/procdefs.ld @@ -35,7 +35,7 @@ _GEN_EXCPT_ADDR = _ebase_address + 0x180; /* As defined by the MIPS sp *************************************************************************/ MEMORY { - kseg0_program_mem (rx) : ORIGIN = 0x9D000000, LENGTH = 0xA000 /* 10 program Flash pages are reserved for bootloader code */ + kseg0_program_mem (rx) : ORIGIN = 0x9D000000, LENGTH = 0x4000 /* 4 program Flash pages are reserved for bootloader code */ kseg0_boot_mem : ORIGIN = 0x9FC00490, LENGTH = 0x970 /* C Init section goes here : ends at 0x9FC01370 */ /*exception_mem : ORIGIN = 0x9D002000, LENGTH = 0x1000 */ exception_mem : ORIGIN = 0x9FC01000, LENGTH = 0x1000 diff --git a/Memory map.xlsx b/Memory map.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4a7fee790cbd7082cf995def69050e37332983a2 GIT binary patch literal 12263 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 U05a%@v=Irg3nbw;+8>|(7xWS_t^fc4 literal 0 HcmV?d00001