drv_sfc.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*
  2. * drv_sfc.h
  3. *
  4. * Created on: 2016Äê4ÔÂ5ÈÕ
  5. * Author: Urey
  6. */
  7. #ifndef DRIVER_DRV_SFC_H_
  8. #define DRIVER_DRV_SFC_H_
  9. #include <stdint.h>
  10. #define SFC_USE_SWAP
  11. #define SFC_USE_DMA
  12. #define SFC_USE_QUAD
  13. #define UNCACHE(addr) ((((uint32_t)(addr)) | 0xa0000000))
  14. /* SFC register */
  15. #define SFC_GLB (0x0000)
  16. #define SFC_DEV_CONF (0x0004)
  17. #define SFC_DEV_STA_EXP (0x0008)
  18. #define SFC_DEV_STA_RT (0x000c)
  19. #define SFC_DEV_STA_MSK (0x0010)
  20. #define SFC_TRAN_CONF(n) (0x0014 + (n * 4))
  21. #define SFC_TRAN_LEN (0x002c)
  22. #define SFC_DEV_ADDR(n) (0x0030 + (n * 4))
  23. #define SFC_DEV_ADDR_PLUS(n) (0x0048 + (n * 4))
  24. #define SFC_MEM_ADDR (0x0060)
  25. #define SFC_TRIG (0x0064)
  26. #define SFC_SR (0x0068)
  27. #define SFC_SCR (0x006c)
  28. #define SFC_INTC (0x0070)
  29. #define SFC_FSM (0x0074)
  30. #define SFC_CGE (0x0078)
  31. #define SFC_RM_DR (0x1000)
  32. /* For SFC_GLB */
  33. #define GLB_TRAN_DIR (1 << 13)
  34. #define GLB_TRAN_DIR_WRITE (1)
  35. #define GLB_TRAN_DIR_READ (0)
  36. #define GLB_THRESHOLD_OFFSET (7)
  37. #define GLB_THRESHOLD_MSK (0x3f << GLB_THRESHOLD_OFFSET)
  38. #define GLB_OP_MODE (1 << 6)
  39. #define SLAVE_MODE (0x0)
  40. #define DMA_MODE (0x1)
  41. #define GLB_PHASE_NUM_OFFSET (3)
  42. #define GLB_PHASE_NUM_MSK (0x7 << GLB_PHASE_NUM_OFFSET)
  43. #define GLB_WP_EN (1 << 2)
  44. #define GLB_BURST_MD_OFFSET (0)
  45. #define GLB_BURST_MD_MSK (0x3 << GLB_BURST_MD_OFFSET)
  46. /* For SFC_DEV_CONF */
  47. #define DEV_CONF_ONE_AND_HALF_CYCLE_DELAY (3)
  48. #define DEV_CONF_ONE_CYCLE_DELAY (2)
  49. #define DEV_CONF_HALF_CYCLE_DELAY (1)
  50. #define DEV_CONF_NO_DELAY (0)
  51. #define DEV_CONF_SMP_DELAY_OFFSET (16)
  52. #define DEV_CONF_SMP_DELAY_MSK (0x3 << DEV_CONF_SMP_DELAY_OFFSET)
  53. #define DEV_CONF_CMD_TYPE (0x1 << 15)
  54. #define DEV_CONF_STA_TYPE_OFFSET (13)
  55. #define DEV_CONF_STA_TYPE_MSK (0x1 << DEV_CONF_STA_TYPE_OFFSET)
  56. #define DEV_CONF_THOLD_OFFSET (11)
  57. #define DEV_CONF_THOLD_MSK (0x3 << DEV_CONF_THOLD_OFFSET)
  58. #define DEV_CONF_TSETUP_OFFSET (9)
  59. #define DEV_CONF_TSETUP_MSK (0x3 << DEV_CONF_TSETUP_OFFSET)
  60. #define DEV_CONF_TSH_OFFSET (5)
  61. #define DEV_CONF_TSH_MSK (0xf << DEV_CONF_TSH_OFFSET)
  62. #define DEV_CONF_CPHA (0x1 << 4)
  63. #define DEV_CONF_CPOL (0x1 << 3)
  64. #define DEV_CONF_CEDL (0x1 << 2)
  65. #define DEV_CONF_HOLDDL (0x1 << 1)
  66. #define DEV_CONF_WPDL (0x1 << 0)
  67. /* For SFC_TRAN_CONF */
  68. #define TRAN_CONF_TRAN_MODE_OFFSET (29)
  69. #define TRAN_CONF_TRAN_MODE_MSK (0x7)
  70. #define TRAN_CONF_ADDR_WIDTH_OFFSET (26)
  71. #define TRAN_CONF_ADDR_WIDTH_MSK (0x7 << ADDR_WIDTH_OFFSET)
  72. #define TRAN_CONF_POLLEN (1 << 25)
  73. #define TRAN_CONF_CMDEN (1 << 24)
  74. #define TRAN_CONF_FMAT (1 << 23)
  75. #define TRAN_CONF_DMYBITS_OFFSET (17)
  76. #define TRAN_CONF_DMYBITS_MSK (0x3f << DMYBITS_OFFSET)
  77. #define TRAN_CONF_DATEEN (1 << 16)
  78. #define TRAN_CONF_CMD_OFFSET (0)
  79. #define TRAN_CONF_CMD_MSK (0xffff << CMD_OFFSET)
  80. #define TRAN_CONF_CMD_LEN (1 << 15)
  81. /* For SFC_TRIG */
  82. #define TRIG_FLUSH (1 << 2)
  83. #define TRIG_STOP (1 << 1)
  84. #define TRIG_START (1 << 0)
  85. /* For SFC_SCR */
  86. #define CLR_END (1 << 4)
  87. #define CLR_TREQ (1 << 3)
  88. #define CLR_RREQ (1 << 2)
  89. #define CLR_OVER (1 << 1)
  90. #define CLR_UNDER (1 << 0)
  91. /* For SFC_TRAN_CONFx */
  92. #define TRAN_MODE_OFFSET (29)
  93. #define TRAN_MODE_MSK (0x7 << TRAN_MODE_OFFSET)
  94. #define TRAN_SPI_STANDARD (0x0)
  95. #define TRAN_SPI_DUAL (0x1 )
  96. #define TRAN_SPI_QUAD (0x5 )
  97. #define TRAN_SPI_IO_QUAD (0x6 )
  98. #define ADDR_WIDTH_OFFSET (26)
  99. #define ADDR_WIDTH_MSK (0x7 << ADDR_WIDTH_OFFSET)
  100. #define POLLEN (1 << 25)
  101. #define CMDEN (1 << 24)
  102. #define FMAT (1 << 23)
  103. #define DMYBITS_OFFSET (17)
  104. #define DMYBITS_MSK (0x3f << DMYBITS_OFFSET)
  105. #define DATEEN (1 << 16)
  106. #define CMD_OFFSET (0)
  107. #define CMD_MSK (0xffff << CMD_OFFSET)
  108. #define N_MAX 6
  109. #define MAX_SEGS 128
  110. #define CHANNEL_0 0
  111. #define CHANNEL_1 1
  112. #define CHANNEL_2 2
  113. #define CHANNEL_3 3
  114. #define CHANNEL_4 4
  115. #define CHANNEL_5 5
  116. #define ENABLE 1
  117. #define DISABLE 0
  118. #define COM_CMD 1 // common cmd
  119. #define POLL_CMD 2 // the cmd will poll the status of flash,ext: read status
  120. #define DMA_OPS 1
  121. #define CPU_OPS 0
  122. #define TM_STD_SPI 0
  123. #define TM_DI_DO_SPI 1
  124. #define TM_DIO_SPI 2
  125. #define TM_FULL_DIO_SPI 3
  126. #define TM_QI_QO_SPI 5
  127. #define TM_QIO_SPI 6
  128. #define TM_FULL_QIO_SPI 7
  129. #define DEFAULT_ADDRSIZE 3
  130. #ifndef max
  131. #define max(a, b) (((a) > (b)) ? (a) : (b))
  132. #endif
  133. #ifndef min
  134. #define min(a, b) (((a) < (b)) ? (a) : (b))
  135. #endif
  136. /*SPI NOR FLASH Instructions*/
  137. #define CMD_WREN 0x06 /* Write Enable */
  138. #define CMD_WRDI 0x04 /* Write Disable */
  139. #define CMD_RDSR 0x05 /* Read Status Register */
  140. #define CMD_RDSR_1 0x35 /* Read Status1 Register */
  141. #define CMD_RDSR_2 0x15 /* Read Status2 Register */
  142. #define CMD_WRSR 0x01 /* Write Status Register */
  143. #define CMD_WRSR_1 0x31 /* Write Status1 Register */
  144. #define CMD_WRSR_2 0x11 /* Write Status2 Register */
  145. #define CMD_READ 0x03 /* Read Data */
  146. #define CMD_DUAL_READ 0x3b /* DUAL Read Data */
  147. #define CMD_QUAD_READ 0x6b /* QUAD Read Data */
  148. #define CMD_QUAD_IO_FAST_READ 0xeb /* QUAD FAST Read Data */
  149. #define CMD_QUAD_IO_WORD_FAST_READ 0xe7 /* QUAD IO WORD Read Data */
  150. #define CMD_FAST_READ 0x0B /* Read Data at high speed */
  151. #define CMD_PP 0x02 /* Page Program(write data) */
  152. #define CMD_QPP 0x32 /* QUAD Page Program(write data) */
  153. #define CMD_BE_4K 0x20
  154. #define CMD_BE_32K 0x52 /* Block Erase */
  155. #define CMD_BE_64K 0XD8 /* Block Erase */
  156. #define CMD_CE 0xC7 /* Bulk or Chip Erase */
  157. #define CMD_DP 0xB9 /* Deep Power-Down */
  158. #define CMD_RES 0xAB /* Release from Power-Down and Read Electronic Signature */
  159. #define CMD_REMS 0x90 /* Read Manufacture ID/ Device ID */
  160. #define CMD_RDID 0x9F /* Read Identification */
  161. #define CMD_NON 0x00 /* Read Identification */
  162. #define CMD_RUID 0x4B /* ReadUnique ID */
  163. #define CMD_NON 0x00 /* Read Identification */
  164. #define CMD_EN4B 0xB7 /* Enter 4 bytes address mode */
  165. #define CMD_EX4B 0xE9 /* Exit 4 bytes address mode */
  166. struct cmd_info
  167. {
  168. uint32_t cmd;
  169. uint32_t cmd_len;/*reserved; not use*/
  170. uint32_t dataen;
  171. uint32_t sta_exp;
  172. uint32_t sta_msk;
  173. };
  174. struct sfc_transfer
  175. {
  176. uint32_t direction;
  177. struct cmd_info *cmd_info;
  178. uint32_t addr_len;
  179. uint32_t addr;
  180. uint32_t addr_plus;
  181. uint32_t addr_dummy_bits;/*cmd + addr_dummy_bits + addr*/
  182. const uint8_t *data;
  183. uint32_t data_dummy_bits;/*addr + data_dummy_bits + data*/
  184. uint32_t len;
  185. uint32_t cur_len;
  186. uint32_t sfc_mode;
  187. uint32_t ops_mode;
  188. uint32_t phase_format;/*we just use default value;phase1:cmd+dummy+addr... phase0:cmd+addr+dummy...*/
  189. rt_list_t transfer_list;
  190. };
  191. struct sfc_message
  192. {
  193. rt_list_t transfers;
  194. uint32_t actual_length;
  195. uint32_t status;
  196. };
  197. struct sfc
  198. {
  199. void *iomem;
  200. int irq;
  201. struct clk *clk;
  202. struct clk *clk_gate;
  203. uint32_t src_clk;
  204. uint32_t threshold;
  205. struct sfc_transfer *transfer;
  206. struct rt_completion done;
  207. };
  208. struct sfc_quad_mode
  209. {
  210. uint8_t RDSR_CMD;
  211. uint32_t RD_DATE_SIZE;//the data is write the spi status register for QE bit
  212. uint8_t sfc_mode;
  213. uint8_t WRSR_CMD;
  214. uint32_t WD_DATE_SIZE;//the data is write the spi status register for QE bit
  215. uint8_t cmd_read;
  216. uint32_t RDSR_DATE;//the data is write the spi status register for QE bit
  217. uint32_t WRSR_DATE;//this bit should be the flash QUAD mode enable
  218. uint32_t dummy_byte;
  219. };
  220. struct sfc_flash
  221. {
  222. struct rt_mtd_nor_device mtd;
  223. char *name;
  224. uint32_t id;
  225. uint8_t uid[8];
  226. uint32_t pagesize;
  227. uint32_t sectorsize;
  228. uint32_t chipsize;
  229. uint32_t erasesize;
  230. uint32_t writesize;
  231. uint32_t addrsize;
  232. struct sfc *sfc;
  233. uint32_t sfc_mode;
  234. #ifdef SFC_USE_QUAD
  235. struct sfc_quad_mode *quad_mode;
  236. #endif
  237. struct rt_mutex lock;
  238. };
  239. int sfc_norflash_probe(struct sfc_flash *flash);
  240. size_t sfc_norflash_read(struct sfc_flash *flash, rt_off_t from, uint8_t *buf, size_t len);
  241. size_t sfc_norflash_write(struct sfc_flash *flash, rt_off_t to, const uint8_t *buf, size_t len);
  242. int sfc_norflash_erase_sector(struct sfc_flash *flash, uint32_t addr);
  243. int sfc_norflash_set_addr_width_4byte(struct sfc_flash *flash,int on);
  244. #endif /* DRIVER_DRV_SFC_H_ */