spi.c 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581
  1. /* Copyright 2018 Canaan Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include <bsp.h>
  16. #include <stddef.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include "fpioa.h"
  20. #include "gpiohs.h"
  21. #include "platform.h"
  22. #include "spi.h"
  23. #include "sysctl.h"
  24. #include "utils.h"
  25. #include "iomem.h"
  26. volatile spi_t *const spi[4] =
  27. {
  28. (volatile spi_t *)SPI0_BASE_ADDR,
  29. (volatile spi_t *)SPI1_BASE_ADDR,
  30. (volatile spi_t *)SPI_SLAVE_BASE_ADDR,
  31. (volatile spi_t *)SPI3_BASE_ADDR};
  32. typedef struct _spi_dma_context
  33. {
  34. uint8_t *buffer;
  35. size_t buf_len;
  36. uint32_t *malloc_buffer;
  37. spi_transfer_mode_t int_mode;
  38. dmac_channel_number_t dmac_channel;
  39. spi_device_num_t spi_num;
  40. plic_instance_t spi_int_instance;
  41. } spi_dma_context_t;
  42. spi_dma_context_t spi_dma_context[4];
  43. typedef struct _spi_instance_t
  44. {
  45. spi_device_num_t spi_num;
  46. spi_transfer_mode_t transfer_mode;
  47. dmac_channel_number_t dmac_channel;
  48. plic_instance_t spi_int_instance;
  49. spinlock_t lock;
  50. } spi_instance_t;
  51. static spi_instance_t g_spi_instance[4];
  52. static spi_slave_instance_t g_instance;
  53. static spi_frame_format_t spi_get_frame_format(spi_device_num_t spi_num)
  54. {
  55. uint8_t frf_offset;
  56. switch(spi_num)
  57. {
  58. case 0:
  59. case 1:
  60. frf_offset = 21;
  61. break;
  62. case 2:
  63. configASSERT(!"Spi Bus 2 Not Support!");
  64. break;
  65. case 3:
  66. default:
  67. frf_offset = 22;
  68. break;
  69. }
  70. volatile spi_t *spi_adapter = spi[spi_num];
  71. return ((spi_adapter->ctrlr0 >> frf_offset) & 0x3);
  72. }
  73. static spi_transfer_width_t spi_get_frame_size(size_t data_bit_length)
  74. {
  75. if(data_bit_length < 8)
  76. return SPI_TRANS_CHAR;
  77. else if(data_bit_length < 16)
  78. return SPI_TRANS_SHORT;
  79. return SPI_TRANS_INT;
  80. }
  81. static int spi_dma_irq(void *ctx)
  82. {
  83. spi_instance_t *v_instance = (spi_instance_t *)ctx;
  84. volatile spi_t *spi_handle = spi[v_instance->spi_num];
  85. dmac_irq_unregister(v_instance->dmac_channel);
  86. while((spi_handle->sr & 0x05) != 0x04)
  87. ;
  88. spi_handle->ser = 0x00;
  89. spi_handle->ssienr = 0x00;
  90. spinlock_unlock(&v_instance->lock);
  91. if(v_instance->spi_int_instance.callback)
  92. {
  93. v_instance->spi_int_instance.callback(v_instance->spi_int_instance.ctx);
  94. }
  95. return 0;
  96. }
  97. static int spi_clk_init(uint8_t spi_num)
  98. {
  99. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  100. if(spi_num == 3)
  101. sysctl_clock_set_clock_select(SYSCTL_CLOCK_SELECT_SPI3, 1);
  102. sysctl_clock_enable(SYSCTL_CLOCK_SPI0 + spi_num);
  103. sysctl_clock_set_threshold(SYSCTL_THRESHOLD_SPI0 + spi_num, 0);
  104. return 0;
  105. }
  106. static void spi_set_tmod(uint8_t spi_num, uint32_t tmod)
  107. {
  108. configASSERT(spi_num < SPI_DEVICE_MAX);
  109. volatile spi_t *spi_handle = spi[spi_num];
  110. uint8_t tmod_offset = 0;
  111. switch(spi_num)
  112. {
  113. case 0:
  114. case 1:
  115. case 2:
  116. tmod_offset = 8;
  117. break;
  118. case 3:
  119. default:
  120. tmod_offset = 10;
  121. break;
  122. }
  123. set_bit(&spi_handle->ctrlr0, 3 << tmod_offset, tmod << tmod_offset);
  124. }
  125. void spi_init(spi_device_num_t spi_num, spi_work_mode_t work_mode, spi_frame_format_t frame_format,
  126. size_t data_bit_length, uint32_t endian)
  127. {
  128. configASSERT(data_bit_length >= 4 && data_bit_length <= 32);
  129. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  130. spi_clk_init(spi_num);
  131. uint8_t dfs_offset, frf_offset, work_mode_offset;
  132. switch(spi_num)
  133. {
  134. case 0:
  135. case 1:
  136. dfs_offset = 16;
  137. frf_offset = 21;
  138. work_mode_offset = 6;
  139. break;
  140. case 2:
  141. configASSERT(!"Spi Bus 2 Not Support!");
  142. break;
  143. case 3:
  144. default:
  145. dfs_offset = 0;
  146. frf_offset = 22;
  147. work_mode_offset = 8;
  148. break;
  149. }
  150. switch(frame_format)
  151. {
  152. case SPI_FF_DUAL:
  153. configASSERT(data_bit_length % 2 == 0);
  154. break;
  155. case SPI_FF_QUAD:
  156. configASSERT(data_bit_length % 4 == 0);
  157. break;
  158. case SPI_FF_OCTAL:
  159. configASSERT(data_bit_length % 8 == 0);
  160. break;
  161. default:
  162. break;
  163. }
  164. volatile spi_t *spi_adapter = spi[spi_num];
  165. if(spi_adapter->baudr == 0)
  166. spi_adapter->baudr = 0x14;
  167. spi_adapter->imr = 0x00;
  168. spi_adapter->dmacr = 0x00;
  169. spi_adapter->dmatdlr = 0x10;
  170. spi_adapter->dmardlr = 0x00;
  171. spi_adapter->ser = 0x00;
  172. spi_adapter->ssienr = 0x00;
  173. spi_adapter->ctrlr0 = (work_mode << work_mode_offset) | (frame_format << frf_offset) | ((data_bit_length - 1) << dfs_offset);
  174. spi_adapter->spi_ctrlr0 = 0;
  175. spi_adapter->endian = endian;
  176. }
  177. void spi_init_non_standard(spi_device_num_t spi_num, uint32_t instruction_length, uint32_t address_length,
  178. uint32_t wait_cycles, spi_instruction_address_trans_mode_t instruction_address_trans_mode)
  179. {
  180. configASSERT(wait_cycles < (1 << 5));
  181. configASSERT(instruction_address_trans_mode < 3);
  182. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  183. volatile spi_t *spi_handle = spi[spi_num];
  184. uint32_t inst_l = 0;
  185. switch(instruction_length)
  186. {
  187. case 0:
  188. inst_l = 0;
  189. break;
  190. case 4:
  191. inst_l = 1;
  192. break;
  193. case 8:
  194. inst_l = 2;
  195. break;
  196. case 16:
  197. inst_l = 3;
  198. break;
  199. default:
  200. configASSERT(!"Invalid instruction length");
  201. break;
  202. }
  203. configASSERT(address_length % 4 == 0 && address_length <= 60);
  204. uint32_t addr_l = address_length / 4;
  205. spi_handle->spi_ctrlr0 = (wait_cycles << 11) | (inst_l << 8) | (addr_l << 2) | instruction_address_trans_mode;
  206. }
  207. uint32_t spi_set_clk_rate(spi_device_num_t spi_num, uint32_t spi_clk)
  208. {
  209. uint32_t spi_baudr = sysctl_clock_get_freq(SYSCTL_CLOCK_SPI0 + spi_num) / spi_clk;
  210. if(spi_baudr < 2)
  211. {
  212. spi_baudr = 2;
  213. } else if(spi_baudr > 65534)
  214. {
  215. spi_baudr = 65534;
  216. }
  217. volatile spi_t *spi_adapter = spi[spi_num];
  218. spi_adapter->baudr = spi_baudr;
  219. return sysctl_clock_get_freq(SYSCTL_CLOCK_SPI0 + spi_num) / spi_baudr;
  220. }
  221. void spi_send_data_normal(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *tx_buff, size_t tx_len)
  222. {
  223. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  224. size_t index, fifo_len;
  225. spi_set_tmod(spi_num, SPI_TMOD_TRANS);
  226. volatile spi_t *spi_handle = spi[spi_num];
  227. uint8_t dfs_offset;
  228. switch(spi_num)
  229. {
  230. case 0:
  231. case 1:
  232. dfs_offset = 16;
  233. break;
  234. case 2:
  235. configASSERT(!"Spi Bus 2 Not Support!");
  236. break;
  237. case 3:
  238. default:
  239. dfs_offset = 0;
  240. break;
  241. }
  242. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  243. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  244. uint8_t v_misalign_flag = 0;
  245. uint32_t v_send_data;
  246. if((uintptr_t)tx_buff % frame_width)
  247. v_misalign_flag = 1;
  248. spi_handle->ssienr = 0x01;
  249. spi_handle->ser = 1U << chip_select;
  250. uint32_t i = 0;
  251. while(tx_len)
  252. {
  253. fifo_len = 32 - spi_handle->txflr;
  254. fifo_len = fifo_len < tx_len ? fifo_len : tx_len;
  255. switch(frame_width)
  256. {
  257. case SPI_TRANS_INT:
  258. fifo_len = fifo_len / 4 * 4;
  259. if(v_misalign_flag)
  260. {
  261. for(index = 0; index < fifo_len; index += 4)
  262. {
  263. memcpy(&v_send_data, tx_buff + i, 4);
  264. spi_handle->dr[0] = v_send_data;
  265. i += 4;
  266. }
  267. } else
  268. {
  269. for(index = 0; index < fifo_len / 4; index++)
  270. spi_handle->dr[0] = ((uint32_t *)tx_buff)[i++];
  271. }
  272. break;
  273. case SPI_TRANS_SHORT:
  274. fifo_len = fifo_len / 2 * 2;
  275. if(v_misalign_flag)
  276. {
  277. for(index = 0; index < fifo_len; index += 2)
  278. {
  279. memcpy(&v_send_data, tx_buff + i, 2);
  280. spi_handle->dr[0] = v_send_data;
  281. i += 2;
  282. }
  283. } else
  284. {
  285. for(index = 0; index < fifo_len / 2; index++)
  286. spi_handle->dr[0] = ((uint16_t *)tx_buff)[i++];
  287. }
  288. break;
  289. default:
  290. for(index = 0; index < fifo_len; index++)
  291. spi_handle->dr[0] = tx_buff[i++];
  292. break;
  293. }
  294. tx_len -= fifo_len;
  295. }
  296. while((spi_handle->sr & 0x05) != 0x04)
  297. ;
  298. spi_handle->ser = 0x00;
  299. spi_handle->ssienr = 0x00;
  300. }
  301. void spi_send_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *cmd_buff,
  302. size_t cmd_len, const uint8_t *tx_buff, size_t tx_len)
  303. {
  304. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  305. uint8_t *v_buf = malloc(cmd_len + tx_len);
  306. size_t i;
  307. for(i = 0; i < cmd_len; i++)
  308. v_buf[i] = cmd_buff[i];
  309. for(i = 0; i < tx_len; i++)
  310. v_buf[cmd_len + i] = tx_buff[i];
  311. spi_send_data_normal(spi_num, chip_select, v_buf, cmd_len + tx_len);
  312. free((void *)v_buf);
  313. }
  314. void spi_send_data_standard_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num,
  315. spi_chip_select_t chip_select,
  316. const uint8_t *cmd_buff, size_t cmd_len, const uint8_t *tx_buff, size_t tx_len)
  317. {
  318. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  319. volatile spi_t *spi_handle = spi[spi_num];
  320. uint8_t dfs_offset;
  321. switch(spi_num)
  322. {
  323. case 0:
  324. case 1:
  325. dfs_offset = 16;
  326. break;
  327. case 2:
  328. configASSERT(!"Spi Bus 2 Not Support!");
  329. break;
  330. case 3:
  331. default:
  332. dfs_offset = 0;
  333. break;
  334. }
  335. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  336. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  337. uint32_t *buf;
  338. size_t v_send_len;
  339. int i;
  340. switch(frame_width)
  341. {
  342. case SPI_TRANS_INT:
  343. buf = malloc(cmd_len + tx_len);
  344. for(i = 0; i < cmd_len / 4; i++)
  345. buf[i] = ((uint32_t *)cmd_buff)[i];
  346. for(i = 0; i < tx_len / 4; i++)
  347. buf[cmd_len / 4 + i] = ((uint32_t *)tx_buff)[i];
  348. v_send_len = (cmd_len + tx_len) / 4;
  349. break;
  350. case SPI_TRANS_SHORT:
  351. buf = malloc((cmd_len + tx_len) / 2 * sizeof(uint32_t));
  352. for(i = 0; i < cmd_len / 2; i++)
  353. buf[i] = ((uint16_t *)cmd_buff)[i];
  354. for(i = 0; i < tx_len / 2; i++)
  355. buf[cmd_len / 2 + i] = ((uint16_t *)tx_buff)[i];
  356. v_send_len = (cmd_len + tx_len) / 2;
  357. break;
  358. default:
  359. buf = malloc((cmd_len + tx_len) * sizeof(uint32_t));
  360. for(i = 0; i < cmd_len; i++)
  361. buf[i] = cmd_buff[i];
  362. for(i = 0; i < tx_len; i++)
  363. buf[cmd_len + i] = tx_buff[i];
  364. v_send_len = cmd_len + tx_len;
  365. break;
  366. }
  367. spi_send_data_normal_dma(channel_num, spi_num, chip_select, buf, v_send_len, SPI_TRANS_INT);
  368. free((void *)buf);
  369. }
  370. void spi_send_data_normal_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num,
  371. spi_chip_select_t chip_select,
  372. const void *tx_buff, size_t tx_len, spi_transfer_width_t spi_transfer_width)
  373. {
  374. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  375. spi_set_tmod(spi_num, SPI_TMOD_TRANS);
  376. volatile spi_t *spi_handle = spi[spi_num];
  377. uint32_t *buf;
  378. int i;
  379. switch(spi_transfer_width)
  380. {
  381. case SPI_TRANS_SHORT:
  382. #if FIX_CACHE
  383. buf = (uint32_t *)iomem_malloc((tx_len) * sizeof(uint32_t));
  384. #else
  385. buf = (uint32_t *)malloc((tx_len) * sizeof(uint32_t));
  386. #endif
  387. for(i = 0; i < tx_len; i++)
  388. buf[i] = ((uint16_t *)tx_buff)[i];
  389. break;
  390. case SPI_TRANS_INT:
  391. buf = (uint32_t *)tx_buff;
  392. break;
  393. case SPI_TRANS_CHAR:
  394. default:
  395. #if FIX_CACHE
  396. buf = (uint32_t *)iomem_malloc((tx_len) * sizeof(uint32_t));
  397. #else
  398. buf = (uint32_t *)malloc((tx_len) * sizeof(uint32_t));
  399. #endif
  400. for(i = 0; i < tx_len; i++)
  401. buf[i] = ((uint8_t *)tx_buff)[i];
  402. break;
  403. }
  404. spi_handle->dmacr = 0x2; /*enable dma transmit*/
  405. spi_handle->ssienr = 0x01;
  406. sysctl_dma_select((sysctl_dma_channel_t)channel_num, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  407. dmac_set_single_mode(channel_num, buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  408. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, tx_len);
  409. spi_handle->ser = 1U << chip_select;
  410. dmac_wait_done(channel_num);
  411. if(spi_transfer_width != SPI_TRANS_INT)
  412. {
  413. #if FIX_CACHE
  414. iomem_free((void *)buf);
  415. #else
  416. free((void *)buf);
  417. #endif
  418. }
  419. while((spi_handle->sr & 0x05) != 0x04)
  420. ;
  421. spi_handle->ser = 0x00;
  422. spi_handle->ssienr = 0x00;
  423. }
  424. void spi_dup_send_receive_data_dma(dmac_channel_number_t dma_send_channel_num,
  425. dmac_channel_number_t dma_receive_channel_num,
  426. spi_device_num_t spi_num, spi_chip_select_t chip_select,
  427. const uint8_t *tx_buf, size_t tx_len, uint8_t *rx_buf, size_t rx_len)
  428. {
  429. spi_set_tmod(spi_num, SPI_TMOD_TRANS_RECV);
  430. volatile spi_t *spi_handle = spi[spi_num];
  431. uint8_t dfs_offset;
  432. switch(spi_num)
  433. {
  434. case 0:
  435. case 1:
  436. dfs_offset = 16;
  437. break;
  438. case 2:
  439. configASSERT(!"Spi Bus 2 Not Support!");
  440. break;
  441. case 3:
  442. default:
  443. dfs_offset = 0;
  444. break;
  445. }
  446. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  447. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  448. size_t v_tx_len = tx_len / frame_width;
  449. size_t v_rx_len = rx_len / frame_width;
  450. size_t v_max_len = v_tx_len > v_rx_len ? v_tx_len : v_rx_len;
  451. #if FIX_CACHE
  452. uint32_t *v_tx_buf = iomem_malloc(v_max_len * 4);
  453. uint32_t *v_rx_buf = iomem_malloc(v_max_len * 4);
  454. #else
  455. uint32_t *v_tx_buf = malloc(v_max_len * 4);
  456. uint32_t *v_rx_buf = malloc(v_max_len * 4);
  457. #endif
  458. uint32_t i = 0;
  459. switch(frame_width)
  460. {
  461. case SPI_TRANS_INT:
  462. for(i = 0; i < v_tx_len; i++)
  463. {
  464. v_tx_buf[i] = ((uint32_t *)tx_buf)[i];
  465. }
  466. if(v_max_len > v_tx_len)
  467. {
  468. while(i < v_max_len)
  469. {
  470. v_tx_buf[i++] = 0xFFFFFFFF;
  471. }
  472. }
  473. break;
  474. case SPI_TRANS_SHORT:
  475. for(i = 0; i < v_tx_len; i++)
  476. {
  477. v_tx_buf[i] = ((uint16_t *)tx_buf)[i];
  478. }
  479. if(v_max_len > v_tx_len)
  480. {
  481. while(i < v_max_len)
  482. {
  483. v_tx_buf[i++] = 0xFFFFFFFF;
  484. }
  485. }
  486. break;
  487. default:
  488. for(i = 0; i < v_tx_len; i++)
  489. {
  490. v_tx_buf[i] = tx_buf[i];
  491. }
  492. if(v_max_len > v_tx_len)
  493. {
  494. while(i < v_max_len)
  495. {
  496. v_tx_buf[i++] = 0xFFFFFFFF;
  497. }
  498. }
  499. break;
  500. }
  501. spi_handle->dmacr = 0x3;
  502. spi_handle->ssienr = 0x01;
  503. sysctl_dma_select((sysctl_dma_channel_t)dma_send_channel_num, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  504. sysctl_dma_select((sysctl_dma_channel_t)dma_receive_channel_num, SYSCTL_DMA_SELECT_SSI0_RX_REQ + spi_num * 2);
  505. dmac_set_single_mode(dma_receive_channel_num, (void *)(&spi_handle->dr[0]), v_rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  506. DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, v_max_len);
  507. dmac_set_single_mode(dma_send_channel_num, v_tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  508. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, v_max_len);
  509. spi_handle->ser = 1U << chip_select;
  510. dmac_wait_done(dma_send_channel_num);
  511. dmac_wait_done(dma_receive_channel_num);
  512. spi_handle->ser = 0x00;
  513. spi_handle->ssienr = 0x00;
  514. switch(frame_width)
  515. {
  516. case SPI_TRANS_INT:
  517. for(i = 0; i < v_rx_len; i++)
  518. ((uint32_t *)rx_buf)[i] = v_rx_buf[i];
  519. break;
  520. case SPI_TRANS_SHORT:
  521. for(i = 0; i < v_rx_len; i++)
  522. ((uint16_t *)rx_buf)[i] = v_rx_buf[i];
  523. break;
  524. default:
  525. for(i = 0; i < v_rx_len; i++)
  526. rx_buf[i] = v_rx_buf[i];
  527. break;
  528. }
  529. #if FIX_CACHE
  530. iomem_free(v_tx_buf);
  531. iomem_free(v_rx_buf);
  532. #else
  533. free(v_tx_buf);
  534. free(v_rx_buf);
  535. #endif
  536. }
  537. void spi_receive_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *cmd_buff,
  538. size_t cmd_len, uint8_t *rx_buff, size_t rx_len)
  539. {
  540. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  541. size_t index, fifo_len;
  542. if(cmd_len == 0)
  543. spi_set_tmod(spi_num, SPI_TMOD_RECV);
  544. else
  545. spi_set_tmod(spi_num, SPI_TMOD_EEROM);
  546. volatile spi_t *spi_handle = spi[spi_num];
  547. uint8_t dfs_offset;
  548. switch(spi_num)
  549. {
  550. case 0:
  551. case 1:
  552. dfs_offset = 16;
  553. break;
  554. case 2:
  555. configASSERT(!"Spi Bus 2 Not Support!");
  556. break;
  557. case 3:
  558. default:
  559. dfs_offset = 0;
  560. break;
  561. }
  562. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  563. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  564. uint32_t i = 0;
  565. size_t v_cmd_len = cmd_len / frame_width;
  566. uint32_t v_rx_len = rx_len / frame_width;
  567. spi_handle->ctrlr1 = (uint32_t)(v_rx_len - 1);
  568. spi_handle->ssienr = 0x01;
  569. while(v_cmd_len)
  570. {
  571. fifo_len = 32 - spi_handle->txflr;
  572. fifo_len = fifo_len < v_cmd_len ? fifo_len : v_cmd_len;
  573. switch(frame_width)
  574. {
  575. case SPI_TRANS_INT:
  576. for(index = 0; index < fifo_len; index++)
  577. spi_handle->dr[0] = ((uint32_t *)cmd_buff)[i++];
  578. break;
  579. case SPI_TRANS_SHORT:
  580. for(index = 0; index < fifo_len; index++)
  581. spi_handle->dr[0] = ((uint16_t *)cmd_buff)[i++];
  582. break;
  583. default:
  584. for(index = 0; index < fifo_len; index++)
  585. spi_handle->dr[0] = cmd_buff[i++];
  586. break;
  587. }
  588. spi_handle->ser = 1U << chip_select;
  589. v_cmd_len -= fifo_len;
  590. }
  591. if(cmd_len == 0)
  592. {
  593. spi_handle->dr[0] = 0xffffffff;
  594. spi_handle->ser = 1U << chip_select;
  595. }
  596. i = 0;
  597. while(v_rx_len)
  598. {
  599. fifo_len = spi_handle->rxflr;
  600. fifo_len = fifo_len < v_rx_len ? fifo_len : v_rx_len;
  601. switch(frame_width)
  602. {
  603. case SPI_TRANS_INT:
  604. for(index = 0; index < fifo_len; index++)
  605. ((uint32_t *)rx_buff)[i++] = spi_handle->dr[0];
  606. break;
  607. case SPI_TRANS_SHORT:
  608. for(index = 0; index < fifo_len; index++)
  609. ((uint16_t *)rx_buff)[i++] = (uint16_t)spi_handle->dr[0];
  610. break;
  611. default:
  612. for(index = 0; index < fifo_len; index++)
  613. rx_buff[i++] = (uint8_t)spi_handle->dr[0];
  614. break;
  615. }
  616. v_rx_len -= fifo_len;
  617. }
  618. spi_handle->ser = 0x00;
  619. spi_handle->ssienr = 0x00;
  620. }
  621. void spi_receive_data_normal_dma(dmac_channel_number_t dma_send_channel_num,
  622. dmac_channel_number_t dma_receive_channel_num,
  623. spi_device_num_t spi_num, spi_chip_select_t chip_select, const void *cmd_buff,
  624. size_t cmd_len, void *rx_buff, size_t rx_len)
  625. {
  626. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  627. if(cmd_len == 0)
  628. spi_set_tmod(spi_num, SPI_TMOD_RECV);
  629. else
  630. spi_set_tmod(spi_num, SPI_TMOD_EEROM);
  631. volatile spi_t *spi_handle = spi[spi_num];
  632. spi_handle->ctrlr1 = (uint32_t)(rx_len - 1);
  633. spi_handle->dmacr = 0x3;
  634. spi_handle->ssienr = 0x01;
  635. if(cmd_len)
  636. sysctl_dma_select((sysctl_dma_channel_t)dma_send_channel_num, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  637. sysctl_dma_select((sysctl_dma_channel_t)dma_receive_channel_num, SYSCTL_DMA_SELECT_SSI0_RX_REQ + spi_num * 2);
  638. dmac_set_single_mode(dma_receive_channel_num, (void *)(&spi_handle->dr[0]), rx_buff, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  639. DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, rx_len);
  640. if(cmd_len)
  641. dmac_set_single_mode(dma_send_channel_num, cmd_buff, (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  642. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, cmd_len);
  643. if(cmd_len == 0 && spi_get_frame_format(spi_num) == SPI_FF_STANDARD)
  644. spi[spi_num]->dr[0] = 0xffffffff;
  645. spi_handle->ser = 1U << chip_select;
  646. if(cmd_len)
  647. dmac_wait_done(dma_send_channel_num);
  648. dmac_wait_done(dma_receive_channel_num);
  649. spi_handle->ser = 0x00;
  650. spi_handle->ssienr = 0x00;
  651. }
  652. void spi_receive_data_standard_dma(dmac_channel_number_t dma_send_channel_num,
  653. dmac_channel_number_t dma_receive_channel_num,
  654. spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *cmd_buff,
  655. size_t cmd_len, uint8_t *rx_buff, size_t rx_len)
  656. {
  657. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  658. volatile spi_t *spi_handle = spi[spi_num];
  659. uint8_t dfs_offset;
  660. switch(spi_num)
  661. {
  662. case 0:
  663. case 1:
  664. dfs_offset = 16;
  665. break;
  666. case 2:
  667. configASSERT(!"Spi Bus 2 Not Support!");
  668. break;
  669. case 3:
  670. default:
  671. dfs_offset = 0;
  672. break;
  673. }
  674. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  675. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  676. size_t i;
  677. uint32_t *write_cmd;
  678. uint32_t *read_buf;
  679. size_t v_recv_len;
  680. size_t v_cmd_len;
  681. switch(frame_width)
  682. {
  683. case SPI_TRANS_INT:
  684. #if FIX_CACHE
  685. write_cmd = iomem_malloc(cmd_len + rx_len);
  686. #else
  687. write_cmd = malloc(cmd_len + rx_len);
  688. #endif
  689. for(i = 0; i < cmd_len / 4; i++)
  690. write_cmd[i] = ((uint32_t *)cmd_buff)[i];
  691. read_buf = &write_cmd[i];
  692. v_recv_len = rx_len / 4;
  693. v_cmd_len = cmd_len / 4;
  694. break;
  695. case SPI_TRANS_SHORT:
  696. #if FIX_CACHE
  697. write_cmd = iomem_malloc((cmd_len + rx_len) / 2 * sizeof(uint32_t));
  698. #else
  699. write_cmd = malloc((cmd_len + rx_len) / 2 * sizeof(uint32_t));
  700. #endif
  701. for(i = 0; i < cmd_len / 2; i++)
  702. write_cmd[i] = ((uint16_t *)cmd_buff)[i];
  703. read_buf = &write_cmd[i];
  704. v_recv_len = rx_len / 2;
  705. v_cmd_len = cmd_len / 2;
  706. break;
  707. default:
  708. #if FIX_CACHE
  709. write_cmd = iomem_malloc((cmd_len + rx_len) * sizeof(uint32_t));
  710. #else
  711. write_cmd = malloc((cmd_len + rx_len) * sizeof(uint32_t));
  712. #endif
  713. for(i = 0; i < cmd_len; i++)
  714. write_cmd[i] = cmd_buff[i];
  715. read_buf = &write_cmd[i];
  716. v_recv_len = rx_len;
  717. v_cmd_len = cmd_len;
  718. break;
  719. }
  720. spi_receive_data_normal_dma(dma_send_channel_num, dma_receive_channel_num, spi_num, chip_select, write_cmd, v_cmd_len, read_buf, v_recv_len);
  721. switch(frame_width)
  722. {
  723. case SPI_TRANS_INT:
  724. for(i = 0; i < v_recv_len; i++)
  725. ((uint32_t *)rx_buff)[i] = read_buf[i];
  726. break;
  727. case SPI_TRANS_SHORT:
  728. for(i = 0; i < v_recv_len; i++)
  729. ((uint16_t *)rx_buff)[i] = read_buf[i];
  730. break;
  731. default:
  732. for(i = 0; i < v_recv_len; i++)
  733. rx_buff[i] = read_buf[i];
  734. break;
  735. }
  736. #if FIX_CACHE
  737. iomem_free(write_cmd);
  738. #else
  739. free(write_cmd);
  740. #endif
  741. }
  742. void spi_receive_data_multiple(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint32_t *cmd_buff,
  743. size_t cmd_len, uint8_t *rx_buff, size_t rx_len)
  744. {
  745. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  746. size_t index, fifo_len;
  747. if(cmd_len == 0)
  748. spi_set_tmod(spi_num, SPI_TMOD_RECV);
  749. else
  750. spi_set_tmod(spi_num, SPI_TMOD_EEROM);
  751. volatile spi_t *spi_handle = spi[spi_num];
  752. uint8_t dfs_offset;
  753. switch(spi_num)
  754. {
  755. case 0:
  756. case 1:
  757. dfs_offset = 16;
  758. break;
  759. case 2:
  760. configASSERT(!"Spi Bus 2 Not Support!");
  761. break;
  762. case 3:
  763. default:
  764. dfs_offset = 0;
  765. break;
  766. }
  767. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  768. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  769. uint32_t v_cmd_len = cmd_len;
  770. uint32_t i = 0;
  771. uint32_t v_rx_len = rx_len / frame_width;
  772. spi_handle->ctrlr1 = (uint32_t)(v_rx_len - 1);
  773. spi_handle->ssienr = 0x01;
  774. while(v_cmd_len)
  775. {
  776. fifo_len = 32 - spi_handle->txflr;
  777. fifo_len = fifo_len < v_cmd_len ? fifo_len : v_cmd_len;
  778. for(index = 0; index < fifo_len; index++)
  779. spi_handle->dr[0] = *cmd_buff++;
  780. spi_handle->ser = 1U << chip_select;
  781. v_cmd_len -= fifo_len;
  782. }
  783. if(cmd_len == 0)
  784. {
  785. spi_handle->ser = 1U << chip_select;
  786. }
  787. while(v_rx_len)
  788. {
  789. fifo_len = spi_handle->rxflr;
  790. fifo_len = fifo_len < v_rx_len ? fifo_len : v_rx_len;
  791. switch(frame_width)
  792. {
  793. case SPI_TRANS_INT:
  794. for(index = 0; index < fifo_len; index++)
  795. ((uint32_t *)rx_buff)[i++] = spi_handle->dr[0];
  796. break;
  797. case SPI_TRANS_SHORT:
  798. for(index = 0; index < fifo_len; index++)
  799. ((uint16_t *)rx_buff)[i++] = (uint16_t)spi_handle->dr[0];
  800. break;
  801. default:
  802. for(index = 0; index < fifo_len; index++)
  803. rx_buff[i++] = (uint8_t)spi_handle->dr[0];
  804. break;
  805. }
  806. v_rx_len -= fifo_len;
  807. }
  808. spi_handle->ser = 0x00;
  809. spi_handle->ssienr = 0x00;
  810. }
  811. void spi_receive_data_multiple_dma(dmac_channel_number_t dma_send_channel_num,
  812. dmac_channel_number_t dma_receive_channel_num,
  813. spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint32_t *cmd_buff,
  814. size_t cmd_len, uint8_t *rx_buff, size_t rx_len)
  815. {
  816. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  817. volatile spi_t *spi_handle = spi[spi_num];
  818. uint8_t dfs_offset;
  819. switch(spi_num)
  820. {
  821. case 0:
  822. case 1:
  823. dfs_offset = 16;
  824. break;
  825. case 2:
  826. configASSERT(!"Spi Bus 2 Not Support!");
  827. break;
  828. case 3:
  829. default:
  830. dfs_offset = 0;
  831. break;
  832. }
  833. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  834. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  835. size_t i;
  836. uint32_t *write_cmd = NULL;
  837. uint32_t *read_buf;
  838. size_t v_recv_len;
  839. switch(frame_width)
  840. {
  841. case SPI_TRANS_INT:
  842. v_recv_len = rx_len / 4;
  843. break;
  844. case SPI_TRANS_SHORT:
  845. #if FIX_CACHE
  846. write_cmd = iomem_malloc(cmd_len + rx_len / 2 * sizeof(uint32_t));
  847. #else
  848. write_cmd = malloc(cmd_len + rx_len / 2 * sizeof(uint32_t));
  849. #endif
  850. for(i = 0; i < cmd_len; i++)
  851. write_cmd[i] = cmd_buff[i];
  852. read_buf = &write_cmd[i];
  853. v_recv_len = rx_len / 2;
  854. break;
  855. default:
  856. #if FIX_CACHE
  857. write_cmd = iomem_malloc(cmd_len + rx_len * sizeof(uint32_t));
  858. #else
  859. write_cmd = malloc(cmd_len + rx_len * sizeof(uint32_t));
  860. #endif
  861. for(i = 0; i < cmd_len; i++)
  862. write_cmd[i] = cmd_buff[i];
  863. read_buf = &write_cmd[i];
  864. v_recv_len = rx_len;
  865. break;
  866. }
  867. if(frame_width == SPI_TRANS_INT)
  868. spi_receive_data_normal_dma(dma_send_channel_num, dma_receive_channel_num, spi_num, chip_select, cmd_buff, cmd_len, rx_buff, v_recv_len);
  869. else
  870. spi_receive_data_normal_dma(dma_send_channel_num, dma_receive_channel_num, spi_num, chip_select, write_cmd, cmd_len, read_buf, v_recv_len);
  871. switch(frame_width)
  872. {
  873. case SPI_TRANS_INT:
  874. break;
  875. case SPI_TRANS_SHORT:
  876. for(i = 0; i < v_recv_len; i++)
  877. ((uint16_t *)rx_buff)[i] = read_buf[i];
  878. break;
  879. default:
  880. for(i = 0; i < v_recv_len; i++)
  881. rx_buff[i] = read_buf[i];
  882. break;
  883. }
  884. if(frame_width != SPI_TRANS_INT)
  885. {
  886. #if FIX_CACHE
  887. iomem_free(write_cmd);
  888. #else
  889. free(write_cmd);
  890. #endif
  891. }
  892. }
  893. void spi_send_data_multiple(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint32_t *cmd_buff,
  894. size_t cmd_len, const uint8_t *tx_buff, size_t tx_len)
  895. {
  896. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  897. size_t index, fifo_len;
  898. spi_set_tmod(spi_num, SPI_TMOD_TRANS);
  899. volatile spi_t *spi_handle = spi[spi_num];
  900. spi_handle->ssienr = 0x01;
  901. spi_handle->ser = 1U << chip_select;
  902. size_t v_cmd_len = cmd_len * 4;
  903. while(v_cmd_len)
  904. {
  905. fifo_len = 32 - spi_handle->txflr;
  906. fifo_len = fifo_len < v_cmd_len ? fifo_len : v_cmd_len;
  907. fifo_len = fifo_len / 4 * 4;
  908. for(index = 0; index < fifo_len / 4; index++)
  909. spi_handle->dr[0] = *cmd_buff++;
  910. v_cmd_len -= fifo_len;
  911. }
  912. spi_send_data_normal(spi_num, chip_select, tx_buff, tx_len);
  913. }
  914. void spi_send_data_multiple_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num,
  915. spi_chip_select_t chip_select,
  916. const uint32_t *cmd_buff, size_t cmd_len, const uint8_t *tx_buff, size_t tx_len)
  917. {
  918. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  919. volatile spi_t *spi_handle = spi[spi_num];
  920. uint8_t dfs_offset;
  921. switch(spi_num)
  922. {
  923. case 0:
  924. case 1:
  925. dfs_offset = 16;
  926. break;
  927. case 2:
  928. configASSERT(!"Spi Bus 2 Not Support!");
  929. break;
  930. case 3:
  931. default:
  932. dfs_offset = 0;
  933. break;
  934. }
  935. uint32_t data_bit_length = (spi_handle->ctrlr0 >> dfs_offset) & 0x1F;
  936. spi_transfer_width_t frame_width = spi_get_frame_size(data_bit_length);
  937. uint32_t *buf;
  938. size_t v_send_len;
  939. int i;
  940. switch(frame_width)
  941. {
  942. case SPI_TRANS_INT:
  943. #if FIX_CACHE
  944. buf = iomem_malloc(cmd_len * sizeof(uint32_t) + tx_len);
  945. #else
  946. buf = malloc(cmd_len * sizeof(uint32_t) + tx_len);
  947. #endif
  948. for(i = 0; i < cmd_len; i++)
  949. buf[i] = cmd_buff[i];
  950. for(i = 0; i < tx_len / 4; i++)
  951. buf[cmd_len + i] = ((uint32_t *)tx_buff)[i];
  952. v_send_len = cmd_len + tx_len / 4;
  953. break;
  954. case SPI_TRANS_SHORT:
  955. #if FIX_CACHE
  956. buf = iomem_malloc(cmd_len * sizeof(uint32_t) + tx_len / 2 * sizeof(uint32_t));
  957. #else
  958. buf = malloc(cmd_len * sizeof(uint32_t) + tx_len / 2 * sizeof(uint32_t));
  959. #endif
  960. for(i = 0; i < cmd_len; i++)
  961. buf[i] = cmd_buff[i];
  962. for(i = 0; i < tx_len / 2; i++)
  963. buf[cmd_len + i] = ((uint16_t *)tx_buff)[i];
  964. v_send_len = cmd_len + tx_len / 2;
  965. break;
  966. default:
  967. #if FIX_CACHE
  968. buf = iomem_malloc((cmd_len + tx_len) * sizeof(uint32_t));
  969. #else
  970. buf = malloc((cmd_len + tx_len) * sizeof(uint32_t));
  971. #endif
  972. for(i = 0; i < cmd_len; i++)
  973. buf[i] = cmd_buff[i];
  974. for(i = 0; i < tx_len; i++)
  975. buf[cmd_len + i] = tx_buff[i];
  976. v_send_len = cmd_len + tx_len;
  977. break;
  978. }
  979. spi_send_data_normal_dma(channel_num, spi_num, chip_select, buf, v_send_len, SPI_TRANS_INT);
  980. #if FIX_CACHE
  981. iomem_free((void *)buf);
  982. #else
  983. free((void *)buf);
  984. #endif
  985. }
  986. void spi_fill_data_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num, spi_chip_select_t chip_select,
  987. const uint32_t *tx_buff, size_t tx_len)
  988. {
  989. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  990. spi_set_tmod(spi_num, SPI_TMOD_TRANS);
  991. volatile spi_t *spi_handle = spi[spi_num];
  992. spi_handle->dmacr = 0x2; /*enable dma transmit*/
  993. spi_handle->ssienr = 0x01;
  994. sysctl_dma_select((sysctl_dma_channel_t)channel_num, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  995. dmac_set_single_mode(channel_num, tx_buff, (void *)(&spi_handle->dr[0]), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
  996. DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, tx_len);
  997. spi_handle->ser = 1U << chip_select;
  998. dmac_wait_done(channel_num);
  999. while((spi_handle->sr & 0x05) != 0x04)
  1000. ;
  1001. spi_handle->ser = 0x00;
  1002. spi_handle->ssienr = 0x00;
  1003. }
  1004. static void spi_slave_idle_mode(void)
  1005. {
  1006. if(g_instance.is_dual)
  1007. {
  1008. fpioa_set_function(g_instance.mosi_pin, FUNC_SPI_SLAVE_D0);
  1009. }
  1010. volatile spi_t *spi_handle = spi[2];
  1011. g_instance.status = IDLE;
  1012. spi_handle->ssienr = 0x00;
  1013. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x1 << g_instance.slv_oe) | ((g_instance.data_bit_length - 1) << g_instance.dfs);
  1014. spi_handle->dmacr = 0x00;
  1015. spi_handle->ssienr = 0x01;
  1016. gpiohs_set_pin(g_instance.ready_pin, GPIO_PV_HIGH);
  1017. }
  1018. static void spi_slave_command_mode(void)
  1019. {
  1020. volatile spi_t *spi_handle = spi[2];
  1021. uint8_t cmd_data[8], sum = 0;
  1022. spi_transfer_width_t frame_width = spi_get_frame_size(g_instance.data_bit_length - 1);
  1023. spi_device_num_t spi_num = SPI_DEVICE_2;
  1024. switch(frame_width)
  1025. {
  1026. case SPI_TRANS_INT:
  1027. for(uint32_t i = 0; i < 8 / 4; i++)
  1028. ((uint32_t *)cmd_data)[i] = spi_handle->dr[0];
  1029. break;
  1030. case SPI_TRANS_SHORT:
  1031. for(uint32_t i = 0; i < 8 / 2; i++)
  1032. ((uint16_t *)cmd_data)[i] = spi_handle->dr[0];
  1033. break;
  1034. default:
  1035. for(uint32_t i = 0; i < 8; i++)
  1036. cmd_data[i] = spi_handle->dr[0];
  1037. break;
  1038. }
  1039. for(uint32_t i = 0; i < 7; i++)
  1040. {
  1041. sum += cmd_data[i];
  1042. }
  1043. if(cmd_data[7] != sum)
  1044. {
  1045. spi_slave_idle_mode();
  1046. return;
  1047. }
  1048. g_instance.command.cmd = cmd_data[0];
  1049. g_instance.command.addr = cmd_data[1] | (cmd_data[2] << 8) | (cmd_data[3] << 16) | (cmd_data[4] << 24);
  1050. g_instance.command.len = cmd_data[5] | (cmd_data[6] << 8);
  1051. if(g_instance.command.len == 0)
  1052. g_instance.command.len = 65536;
  1053. if((g_instance.command.cmd < WRITE_DATA_BLOCK) && (g_instance.command.len > 8))
  1054. {
  1055. spi_slave_idle_mode();
  1056. return;
  1057. }
  1058. g_instance.status = TRANSFER;
  1059. spi_handle->ssienr = 0x00;
  1060. if(g_instance.command.cmd == WRITE_CONFIG)
  1061. {
  1062. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x1 << g_instance.slv_oe) | ((g_instance.data_bit_length - 1) << g_instance.dfs);
  1063. spi_handle->ssienr = 0x01;
  1064. } else if(g_instance.command.cmd == READ_CONFIG)
  1065. {
  1066. if(g_instance.is_dual)
  1067. {
  1068. fpioa_set_function(g_instance.miso_pin, FUNC_SPI_SLAVE_D0);
  1069. }
  1070. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x0 << g_instance.slv_oe) | ((g_instance.data_bit_length - 1) << g_instance.dfs);
  1071. spi_set_tmod(2, SPI_TMOD_TRANS);
  1072. spi_handle->ssienr = 0x01;
  1073. switch(frame_width)
  1074. {
  1075. case SPI_TRANS_INT:
  1076. for(uint32_t i = 0; i < g_instance.command.len / 4; i++)
  1077. {
  1078. spi_handle->dr[0] = ((uint32_t *)&g_instance.config_ptr[g_instance.command.addr])[i];
  1079. }
  1080. break;
  1081. case SPI_TRANS_SHORT:
  1082. for(uint32_t i = 0; i < g_instance.command.len / 2; i++)
  1083. {
  1084. spi_handle->dr[0] = ((uint16_t *)&g_instance.config_ptr[g_instance.command.addr])[i];
  1085. }
  1086. break;
  1087. default:
  1088. for(uint32_t i = 0; i < g_instance.command.len; i++)
  1089. {
  1090. spi_handle->dr[0] = ((uint8_t *)&g_instance.config_ptr[g_instance.command.addr])[i];
  1091. }
  1092. break;
  1093. }
  1094. } else if(g_instance.command.cmd == WRITE_DATA_BYTE)
  1095. {
  1096. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x1 << g_instance.slv_oe) | ((g_instance.data_bit_length - 1) << g_instance.dfs);
  1097. spi_handle->ssienr = 0x01;
  1098. } else if(g_instance.command.cmd == READ_DATA_BYTE)
  1099. {
  1100. if(g_instance.is_dual)
  1101. {
  1102. fpioa_set_function(g_instance.miso_pin, FUNC_SPI_SLAVE_D0);
  1103. }
  1104. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x0 << g_instance.slv_oe) | ((g_instance.data_bit_length - 1) << g_instance.dfs);
  1105. spi_set_tmod(2, SPI_TMOD_TRANS);
  1106. spi_handle->ssienr = 0x01;
  1107. switch(frame_width)
  1108. {
  1109. case SPI_TRANS_INT:
  1110. for(uint32_t i = 0; i < g_instance.command.len / 4; i++)
  1111. {
  1112. spi_handle->dr[0] = ((uint32_t *)(uintptr_t)g_instance.command.addr)[i];
  1113. }
  1114. break;
  1115. case SPI_TRANS_SHORT:
  1116. for(uint32_t i = 0; i < g_instance.command.len / 2; i++)
  1117. {
  1118. spi_handle->dr[0] = ((uint16_t *)(uintptr_t)g_instance.command.addr)[i];
  1119. }
  1120. break;
  1121. default:
  1122. for(uint32_t i = 0; i < g_instance.command.len; i++)
  1123. {
  1124. spi_handle->dr[0] = ((uint8_t *)(uintptr_t)g_instance.command.addr)[i];
  1125. }
  1126. break;
  1127. }
  1128. } else if(g_instance.command.cmd == WRITE_DATA_BLOCK)
  1129. {
  1130. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x1 << g_instance.slv_oe) | ((32 - 1) << g_instance.dfs);
  1131. spi_handle->dmacr = 0x01;
  1132. spi_handle->ssienr = 0x01;
  1133. sysctl_dma_select(g_instance.dmac_channel, SYSCTL_DMA_SELECT_SSI0_RX_REQ + spi_num * 2);
  1134. dmac_set_single_mode(g_instance.dmac_channel, (void *)(&spi_handle->dr[0]), (void *)((uintptr_t)g_instance.command.addr & 0xFFFFFFF0), DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  1135. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, g_instance.command.len * 4);
  1136. } else if(g_instance.command.cmd == READ_DATA_BLOCK)
  1137. {
  1138. if(g_instance.is_dual)
  1139. {
  1140. fpioa_set_function(g_instance.miso_pin, FUNC_SPI_SLAVE_D0);
  1141. }
  1142. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x0 << g_instance.slv_oe) | ((32 - 1) << g_instance.dfs);
  1143. spi_set_tmod(2, SPI_TMOD_TRANS);
  1144. spi_handle->dmacr = 0x02;
  1145. spi_handle->ssienr = 0x01;
  1146. sysctl_dma_select(g_instance.dmac_channel, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  1147. dmac_set_single_mode(g_instance.dmac_channel, (void *)((uintptr_t)g_instance.command.addr & 0xFFFFFFF0), (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  1148. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, g_instance.command.len * 4);
  1149. } else
  1150. {
  1151. spi_slave_idle_mode();
  1152. return;
  1153. }
  1154. gpiohs_set_pin(g_instance.ready_pin, GPIO_PV_LOW);
  1155. }
  1156. static void spi_slave_transfer_mode(void)
  1157. {
  1158. spi_transfer_width_t frame_width = spi_get_frame_size(g_instance.data_bit_length - 1);
  1159. uint32_t command_len = 0;
  1160. switch(frame_width)
  1161. {
  1162. case SPI_TRANS_INT:
  1163. command_len = g_instance.command.len / 4;
  1164. break;
  1165. case SPI_TRANS_SHORT:
  1166. command_len = g_instance.command.len / 2;
  1167. break;
  1168. default:
  1169. command_len = g_instance.command.len;
  1170. break;
  1171. }
  1172. volatile spi_t *spi_handle = spi[2];
  1173. g_instance.command.err = 0;
  1174. if(g_instance.command.cmd == WRITE_CONFIG || g_instance.command.cmd == WRITE_DATA_BYTE)
  1175. {
  1176. if(spi_handle->rxflr < command_len - 1)
  1177. g_instance.command.err = 1;
  1178. } else if(g_instance.command.cmd == READ_CONFIG || g_instance.command.cmd == READ_DATA_BYTE)
  1179. {
  1180. if(spi_handle->txflr != 0)
  1181. g_instance.command.err = 2;
  1182. } else if(g_instance.command.cmd == WRITE_DATA_BLOCK || g_instance.command.cmd == READ_DATA_BLOCK)
  1183. {
  1184. if(dmac_is_done(g_instance.dmac_channel) == 0)
  1185. {
  1186. dmac_channel_disable(g_instance.dmac_channel);
  1187. g_instance.command.err = 3;
  1188. }
  1189. dmac_wait_done(g_instance.dmac_channel);
  1190. } else
  1191. {
  1192. spi_slave_idle_mode();
  1193. return;
  1194. }
  1195. if(g_instance.command.err == 0)
  1196. {
  1197. if(g_instance.command.cmd == WRITE_CONFIG)
  1198. {
  1199. switch(frame_width)
  1200. {
  1201. case SPI_TRANS_INT:
  1202. for(uint32_t i = 0; i < command_len; i++)
  1203. {
  1204. ((uint32_t *)&g_instance.config_ptr[g_instance.command.addr])[i] = spi_handle->dr[0];
  1205. }
  1206. break;
  1207. case SPI_TRANS_SHORT:
  1208. for(uint32_t i = 0; i < command_len; i++)
  1209. {
  1210. ((uint16_t *)&g_instance.config_ptr[g_instance.command.addr])[i] = spi_handle->dr[0];
  1211. }
  1212. break;
  1213. default:
  1214. for(uint32_t i = 0; i < command_len; i++)
  1215. {
  1216. ((uint8_t *)&g_instance.config_ptr[g_instance.command.addr])[i] = spi_handle->dr[0];
  1217. }
  1218. break;
  1219. }
  1220. } else if(g_instance.command.cmd == WRITE_DATA_BYTE)
  1221. {
  1222. switch(frame_width)
  1223. {
  1224. case SPI_TRANS_INT:
  1225. for(uint32_t i = 0; i < command_len; i++)
  1226. {
  1227. ((uint32_t *)(uintptr_t)g_instance.command.addr)[i] = spi_handle->dr[0];
  1228. }
  1229. break;
  1230. case SPI_TRANS_SHORT:
  1231. for(uint32_t i = 0; i < command_len; i++)
  1232. {
  1233. ((uint16_t *)(uintptr_t)g_instance.command.addr)[i] = spi_handle->dr[0];
  1234. }
  1235. break;
  1236. default:
  1237. for(uint32_t i = 0; i < command_len; i++)
  1238. {
  1239. ((uint8_t *)(uintptr_t)g_instance.command.addr)[i] = spi_handle->dr[0];
  1240. }
  1241. break;
  1242. }
  1243. }
  1244. }
  1245. if(g_instance.callback != NULL)
  1246. {
  1247. g_instance.callback((void *)&g_instance.command);
  1248. }
  1249. spi_slave_idle_mode();
  1250. }
  1251. static void spi_slave_cs_irq(void)
  1252. {
  1253. volatile spi_t *spi_handle = spi[2];
  1254. if (g_instance.status == IDLE && spi_handle->rxflr == 8)
  1255. g_instance.status = COMMAND;
  1256. if(g_instance.status == IDLE)
  1257. spi_slave_idle_mode();
  1258. else if(g_instance.status == COMMAND)
  1259. spi_slave_command_mode();
  1260. else if(g_instance.status == TRANSFER)
  1261. spi_slave_transfer_mode();
  1262. }
  1263. void spi_slave_config(uint8_t int_pin, uint8_t ready_pin, dmac_channel_number_t dmac_channel, size_t data_bit_length, uint8_t *data, uint32_t len, spi_slave_receive_callback_t callback)
  1264. {
  1265. g_instance.status = IDLE;
  1266. g_instance.config_ptr = data;
  1267. g_instance.config_len = len;
  1268. g_instance.work_mode = 6;
  1269. g_instance.slv_oe = 10;
  1270. g_instance.dfs = 16;
  1271. g_instance.data_bit_length = data_bit_length;
  1272. g_instance.ready_pin = ready_pin;
  1273. g_instance.int_pin = int_pin;
  1274. g_instance.callback = callback;
  1275. g_instance.dmac_channel = dmac_channel;
  1276. g_instance.is_dual = 0;
  1277. sysctl_reset(SYSCTL_RESET_SPI2);
  1278. sysctl_clock_enable(SYSCTL_CLOCK_SPI2);
  1279. sysctl_clock_set_threshold(SYSCTL_THRESHOLD_SPI2, 0);
  1280. uint32_t data_width = data_bit_length / 8;
  1281. volatile spi_t *spi_handle = spi[2];
  1282. spi_handle->ssienr = 0x00;
  1283. spi_handle->ctrlr0 = (0x0 << g_instance.work_mode) | (0x1 << g_instance.slv_oe) | ((data_bit_length - 1) << g_instance.dfs);
  1284. spi_handle->dmatdlr = 0x04;
  1285. spi_handle->dmardlr = 0x03;
  1286. spi_handle->dmacr = 0x00;
  1287. spi_handle->txftlr = 0x00;
  1288. spi_handle->rxftlr = 0x08 / data_width - 1;
  1289. spi_handle->imr = 0x00;
  1290. spi_handle->ssienr = 0x01;
  1291. gpiohs_set_drive_mode(g_instance.ready_pin, GPIO_DM_OUTPUT);
  1292. gpiohs_set_pin(g_instance.ready_pin, GPIO_PV_HIGH);
  1293. gpiohs_set_drive_mode(g_instance.int_pin, GPIO_DM_INPUT_PULL_UP);
  1294. gpiohs_set_pin_edge(g_instance.int_pin, GPIO_PE_RISING);
  1295. gpiohs_set_irq(g_instance.int_pin, 3, spi_slave_cs_irq);
  1296. }
  1297. void spi_slave_dual_config(uint8_t int_pin,
  1298. uint8_t ready_pin,
  1299. uint8_t mosi_pin,
  1300. uint8_t miso_pin,
  1301. dmac_channel_number_t dmac_channel,
  1302. size_t data_bit_length,
  1303. uint8_t *data,
  1304. uint32_t len,
  1305. spi_slave_receive_callback_t callback)
  1306. {
  1307. spi_slave_config(int_pin, ready_pin, dmac_channel, data_bit_length, data, len, callback);
  1308. g_instance.is_dual = 1;
  1309. g_instance.mosi_pin = mosi_pin;
  1310. g_instance.miso_pin = miso_pin;
  1311. }
  1312. void spi_handle_data_dma(spi_device_num_t spi_num, spi_chip_select_t chip_select, spi_data_t data, plic_interrupt_t *cb)
  1313. {
  1314. configASSERT(spi_num < SPI_DEVICE_MAX && spi_num != 2);
  1315. configASSERT(chip_select < SPI_CHIP_SELECT_MAX);
  1316. switch(data.transfer_mode)
  1317. {
  1318. case SPI_TMOD_TRANS_RECV:
  1319. case SPI_TMOD_EEROM:
  1320. configASSERT(data.tx_buf && data.tx_len && data.rx_buf && data.rx_len);
  1321. break;
  1322. case SPI_TMOD_TRANS:
  1323. configASSERT(data.tx_buf && data.tx_len);
  1324. break;
  1325. case SPI_TMOD_RECV:
  1326. configASSERT(data.rx_buf && data.rx_len);
  1327. break;
  1328. default:
  1329. configASSERT(!"Transfer Mode ERR");
  1330. break;
  1331. }
  1332. configASSERT(data.tx_channel < DMAC_CHANNEL_MAX && data.rx_channel < DMAC_CHANNEL_MAX);
  1333. volatile spi_t *spi_handle = spi[spi_num];
  1334. spinlock_lock(&g_spi_instance[spi_num].lock);
  1335. if(cb)
  1336. {
  1337. g_spi_instance[spi_num].spi_int_instance.callback = cb->callback;
  1338. g_spi_instance[spi_num].spi_int_instance.ctx = cb->ctx;
  1339. }
  1340. switch(data.transfer_mode)
  1341. {
  1342. case SPI_TMOD_RECV:
  1343. spi_set_tmod(spi_num, SPI_TMOD_RECV);
  1344. if(data.rx_len > 65536)
  1345. data.rx_len = 65536;
  1346. spi_handle->ctrlr1 = (uint32_t)(data.rx_len - 1);
  1347. spi_handle->dmacr = 0x03;
  1348. spi_handle->ssienr = 0x01;
  1349. if(spi_get_frame_format(spi_num) == SPI_FF_STANDARD)
  1350. spi_handle->dr[0] = 0xffffffff;
  1351. if(cb)
  1352. {
  1353. dmac_irq_register(data.rx_channel, spi_dma_irq, &g_spi_instance[spi_num], cb->priority);
  1354. g_spi_instance[spi_num].dmac_channel = data.rx_channel;
  1355. }
  1356. sysctl_dma_select((sysctl_dma_channel_t)data.rx_channel, SYSCTL_DMA_SELECT_SSI0_RX_REQ + spi_num * 2);
  1357. dmac_set_single_mode(data.rx_channel, (void *)(&spi_handle->dr[0]), (void *)data.rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  1358. DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, data.rx_len);
  1359. spi_handle->ser = 1U << chip_select;
  1360. if(!cb)
  1361. dmac_wait_done(data.rx_channel);
  1362. break;
  1363. case SPI_TMOD_TRANS:
  1364. spi_set_tmod(spi_num, SPI_TMOD_TRANS);
  1365. spi_handle->dmacr = 0x2; /*enable dma transmit*/
  1366. spi_handle->ssienr = 0x01;
  1367. if(cb)
  1368. {
  1369. dmac_irq_register(data.tx_channel, spi_dma_irq, &g_spi_instance[spi_num], cb->priority);
  1370. g_spi_instance[spi_num].dmac_channel = data.tx_channel;
  1371. }
  1372. sysctl_dma_select(data.tx_channel, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  1373. if(data.fill_mode)
  1374. dmac_set_single_mode(data.tx_channel, data.tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
  1375. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, data.tx_len);
  1376. else
  1377. dmac_set_single_mode(data.tx_channel, data.tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  1378. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, data.tx_len);
  1379. spi_handle->ser = 1U << chip_select;
  1380. if(!cb)
  1381. {
  1382. dmac_wait_done(data.tx_channel);
  1383. while((spi_handle->sr & 0x05) != 0x04)
  1384. ;
  1385. }
  1386. break;
  1387. case SPI_TMOD_EEROM:
  1388. spi_set_tmod(spi_num, SPI_TMOD_EEROM);
  1389. if(data.rx_len > 65536)
  1390. data.rx_len = 65536;
  1391. spi_handle->ctrlr1 = (uint32_t)(data.rx_len - 1);
  1392. spi_handle->dmacr = 0x3;
  1393. spi_handle->ssienr = 0x01;
  1394. sysctl_dma_select(data.tx_channel, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  1395. if(data.fill_mode)
  1396. dmac_set_single_mode(data.tx_channel, data.tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
  1397. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, data.tx_len);
  1398. else
  1399. dmac_set_single_mode(data.tx_channel, data.tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  1400. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, data.tx_len);
  1401. if(cb)
  1402. {
  1403. dmac_irq_register(data.rx_channel, spi_dma_irq, &g_spi_instance[spi_num], cb->priority);
  1404. g_spi_instance[spi_num].dmac_channel = data.rx_channel;
  1405. }
  1406. sysctl_dma_select(data.rx_channel, SYSCTL_DMA_SELECT_SSI0_RX_REQ + spi_num * 2);
  1407. dmac_set_single_mode(data.rx_channel, (void *)(&spi_handle->dr[0]), (void *)data.rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  1408. DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, data.rx_len);
  1409. spi_handle->ser = 1U << chip_select;
  1410. if(!cb)
  1411. {
  1412. dmac_wait_done(data.tx_channel);
  1413. dmac_wait_done(data.rx_channel);
  1414. }
  1415. break;
  1416. case SPI_TMOD_TRANS_RECV:
  1417. spi_set_tmod(spi_num, SPI_TMOD_TRANS_RECV);
  1418. if(data.rx_len > 65536)
  1419. data.rx_len = 65536;
  1420. if(cb)
  1421. {
  1422. if(data.tx_len > data.rx_len)
  1423. {
  1424. dmac_irq_register(data.tx_channel, spi_dma_irq, &g_spi_instance[spi_num], cb->priority);
  1425. g_spi_instance[spi_num].dmac_channel = data.tx_channel;
  1426. } else
  1427. {
  1428. dmac_irq_register(data.rx_channel, spi_dma_irq, &g_spi_instance[spi_num], cb->priority);
  1429. g_spi_instance[spi_num].dmac_channel = data.rx_channel;
  1430. }
  1431. }
  1432. spi_handle->ctrlr1 = (uint32_t)(data.rx_len - 1);
  1433. spi_handle->dmacr = 0x3;
  1434. spi_handle->ssienr = 0x01;
  1435. sysctl_dma_select(data.tx_channel, SYSCTL_DMA_SELECT_SSI0_TX_REQ + spi_num * 2);
  1436. if(data.fill_mode)
  1437. dmac_set_single_mode(data.tx_channel, data.tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
  1438. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, data.tx_len);
  1439. else
  1440. dmac_set_single_mode(data.tx_channel, data.tx_buf, (void *)(&spi_handle->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
  1441. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, data.tx_len);
  1442. sysctl_dma_select(data.rx_channel, SYSCTL_DMA_SELECT_SSI0_RX_REQ + spi_num * 2);
  1443. dmac_set_single_mode(data.rx_channel, (void *)(&spi_handle->dr[0]), (void *)data.rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  1444. DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, data.rx_len);
  1445. spi_handle->ser = 1U << chip_select;
  1446. if(!cb)
  1447. {
  1448. dmac_wait_done(data.tx_channel);
  1449. dmac_wait_done(data.rx_channel);
  1450. }
  1451. break;
  1452. }
  1453. if(!cb)
  1454. {
  1455. spinlock_unlock(&g_spi_instance[spi_num].lock);
  1456. spi_handle->ser = 0x00;
  1457. spi_handle->ssienr = 0x00;
  1458. }
  1459. }