#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);
int SPIFlashIsPresent();


#endif /* SPI_FLASH_H */

