sdk-hwV1.3/lichee/xr806/appos/include/driver/chip/flashchip/flash_chip.h

253 lines
9.5 KiB
C
Executable File

/*
* Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
* 3. Neither the name of XRADIO TECHNOLOGY CO., LTD. nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _DRIVER_CHIP_FLASHCHIP_FLASH_CHIP_H_
#define _DRIVER_CHIP_FLASHCHIP_FLASH_CHIP_H_
#include "driver/chip/hal_def.h"
#include "driver/chip/flashchip/flash_chip_cfg.h"
#include "driver/chip/hal_flashctrl.h"
#ifdef __cplusplus
extern "C" {
#endif
struct FlashChip;
struct FlashDrv;
typedef struct InstructionField {
uint32_t data;
uint8_t *pdata;
uint32_t len;
uint32_t line;
} InstructionField;
typedef int (*FlashDrvIface)(struct FlashChip *chip, InstructionField *cmd,
InstructionField *addr, InstructionField *dummy, InstructionField *data);
typedef enum FlashReadMode {
FLASH_READ_NORMAL_MODE = 1 << 0, /*!< cmd: 1 line, addr + dummy: 1 line, data: 1 line, freq can't too high */
FLASH_READ_FAST_MODE = 1 << 1, /*!< cmd: 1 line, addr + dummy: 1 line, data: 1 line */
FLASH_READ_DUAL_O_MODE = 1 << 2, /*!< cmd: 1 line, addr + dummy: 1 line, data: 2 line */
FLASH_READ_DUAL_IO_MODE = 1 << 3, /*!< cmd: 1 line, addr + dummy: 2 line, data: 2 line */
FLASH_READ_QUAD_O_MODE = 1 << 4, /*!< cmd: 1 line, addr + dummy: 1 line, data: 4 line */
FLASH_READ_QUAD_IO_MODE = 1 << 5, /*!< cmd: 1 line, addr + dummy: 4 line, data: 4 line */
FLASH_READ_QPI_MODE = 1 << 6, /*!< cmd: 4 line, addr + dummy: 4 line, data: 4 line */
} FlashReadMode;
typedef enum FlashEraseMode {
FLASH_ERASE_NOSUPPORT = 0,
FLASH_ERASE_4KB = 1 << 12, /*!< 4KB erase mode, command: 0x20 , esize: 4096 */
FLASH_ERASE_32KB = 1 << 15, /*!< 32KB erase mode, command: 0x52 , esize: 32768 */
FLASH_ERASE_64KB = 1 << 16, /*!< 64KB erase mode, command: 0xD8 , esize: 65536 */
FLASH_ERASE_CHIP = 1 << 1, /*!< chip erase mode, command: 0xC7 */
} FlashEraseMode;
typedef enum FlashStatus {
FLASH_STATUS1 = 1 << 0, /*!< flash status 1 */
FLASH_STATUS2 = 1 << 1, /*!< flash status 2 */
FLASH_STATUS3 = 1 << 2, /*!< flash status 3 */
} FlashStatus;
typedef enum FlashPageProgramMode {
FLASH_PAGEPROGRAM = 1 << 0, /*!< page program */
FLASH_QUAD_PAGEPROGRAM = 1 << 1, /*!< quad page program */
} FlashPageProgramMode;
#ifdef CONFIG_FLASH_POWER_DOWN_PROTECT
typedef enum FlashLockMode {
FLASH_LOCK_MODE_AREA = 1 << 0, /* area protect mode */
FLASH_LOCK_MODE_BLOCK = 1 << 1, /* block lock mode */
} FlashLockMode;
typedef enum FlashBlockLockState {
FLASH_BLOCK_STATE_LOCK, /* lock state in block lock mode */
FLASH_BLOCK_STATE_UNLOCK, /* unlock state in block lock mode */
} FlashBlockLockState;
#endif
struct FlashChip {
/* attribute */
FlashChipCfg cfg;
#ifdef CONFIG_FLASH_POWER_DOWN_PROTECT
void *mWpCfg;
#else
uint32_t mCsEn; /* useless */
#endif
uint32_t mPageSize; /* 256bytes */
uint16_t mFlashStatus;
uint8_t mDummyCount;
uint8_t mLockSupport;
struct FlashDrv *mDriver;
struct XipDrv *mXip;
/* private interface */
void (*writeEnable)(struct FlashChip *chip);
void (*writeDisable)(struct FlashChip *chip);
int (*readStatus)(struct FlashChip *chip, FlashStatus status, uint8_t *data);
int (*writeStatus)(struct FlashChip *chip, FlashStatus status, uint8_t *data);
int (*erase)(struct FlashChip *chip, FlashEraseMode mode, uint32_t addr); /* block count is realized in Flash erase. */
int (*suspendErasePageprogram)(struct FlashChip *chip);
int (*resumeErasePageprogram)(struct FlashChip *chip);
int (*powerDown)(struct FlashChip *chip);
int (*releasePowerDown)(struct FlashChip *chip);
int (*jedecID)(struct FlashChip *chip, uint32_t *data);
int (*enableQPIMode)(struct FlashChip *chip);
int (*disableQPIMode)(struct FlashChip *chip);
/*int (*enableReset)(struct FlashChip *chip);*/
int (*reset)(struct FlashChip *chip);
int (*uniqueID)(struct FlashChip *chip, uint8_t uid[8]);
int (*pageProgram)(struct FlashChip *chip, FlashPageProgramMode mode, uint32_t addr, const uint8_t *data, uint32_t size);
int (*read)(struct FlashChip *chip, FlashReadMode mode, uint32_t addr, uint8_t *data, uint32_t size);
/* tbc... */
int (*driverWrite)(struct FlashChip *chip, InstructionField *cmd,
InstructionField *addr, InstructionField *dummy, InstructionField *data);
int (*driverRead)(struct FlashChip *chip, InstructionField *cmd,
InstructionField *addr, InstructionField *dummy, InstructionField *data);
int (*xipDriverCfg)(struct FlashChip *chip, FlashReadMode mode);
/*
public interface
*/
int (*setFreq)(struct FlashChip *chip, uint32_t freq);
int (*switchReadMode)(struct FlashChip *chip, FlashReadMode mode);
int (*enableXIP)(struct FlashChip *chip);
int (*disableXIP)(struct FlashChip *chip);
int (*isBusy)(struct FlashChip *chip);
int (*control)(struct FlashChip *chip, int op, void *param);
int (*isSuspend)(struct FlashChip *chip);
FlashEraseMode (*minEraseSize)(struct FlashChip *chip);
/*void *platform_data;*/ /* for special flash */
struct FlashDev *dev;
union {
struct flash_controller *flash_ctrl;
struct spi_controller *spi_ctrl;
void *controller;
};
};
typedef enum DefaultFlashControlCmds {
DEFAULT_FLASH_SET_QPI_READ_P5P4,
DEFAULT_FLASH_POWERDOWN,
} DefaultFlashControlCmds;
/*
Default Flash Chip Interface
*/
void defaultWriteEnable(struct FlashChip *chip);
void defaultWriteDisable(struct FlashChip *chip);
int defaultReadStatus(struct FlashChip *chip, FlashStatus status, uint8_t *data);
int defaultWriteStatus(struct FlashChip *chip, FlashStatus reg, uint8_t *status);
int defaultErase(struct FlashChip *chip, FlashEraseMode mode, uint32_t addr);
int defaultSuspendErasePageprogram(struct FlashChip *chip);
int defaultResumeErasePageprogram(struct FlashChip *chip);
int defaultPowerDown(struct FlashChip *chip);
int defaultReleasePowerDown(struct FlashChip *chip);
int defaultGetJedecID(struct FlashChip *chip, uint32_t *data);
int defaultEnableQPIMode(struct FlashChip *chip);
int defaultDisableQPIMode(struct FlashChip *chip);
int defaultEnableReset(struct FlashChip *chip);
int defaultReset(struct FlashChip *chip);
int defaultGetUniqueID(struct FlashChip *, uint8_t uid[8]);
int defaultPageProgram(struct FlashChip *chip, FlashPageProgramMode mode,
uint32_t addr, const uint8_t *data, uint32_t size);
int defaultRead(struct FlashChip *chip, FlashReadMode mode, uint32_t addr,
uint8_t *data, uint32_t size);
int defaultDriverWrite(struct FlashChip *chip, InstructionField *cmd,
InstructionField *addr, InstructionField *dummy, InstructionField *data);
int defaultDriverRead(struct FlashChip *chip, InstructionField *cmd,
InstructionField *addr, InstructionField *dummy, InstructionField *data);
int defaultSetFreq(struct FlashChip *chip, uint32_t freq);
int defaultSwitchReadMode(struct FlashChip *chip, FlashReadMode mode);
int defaultEnableXIP(struct FlashChip *chip);
int defaultDisableXIP(struct FlashChip *chip);
int defaultIsBusy(struct FlashChip *chip);
int defaultIsSuspend(struct FlashChip *chip);
int defaultControl(struct FlashChip *chip, int op, void *param);
FlashEraseMode defaultGetMinEraseSize(struct FlashChip *chip);
int defaultXipDriverCfg(struct FlashChip *chip, FlashReadMode mode);
int defaultWriteSREnableForVolatile(struct FlashChip *chip);
#ifdef CONFIG_FLASH_POWER_DOWN_PROTECT
int defaultUnLockBlock(struct FlashChip *chip, uint32_t addr);
int defaultLockBlock(struct FlashChip *chip, uint32_t addr);
int defaultSetGlobalBlockLockState(struct FlashChip *chip, FlashBlockLockState state);
int defaultReadBlockLockStatus(struct FlashChip *chip, uint32_t raddr, uint8_t *rdata);
#endif
typedef struct FlashChipCtor {
uint32_t mJedecId;
struct FlashChip *(*enumerate)(struct FlashChip *chip, uint32_t arg);
int (*init)(struct FlashChip *);
int (*destory)(struct FlashChip *);
} FlashChipCtor;
int FlashChipEnum(struct FlashChip *chip, struct FlashDrv *drv);
int FlashChipDestroy(struct FlashChip *chip);
const FlashChipCtor **FlashChipGetChipList(int *size);
#ifdef __cplusplus
}
#endif
#endif /* _DRIVER_CHIP_FLASHCHIP_FLASH_CHIP_H_ */