drv_sfc.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502
  1. /*
  2. * drv_sfc.c
  3. *
  4. * Created on: 2016Äê4ÔÂ5ÈÕ
  5. * Author: Urey
  6. */
  7. /*********************************************************************************************************
  8. ** Include Files
  9. *********************************************************************************************************/
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include <cache.h>
  14. #include <sys/types.h>
  15. #include "board.h"
  16. #include "drv_clock.h"
  17. #include "drv_gpio.h"
  18. #include "drv_sfc.h"
  19. //#define SFC_DEBUG
  20. #if defined(SFC_DEBUG)
  21. #define SFC_DBG(...) rt_kprintf("[SFC]"),rt_kprintf(__VA_ARGS__)
  22. #else
  23. #define SFC_DBG(...)
  24. #endif
  25. #define L2CACHE_ALIGN_SIZE 256
  26. #define THRESHOLD 32
  27. #define PAGE_SIZE 4096
  28. /* Max time can take up to 3 seconds! */
  29. #define MAX_READY_WAIT_TIME 3000 /* the time of erase BE(64KB) */
  30. #define STATUS_SUSPND (1<<0)
  31. #define tCHSH 5 //hold
  32. #define tSLCH 5 //setup
  33. #define tSHSL_RD 20 //interval
  34. #define tSHSL_WR 30
  35. static void sfc_writel(struct sfc *sfc, uint16_t offset, u32 value)
  36. {
  37. writel(value, (uint32_t)sfc->iomem + offset);
  38. }
  39. static uint32_t sfc_readl(struct sfc *sfc, uint16_t offset)
  40. {
  41. return readl((uint32_t)sfc->iomem + offset);
  42. }
  43. static void sfc_init(struct sfc *sfc)
  44. {
  45. uint32_t n;
  46. for (n = 0; n < N_MAX; n++)
  47. {
  48. sfc_writel(sfc, SFC_TRAN_CONF(n), 0);
  49. sfc_writel(sfc, SFC_DEV_ADDR(n), 0);
  50. sfc_writel(sfc, SFC_DEV_ADDR_PLUS(n), 0);
  51. }
  52. //sfc_writel(sfc, SFC_GLB, ((1 << 7) | (1 << 3)));
  53. sfc_writel(sfc, SFC_DEV_CONF, 0);
  54. sfc_writel(sfc, SFC_DEV_STA_EXP, 0);
  55. sfc_writel(sfc, SFC_DEV_STA_MSK, 0);
  56. sfc_writel(sfc, SFC_TRAN_LEN, 0);
  57. sfc_writel(sfc, SFC_MEM_ADDR, 0);
  58. sfc_writel(sfc, SFC_TRIG, 0);
  59. sfc_writel(sfc, SFC_SCR, 0);
  60. sfc_writel(sfc, SFC_INTC, 0);
  61. sfc_writel(sfc, SFC_CGE, 0);
  62. sfc_writel(sfc, SFC_RM_DR, 0);
  63. }
  64. static void sfc_stop(struct sfc*sfc)
  65. {
  66. uint32_t tmp;
  67. tmp = sfc_readl(sfc, SFC_TRIG);
  68. tmp |= TRIG_STOP;
  69. sfc_writel(sfc, SFC_TRIG, tmp);
  70. }
  71. static void sfc_start(struct sfc *sfc)
  72. {
  73. uint32_t tmp;
  74. tmp = sfc_readl(sfc, SFC_TRIG);
  75. tmp |= TRIG_START;
  76. sfc_writel(sfc, SFC_TRIG, tmp);
  77. }
  78. static void sfc_flush_fifo(struct sfc *sfc)
  79. {
  80. uint32_t tmp;
  81. tmp = sfc_readl(sfc, SFC_TRIG);
  82. tmp |= TRIG_FLUSH;
  83. sfc_writel(sfc, SFC_TRIG, tmp);
  84. }
  85. static void sfc_ce_invalid_value(struct sfc *sfc, uint32_t value)
  86. {
  87. if (value == 0)
  88. {
  89. uint32_t tmp;
  90. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  91. tmp &= ~DEV_CONF_CEDL;
  92. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  93. }
  94. else
  95. {
  96. uint32_t tmp;
  97. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  98. tmp |= DEV_CONF_CEDL;
  99. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  100. }
  101. }
  102. static void sfc_hold_invalid_value(struct sfc *sfc, uint32_t value)
  103. {
  104. if (value == 0)
  105. {
  106. uint32_t tmp;
  107. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  108. tmp &= ~DEV_CONF_HOLDDL;
  109. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  110. }
  111. else
  112. {
  113. uint32_t tmp;
  114. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  115. tmp |= DEV_CONF_HOLDDL;
  116. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  117. }
  118. }
  119. static void sfc_wp_invalid_value(struct sfc *sfc, uint32_t value)
  120. {
  121. if (value == 0)
  122. {
  123. uint32_t tmp;
  124. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  125. tmp &= ~DEV_CONF_WPDL;
  126. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  127. }
  128. else
  129. {
  130. uint32_t tmp;
  131. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  132. tmp |= DEV_CONF_WPDL;
  133. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  134. }
  135. }
  136. static void sfc_clear_end_intc(struct sfc *sfc)
  137. {
  138. uint32_t tmp = 0;
  139. tmp = sfc_readl(sfc, SFC_SCR);
  140. tmp |= CLR_END;
  141. sfc_writel(sfc, SFC_SCR, tmp);
  142. tmp = sfc_readl(sfc, SFC_SCR);
  143. }
  144. static void sfc_clear_treq_intc(struct sfc *sfc)
  145. {
  146. uint32_t tmp = 0;
  147. tmp = sfc_readl(sfc, SFC_SCR);
  148. tmp |= CLR_TREQ;
  149. sfc_writel(sfc, SFC_SCR, tmp);
  150. }
  151. static void sfc_clear_rreq_intc(struct sfc *sfc)
  152. {
  153. uint32_t tmp = 0;
  154. tmp = sfc_readl(sfc, SFC_SCR);
  155. tmp |= CLR_RREQ;
  156. sfc_writel(sfc, SFC_SCR, tmp);
  157. }
  158. static void sfc_clear_over_intc(struct sfc *sfc)
  159. {
  160. uint32_t tmp = 0;
  161. tmp = sfc_readl(sfc, SFC_SCR);
  162. tmp |= CLR_OVER;
  163. sfc_writel(sfc, SFC_SCR, tmp);
  164. }
  165. static void sfc_clear_under_intc(struct sfc *sfc)
  166. {
  167. uint32_t tmp = 0;
  168. tmp = sfc_readl(sfc, SFC_SCR);
  169. tmp |= CLR_UNDER;
  170. sfc_writel(sfc, SFC_SCR, tmp);
  171. }
  172. static void sfc_clear_all_intc(struct sfc *sfc)
  173. {
  174. sfc_writel(sfc, SFC_SCR, 0x1f);
  175. }
  176. static void sfc_mask_all_intc(struct sfc *sfc)
  177. {
  178. sfc_writel(sfc, SFC_INTC, 0x1f);
  179. }
  180. static void sfc_mode(struct sfc *sfc, uint32_t channel, uint32_t value)
  181. {
  182. uint32_t tmp;
  183. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  184. tmp &= ~(TRAN_CONF_TRAN_MODE_MSK << TRAN_CONF_TRAN_MODE_OFFSET);
  185. tmp |= (value << TRAN_CONF_TRAN_MODE_OFFSET);
  186. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  187. }
  188. static void sfc_set_phase_num(struct sfc *sfc,uint32_t num)
  189. {
  190. uint32_t tmp;
  191. tmp = sfc_readl(sfc, SFC_GLB);
  192. tmp &= ~GLB_PHASE_NUM_MSK;
  193. tmp |= num << GLB_PHASE_NUM_OFFSET;
  194. sfc_writel(sfc, SFC_GLB, tmp);
  195. }
  196. static void sfc_clock_phase(struct sfc *sfc, uint32_t value)
  197. {
  198. if (value == 0)
  199. {
  200. uint32_t tmp;
  201. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  202. tmp &= ~DEV_CONF_CPHA;
  203. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  204. }
  205. else
  206. {
  207. uint32_t tmp;
  208. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  209. tmp |= DEV_CONF_CPHA;
  210. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  211. }
  212. }
  213. static void sfc_clock_polarity(struct sfc *sfc, uint32_t value)
  214. {
  215. if (value == 0)
  216. {
  217. uint32_t tmp;
  218. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  219. tmp &= ~DEV_CONF_CPOL;
  220. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  221. }
  222. else
  223. {
  224. uint32_t tmp;
  225. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  226. tmp |= DEV_CONF_CPOL;
  227. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  228. }
  229. }
  230. static void sfc_threshold(struct sfc *sfc, uint32_t value)
  231. {
  232. uint32_t tmp;
  233. tmp = sfc_readl(sfc, SFC_GLB);
  234. tmp &= ~GLB_THRESHOLD_MSK;
  235. tmp |= value << GLB_THRESHOLD_OFFSET;
  236. sfc_writel(sfc, SFC_GLB, tmp);
  237. }
  238. static void sfc_smp_delay(struct sfc *sfc, uint32_t value)
  239. {
  240. uint32_t tmp;
  241. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  242. tmp &= ~DEV_CONF_SMP_DELAY_MSK;
  243. tmp |= value << DEV_CONF_SMP_DELAY_OFFSET;
  244. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  245. }
  246. static void sfc_hold_delay(struct sfc *sfc, uint32_t value)
  247. {
  248. uint32_t tmp;
  249. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  250. tmp &= ~DEV_CONF_THOLD_MSK;
  251. tmp |= value << DEV_CONF_THOLD_OFFSET;
  252. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  253. }
  254. static void sfc_setup_delay(struct sfc *sfc, uint32_t value)
  255. {
  256. uint32_t tmp;
  257. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  258. tmp &= ~DEV_CONF_TSETUP_MSK;
  259. tmp |= value << DEV_CONF_TSETUP_OFFSET;
  260. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  261. }
  262. static void sfc_interval_delay(struct sfc *sfc, uint32_t value)
  263. {
  264. uint32_t tmp;
  265. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  266. tmp &= ~DEV_CONF_TSH_MSK;
  267. tmp |= value << DEV_CONF_TSH_OFFSET;
  268. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  269. }
  270. static void sfc_set_cmd_length(struct sfc *sfc, uint32_t value)
  271. {
  272. if (value == 1)
  273. {
  274. uint32_t tmp;
  275. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  276. tmp &= ~TRAN_CONF_CMD_LEN;
  277. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  278. }
  279. else
  280. {
  281. uint32_t tmp;
  282. tmp = sfc_readl(sfc, SFC_DEV_CONF);
  283. tmp |= TRAN_CONF_CMD_LEN;
  284. sfc_writel(sfc, SFC_DEV_CONF, tmp);
  285. }
  286. }
  287. static void sfc_transfer_direction(struct sfc *sfc, uint32_t value)
  288. {
  289. if (value == GLB_TRAN_DIR_READ)
  290. {
  291. uint32_t tmp;
  292. tmp = sfc_readl(sfc, SFC_GLB);
  293. tmp &= ~GLB_TRAN_DIR;
  294. sfc_writel(sfc, SFC_GLB, tmp);
  295. }
  296. else
  297. {
  298. uint32_t tmp;
  299. tmp = sfc_readl(sfc, SFC_GLB);
  300. tmp |= GLB_TRAN_DIR;
  301. sfc_writel(sfc, SFC_GLB, tmp);
  302. }
  303. }
  304. static int set_flash_timing(struct sfc *sfc, uint32_t t_hold, uint32_t t_setup, uint32_t t_shslrd, uint32_t t_shslwr)
  305. {
  306. uint32_t c_hold;
  307. uint32_t c_setup;
  308. uint32_t t_in, c_in, val;
  309. uint64_t cycle;
  310. cycle = 1000000000UL / sfc->src_clk;
  311. c_hold = t_hold / cycle;
  312. if (c_hold > 0)
  313. val = c_hold - 1;
  314. sfc_hold_delay(sfc, val);
  315. c_setup = t_setup / cycle;
  316. if(c_setup > 0)
  317. val = c_setup - 1;
  318. sfc_setup_delay(sfc, val);
  319. t_in = max(t_shslrd, t_shslwr);
  320. c_in = t_in / cycle;
  321. if(c_in > 0)
  322. val = c_in - 1;
  323. sfc_interval_delay(sfc, val);
  324. return 0;
  325. }
  326. static void sfc_set_length(struct sfc *sfc, uint32_t value)
  327. {
  328. sfc_writel(sfc, SFC_TRAN_LEN, value);
  329. }
  330. static void sfc_transfer_mode(struct sfc *sfc, uint32_t value)
  331. {
  332. if (value == 0)
  333. {
  334. uint32_t tmp;
  335. tmp = sfc_readl(sfc, SFC_GLB);
  336. tmp &= ~GLB_OP_MODE;
  337. sfc_writel(sfc, SFC_GLB, tmp);
  338. }
  339. else
  340. {
  341. uint32_t tmp;
  342. tmp = sfc_readl(sfc, SFC_GLB);
  343. tmp |= GLB_OP_MODE;
  344. sfc_writel(sfc, SFC_GLB, tmp);
  345. }
  346. }
  347. static void sfc_read_data(struct sfc *sfc, uint32_t *value)
  348. {
  349. *value = sfc_readl(sfc, SFC_RM_DR);
  350. }
  351. static void sfc_write_data(struct sfc *sfc, const uint32_t value)
  352. {
  353. sfc_writel(sfc, SFC_RM_DR, value);
  354. }
  355. uint32_t sfc_fifo_num(struct sfc *sfc)
  356. {
  357. uint32_t tmp;
  358. tmp = sfc_readl(sfc, SFC_SR);
  359. tmp &= (0x7f << 16);
  360. tmp = tmp >> 16;
  361. return tmp;
  362. }
  363. static uint32_t cpu_read_rxfifo(struct sfc *sfc)
  364. {
  365. uint32_t i;
  366. uint32_t align_len = 0;
  367. uint32_t fifo_num = 0;
  368. uint32_t data[1] = {0};
  369. uint32_t last_word = 0;
  370. align_len = RT_ALIGN(sfc->transfer->len, 4);
  371. if (((align_len - sfc->transfer->cur_len) / 4) > THRESHOLD)
  372. {
  373. fifo_num = THRESHOLD;
  374. last_word = 0;
  375. }
  376. else
  377. {
  378. /* last aligned THRESHOLD data*/
  379. if (sfc->transfer->len % 4)
  380. {
  381. fifo_num = (align_len - sfc->transfer->cur_len) / 4 - 1;
  382. last_word = 1;
  383. }
  384. else
  385. {
  386. fifo_num = (align_len - sfc->transfer->cur_len) / 4;
  387. last_word = 0;
  388. }
  389. }
  390. for (i = 0; i < fifo_num; i++)
  391. {
  392. sfc_read_data(sfc, (uint32_t *) sfc->transfer->data);
  393. sfc->transfer->data += 4;
  394. sfc->transfer->cur_len += 4;
  395. }
  396. /* last word */
  397. if (last_word == 1)
  398. {
  399. sfc_read_data(sfc, data);
  400. rt_memcpy((void *) sfc->transfer->data, data, sfc->transfer->len % 4);
  401. sfc->transfer->data += sfc->transfer->len % 4;
  402. sfc->transfer->cur_len += 4;
  403. }
  404. return 0;
  405. }
  406. static uint32_t cpu_write_txfifo(struct sfc *sfc)
  407. {
  408. uint32_t i;
  409. uint32_t align_len = 0;
  410. uint32_t fifo_num = 0;
  411. align_len = RT_ALIGN(sfc->transfer->len , 4);
  412. if (((align_len - sfc->transfer->cur_len) / 4) > THRESHOLD){
  413. fifo_num = THRESHOLD;
  414. } else {
  415. fifo_num = (align_len - sfc->transfer->cur_len) / 4;
  416. }
  417. for(i = 0; i < fifo_num; i++) {
  418. sfc_write_data(sfc, *(uint32_t *)sfc->transfer->data);
  419. sfc->transfer->data += 4;
  420. sfc->transfer->cur_len += 4;
  421. }
  422. return 0;
  423. }
  424. static int ssi_underrun(struct sfc *sfc)
  425. {
  426. uint32_t tmp;
  427. tmp = sfc_readl(sfc, SFC_SR);
  428. if(tmp & CLR_UNDER)
  429. return 1;
  430. else
  431. return 0;
  432. }
  433. static int ssi_overrun(struct sfc *sfc)
  434. {
  435. uint32_t tmp;
  436. tmp = sfc_readl(sfc, SFC_SR);
  437. if(tmp & CLR_OVER)
  438. return 1;
  439. else
  440. return 0;
  441. }
  442. static int rxfifo_rreq(struct sfc *sfc)
  443. {
  444. uint32_t tmp;
  445. tmp = sfc_readl(sfc, SFC_SR);
  446. if(tmp & CLR_RREQ)
  447. return 1;
  448. else
  449. return 0;
  450. }
  451. static int txfifo_treq(struct sfc *sfc)
  452. {
  453. uint32_t tmp;
  454. tmp = sfc_readl(sfc, SFC_SR);
  455. if(tmp & CLR_TREQ)
  456. return 1;
  457. else
  458. return 0;
  459. }
  460. static int sfc_end(struct sfc *sfc)
  461. {
  462. uint32_t tmp;
  463. tmp = sfc_readl(sfc, SFC_SR);
  464. if(tmp & CLR_END)
  465. return 1;
  466. else
  467. return 0;
  468. }
  469. static uint32_t sfc_get_sta_rt(struct sfc *sfc)
  470. {
  471. return sfc_readl(sfc,SFC_DEV_STA_RT);
  472. }
  473. static uint32_t sfc_get_fsm(struct sfc *sfc)
  474. {
  475. return sfc_readl(sfc,SFC_FSM);
  476. }
  477. static void sfc_set_addr_length(struct sfc *sfc, uint32_t channel, uint32_t value)
  478. {
  479. uint32_t tmp;
  480. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  481. tmp &= ~(ADDR_WIDTH_MSK);
  482. tmp |= (value << ADDR_WIDTH_OFFSET);
  483. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  484. }
  485. static void sfc_cmd_enble(struct sfc *sfc, uint32_t channel, uint32_t value)
  486. {
  487. if (value == ENABLE)
  488. {
  489. uint32_t tmp;
  490. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  491. tmp |= TRAN_CONF_CMDEN;
  492. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  493. }
  494. else
  495. {
  496. uint32_t tmp;
  497. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  498. tmp &= ~TRAN_CONF_CMDEN;
  499. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  500. }
  501. }
  502. static void sfc_data_en(struct sfc *sfc, uint32_t channel, uint32_t value)
  503. {
  504. if (value == 1)
  505. {
  506. uint32_t tmp;
  507. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  508. tmp |= TRAN_CONF_DATEEN;
  509. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  510. }
  511. else
  512. {
  513. uint32_t tmp;
  514. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  515. tmp &= ~TRAN_CONF_DATEEN;
  516. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  517. }
  518. }
  519. static void sfc_phase_format(struct sfc *sfc, uint32_t channel, uint32_t value)
  520. {
  521. if (value == 1)
  522. {
  523. uint32_t tmp;
  524. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  525. tmp |= TRAN_CONF_FMAT;
  526. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  527. }
  528. else
  529. {
  530. uint32_t tmp;
  531. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  532. tmp &= ~TRAN_CONF_FMAT;
  533. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  534. }
  535. }
  536. static void sfc_write_cmd(struct sfc *sfc, uint32_t channel, uint32_t value)
  537. {
  538. uint32_t tmp;
  539. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  540. tmp &= ~TRAN_CONF_CMD_MSK;
  541. tmp |= value;
  542. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  543. }
  544. static void sfc_dev_addr(struct sfc *sfc, uint32_t channel, uint32_t value)
  545. {
  546. sfc_writel(sfc, SFC_DEV_ADDR(channel), value);
  547. }
  548. static void sfc_dev_data_dummy_bytes(struct sfc *sfc, uint32_t channel, uint32_t value)
  549. {
  550. uint32_t tmp;
  551. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  552. tmp &= ~TRAN_CONF_DMYBITS_MSK;
  553. tmp |= value << DMYBITS_OFFSET;
  554. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  555. }
  556. static void sfc_dev_addr_plus(struct sfc *sfc, uint32_t channel, uint32_t value)
  557. {
  558. sfc_writel(sfc, SFC_DEV_ADDR_PLUS(channel), value);
  559. }
  560. static void sfc_dev_pollen(struct sfc *sfc, uint32_t channel, uint32_t value)
  561. {
  562. uint32_t tmp;
  563. tmp = sfc_readl(sfc, SFC_TRAN_CONF(channel));
  564. if(value == 1)
  565. tmp |= TRAN_CONF_POLLEN;
  566. else
  567. tmp &= ~(TRAN_CONF_POLLEN);
  568. sfc_writel(sfc, SFC_TRAN_CONF(channel), tmp);
  569. }
  570. static void sfc_dev_sta_exp(struct sfc *sfc, uint32_t value)
  571. {
  572. sfc_writel(sfc, SFC_DEV_STA_EXP, value);
  573. }
  574. static void sfc_dev_sta_msk(struct sfc *sfc, uint32_t value)
  575. {
  576. sfc_writel(sfc, SFC_DEV_STA_MSK, value);
  577. }
  578. static void sfc_enable_all_intc(struct sfc *sfc)
  579. {
  580. sfc_writel(sfc, SFC_INTC, 0);
  581. }
  582. static void sfc_set_mem_addr(struct sfc *sfc,uint32_t addr )
  583. {
  584. sfc_writel(sfc, SFC_MEM_ADDR, addr);
  585. }
  586. static int sfc_start_transfer(struct sfc *sfc)
  587. {
  588. int err;
  589. sfc_clear_all_intc(sfc);
  590. sfc_enable_all_intc(sfc);
  591. sfc_start(sfc);
  592. err = rt_completion_wait(&sfc->done,RT_TICK_PER_SECOND * 10);
  593. if (RT_EOK != err)
  594. {
  595. sfc_mask_all_intc(sfc);
  596. sfc_clear_all_intc(sfc);
  597. SFC_DBG("line:%d Timeout for ACK from SFC device\n", __LINE__);
  598. return -RT_ETIMEOUT;
  599. }
  600. return 0;
  601. }
  602. static void sfc_phase_transfer(struct sfc *sfc,struct sfc_transfer * transfer,uint32_t channel)
  603. {
  604. sfc_flush_fifo(sfc);
  605. sfc_set_addr_length(sfc,channel,transfer->addr_len);
  606. sfc_cmd_enble(sfc,channel,ENABLE);
  607. sfc_write_cmd(sfc,channel,transfer->cmd_info->cmd);
  608. sfc_dev_data_dummy_bytes(sfc,channel,transfer->data_dummy_bits);
  609. sfc_data_en(sfc,channel,transfer->cmd_info->dataen);
  610. sfc_dev_addr(sfc, channel,transfer->addr);
  611. sfc_dev_addr_plus(sfc,channel,transfer->addr_plus);
  612. sfc_mode(sfc,channel,transfer->sfc_mode);
  613. sfc_phase_format(sfc,channel,0);/*default 0,dummy bits is blow the addr*/
  614. }
  615. static void common_cmd_request_transfer(struct sfc *sfc,struct sfc_transfer *transfer,uint32_t channel)
  616. {
  617. sfc_phase_transfer(sfc,transfer,channel);
  618. sfc_dev_sta_exp(sfc,0);
  619. sfc_dev_sta_msk(sfc,0);
  620. sfc_dev_pollen(sfc,channel,DISABLE);
  621. }
  622. static void poll_cmd_request_transfer(struct sfc *sfc,struct sfc_transfer *transfer,uint32_t channel)
  623. {
  624. struct cmd_info *cmd = transfer->cmd_info;
  625. sfc_phase_transfer(sfc,transfer,channel);
  626. sfc_dev_sta_exp(sfc,cmd->sta_exp);
  627. sfc_dev_sta_msk(sfc,cmd->sta_msk);
  628. sfc_dev_pollen(sfc,channel,ENABLE);
  629. }
  630. static void sfc_glb_info_config(struct sfc *sfc,struct sfc_transfer *transfer)
  631. {
  632. sfc_transfer_direction(sfc, transfer->direction);
  633. if ((transfer->ops_mode == DMA_OPS))
  634. {
  635. sfc_set_length(sfc, transfer->len);
  636. if (transfer->direction == GLB_TRAN_DIR_READ)
  637. r4k_dma_cache_sync((uint32_t) transfer->data, transfer->len,
  638. DMA_FROM_DEVICE);
  639. else
  640. r4k_dma_cache_sync((uint32_t) transfer->data, transfer->len,
  641. DMA_TO_DEVICE);
  642. sfc_set_mem_addr(sfc, PHYS(transfer->data));
  643. sfc_transfer_mode(sfc, DMA_MODE);
  644. }
  645. else
  646. {
  647. sfc_set_length(sfc, transfer->len);
  648. sfc_set_mem_addr(sfc, 0);
  649. sfc_transfer_mode(sfc, SLAVE_MODE);
  650. }
  651. }
  652. #ifdef DEBUG
  653. static void dump_transfer(struct sfc_transfer *xfer,uint32_t num)
  654. {
  655. rt_kprintf("\n");
  656. rt_kprintf("cmd[%d].cmd = 0x%02x\n",num,xfer->cmd_info->cmd);
  657. rt_kprintf("cmd[%d].addr_len = %d\n",num,xfer->addr_len);
  658. rt_kprintf("cmd[%d].dummy_byte = %d\n",num,xfer->data_dummy_bits);
  659. rt_kprintf("cmd[%d].dataen = %d\n",num,xfer->cmd_info->dataen);
  660. rt_kprintf("cmd[%d].sta_exp = %d\n",num,xfer->cmd_info->sta_exp);
  661. rt_kprintf("cmd[%d].sta_msk = %d\n",num,xfer->cmd_info->sta_msk);
  662. rt_kprintf("transfer[%d].addr = 0x%08x\n",num,xfer->addr);
  663. rt_kprintf("transfer[%d].len = %d\n",num,xfer->len);
  664. rt_kprintf("transfer[%d].data = 0x%p\n",num,xfer->data);
  665. rt_kprintf("transfer[%d].direction = %d\n",num,xfer->direction);
  666. rt_kprintf("transfer[%d].sfc_mode = %d\n",num,xfer->sfc_mode);
  667. rt_kprintf("transfer[%d].ops_mode = %d\n",num,xfer->ops_mode);
  668. }
  669. #endif
  670. static int sfc_sync(struct sfc *sfc, struct sfc_message *message)
  671. {
  672. struct sfc_transfer *xfer;
  673. int phase_num = 0,ret = 0;
  674. sfc_set_length(sfc, 0);
  675. rt_list_for_each_entry(xfer, &message->transfers, transfer_list)
  676. {
  677. if (xfer->cmd_info->sta_msk == 0)
  678. {
  679. common_cmd_request_transfer(sfc, xfer, phase_num);
  680. }
  681. else
  682. {
  683. poll_cmd_request_transfer(sfc, xfer, phase_num);
  684. }
  685. if (xfer->addr_len || xfer->len)
  686. sfc_glb_info_config(sfc, xfer);
  687. phase_num++;
  688. message->actual_length += xfer->len;
  689. if (xfer->len > 0)
  690. sfc->transfer = xfer;
  691. }
  692. sfc_set_phase_num(sfc,phase_num);
  693. ret = sfc_start_transfer(sfc);
  694. rt_list_remove(&message->transfers);
  695. return ret;
  696. }
  697. static void sfc_transfer_del(struct sfc_transfer *t)
  698. {
  699. rt_list_remove(&t->transfer_list);
  700. }
  701. static void sfc_message_add_tail(struct sfc_transfer *t, struct sfc_message *m)
  702. {
  703. rt_list_insert_before(&m->transfers, &t->transfer_list);
  704. }
  705. static void sfc_message_init(struct sfc_message *m)
  706. {
  707. rt_memset(m, 0, sizeof *m);
  708. rt_list_init(&m->transfers);
  709. }
  710. static void jz_sfc_pio_irq(int vector,void *param)
  711. {
  712. struct sfc *sfc = (struct sfc *)param;
  713. if (ssi_underrun(sfc))
  714. {
  715. sfc_clear_under_intc(sfc);
  716. rt_completion_done(&sfc->done);
  717. return ;
  718. }
  719. if (ssi_overrun(sfc))
  720. {
  721. sfc_clear_over_intc(sfc);
  722. rt_completion_done(&sfc->done);
  723. return ;
  724. }
  725. if (rxfifo_rreq(sfc))
  726. {
  727. sfc_clear_rreq_intc(sfc);
  728. cpu_read_rxfifo(sfc);
  729. return ;
  730. }
  731. if (txfifo_treq(sfc))
  732. {
  733. sfc_clear_treq_intc(sfc);
  734. cpu_write_txfifo(sfc);
  735. return ;
  736. }
  737. if (sfc_end(sfc))
  738. {
  739. sfc_mask_all_intc(sfc);
  740. sfc_clear_end_intc(sfc);
  741. rt_completion_done(&sfc->done);
  742. return ;
  743. }
  744. }
  745. static int jz_sfc_init_setup(struct sfc *sfc)
  746. {
  747. sfc_init(sfc);
  748. sfc_stop(sfc);
  749. /*set hold high*/
  750. sfc_hold_invalid_value(sfc, 1);
  751. /*set wp high*/
  752. sfc_wp_invalid_value(sfc, 1);
  753. sfc_clear_all_intc(sfc);
  754. sfc_mask_all_intc(sfc);
  755. sfc_threshold(sfc, sfc->threshold);
  756. /*config the sfc pin init state*/
  757. sfc_clock_phase(sfc, 0);
  758. sfc_clock_polarity(sfc, 0);
  759. sfc_ce_invalid_value(sfc, 1);
  760. sfc_transfer_mode(sfc, SLAVE_MODE);
  761. if (sfc->src_clk >= 100000000)
  762. {
  763. sfc_smp_delay(sfc, DEV_CONF_HALF_CYCLE_DELAY);
  764. }
  765. return 0;
  766. }
  767. static struct sfc* jz_sfc_init(void)
  768. {
  769. struct sfc *sfc = (struct sfc *)rt_malloc(sizeof(struct sfc));
  770. if(sfc == RT_NULL)
  771. return RT_NULL;
  772. sfc->iomem = (void *)SFC_BASE;
  773. sfc->irq = IRQ_SFC;
  774. sfc->clk = clk_get("cgu_ssi");
  775. sfc->clk_gate = clk_get("sfc");
  776. sfc->src_clk = 100000000L;
  777. if(clk_get_rate(sfc->clk) >= sfc->src_clk)
  778. clk_set_rate(sfc->clk, sfc->src_clk);
  779. else
  780. clk_set_rate(sfc->clk, sfc->src_clk);
  781. clk_enable(sfc->clk);
  782. clk_enable(sfc->clk_gate);
  783. sfc->threshold = THRESHOLD;
  784. /* Init IPC */
  785. rt_completion_init(&(sfc->done));
  786. /* Request SFC IRQ */
  787. rt_hw_interrupt_install(sfc->irq,jz_sfc_pio_irq,sfc,"SFC");
  788. rt_hw_interrupt_umask(sfc->irq);
  789. /* SFC controller initializations for SFC */
  790. jz_sfc_init_setup(sfc);
  791. rt_completion_init(&sfc->done);
  792. return sfc;
  793. }
  794. static int sfc_flash_read_id(struct sfc_flash *flash, uint8_t command, uint32_t addr, uint32_t addr_len, size_t len, uint32_t dummy_byte)
  795. {
  796. struct sfc_transfer transfer;
  797. struct sfc_message message;
  798. struct cmd_info cmd;
  799. int ret;
  800. uint32_t chip_id = 0;
  801. sfc_message_init(&message);
  802. rt_memset(&transfer, 0, sizeof(transfer));
  803. rt_memset(&cmd, 0, sizeof(cmd));
  804. cmd.cmd = command;
  805. cmd.dataen = ENABLE;
  806. transfer.addr_len = addr_len;
  807. transfer.data_dummy_bits = dummy_byte;
  808. transfer.addr = addr;
  809. transfer.len = len;
  810. transfer.data =(uint8_t *)&chip_id;
  811. transfer.ops_mode = CPU_OPS;
  812. transfer.sfc_mode = TM_STD_SPI;
  813. transfer.direction = GLB_TRAN_DIR_READ;
  814. transfer.cmd_info = &cmd;
  815. sfc_message_add_tail(&transfer, &message);
  816. ret = sfc_sync(flash->sfc, &message);
  817. if (ret)
  818. {
  819. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  820. ret = -RT_EIO;
  821. }
  822. return chip_id & 0x00ffffff;
  823. }
  824. static uint32_t sfc_flash_do_read(struct sfc_flash *flash,uint8_t command,uint32_t addr,uint32_t addr_len,uint8_t *buf,size_t len,uint32_t dummy_byte)
  825. {
  826. struct sfc_transfer transfer;
  827. struct sfc_message message;
  828. struct cmd_info cmd;
  829. int ret;
  830. sfc_message_init(&message);
  831. rt_memset(&transfer, 0, sizeof(transfer));
  832. rt_memset(&cmd, 0, sizeof(cmd));
  833. cmd.cmd = command;
  834. cmd.dataen = ENABLE;
  835. transfer.addr_len = addr_len;
  836. transfer.data_dummy_bits = dummy_byte;
  837. transfer.addr = addr;
  838. transfer.len = len;
  839. transfer.data = buf;
  840. transfer.cur_len = 0;
  841. if(len >= L2CACHE_ALIGN_SIZE)
  842. transfer.ops_mode = DMA_OPS;
  843. else
  844. transfer.ops_mode = CPU_OPS;
  845. transfer.sfc_mode = flash->sfc_mode;
  846. transfer.direction = GLB_TRAN_DIR_READ;
  847. transfer.cmd_info = &cmd;
  848. sfc_message_add_tail(&transfer, &message);
  849. ret = sfc_sync(flash->sfc, &message);
  850. if (ret)
  851. {
  852. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  853. ret = -RT_EIO;
  854. }
  855. /*fix the cache line problem,when use jffs2 filesystem must be flush cache twice*/
  856. if(transfer.ops_mode == DMA_OPS)
  857. r4k_dma_cache_sync((rt_base_t)buf, len, DMA_FROM_DEVICE);
  858. return message.actual_length;
  859. }
  860. static unsigned int sfc_flash_do_write(struct sfc_flash *flash,uint8_t command,uint32_t addr,uint32_t addr_len,const uint8_t *buf,size_t len,uint32_t dummy_byte)
  861. {
  862. struct sfc_transfer transfer[3];
  863. struct sfc_message message;
  864. struct cmd_info cmd[3];
  865. int ret;
  866. sfc_message_init(&message);
  867. rt_memset(&transfer, 0, sizeof(transfer));
  868. rt_memset(&cmd, 0, sizeof(cmd));
  869. /* write enable */
  870. cmd[0].cmd = CMD_WREN;
  871. cmd[0].dataen = DISABLE;
  872. transfer[0].cmd_info = &cmd[0];
  873. transfer[0].sfc_mode = flash->sfc_mode;
  874. sfc_message_add_tail(&transfer[0], &message);
  875. /* write ops */
  876. cmd[1].cmd = command;
  877. cmd[1].dataen = ENABLE;
  878. transfer[1].addr = addr;
  879. transfer[1].addr_len = addr_len;
  880. transfer[1].len = len;
  881. transfer[1].cur_len = 0;
  882. transfer[1].data_dummy_bits = dummy_byte;
  883. transfer[1].data = buf;
  884. if(len >= L2CACHE_ALIGN_SIZE)
  885. transfer[1].ops_mode = DMA_OPS;
  886. else
  887. transfer[1].ops_mode = CPU_OPS;
  888. transfer[1].sfc_mode = flash->sfc_mode;
  889. transfer[1].direction = GLB_TRAN_DIR_WRITE;
  890. transfer[1].cmd_info = &cmd[1];
  891. sfc_message_add_tail(&transfer[1], &message);
  892. cmd[2].cmd = CMD_RDSR;
  893. cmd[2].dataen = DISABLE;
  894. cmd[2].sta_exp = 0;
  895. cmd[2].sta_msk = 0x1;
  896. transfer[2].cmd_info = &cmd[2];
  897. sfc_message_add_tail(&transfer[2], &message);
  898. ret = sfc_sync(flash->sfc, &message);
  899. if (ret)
  900. {
  901. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  902. ret = -RT_EIO;
  903. }
  904. return message.actual_length;
  905. }
  906. #ifdef SFC_USE_QUAD
  907. static int sfc_flash_set_quad_mode(struct sfc_flash *flash)
  908. {
  909. uint8_t command;
  910. uint32_t sent_data,len,dummy_byte;
  911. int ret;
  912. struct sfc_transfer transfer[3];
  913. struct sfc_message message;
  914. struct cmd_info cmd[3];
  915. if (flash->quad_mode == NULL)
  916. {
  917. SFC_DBG("quad info is null, use standard spi mode\n");
  918. flash->sfc_mode = TM_STD_SPI;
  919. return -1;
  920. }
  921. command = flash->quad_mode->WRSR_CMD;
  922. sent_data = flash->quad_mode->WRSR_DATE;
  923. len = flash->quad_mode->WD_DATE_SIZE;
  924. dummy_byte = flash->quad_mode->dummy_byte;
  925. sfc_message_init(&message);
  926. rt_memset(&transfer, 0, sizeof(transfer));
  927. rt_memset(&cmd, 0, sizeof(cmd));
  928. /* write enable */
  929. cmd[0].cmd = CMD_WREN;
  930. cmd[0].dataen = DISABLE;
  931. transfer[0].cmd_info = &cmd[0];
  932. transfer[0].sfc_mode = TM_STD_SPI;
  933. sfc_message_add_tail(&transfer[0], &message);
  934. /* write ops */
  935. cmd[1].cmd = command;
  936. cmd[1].dataen = ENABLE;
  937. transfer[1].len = len;
  938. transfer[1].data = (const uint8_t *)&sent_data;
  939. transfer[1].data_dummy_bits = dummy_byte;
  940. transfer[1].ops_mode = CPU_OPS;
  941. transfer[1].sfc_mode = TM_STD_SPI;
  942. transfer[1].direction = GLB_TRAN_DIR_WRITE;
  943. transfer[1].cmd_info = &cmd[1];
  944. sfc_message_add_tail(&transfer[1], &message);
  945. cmd[2].cmd = flash->quad_mode->RDSR_CMD;
  946. cmd[2].dataen = DISABLE;
  947. cmd[2].sta_exp = 0x2;
  948. cmd[2].sta_msk = 0x2;
  949. transfer[2].data_dummy_bits = 0;
  950. transfer[2].cmd_info = &cmd[2];
  951. sfc_message_add_tail(&transfer[2], &message);
  952. ret = sfc_sync(flash->sfc, &message);
  953. if (ret)
  954. {
  955. flash->sfc_mode = TM_STD_SPI;
  956. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  957. ret = -RT_EIO;
  958. }
  959. else
  960. {
  961. flash->sfc_mode = flash->quad_mode->sfc_mode;
  962. }
  963. return 0;
  964. }
  965. #endif
  966. static int sfc_flash_write(struct sfc_flash *flash, rt_off_t to, size_t len, const uint8_t *buf)
  967. {
  968. uint8_t command;
  969. int dummy_byte = 0;
  970. uint32_t s_len = 0, f_len = 0, a_len = 0;
  971. #ifdef SFC_USE_QUAD
  972. if((flash->sfc_mode == TM_QI_QO_SPI) || (flash->sfc_mode == TM_QIO_SPI) || (flash->sfc_mode == TM_FULL_QIO_SPI))
  973. {
  974. command = CMD_PP;
  975. }
  976. else
  977. {
  978. command = CMD_PP;
  979. }
  980. #else
  981. command = CMD_PP;
  982. #endif
  983. if (len > L2CACHE_ALIGN_SIZE)
  984. {
  985. s_len = RT_ALIGN((uint32_t )buf, L2CACHE_ALIGN_SIZE) - (uint32_t)buf;
  986. if (s_len)
  987. {
  988. sfc_flash_do_write(flash, command, (uint32_t) to, flash->addrsize, buf, s_len, dummy_byte);
  989. }
  990. a_len = (len - s_len) - (len - s_len) % L2CACHE_ALIGN_SIZE;
  991. if (a_len)
  992. {
  993. sfc_flash_do_write(flash, command, (uint32_t) to + s_len,
  994. flash->addrsize, &buf[s_len], a_len, dummy_byte);
  995. }
  996. f_len = len - s_len - a_len;
  997. if (f_len)
  998. {
  999. sfc_flash_do_write(flash, command, (uint32_t) to + s_len + a_len,
  1000. flash->addrsize, &buf[s_len + a_len], f_len,
  1001. dummy_byte);
  1002. }
  1003. }
  1004. else
  1005. {
  1006. sfc_flash_do_write(flash, command, (uint32_t) to, flash->addrsize,
  1007. buf, len, dummy_byte);
  1008. }
  1009. return len;
  1010. }
  1011. static int sfc_flash_read_cacheline_align(struct sfc_flash *flash,uint8_t command,uint32_t addr,int addr_len,uint8_t *buf,size_t len,int dummy_byte)
  1012. {
  1013. uint32_t ret = 0;
  1014. uint32_t s_len = 0, f_len = 0, a_len = 0;
  1015. /**
  1016. * s_len : start not align length
  1017. * a_len : middle align length
  1018. * f_len : end not align length
  1019. */
  1020. if (len > L2CACHE_ALIGN_SIZE)
  1021. {
  1022. s_len = RT_ALIGN((uint32_t )buf, L2CACHE_ALIGN_SIZE) - (uint32_t)buf;
  1023. if (s_len)
  1024. {
  1025. ret += sfc_flash_do_read(flash, command, (uint32_t) addr,
  1026. flash->addrsize, buf, s_len, dummy_byte);
  1027. }
  1028. a_len = (len - s_len) - (len - s_len) % L2CACHE_ALIGN_SIZE;
  1029. if (a_len)
  1030. {
  1031. ret += sfc_flash_do_read(flash, command, (uint32_t) addr + s_len,
  1032. flash->addrsize, &buf[s_len], a_len,
  1033. dummy_byte);
  1034. }
  1035. f_len = len - s_len - a_len;
  1036. if (f_len)
  1037. {
  1038. ret += sfc_flash_do_read(flash, command,
  1039. (uint32_t) addr + s_len + a_len,
  1040. flash->addrsize, &buf[s_len + a_len], f_len,
  1041. dummy_byte);
  1042. }
  1043. } else {
  1044. ret = sfc_flash_do_read(flash, command, (uint32_t)addr, flash->addrsize, buf, len, dummy_byte);
  1045. }
  1046. return ret;
  1047. }
  1048. static int sfc_flash_read(struct sfc_flash *flash, rt_off_t from, size_t len, uint8_t *buf)
  1049. {
  1050. uint8_t command;
  1051. int dummy_byte;
  1052. int tmp_len = 0, current_len = 0;
  1053. #ifdef SFC_USE_QUAD
  1054. if((flash->sfc_mode == TM_QI_QO_SPI) || (flash->sfc_mode == TM_QIO_SPI) || (flash->sfc_mode == TM_FULL_QIO_SPI))
  1055. {
  1056. command = flash->quad_mode->cmd_read;
  1057. dummy_byte = flash->quad_mode->dummy_byte;
  1058. }
  1059. else
  1060. {
  1061. command = CMD_READ;
  1062. dummy_byte = 0;
  1063. }
  1064. #else
  1065. command = CMD_READ;
  1066. dummy_byte = 0;
  1067. #endif
  1068. while (len)
  1069. {
  1070. tmp_len = sfc_flash_read_cacheline_align(flash, command,
  1071. (uint32_t) from + current_len,
  1072. flash->addrsize,
  1073. &buf[current_len], len, dummy_byte);
  1074. current_len += tmp_len;
  1075. len -= tmp_len;
  1076. }
  1077. return current_len;
  1078. }
  1079. int sfc_norflash_set_addr_width_4byte(struct sfc_flash *flash,int on)
  1080. {
  1081. struct sfc_transfer transfer;
  1082. struct sfc_message message;
  1083. struct cmd_info cmd;
  1084. int ret;
  1085. sfc_message_init(&message);
  1086. rt_memset(&transfer, 0, sizeof(transfer));
  1087. rt_memset(&cmd, 0, sizeof(cmd));
  1088. cmd.cmd = CMD_EN4B;
  1089. cmd.dataen = DISABLE;
  1090. transfer.data_dummy_bits = 0;
  1091. transfer.cmd_info = &cmd;
  1092. sfc_message_add_tail(&transfer, &message);
  1093. ret = sfc_sync(flash->sfc, &message);
  1094. if (ret)
  1095. {
  1096. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  1097. ret = -RT_EIO;
  1098. }
  1099. return 0;
  1100. }
  1101. size_t sfc_norflash_read(struct sfc_flash *flash, rt_off_t from, uint8_t *buf, size_t len)
  1102. {
  1103. size_t retlen;
  1104. rt_mutex_take(&flash->lock,RT_WAITING_FOREVER);
  1105. retlen = sfc_flash_read(flash, from, len, buf);
  1106. rt_mutex_release(&flash->lock);
  1107. return retlen;
  1108. }
  1109. int sfc_norflash_read_params(struct sfc_flash *flash, rt_off_t from, size_t len, uint8_t *buf)
  1110. {
  1111. struct sfc_transfer transfer;
  1112. struct sfc_message message;
  1113. struct cmd_info cmd;
  1114. uint8_t command;
  1115. int dummy_byte = 0,ret;
  1116. command = CMD_READ;
  1117. rt_mutex_take(&flash->lock,RT_WAITING_FOREVER);
  1118. sfc_message_init(&message);
  1119. rt_memset(&transfer, 0, sizeof(transfer));
  1120. rt_memset(&cmd, 0, sizeof(cmd));
  1121. cmd.cmd = command;
  1122. cmd.dataen = ENABLE;
  1123. transfer.addr = (uint32_t)from;
  1124. transfer.len = len;
  1125. transfer.data = buf;
  1126. transfer.addr_len = DEFAULT_ADDRSIZE;
  1127. transfer.data_dummy_bits = dummy_byte;
  1128. transfer.ops_mode = CPU_OPS;
  1129. transfer.direction = GLB_TRAN_DIR_READ;
  1130. transfer.sfc_mode = TM_STD_SPI;
  1131. transfer.cmd_info = &cmd;
  1132. sfc_message_add_tail(&transfer, &message);
  1133. ret = sfc_sync(flash->sfc, &message);
  1134. if (ret)
  1135. {
  1136. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  1137. ret = -RT_EIO;
  1138. }
  1139. /*fix the cache line problem,when use jffs2 filesystem must be flush cache twice*/
  1140. if(transfer.ops_mode == DMA_OPS)
  1141. r4k_dma_cache_sync((rt_ubase_t)buf,len, DMA_FROM_DEVICE);
  1142. rt_mutex_release(&flash->lock);
  1143. return 0;
  1144. }
  1145. int sfc_norflash_erase_sector(struct sfc_flash *flash, uint32_t addr)
  1146. {
  1147. uint8_t command;
  1148. struct sfc_transfer transfer[3];
  1149. struct sfc_message message;
  1150. struct cmd_info cmd[3];
  1151. int ret;
  1152. rt_mutex_take(&flash->lock,RT_WAITING_FOREVER);
  1153. sfc_message_init(&message);
  1154. rt_memset(&transfer, 0, sizeof(transfer));
  1155. rt_memset(&cmd, 0, sizeof(cmd));
  1156. /* write enable */
  1157. cmd[0].cmd = CMD_WREN;
  1158. cmd[0].dataen = DISABLE;
  1159. transfer[0].sfc_mode = TM_STD_SPI;
  1160. transfer[0].cmd_info = &cmd[0];
  1161. sfc_message_add_tail(&transfer[0], &message);
  1162. switch (flash->erasesize)
  1163. {
  1164. case 0x1000:
  1165. command = CMD_BE_4K;
  1166. break;
  1167. case 0x8000:
  1168. command = CMD_BE_32K;
  1169. break;
  1170. case 0x10000:
  1171. command = CMD_BE_64K;
  1172. break;
  1173. }
  1174. /* erase ops */
  1175. cmd[1].cmd = command;
  1176. cmd[1].dataen = DISABLE;
  1177. transfer[1].addr_len = flash->addrsize;
  1178. transfer[1].data_dummy_bits = 0;
  1179. transfer[1].addr = addr;
  1180. transfer[1].sfc_mode = TM_STD_SPI;
  1181. transfer[1].direction = GLB_TRAN_DIR_WRITE;
  1182. transfer[1].cmd_info = &cmd[1];
  1183. sfc_message_add_tail(&transfer[1], &message);
  1184. cmd[2].cmd = CMD_RDSR;
  1185. cmd[2].dataen = DISABLE;
  1186. cmd[2].sta_exp = 0;
  1187. cmd[2].sta_msk = 0x1;
  1188. transfer[2].cmd_info = &cmd[2];
  1189. sfc_message_add_tail(&transfer[2], &message);
  1190. ret = sfc_sync(flash->sfc, &message);
  1191. if (ret)
  1192. {
  1193. SFC_DBG("sfc_sync error ! %s %s %d\n", __FILE__, __func__, __LINE__);
  1194. ret = -RT_EIO;
  1195. }
  1196. rt_mutex_release(&flash->lock);
  1197. return 0;
  1198. }
  1199. size_t sfc_norflash_write(struct sfc_flash *flash, rt_off_t to, const uint8_t *buf, size_t len)
  1200. {
  1201. size_t retlen;
  1202. u32 page_offset, actual_len;
  1203. int ret;
  1204. rt_mutex_take(&flash->lock,RT_WAITING_FOREVER);
  1205. page_offset = to & (flash->pagesize - 1);
  1206. /* do all the bytes fit onto one page? */
  1207. if (page_offset + len <= flash->pagesize)
  1208. {
  1209. ret = sfc_flash_write(flash, to, len, buf);
  1210. retlen = ret;
  1211. }
  1212. else
  1213. {
  1214. u32 i;
  1215. /* the size of data remaining on the first page */
  1216. actual_len = flash->pagesize - page_offset;
  1217. ret = sfc_flash_write(flash,to,actual_len,buf);
  1218. retlen += ret;
  1219. /* write everything in flash->page_size chunks */
  1220. for (i = actual_len; i < len; i += flash->writesize)
  1221. {
  1222. actual_len = len - i;
  1223. if (actual_len >= flash->writesize)
  1224. actual_len = flash->writesize;
  1225. ret = sfc_flash_write(flash, to + i, actual_len, buf + i);
  1226. retlen += ret;
  1227. }
  1228. }
  1229. rt_mutex_release(&flash->lock);
  1230. return retlen;
  1231. }
  1232. int sfc_norflash_probe(struct sfc_flash *flash)
  1233. {
  1234. struct sfc *sfc;
  1235. sfc = flash->sfc = jz_sfc_init();
  1236. if(sfc == RT_NULL)
  1237. return -RT_EIO;
  1238. /* GPIO Initialize (SFC FUNC1) */
  1239. gpio_set_func(GPIO_PORT_A,GPIO_Pin_26,GPIO_FUNC_1); //CLK
  1240. gpio_set_func(GPIO_PORT_A,GPIO_Pin_27,GPIO_FUNC_1); //CE
  1241. gpio_set_func(GPIO_PORT_A,GPIO_Pin_28,GPIO_FUNC_1); //DR
  1242. gpio_set_func(GPIO_PORT_A,GPIO_Pin_29,GPIO_FUNC_1); //DT
  1243. gpio_set_func(GPIO_PORT_A,GPIO_Pin_30,GPIO_FUNC_1); //WP
  1244. gpio_set_func(GPIO_PORT_A,GPIO_Pin_31,GPIO_FUNC_1); //HOLD
  1245. /* init mutex */
  1246. if(rt_mutex_init(&(flash->lock),"norLock",RT_IPC_FLAG_FIFO) != RT_EOK)
  1247. {
  1248. SFC_DBG("Init mutex error\n");
  1249. RT_ASSERT(0);
  1250. }
  1251. rt_mutex_take(&(flash->lock),RT_WAITING_FOREVER);
  1252. //get ID
  1253. {
  1254. uint8_t command;
  1255. int dummy_byte = 0;
  1256. int addr_len = 0;
  1257. int len = 3;
  1258. int addr = 0;
  1259. int id;
  1260. int i;
  1261. struct spi_nor_platform_data *flash_info;
  1262. struct spi_board_info *binfo;
  1263. command = CMD_RDID;
  1264. SFC_DBG("Get ID:\n");
  1265. id = sfc_flash_read_id(flash, command, addr, addr_len, len, dummy_byte);
  1266. id = ((id & 0xff) << 16) | (((id >> 8) & 0xff) << 8) | ((id >> 16) & 0xff);
  1267. SFC_DBG("id = %06x\n",id);
  1268. flash->id = id;
  1269. }
  1270. #if 0
  1271. //get UID
  1272. {
  1273. int i;
  1274. sfc_flash_do_read(flash,CMD_RUID,0,3,flash->uid,8,8);
  1275. SFC_DBG("uid = ");
  1276. for (i = 0; i < 8; ++i) {
  1277. SFC_DBG("%02x ",flash->uid[i]);
  1278. }
  1279. SFC_DBG("\n");
  1280. }
  1281. #endif
  1282. rt_mutex_release(&(flash->lock));
  1283. return 0;
  1284. }