/*
 * srm32sprog.h
 *
 *  Created on: Apr 12, 2016
 *      Author: jesstr
 */

#ifndef SRM32SPROG_H_
#define SRM32SPROG_H_

#include "stm32f4xx_usart.h"
#include "gpio_io.h"

#include "serial.h"
#include "sys/types.h"

#define MAX_CONNECT_RETRIES	3

#define DEFAULT_BAUD 57600

#define MAX_BLOCK_SIZE 256


static const uint8_t ACK = 0x79;
typedef enum {
    CMD_GET_VERSION = 0x00,
    CMD_GET_READ_STATUS = 0x01,
    CMD_GET_ID = 0x02,
    CMD_READ_MEM = 0x11,
    CMD_GO = 0x21,
    CMD_WRITE_MEM = 0x31,
    CMD_ERASE = 0x43,
    CMD_EXTENDED_ERASE = 0x44,
    CMD_WRITE_PROTECT = 0x63,
    CMD_WRITE_UNPROTECT = 0x73,
    CMD_READ_PROTECT = 0x82,
    CMD_READ_UNPROTECT = 0x92
} Command;
#define NUM_COMMANDS_KNOWN 12

enum {
    ID_LOW_DENSITY = 0x0412,
    ID_MED_DENSITY = 0x0410,
    ID_HI_DENSITY = 0x0414,
    ID_CONNECTIVITY = 0x0418,
    ID_VALUE = 0x0420,
    ID_HI_DENSITY_VALUE = 0x0428,
    ID_XL_DENSITY = 0x0430,
    ID_MED_DENSITY_ULTRA_LOW_POWER = 0x0436,
    ID_HI_DENSITY_ULTRA_LOW_POWER = 0x0416
};

typedef struct {
    uint8_t bootloaderVer;
    bool commands[NUM_COMMANDS_KNOWN];
    uint32_t flashBeginAddr;
    uint32_t flashEndAddr;
    int flashPagesPerSector;
    size_t flashPageSize;
    useconds_t eraseDelay;
    useconds_t writeDelay;
} DeviceParameters;

int stm32sprog_test(void);
void usleep(uint32_t us);
void stmRebootForFlash(void);
void stmReboot(void);
uint32_t stmCalcFlashCrc(void (* periodic_handler)(uint8_t));
uint32_t stmReadFlashCrc(void);
bool stmConnect(void);
bool stmGetDevParams(void);
bool stmEraseFlash(void);
bool stmEraseFW(void);
bool stmWriteBlock(uint32_t addr, const uint8_t *buff, size_t size);
void stmProg( uint32_t* addr, uint8_t * ptr, uint32_t len);


#endif /* SRM32SPROG_H_ */