/**
 * @file    wm_flash.h
 *
 * @brief   flash Driver module
 *
 * @author  dave
 *
 * Copyright (c) 2015 Winner Microelectronics Co., Ltd.
 */
#ifndef WM_FLASH_H
#define WM_FLASH_H

#include "wm_type_def.h"
#include "wm_osal.h"

#define TLS_FLS_STATUS_OK      (0)
#define TLS_FLS_STATUS_EINVAL      (1)
#define TLS_FLS_STATUS_EBUSY      (2)
#define TLS_FLS_STATUS_EPERM      (3)
#define TLS_FLS_STATUS_ENOSUPPORT      (4)
#define TLS_FLS_STATUS_EEXIST      (5)
#define TLS_FLS_STATUS_ENOMEM      (6)
#define TLS_FLS_STATUS_EOVERFLOW      (7)
#define TLS_FLS_STATUS_ENODEV      (8)
#define TLS_FLS_STATUS_EDEV      (9)
#define TLS_FLS_STATUS_EIO      (10)
#define TLS_FLS_STATUS_ENODRV      (11)

#define TLS_FLS_PARAM_TYPE_ID      (0)
#define TLS_FLS_PARAM_TYPE_SIZE      (1)
#define TLS_FLS_PARAM_TYPE_PAGE_SIZE      (2)
#define TLS_FLS_PARAM_TYPE_PROG_SIZE      (3)
#define TLS_FLS_PARAM_TYPE_SECTOR_SIZE      (4)

#define TLS_FLS_FLAG_UNDER_PROTECT      (1<<0)
#define TLS_FLS_FLAG_FAST_READ      (1<<1)
#define TLS_FLS_FLAG_AAAI      (1<<2)

#define FLS_CMD_READ_DEV_ID     (0x9F)  // read device id //(0x9f)

/**
 * @struct fls_list     list
 */
struct fls_list
{
    struct fls_list *next;
    struct fls_list *prev;
};


/**
 * @struct tls_fls_drv     flash driver
 */
struct tls_fls_drv
{
    struct fls_list drv_list;
    u32 id;
    u32 total_size;
    u32 page_size;
    u32 program_size;
    u32 sector_size;
    u32 clock;
    u8 mode;
    u8 cs_active;
    u8 flags;
    int (*read) (u32, u8 *, u32);
    int (*fast_read) (u32, u8 *, u32);
    int (*page_write) (u32, u8 *);
    int (*erase) (u32);
    int (*chip_erase) (void);
    int (*probe)(u32 id);
    void (*remove) (void);
};

/**
 * @struct tls_fls     flash
 */
struct tls_fls
{
    struct fls_list fls_drvs;
    struct tls_fls_drv *current_drv;
    tls_os_sem_t *fls_lock;
};

/**
 * @defgroup Driver_APIs Driver APIs
 * @brief Driver APIs
 */

/**
 * @addtogroup Driver_APIs
 * @{
 */

/**
 * @defgroup SPIFLASH_Driver_APIs SPI FLASH Driver APIs
 * @brief SPI FLASH driver APIs
 */

/**
 * @addtogroup SPIFLASH_Driver_APIs
 * @{
 */

/**
 * @brief          This function is used to initial flash module structer.
 *
 * @param[in]      None
 *
 * @retval         TLS_FLS_STATUS_OK	                if init sucsess
 * @retval         TLS_FLS_STATUS_EBUSY            already inited
 * @retval         TLS_FLS_STATUS_ENOMEM         memory error
 *
 * @note           None
 */
int tls_spifls_init(void);


/**
 * @brief          This function is used to read data from the flash.
 *
 * @param[in]      addr                  Specifies the starting address to read from
 * @param[in]      buf                   Pointer to a byte array that is to be written.
 * @param[in]      len                   length to read.
 *
 * @retval         TLS_FLS_STATUS_OK	    if read sucsess
 * @retval         TLS_FLS_STATUS_EIO	    if read fail
 *
 * @note           None
 */
int tls_spifls_read(u32 addr, u8 * buf, u32 len);


/**
 * @brief          This function is used to write data into the flash.
 *
 * @param[in]      addr      Specifies the starting address to write to.
 * @param[in]      buf       Pointer to a byte array that holds the data to be written.
 * @param[in]      len       length to write.
 *
 * @retval         TLS_FLS_STATUS_OK	           if write flash success
 * @retval         TLS_FLS_STATUS_EPERM	    if flash struct point is null
 * @retval         TLS_FLS_STATUS_ENODRV	    if flash driver is not installed
 * @retval         TLS_FLS_STATUS_EINVAL	    if argument is invalid
 * @retval         TLS_FLS_STATUS_EIO           if io error
 *
 * @note           None
 */
int tls_spifls_write(u32 addr, u8 * buf, u32 len);

/**
 * @}
 */

/**
 * @}
 */

#endif /* WM_FLASH_H */