spinand_acts.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include <device.h>
  2. #include <drivers/flash.h>
  3. #include <drivers/spi.h>
  4. #include <drivers/dma.h>
  5. #include <soc_regs.h>
  6. #include <logging/log.h>
  7. #include <soc.h>
  8. /*spinand rom print level*/
  9. #define DEBUG_LEVEL 4
  10. #define INFO_LEVEL 3
  11. #define WARN_LEVEL 2
  12. #define ERROR_LEVEL 1
  13. /* struct FlashChipInfo takes total 60 bytes size */
  14. #define NAND_CHIPID_LENGTH (8) /* nand flash chipid length */
  15. /*
  16. * struct FlashChipInfo takes total 60 bytes size
  17. * read mode:
  18. * 0x0:1xIO(0x03), cpu trans; 0x10:1xIO(0x03), dma trans;
  19. * 0x1:2xIO-quad(0xbb), cpu trans; 0x11:2xIO-quad(0xbb), dma trans;
  20. * 0x2:2xIO-dual(0x3b), cpu trans; 0x12:2xIO-dual(0x3b), dma trans;
  21. * 0x4:4xIO-quad(0x6b), cpu trans; 0x14:4xIO-quad(0x6b), dma trans;
  22. * 0x8:4xIO-dual(0xeb), cpu trans; 0x18:4xIO-dual(0xeb), dma trans.
  23. * write mode:
  24. * 0x0:1xIO(0x02), cpu trans; 0x10:1xIO(0x02), dma trans;
  25. * 0x4:4xIO-quad(0x32), cpu trans; 0x14:4xIO-quad(0x32), dma trans;
  26. */
  27. struct FlashChipInfo
  28. {
  29. uint8_t ChipID[NAND_CHIPID_LENGTH]; /* nand flash id */
  30. uint8_t ChipCnt; /* the count of chip connecting in flash*/
  31. uint8_t DieCntPerChip; /* the die count in a chip */
  32. uint8_t PlaneCntPerDie; /* the plane count in a die */
  33. uint8_t SectorNumPerPage; /* page size, based on sector */
  34. uint8_t SpareBytesPerSector; /* spare bytes per sector */
  35. uint8_t Frequence; /* spi clk, may be based on xMHz */
  36. uint16_t PageNumPerPhyBlk; /* the page number of physic block */
  37. uint16_t TotalBlkNumPerDie; /* total number of the physic block in a die */
  38. uint16_t DefaultLBlkNumPer1024Blk; /* Logical number per 1024 physical block */
  39. uint16_t userMetaOffset; /*user meta data offset, add for spinand*/
  40. uint8_t userMetaShift; /*user meta data shift, add for spinand*/
  41. uint8_t userMetaSize; /*user meta data size, add for spinand*/
  42. uint8_t ECCBits;
  43. uint8_t eccStatusMask; /*ecc status mask, add for spinand*/
  44. uint8_t eccStatusErrVal; /*ecc status err value, add for spinand*/
  45. uint8_t readAddressBits; /*read address bit, 16bit or 24bit address, add for spinand*/
  46. uint8_t readMode;
  47. uint8_t writeMode;
  48. uint8_t Version; /* flash chipinfo version */
  49. uint8_t FlashMark[16]; /* the name of spinand */
  50. uint8_t delayChain; /* the delaychain of spinand, value from 0 to 63(spi0) or 31(spi1, spi2, spi3) */
  51. uint8_t Reserved1[12]; /* reserved */
  52. } __attribute__ ((packed));
  53. //10Byte
  54. struct NandIdTblHeader
  55. {
  56. uint8_t num;
  57. uint32_t magic;
  58. uint32_t checksum;
  59. uint8_t Reserved;
  60. } __attribute__ ((packed));
  61. struct nand_info {
  62. /* spi controller address */
  63. uint32_t base;
  64. uint8_t bus_width;
  65. uint8_t delay_chain;
  66. uint8_t spi_mode;
  67. uint8_t data;
  68. uint32_t dma_base;
  69. int (*printf)(const char *fmt, ...);
  70. //1:err;2:warn;3:info;4:debug.
  71. uint8_t loglevel;
  72. //act as a patch for spinand rom.
  73. uint8_t (*phy_readpage)(void *sni, uint32_t colAddr, void *buf, uint32_t len, int addrBits, int mode);
  74. uint8_t (*phy_writepage)(void *sni, uint32_t rowAddr, const void *buf, uint32_t len, const void *uData, int uDataSize, int mode);
  75. void (*prepare_hook)(void *sni);
  76. void (*panic)(const char *fmt, void *sni);
  77. void (*checkrb_sem)(void *sni);
  78. void (*phy_special_init)(void *sni);
  79. void (*phy_special_ecc_err)(void *sni, const uint32_t errBits);
  80. } __attribute__ ((packed));
  81. struct spinand_info {
  82. struct nand_info *spi;
  83. //protect is a lock for write/erase some sectors; protect=0: lock; protect=1: unlock.
  84. uint32_t protect;
  85. void *id_tbl;
  86. //bass data for spinand code rom.
  87. void *bss;
  88. } __attribute__ ((packed));
  89. #ifndef CONFIG_SPINAND_LIB
  90. struct PhysicOpParameter
  91. {
  92. //Bank number
  93. uint8_t BankNum;
  94. //page number in physic block,the page is based on multi-plane if support
  95. uint16_t PageNum;
  96. //physic block number in bank,the physic block is based on multi-plane if support
  97. uint16_t PhyBlkNumInBank;
  98. //page sector bitmap
  99. uint32_t SectorBitmapInPage;
  100. //pointer to main data buffer
  101. void *MainDataPtr;
  102. //pointer to spare data buffer
  103. void *SpareDataPtr;
  104. } __attribute__ ((packed));
  105. struct spinand_extra_api {
  106. uint32_t (*phy_read)(struct spinand_info *sni, struct PhysicOpParameter *OpPar);
  107. uint32_t (*phy_write)(struct spinand_info *sni, struct PhysicOpParameter *OpPar);
  108. uint32_t (*phy_erase)(struct spinand_info *sni, struct PhysicOpParameter *OpPar);
  109. int (*null)(struct spinand_info *sni);
  110. } __attribute__ ((packed));
  111. struct spinand_operation_api {
  112. int (*init)(struct spinand_info *sni);
  113. uint32_t (*read_chipid)(struct spinand_info *sni);
  114. int (*read)(struct spinand_info *sni, uint32_t addr, void *buf, uint32_t len);
  115. int (*write)(struct spinand_info *sni, uint32_t addr, const void *buf, uint32_t len);
  116. int (*erase)(struct spinand_info *sni, uint32_t addr, uint32_t len);
  117. int (*flush)(struct spinand_info *sni);
  118. int (*flash_protect) (struct spinand_info *sni, uint32_t len);
  119. int (*spinand_pdl_init) (struct spinand_info *sni);
  120. uint8_t (*spinand_get_feature) (struct spinand_info *sni, uint8_t feature);
  121. uint8_t (*spinand_set_feature) (struct spinand_info *sni, uint8_t feature, uint8_t setting);
  122. uint8_t (*spinand_get_version) (struct spinand_info *sni, char *version);
  123. const struct spinand_extra_api *extra_api;
  124. } __attribute__ ((packed));
  125. //spinand code rom api address
  126. #define SPINAND_API_ADDR 0x00007000
  127. #define p_spinand_api ((struct spinand_operation_api *)SPINAND_API_ADDR)
  128. #else
  129. int spinand_pdl_init(struct spinand_info *sni);
  130. int spinand_init(struct spinand_info *sni);
  131. u32_t spinand_read_chipid(struct spinand_info *sni);
  132. int spinand_read(struct spinand_info *sni, u32_t addr, void *buf, u32_t len);
  133. int spinand_write(struct spinand_info *sni, u32_t addr, const void *buf, u32_t len);
  134. int spinand_erase(struct spinand_info *sni, u32_t addr, u32_t len);
  135. int spinand_flush(struct spinand_info *sni, bool efficient);
  136. int spinand_flash_protect(struct spinand_info *sni, u32_t len);
  137. uint8_t spinand_get_feature(struct spinand_info *sni, u8_t feature);
  138. void spinand_set_feature(struct spinand_info *sni, u8_t feature, u8_t setting);
  139. uint8_t *spinand_get_version(void);
  140. #ifdef CONFIG_SPINAND_TEST_FRAMEWORKS
  141. int spinand_get_delaychain(struct spinand_info *sni);
  142. int spinand_get_chipid(struct spinand_info *sni, u32_t *chipid);
  143. int get_storage_params(struct spinand_info *sni, u8_t *id, struct FlashChipInfo **ChipInfo);
  144. #endif
  145. #endif
  146. struct spinand_acts_config {
  147. struct acts_spi_controller *spi;
  148. uint32_t spiclk_reg;
  149. const char *dma_dev_name;
  150. uint8_t txdma_id;
  151. uint8_t txdma_chan;
  152. uint8_t rxdma_id;
  153. uint8_t rxdma_chan;
  154. uint8_t clock_id;
  155. uint8_t reset_id;
  156. uint8_t flag_use_dma:1;
  157. uint8_t delay_chain:7;
  158. };
  159. #define DEV_CFG(dev) \
  160. ((const struct spinand_acts_config *const)(dev)->config)
  161. #define DEV_DATA(dev) \
  162. ((struct spinand_info *)(dev)->data)