vf610_qspi.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. /*
  2. * Copyright 2013 Freescale Semiconductor, Inc.
  3. *
  4. * See file CREDITS for list of people who contributed to this
  5. * project.
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20. * MA 02111-1307 USA
  21. */
  22. #include <common.h>
  23. #include <asm/io.h>
  24. #include <command.h>
  25. #include <asm/imx-common/iomux-v3.h>
  26. #include <asm/arch-vf610/iomux-vf610.h>
  27. #include <asm/arch-vf610/crm_regs.h>
  28. #include <asm/arch/vf610_qspi.h>
  29. void quadspi_init(void);
  30. void quadspi_erase(void);
  31. void quadspi_erase_sector(unsigned int addr);
  32. void quadspi_program(unsigned int src, unsigned int base, unsigned int size);
  33. static void quadspi_setup_iomux(void);
  34. static void quadspi_setup_clocks(void);
  35. static void quadspi_config(void);
  36. static void quadspi_setup_lut(void);
  37. static void quadspi_wait_while_flash_busy(void);
  38. static void quadspi_enable_quadbit(void);
  39. static volatile struct quadspi *qspi = (struct quadspi *)QSPI0_BASE_ADDR;
  40. static int qspidev = 0;
  41. static int qspibase = QSPI0_FLASH_BASE_ADDR;
  42. static void quadspi_setup_iomux(void)
  43. {
  44. if (qspidev == 0) {
  45. imx_iomux_v3_setup_pad(VF610_PAD_PTD0__QSCKA);
  46. imx_iomux_v3_setup_pad(VF610_PAD_PTD1__QCS0A);
  47. imx_iomux_v3_setup_pad(VF610_PAD_PTD2__QIO3A);
  48. imx_iomux_v3_setup_pad(VF610_PAD_PTD3__QIO2A);
  49. imx_iomux_v3_setup_pad(VF610_PAD_PTD4__QIO1A);
  50. imx_iomux_v3_setup_pad(VF610_PAD_PTD5__QIO0A);
  51. imx_iomux_v3_setup_pad(VF610_PAD_PTD7__QSCKB);
  52. imx_iomux_v3_setup_pad(VF610_PAD_PTD8__QCS0B);
  53. imx_iomux_v3_setup_pad(VF610_PAD_PTD9__QIO3B);
  54. imx_iomux_v3_setup_pad(VF610_PAD_PTD10__QIO2B);
  55. imx_iomux_v3_setup_pad(VF610_PAD_PTD11__QIO1B);
  56. imx_iomux_v3_setup_pad(VF610_PAD_PTD12__QIO0B);
  57. } else {
  58. imx_iomux_v3_setup_pad(VF610_PAD_PTA19__QSCKA);
  59. imx_iomux_v3_setup_pad(VF610_PAD_PTB0__QCS0A);
  60. imx_iomux_v3_setup_pad(VF610_PAD_PTB1__QIO3A);
  61. imx_iomux_v3_setup_pad(VF610_PAD_PTB2__QIO2A);
  62. imx_iomux_v3_setup_pad(VF610_PAD_PTB3__QIO1A);
  63. imx_iomux_v3_setup_pad(VF610_PAD_PTB4__QIO0A);
  64. }
  65. }
  66. static void quadspi_setup_clocks(void)
  67. {
  68. struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
  69. debug ("Setup QuadSPI clocks\n");
  70. if (qspidev == 0) /* Ungate QSPI0 */
  71. ccm->ccgr2 |= 0x1 << 8;
  72. else /* Ungate QSPI1 */
  73. ccm->ccgr8 |= 0x1 << 8;
  74. /* Select pll1-pfd4 as source for both Qspi0 and Qsp1 */
  75. if (qspidev == 0)
  76. ccm->cscmr1 |= (0x3 << 22);
  77. else
  78. ccm->cscmr1 |= (0x3 << 24);
  79. /* QSPI Enable, QSPI_DIV(1),
  80. * QSPI_X2_DIV(2), QSPI_X4_DIV(4) = 33MHZ
  81. */
  82. if (qspidev == 0)
  83. ccm->cscdr3 |= 0x1F;
  84. else
  85. ccm->cscdr3 |= (0x1F << 8);
  86. }
  87. static void quadspi_config(void)
  88. {
  89. debug ("Config QuadSPI0\n");
  90. /* Support both SDR and DDR instructions;
  91. * Enable Qspi module
  92. */
  93. qspi->mcr &= ~0x4000;
  94. qspi->mcr |= 0x0080;
  95. qspi->buf0ind = 0x0;
  96. /* top address of FA1 */
  97. if (!qspi->sfa1ad)
  98. qspi->sfa1ad = (qspidev ? QSPI1_TOP_FLASH_A1_ADDR
  99. : QSPI0_TOP_FLASH_A1_ADDR);
  100. /* top address of FA2 */
  101. if (!qspi->sfa2ad)
  102. qspi->sfa2ad = qspi->sfa1ad;
  103. /* top address of FB1 */
  104. if (!qspi->sfb1ad)
  105. qspi->sfb1ad = (qspidev ? QSPI1_TOP_FLASH_B1_ADDR
  106. : QSPI0_TOP_FLASH_B1_ADDR);
  107. /* top address of FB2 */
  108. if (!qspi->sfb2ad)
  109. qspi->sfb2ad = qspi->sfb1ad;
  110. }
  111. static void quadspi_setup_lut (void)
  112. {
  113. debug ("quadspi_setup_lut\n");
  114. /* Unlock LUT */
  115. qspi->lutkey = 0x5af05af0;
  116. qspi->lckcr = 0x2;
  117. /* seqid 0 - quad read */
  118. qspi->lut[0] = 0x0a1804eb; /* quad read, 24 bit addresses */
  119. qspi->lut[1] = 0x0e0412a5; /* mode bits and 4 dummy cycles */
  120. qspi->lut[2] = 0x24011e80; /* read 128 bytes and jump to address */
  121. /* seqid 1 - write enable */
  122. qspi->lut[4] = 0x406;
  123. /* seqid 2 - bulk erase */
  124. qspi->lut[8] = 0x460;
  125. /* seqid 3 - read status */
  126. qspi->lut[12] = 0x1c010405;
  127. /* seqid 4 - page program */
  128. qspi->lut[16] = 0x08180402; /* 24bit address */
  129. qspi->lut[17] = 0x2004; /* default 4-byte write */
  130. /* seqid 5 - write config/status */
  131. qspi->lut[20] = 0x20020401; /*2-byte write */
  132. /* seqid 6 - read config */
  133. qspi->lut[24] = 0x1c010435; /*1-byte read */
  134. /* seqid 7 - sector erase */
  135. qspi->lut[28] = 0x081804d8;
  136. /* seqid 8 - quad ddr read */
  137. /* quad ddr read - 24 bit addresses */
  138. qspi->lut[32] = QuadSPI_LUT_INSTR0(CMD)|
  139. QuadSPI_LUT_PAD0(0x0)|
  140. QuadSPI_LUT_OPRND0(0xED)|
  141. QuadSPI_LUT_INSTR1(ADDR_DDR)|
  142. QuadSPI_LUT_PAD1(0x2) |
  143. QuadSPI_LUT_OPRND1(0x18);
  144. /*set mode and 6 dummy cycles */
  145. qspi->lut[33] = QuadSPI_LUT_INSTR0(MODE_DDR) |
  146. QuadSPI_LUT_PAD0(0x2) |
  147. QuadSPI_LUT_OPRND0(0xa5) |
  148. QuadSPI_LUT_INSTR1(DUMMY) |
  149. QuadSPI_LUT_PAD1(0x2) |
  150. QuadSPI_LUT_OPRND1(0x6);
  151. /* read 128 bytes */
  152. qspi->lut[34] = QuadSPI_LUT_INSTR0(READ_DDR) |
  153. QuadSPI_LUT_PAD0(0x2) |
  154. QuadSPI_LUT_OPRND0(0x80) |
  155. QuadSPI_LUT_INSTR1(JMP_ON_CS) |
  156. QuadSPI_LUT_PAD1(0x0) |
  157. QuadSPI_LUT_OPRND1(0x1);
  158. /* seqid 9 - ddr read - 24 bit addresses */
  159. qspi->lut[36] = QuadSPI_LUT_INSTR0(CMD) |
  160. QuadSPI_LUT_PAD0(0x0) |
  161. QuadSPI_LUT_OPRND0(0x0D) |
  162. QuadSPI_LUT_INSTR1(ADDR_DDR) |
  163. QuadSPI_LUT_PAD1(0x0) |
  164. QuadSPI_LUT_OPRND1(0x18);
  165. /*mode bits and 2 dummy cycles */
  166. qspi->lut[37] = QuadSPI_LUT_INSTR0(MODE_DDR) |
  167. QuadSPI_LUT_PAD0(0x0) |
  168. QuadSPI_LUT_OPRND0(0xFF) |
  169. QuadSPI_LUT_INSTR1(DUMMY)|
  170. QuadSPI_LUT_PAD1(0x0) |
  171. QuadSPI_LUT_OPRND1(0x2);
  172. qspi->lut[38] = 0x3880;
  173. /* lock lut */
  174. qspi->lutkey = 0x5af05af0;
  175. qspi->lckcr = 0x1;
  176. }
  177. static void quadspi_wait_while_flash_busy(void)
  178. {
  179. u32 status_value = 0x1;
  180. while ((status_value & 0x1)==0x1)
  181. {
  182. qspi->ipcr = 3 << 24;
  183. while(qspi->sr & 0x1);
  184. while(!(qspi->sr & (1 << 16)));
  185. status_value = QSPI_ARDB;
  186. /* read complete */
  187. qspi->fr = 0x10000;
  188. }
  189. }
  190. void quadspi_init(void)
  191. {
  192. quadspi_setup_clocks();
  193. /* port configuration */
  194. quadspi_setup_iomux();
  195. quadspi_config();
  196. quadspi_setup_lut();
  197. /* set quad ddr as xbar read instruction */
  198. qspi->bfgencr = 0x9000;
  199. /* set mdis bit */
  200. qspi->mcr = qspi->mcr | 0x4000;
  201. /* for 33MHz clock */
  202. qspi->smpr = 0x10000;
  203. /* clear mdis bit */
  204. qspi->mcr &= ~0x4000;
  205. /* clear tx fifo */
  206. qspi->mcr |= 0x800;
  207. qspi->sfar = (qspidev ? QSPI1_FLASH_BASE_ADDR : QSPI0_FLASH_BASE_ADDR);
  208. quadspi_enable_quadbit();
  209. qspi->sfar = (qspidev ? QSPI1_FLASH_BASE_ADDR : QSPI0_FLASH_BASE_ADDR);
  210. }
  211. static void quadspi_enable_quadbit(void)
  212. {
  213. /* write enable */
  214. qspi->ipcr = 1 << 24;
  215. while(qspi->sr & 0x1);
  216. /* write data to Tx Buffer */
  217. /* enable flash quad mode */
  218. qspi->tbdr = 0x00020000;
  219. /* send write command */
  220. qspi->ipcr = 5 << 24;
  221. while(qspi->sr & 0x1);
  222. quadspi_wait_while_flash_busy();
  223. /* Read config reg to ensure write was successful */
  224. qspi->ipcr = 6 << 24;
  225. while(qspi->sr & 0x1);
  226. /* read complete */
  227. qspi->fr = 0x10000;
  228. }
  229. void quadspi_erase(void)
  230. {
  231. qspi->sfar = qspibase;
  232. /*write enable*/
  233. qspi->ipcr = 1 << 24;
  234. while(qspi->sr & 0x1);
  235. /*send erase command */
  236. qspi->ipcr = 2 << 24;
  237. while(qspi->sr & 0x1);
  238. quadspi_wait_while_flash_busy();
  239. }
  240. void quadspi_erase_sector(unsigned int addr)
  241. {
  242. debug ("Erasing QuadSPI flash addr=0x%x\n",addr);
  243. qspi->sfar = addr;
  244. /*write enable */
  245. qspi->ipcr = 1 << 24;
  246. while(qspi->sr & 0x1);
  247. /*send erase sector command */
  248. qspi->ipcr = 7 << 24;
  249. while(qspi->sr & 0x1);
  250. quadspi_wait_while_flash_busy();
  251. }
  252. void quadspi_program(unsigned int src, unsigned int base, unsigned int size)
  253. {
  254. unsigned int *start_address = (unsigned int *)src;
  255. unsigned int *end_address = (unsigned int *)(src + size);
  256. unsigned int *page_address = start_address;
  257. unsigned int *flash_address = (unsigned int *)base;
  258. int page_size = QSPI_FLASH_PGSZ;
  259. unsigned int *current_address = start_address;
  260. unsigned int data_value;
  261. int i;
  262. /* 1024 offset for spansion */
  263. qspi->sfar = (unsigned int)flash_address;
  264. /* clear Tx fifo */
  265. qspi->mcr |= 0x800;
  266. page_address = start_address + (page_size >> 2);
  267. do {
  268. if ((unsigned int)flash_address % 0x10000 == 0)
  269. quadspi_erase_sector((unsigned int)flash_address);
  270. /* write enable */
  271. qspi->ipcr = 1 << 24;
  272. while(qspi->sr & 0x1);
  273. /* clear Tx fifo */
  274. qspi->mcr |= 0x800;
  275. while (current_address < page_address)
  276. {
  277. /* fill tx fifo (64 bytes) */
  278. for (i = 0; i < 16; i++)
  279. {
  280. data_value=*(current_address++);
  281. qspi->tbdr = __swap_32(data_value);
  282. }
  283. /*page program 256bytes */
  284. qspi->ipcr = (4 << 24) | page_size;
  285. for (i = 0; i < 48; i++)
  286. {
  287. /* while TX fifo Full */
  288. while(qspi->sr & 0x8000000u);
  289. data_value=*(current_address++);
  290. qspi->tbdr = __swap_32(data_value);
  291. }
  292. while(qspi->sr & 0x1);
  293. quadspi_wait_while_flash_busy();
  294. }
  295. page_address += (page_size >> 2);
  296. flash_address += (page_size >> 2);
  297. qspi->sfar = (unsigned int)flash_address;
  298. } while (current_address < end_address);
  299. }
  300. int quadspi_write_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  301. {
  302. ulong length = 1;
  303. ulong dest, src;
  304. if (argc < 4)
  305. return CMD_RET_USAGE;
  306. /* Address is specified since argc > 1 */
  307. dest = simple_strtoul(argv[1], NULL, 16);
  308. src = simple_strtoul(argv[2], NULL, 16);
  309. length = simple_strtoul(argv[3], NULL, 16);
  310. if (!src || !length)
  311. return CMD_RET_USAGE;
  312. /* Check if in the QSPI address range */
  313. if (!((dest >= qspibase) && (dest + length <= qspi->sfb2ad)))
  314. return CMD_RET_USAGE;
  315. quadspi_program(src, dest, length);
  316. print_buffer(dest, (void*)dest, 2, 0x10, 8);
  317. return 0;
  318. }
  319. U_BOOT_CMD(
  320. qspiwrite, 4, 0, quadspi_write_cmd,
  321. "Write/programm the QSPI memory",
  322. "qspiwrite destAddr srcAddr length\n"
  323. " destAddr: is an address in the QSPI domain\n"
  324. " srcAddr: is the source address\n"
  325. " length: size in bytes\n"
  326. " Example:\n"
  327. " qspiwrite 0x20000000 0x3f800000 0x1000\n"
  328. ""
  329. );
  330. int quadspi_init_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  331. {
  332. unsigned int addr;
  333. int i;
  334. if (argc < 2)
  335. return CMD_RET_USAGE;
  336. /* dev= must be first argument */
  337. if (!strncmp(argv[1], "dev=", 4)) {
  338. qspidev = simple_strtoul(argv[1] + 4, NULL, 16);
  339. switch (qspidev) {
  340. case 0:
  341. qspi = (struct quadspi *)QSPI0_BASE_ADDR;
  342. qspibase = QSPI0_FLASH_BASE_ADDR;
  343. break;
  344. case 1:
  345. qspi = (struct quadspi *)QSPI1_BASE_ADDR;
  346. qspibase = QSPI1_FLASH_BASE_ADDR;
  347. break;
  348. default:
  349. return CMD_RET_USAGE;
  350. }
  351. } else
  352. return CMD_RET_USAGE;
  353. for (i = 2; i < argc; i++) {
  354. addr = simple_strtoul(argv[i] + 4, NULL, 16);
  355. if (!strncmp(argv[i], "fa1=", 4)){
  356. qspi->sfa1ad = addr;
  357. /* assume there is no FA2 */
  358. qspi->sfa2ad = addr;
  359. /* assume there is no FB1 */
  360. qspi->sfb1ad = addr;
  361. } else if (!strncmp(argv[i], "fa2=", 4)) {
  362. /* FA2 can only be set if FA1 is already set */
  363. if (!qspi->sfa1ad)
  364. return CMD_RET_USAGE;
  365. qspi->sfa2ad = addr;
  366. /* assume there is no FB1 */
  367. qspi->sfb1ad = addr;
  368. } else if (!strncmp(argv[i], "fb1=", 4)) {
  369. /* FB1 can only be set if FA is already set */
  370. if (!qspi->sfa1ad)
  371. return CMD_RET_USAGE;
  372. qspi->sfb1ad = addr;
  373. /* assume there is no FB2 */
  374. qspi->sfb2ad = addr;
  375. } else if (!strncmp(argv[i], "fb2=", 4)) {
  376. if (!qspi->sfb1ad || !qspi->sfa1ad)
  377. return CMD_RET_USAGE;
  378. qspi->sfb2ad = addr;
  379. } else
  380. return CMD_RET_USAGE;
  381. }
  382. debug ("Init QuadSPI dev %d\n", qspidev);
  383. quadspi_init();
  384. return 0;
  385. }
  386. U_BOOT_CMD(
  387. qspiinit, 4, 0, quadspi_init_cmd,
  388. "initialize the QSPI",
  389. "qspiiint dev=X <fa1=A1> <fa2=A2> <fb1=B1> <fb2=B2>\n"
  390. " dev= set 0 for qspi0 and 1 for qsp1\n"
  391. " fa1= is the address of the top flash A1 device\n"
  392. " fa2= is the address of the top flash A2 device\n"
  393. " fb1= is the address of the top flash B1 device\n"
  394. " fb2= is the address of the top flash B2 device\n"
  395. " Note that fa1, fa2, fb1 and fb2 are optional but they must be listed\n "
  396. " in that order, you can not list fb1 before fa1 for instance\n"
  397. " Example1:\n"
  398. " Initialize QSPI0 using default values\n"
  399. " qspiinit dev=0\n"
  400. " Example2:\n"
  401. " Set FA1 and FB1\n"
  402. " qspiinit dev=0 fa1=0x21000000 fb1=0x22000000\n"
  403. ""
  404. );
  405. int quadspi_erase_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  406. {
  407. ulong addr;
  408. if (argc < 2)
  409. return CMD_RET_USAGE;
  410. addr = simple_strtoul(argv[1], NULL, 16);
  411. quadspi_erase_sector(addr);
  412. return 0;
  413. }
  414. U_BOOT_CMD(
  415. qspierase, 2, 0, quadspi_erase_cmd,
  416. "Erase whole QSPI memory",
  417. "qspierase addr\n"
  418. " Example:\n"
  419. " qspierase 0x20040000\n"
  420. ""
  421. );