123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- #include <device.h>
- #include <drivers/flash.h>
- #include <drivers/spi.h>
- #include <drivers/dma.h>
- #include <soc_regs.h>
- #include <logging/log.h>
- #include <soc.h>
- #define DEBUG_LEVEL 4
- #define INFO_LEVEL 3
- #define WARN_LEVEL 2
- #define ERROR_LEVEL 1
- #define NAND_CHIPID_LENGTH (8)
- struct FlashChipInfo
- {
- uint8_t ChipID[NAND_CHIPID_LENGTH];
- uint8_t ChipCnt;
- uint8_t DieCntPerChip;
- uint8_t PlaneCntPerDie;
- uint8_t SectorNumPerPage;
- uint8_t SpareBytesPerSector;
- uint8_t Frequence;
- uint16_t PageNumPerPhyBlk;
- uint16_t TotalBlkNumPerDie;
- uint16_t DefaultLBlkNumPer1024Blk;
- uint16_t userMetaOffset;
- uint8_t userMetaShift;
- uint8_t userMetaSize;
- uint8_t ECCBits;
- uint8_t eccStatusMask;
- uint8_t eccStatusErrVal;
- uint8_t readAddressBits;
- uint8_t readMode;
- uint8_t writeMode;
- uint8_t Version;
- uint8_t FlashMark[16];
- uint8_t delayChain;
- uint8_t Reserved1[12];
- } __attribute__ ((packed));
- struct NandIdTblHeader
- {
- u8_t num;
- u32_t magic;
- u32_t checksum;
- u8_t Reserved;
- } __attribute__ ((packed));
- struct nand_info {
-
- uint32_t base;
- uint8_t bus_width;
- uint8_t delay_chain;
- uint8_t spi_mode;
- uint8_t data;
- uint32_t dma_base;
- int (*printf)(const char *fmt, ...);
-
- uint8_t loglevel;
-
- uint8_t (*phy_readpage)(void *sni, uint32_t colAddr, void *buf, int len, int addrBits, int mode);
- uint8_t (*phy_writepage)(void *sni, uint32_t rowAddr, const void *buf, int len, const void *uData, int uDataSize, int mode);
- void (*prepare_hook)(void *sni);
- void (*panic)(const char *fmt, void *sni);
- void (*checkrb_sem)(void *sni);
- void (*phy_special_init)(void *sni);
- void (*phy_special_ecc_err)(void *sni, const uint32_t errBits);
- } __attribute__ ((packed));
- struct spinand_info {
- struct nand_info *spi;
-
- u32_t protect;
- void *id_tbl;
-
- void *bss;
- } __attribute__ ((packed));
- #ifndef CONFIG_SPINAND_LIB
- struct PhysicOpParameter
- {
-
- uint8_t BankNum;
-
- uint16_t PageNum;
-
- uint16_t PhyBlkNumInBank;
-
- uint32_t SectorBitmapInPage;
-
- void *MainDataPtr;
-
- void *SpareDataPtr;
- } __attribute__ ((packed));
- struct spinand_extra_api {
- uint32_t (*phy_read)(struct spinand_info *sni, struct PhysicOpParameter *OpPar);
- uint32_t (*phy_write)(struct spinand_info *sni, struct PhysicOpParameter *OpPar);
- uint32_t (*phy_erase)(struct spinand_info *sni, struct PhysicOpParameter *OpPar);
- int (*null)(struct spinand_info *sni);
- } __attribute__ ((packed));
- struct spinand_operation_api {
- int (*init)(struct spinand_info *sni);
- u32_t (*read_chipid) (struct spinand_info *sni);
- int (*read) (struct spinand_info *sni, u32_t addr, void *buf, u32_t len);
- int (*write) (struct spinand_info *sni, u32_t addr, const void *buf, u32_t len);
- int (*erase) (struct spinand_info *sni, u32_t addr, u32_t len);
- int (*flush)(struct spinand_info *sni);
- int (*flash_protect) (struct spinand_info *sni, uint32_t len);
- int (*spinand_pdl_init) (struct spinand_info *sni);
- u8_t (*spinand_get_feature) (struct spinand_info *sni, uint8_t feature);
- u8_t (*spinand_set_feature) (struct spinand_info *sni, uint8_t feature, uint8_t setting);
- u8_t (*spinand_get_version) (struct spinand_info *sni, char *version);
- const struct spinand_extra_api *extra_api;
- } __attribute__ ((packed));
- #else
- int spinand_pdl_init(struct spinand_info *sni);
- int spinand_init(struct spinand_info *sni);
- u32_t spinand_read_chipid(struct spinand_info *sni);
- int spinand_read(struct spinand_info *sni, u32_t addr, void *buf, u32_t len);
- int spinand_write(struct spinand_info *sni, u32_t addr, const void *buf, u32_t len);
- int spinand_erase(struct spinand_info *sni, u32_t addr, u32_t len);
- int spinand_flush(struct spinand_info *sni, bool efficient);
- int spinand_flash_protect(struct spinand_info *sni, u32_t len);
- uint8_t spinand_get_feature(struct spinand_info *sni, u8_t feature);
- void spinand_set_feature(struct spinand_info *sni, u8_t feature, u8_t setting);
- uint8_t *spinand_get_version(void);
- #ifdef CONFIG_SPINAND_TEST_FRAMEWORKS
- int spinand_get_delaychain(struct spinand_info *sni);
- int spinand_get_chipid(struct spinand_info *sni, u32_t *chipid);
- int get_storage_params(struct spinand_info *sni, u8_t *id, struct FlashChipInfo **ChipInfo);
- #endif
- #endif
- struct spinand_acts_config {
- struct acts_spi_controller *spi;
- uint32_t spiclk_reg;
- const char *dma_dev_name;
- uint8_t txdma_id;
- uint8_t txdma_chan;
- uint8_t rxdma_id;
- uint8_t rxdma_chan;
- uint8_t clock_id;
- uint8_t reset_id;
- uint8_t flag_use_dma:1;
- uint8_t delay_chain:7;
- };
- #define DEV_CFG(dev) \
- ((const struct spinand_acts_config *const)(dev)->config)
- #define DEV_DATA(dev) \
- ((struct spinand_info *)(dev)->data)
|