fsl_spi_cmsis.c 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787
  1. /*
  2. * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
  3. * Copyright (c) 2016, Freescale Semiconductor, Inc. Not a Contribution.
  4. * Copyright 2016-2017 NXP. Not a Contribution.
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. *
  8. * Licensed under the Apache License, Version 2.0 (the License); you may
  9. * not use this file except in compliance with the License.
  10. * You may obtain a copy of the License at
  11. *
  12. * http://www.apache.org/licenses/LICENSE-2.0
  13. *
  14. * Unless required by applicable law or agreed to in writing, software
  15. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  16. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. */
  20. #include "fsl_spi_cmsis.h"
  21. /* Component ID definition, used by tools. */
  22. #ifndef FSL_COMPONENT_ID
  23. #define FSL_COMPONENT_ID "platform.drivers.flexcomm_spi_cmsis"
  24. #endif
  25. #if (RTE_SPI0 || RTE_SPI1 || RTE_SPI2 || RTE_SPI3 || RTE_SPI4 || RTE_SPI5 || RTE_SPI6 || RTE_SPI7 || RTE_SPI8 || \
  26. RTE_SPI9)
  27. #define ARM_SPI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */
  28. /*! @brief IDs of clock for each FLEXCOMM module */
  29. static const clock_ip_name_t s_flexcommClocks[] = FLEXCOMM_CLOCKS;
  30. /* Array of SPI reset number. */
  31. static const reset_ip_name_t s_spiResetInstance[] = FLEXCOMM_RSTS;
  32. /*
  33. * ARMCC does not support split the data section automatically, so the driver
  34. * needs to split the data to separate sections explicitly, to reduce codesize.
  35. */
  36. #if defined(__CC_ARM)
  37. #define ARMCC_SECTION(section_name) __attribute__((section(section_name)))
  38. #endif
  39. typedef const struct _cmsis_spi_resource
  40. {
  41. SPI_Type *base;
  42. uint32_t instance;
  43. uint32_t (*GetFreq)(void);
  44. } cmsis_spi_resource_t;
  45. typedef union _cmsis_spi_handle
  46. {
  47. spi_master_handle_t masterHandle;
  48. spi_slave_handle_t slaveHandle;
  49. } cmsis_spi_handle_t;
  50. typedef struct _cmsis_spi_interrupt_driver_state
  51. {
  52. cmsis_spi_resource_t *resource;
  53. cmsis_spi_handle_t *handle;
  54. ARM_SPI_SignalEvent_t cb_event;
  55. uint32_t baudRate_Bps;
  56. uint8_t flags; /*!< Control and state flags. */
  57. } cmsis_spi_interrupt_driver_state_t;
  58. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  59. typedef const struct _cmsis_spi_dma_resource
  60. {
  61. DMA_Type *txdmaBase;
  62. uint32_t txdmaChannel;
  63. DMA_Type *rxdmaBase;
  64. uint32_t rxdmaChannel;
  65. } cmsis_spi_dma_resource_t;
  66. typedef union _cmsis_spi_dma_handle
  67. {
  68. spi_dma_handle_t masterHandle;
  69. spi_dma_handle_t slaveHandle;
  70. } cmsis_spi_dma_handle_t;
  71. typedef struct _cmsis_spi_dma_driver_state
  72. {
  73. cmsis_spi_resource_t *resource;
  74. cmsis_spi_dma_resource_t *dmaResource;
  75. cmsis_spi_dma_handle_t *handle;
  76. dma_handle_t *dmaRxDataHandle;
  77. dma_handle_t *dmaTxDataHandle;
  78. uint32_t baudRate_Bps;
  79. ARM_SPI_SignalEvent_t cb_event;
  80. uint8_t flags; /*!< Control and state flags. */
  81. } cmsis_spi_dma_driver_state_t;
  82. #endif
  83. /* Driver Version */
  84. static const ARM_DRIVER_VERSION s_SPIDriverVersion = {ARM_SPI_API_VERSION, ARM_SPI_DRV_VERSION};
  85. /* Driver Capabilities */
  86. static const ARM_SPI_CAPABILITIES s_SPIDriverCapabilities = {
  87. 1, /* Simplex Mode (Master and Slave) */
  88. 0, /* TI Synchronous Serial Interface */
  89. 0, /* Microwire Interface */
  90. 0 /* Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT */
  91. };
  92. /*******************************************************************************
  93. * Code
  94. ******************************************************************************/
  95. void SPI_MasterCommonControl(uint32_t control,
  96. cmsis_spi_resource_t *resource,
  97. uint8_t *status,
  98. spi_master_config_t *masterConfig)
  99. {
  100. switch (resource->instance)
  101. {
  102. case 0:
  103. #if defined(RTE_SPI0_SSEL_NUM)
  104. masterConfig->sselNum = RTE_SPI0_SSEL_NUM;
  105. #endif
  106. #if defined(RTE_SPI0_SSEL_POL)
  107. masterConfig->sselPol = RTE_SPI0_SSEL_POL;
  108. #endif
  109. break;
  110. case 1:
  111. #if defined(RTE_SPI1_SSEL_NUM)
  112. masterConfig->sselNum = RTE_SPI1_SSEL_NUM;
  113. #endif
  114. #if defined(RTE_SPI1_SSEL_POL)
  115. masterConfig->sselPol = RTE_SPI1_SSEL_POL;
  116. #endif
  117. break;
  118. case 2:
  119. #if defined(RTE_SPI2_SSEL_NUM)
  120. masterConfig->sselNum = RTE_SPI2_SSEL_NUM;
  121. #endif
  122. #if defined(RTE_SPI2_SSEL_POL)
  123. masterConfig->sselPol = RTE_SPI2_SSEL_POL;
  124. #endif
  125. break;
  126. case 3:
  127. #if defined(RTE_SPI3_SSEL_NUM)
  128. masterConfig->sselNum = RTE_SPI3_SSEL_NUM;
  129. #endif
  130. #if defined(RTE_SPI3_SSEL_POL)
  131. masterConfig->sselPol = RTE_SPI3_SSEL_POL;
  132. #endif
  133. break;
  134. case 4:
  135. #if defined(RTE_SPI4_SSEL_NUM)
  136. masterConfig->sselNum = RTE_SPI4_SSEL_NUM;
  137. #endif
  138. #if defined(RTE_SPI4_SSEL_POL)
  139. masterConfig->sselPol = RTE_SPI4_SSEL_POL;
  140. #endif
  141. break;
  142. case 5:
  143. #if defined(RTE_SPI5_SSEL_NUM)
  144. masterConfig->sselNum = RTE_SPI5_SSEL_NUM;
  145. #endif
  146. #if defined(RTE_SPI5_SSEL_POL)
  147. masterConfig->sselPol = RTE_SPI5_SSEL_POL;
  148. #endif
  149. break;
  150. case 6:
  151. #if defined(RTE_SPI6_SSEL_NUM)
  152. masterConfig->sselNum = RTE_SPI6_SSEL_NUM;
  153. #endif
  154. #if defined(RTE_SPI6_SSEL_POL)
  155. masterConfig->sselPol = RTE_SPI6_SSEL_POL;
  156. #endif
  157. break;
  158. case 7:
  159. #if defined(RTE_SPI7_SSEL_NUM)
  160. masterConfig->sselNum = RTE_SPI7_SSEL_NUM;
  161. #endif
  162. #if defined(RTE_SPI7_SSEL_POL)
  163. masterConfig->sselPol = RTE_SPI7_SSEL_POL;
  164. #endif
  165. break;
  166. case 8:
  167. #if defined(RTE_SPI8_SSEL_NUM)
  168. masterConfig->sselNum = RTE_SPI8_SSEL_NUM;
  169. #endif
  170. #if defined(RTE_SPI8_SSEL_POL)
  171. masterConfig->sselPol = RTE_SPI8_SSEL_POL;
  172. #endif
  173. break;
  174. case 9:
  175. #if defined(RTE_SPI9_SSEL_NUM)
  176. masterConfig->sselNum = RTE_SPI9_SSEL_NUM;
  177. #endif
  178. #if defined(RTE_SPI9_SSEL_POL)
  179. masterConfig->sselPol = RTE_SPI9_SSEL_POL;
  180. #endif
  181. break;
  182. default:
  183. break;
  184. }
  185. switch (control & ARM_SPI_FRAME_FORMAT_Msk)
  186. {
  187. case ARM_SPI_CPOL0_CPHA0:
  188. masterConfig->polarity = kSPI_ClockPolarityActiveHigh;
  189. masterConfig->phase = kSPI_ClockPhaseFirstEdge;
  190. break;
  191. case ARM_SPI_CPOL0_CPHA1:
  192. masterConfig->polarity = kSPI_ClockPolarityActiveHigh;
  193. masterConfig->phase = kSPI_ClockPhaseSecondEdge;
  194. break;
  195. case ARM_SPI_CPOL1_CPHA0:
  196. masterConfig->polarity = kSPI_ClockPolarityActiveLow;
  197. masterConfig->phase = kSPI_ClockPhaseFirstEdge;
  198. break;
  199. case ARM_SPI_CPOL1_CPHA1:
  200. masterConfig->polarity = kSPI_ClockPolarityActiveLow;
  201. masterConfig->phase = kSPI_ClockPhaseSecondEdge;
  202. break;
  203. default:
  204. break;
  205. }
  206. if (control & ARM_SPI_DATA_BITS_Msk) /* setting Number of Data bits */
  207. {
  208. if ((((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) >= 4) &&
  209. (((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) <= 16))
  210. {
  211. masterConfig->dataWidth =
  212. (spi_data_width_t)(((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) - 1);
  213. }
  214. }
  215. switch (control & ARM_SPI_BIT_ORDER_Msk)
  216. {
  217. case ARM_SPI_LSB_MSB:
  218. masterConfig->direction = kSPI_LsbFirst;
  219. break;
  220. case ARM_SPI_MSB_LSB:
  221. masterConfig->direction = kSPI_MsbFirst;
  222. break;
  223. default:
  224. break;
  225. }
  226. }
  227. void SPI_SlaveCommonControl(uint32_t control,
  228. cmsis_spi_resource_t *resource,
  229. uint8_t *status,
  230. spi_slave_config_t *slaveConfig)
  231. {
  232. switch (resource->instance)
  233. {
  234. case 0:
  235. #if defined(RTE_SPI0_SSEL_POL)
  236. slaveConfig->sselPol = RTE_SPI0_SSEL_POL;
  237. #endif
  238. break;
  239. case 1:
  240. #if defined(RTE_SPI1_SSEL_POL)
  241. slaveConfig->sselPol = RTE_SPI1_SSEL_POL;
  242. #endif
  243. break;
  244. case 2:
  245. #if defined(RTE_SPI2_SSEL_POL)
  246. slaveConfig->sselPol = RTE_SPI2_SSEL_POL;
  247. #endif
  248. break;
  249. case 3:
  250. #if defined(RTE_SPI3_SSEL_POL)
  251. slaveConfig->sselPol = RTE_SPI3_SSEL_POL;
  252. #endif
  253. break;
  254. case 4:
  255. #if defined(RTE_SPI4_SSEL_POL)
  256. slaveConfig->sselPol = RTE_SPI4_SSEL_POL;
  257. #endif
  258. break;
  259. case 5:
  260. #if defined(RTE_SPI5_SSEL_POL)
  261. slaveConfig->sselPol = RTE_SPI5_SSEL_POL;
  262. #endif
  263. break;
  264. case 6:
  265. #if defined(RTE_SPI6_SSEL_POL)
  266. slaveConfig->sselPol = RTE_SPI6_SSEL_POL;
  267. #endif
  268. break;
  269. case 7:
  270. #if defined(RTE_SPI7_SSEL_POL)
  271. slaveConfig->sselPol = RTE_SPI7_SSEL_POL;
  272. #endif
  273. break;
  274. case 8:
  275. #if defined(RTE_SPI8_SSEL_POL)
  276. slaveConfig->sselPol = RTE_SPI8_SSEL_POL;
  277. #endif
  278. break;
  279. case 9:
  280. #if defined(RTE_SPI9_SSEL_POL)
  281. slaveConfig->sselPol = RTE_SPI9_SSEL_POL;
  282. #endif
  283. break;
  284. default:
  285. break;
  286. }
  287. switch (control & ARM_SPI_FRAME_FORMAT_Msk)
  288. {
  289. case ARM_SPI_CPOL0_CPHA0:
  290. slaveConfig->polarity = kSPI_ClockPolarityActiveHigh;
  291. slaveConfig->phase = kSPI_ClockPhaseFirstEdge;
  292. break;
  293. case ARM_SPI_CPOL0_CPHA1:
  294. slaveConfig->polarity = kSPI_ClockPolarityActiveHigh;
  295. slaveConfig->phase = kSPI_ClockPhaseSecondEdge;
  296. break;
  297. case ARM_SPI_CPOL1_CPHA0:
  298. slaveConfig->polarity = kSPI_ClockPolarityActiveLow;
  299. slaveConfig->phase = kSPI_ClockPhaseFirstEdge;
  300. break;
  301. case ARM_SPI_CPOL1_CPHA1:
  302. slaveConfig->polarity = kSPI_ClockPolarityActiveLow;
  303. slaveConfig->phase = kSPI_ClockPhaseSecondEdge;
  304. break;
  305. default:
  306. break;
  307. }
  308. if (control & ARM_SPI_DATA_BITS_Msk) /* setting Number of Data bits */
  309. {
  310. if ((((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) >= 4) &&
  311. (((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) <= 16))
  312. {
  313. slaveConfig->dataWidth =
  314. (spi_data_width_t)(((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) - 1);
  315. }
  316. }
  317. switch (control & ARM_SPI_BIT_ORDER_Msk)
  318. {
  319. case ARM_SPI_LSB_MSB:
  320. slaveConfig->direction = kSPI_LsbFirst;
  321. break;
  322. case ARM_SPI_MSB_LSB:
  323. slaveConfig->direction = kSPI_MsbFirst;
  324. break;
  325. default:
  326. break;
  327. }
  328. }
  329. static ARM_DRIVER_VERSION SPIx_GetVersion(void)
  330. {
  331. return s_SPIDriverVersion;
  332. }
  333. static ARM_SPI_CAPABILITIES SPIx_GetCapabilities(void)
  334. {
  335. return s_SPIDriverCapabilities;
  336. }
  337. #endif
  338. #if (RTE_SPI0_DMA_EN || RTE_SPI1_DMA_EN || RTE_SPI2_DMA_EN || RTE_SPI3_DMA_EN || RTE_SPI4_DMA_EN || RTE_SPI5_DMA_EN || \
  339. RTE_SPI6_DMA_EN || RTE_SPI7_DMA_EN || RTE_SPI8_DMA_EN || RTE_SPI9_DMA_EN)
  340. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  341. void KSDK_SPI_MasterDMACallback(SPI_Type *base, spi_dma_handle_t *handle, status_t status, void *userData)
  342. {
  343. uint32_t event = 0;
  344. if (kStatus_Success == status)
  345. {
  346. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  347. }
  348. if (kStatus_SPI_Error == status)
  349. {
  350. event = ARM_SPI_EVENT_DATA_LOST;
  351. }
  352. if (userData)
  353. {
  354. ((ARM_SPI_SignalEvent_t)userData)(event);
  355. }
  356. }
  357. void KSDK_SPI_SlaveDMACallback(SPI_Type *base, spi_dma_handle_t *handle, status_t status, void *userData)
  358. {
  359. uint32_t event = 0;
  360. if (kStatus_Success == status)
  361. {
  362. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  363. }
  364. if (kStatus_SPI_Error == status)
  365. {
  366. event = ARM_SPI_EVENT_DATA_LOST;
  367. }
  368. /* User data is actually CMSIS driver callback. */
  369. if (userData)
  370. {
  371. ((ARM_SPI_SignalEvent_t)userData)(event);
  372. }
  373. }
  374. static int32_t SPI_DMAInitialize(ARM_SPI_SignalEvent_t cb_event, cmsis_spi_dma_driver_state_t *spi)
  375. {
  376. if (!(spi->flags & SPI_FLAG_INIT))
  377. {
  378. spi->cb_event = cb_event;
  379. spi->flags = SPI_FLAG_INIT;
  380. }
  381. return ARM_DRIVER_OK;
  382. }
  383. static int32_t SPI_DMAUninitialize(cmsis_spi_dma_driver_state_t *spi)
  384. {
  385. spi->flags = SPI_FLAG_UNINIT;
  386. return ARM_DRIVER_OK;
  387. }
  388. static int32_t SPI_DMAPowerControl(ARM_POWER_STATE state, cmsis_spi_dma_driver_state_t *spi)
  389. {
  390. switch (state)
  391. {
  392. case ARM_POWER_OFF:
  393. if (spi->flags & SPI_FLAG_POWER)
  394. {
  395. SPI_Deinit(spi->resource->base);
  396. RESET_PeripheralReset(s_spiResetInstance[spi->resource->instance]);
  397. DMA_DisableChannel(spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel);
  398. DMA_DisableChannel(spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel);
  399. DMA_Deinit(spi->dmaResource->txdmaBase);
  400. DMA_Deinit(spi->dmaResource->rxdmaBase);
  401. spi->flags = SPI_FLAG_INIT;
  402. }
  403. break;
  404. case ARM_POWER_LOW:
  405. return ARM_DRIVER_ERROR_UNSUPPORTED;
  406. case ARM_POWER_FULL:
  407. if (spi->flags == SPI_FLAG_UNINIT)
  408. {
  409. return ARM_DRIVER_ERROR;
  410. }
  411. if (spi->flags & SPI_FLAG_POWER)
  412. {
  413. /* Driver already powered */
  414. break;
  415. }
  416. /* Enable flexcomm clock gate */
  417. CLOCK_EnableClock(s_flexcommClocks[spi->resource->instance]);
  418. /* Init DMA */
  419. DMA_Init(spi->dmaResource->rxdmaBase);
  420. DMA_Init(spi->dmaResource->txdmaBase);
  421. spi->flags |= SPI_FLAG_POWER;
  422. break;
  423. default:
  424. return ARM_DRIVER_ERROR_UNSUPPORTED;
  425. }
  426. return ARM_DRIVER_OK;
  427. }
  428. static int32_t SPI_DMASend(const void *data, uint32_t num, cmsis_spi_dma_driver_state_t *spi)
  429. {
  430. int32_t ret;
  431. status_t status;
  432. spi_transfer_t xfer = {0};
  433. xfer.rxData = NULL;
  434. xfer.txData = (uint8_t *)data;
  435. xfer.dataSize = num;
  436. if (spi->flags & SPI_FLAG_MASTER)
  437. {
  438. xfer.configFlags |= kSPI_FrameAssert;
  439. }
  440. if (spi->flags & SPI_FLAG_MASTER)
  441. {
  442. status = SPI_MasterTransferDMA(spi->resource->base, &spi->handle->masterHandle, &xfer);
  443. }
  444. else
  445. {
  446. status = SPI_SlaveTransferDMA(spi->resource->base, &spi->handle->slaveHandle, &xfer);
  447. }
  448. switch (status)
  449. {
  450. case kStatus_Success:
  451. ret = ARM_DRIVER_OK;
  452. break;
  453. case kStatus_InvalidArgument:
  454. ret = ARM_DRIVER_ERROR_PARAMETER;
  455. break;
  456. case kStatus_SPI_Busy:
  457. ret = ARM_DRIVER_ERROR_BUSY;
  458. break;
  459. default:
  460. ret = ARM_DRIVER_ERROR;
  461. break;
  462. }
  463. return ret;
  464. }
  465. static int32_t SPI_DMAReceive(void *data, uint32_t num, cmsis_spi_dma_driver_state_t *spi)
  466. {
  467. int32_t ret;
  468. status_t status;
  469. spi_transfer_t xfer = {0};
  470. xfer.txData = NULL;
  471. xfer.rxData = (uint8_t *)data;
  472. xfer.dataSize = num;
  473. if (spi->flags & SPI_FLAG_MASTER)
  474. {
  475. xfer.configFlags |= kSPI_FrameAssert;
  476. }
  477. if (spi->flags & SPI_FLAG_MASTER)
  478. {
  479. status = SPI_MasterTransferDMA(spi->resource->base, &spi->handle->masterHandle, &xfer);
  480. }
  481. else
  482. {
  483. status = SPI_SlaveTransferDMA(spi->resource->base, &spi->handle->slaveHandle, &xfer);
  484. }
  485. switch (status)
  486. {
  487. case kStatus_Success:
  488. ret = ARM_DRIVER_OK;
  489. break;
  490. case kStatus_InvalidArgument:
  491. ret = ARM_DRIVER_ERROR_PARAMETER;
  492. break;
  493. case kStatus_SPI_Busy:
  494. ret = ARM_DRIVER_ERROR_BUSY;
  495. break;
  496. default:
  497. ret = ARM_DRIVER_ERROR;
  498. break;
  499. }
  500. return ret;
  501. }
  502. static int32_t SPI_DMATransfer(const void *data_out, void *data_in, uint32_t num, cmsis_spi_dma_driver_state_t *spi)
  503. {
  504. int32_t ret;
  505. status_t status;
  506. spi_transfer_t xfer = {0};
  507. xfer.txData = (uint8_t *)data_out;
  508. xfer.rxData = (uint8_t *)data_in;
  509. xfer.dataSize = num;
  510. if (spi->flags & SPI_FLAG_MASTER)
  511. {
  512. xfer.configFlags |= kSPI_FrameAssert;
  513. }
  514. if (spi->flags & SPI_FLAG_MASTER)
  515. {
  516. status = SPI_MasterTransferDMA(spi->resource->base, &spi->handle->masterHandle, &xfer);
  517. }
  518. else
  519. {
  520. status = SPI_SlaveTransferDMA(spi->resource->base, &spi->handle->slaveHandle, &xfer);
  521. }
  522. switch (status)
  523. {
  524. case kStatus_Success:
  525. ret = ARM_DRIVER_OK;
  526. break;
  527. case kStatus_InvalidArgument:
  528. ret = ARM_DRIVER_ERROR_PARAMETER;
  529. break;
  530. case kStatus_SPI_Busy:
  531. ret = ARM_DRIVER_ERROR_BUSY;
  532. break;
  533. default:
  534. ret = ARM_DRIVER_ERROR;
  535. break;
  536. }
  537. return ret;
  538. }
  539. static uint32_t SPI_DMAGetCount(cmsis_spi_dma_driver_state_t *spi)
  540. {
  541. uint32_t cnt;
  542. size_t bytes;
  543. bytes = DMA_GetRemainingBytes(spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel);
  544. if (spi->flags & SPI_FLAG_MASTER)
  545. {
  546. cnt = spi->handle->masterHandle.transferSize - bytes;
  547. }
  548. else
  549. {
  550. cnt = spi->handle->slaveHandle.transferSize - bytes;
  551. }
  552. return cnt;
  553. }
  554. static int32_t SPI_DMAControl(uint32_t control, uint32_t arg, cmsis_spi_dma_driver_state_t *spi)
  555. {
  556. if (!(spi->flags & SPI_FLAG_POWER))
  557. {
  558. return ARM_DRIVER_ERROR;
  559. }
  560. switch (control & ARM_SPI_CONTROL_Msk)
  561. {
  562. case ARM_SPI_MODE_INACTIVE:
  563. SPI_Enable(spi->resource->base, false);
  564. break;
  565. case ARM_SPI_MODE_MASTER:
  566. spi->baudRate_Bps = arg;
  567. spi->flags |= SPI_FLAG_MASTER;
  568. break;
  569. case ARM_SPI_MODE_SLAVE:
  570. spi->flags &= ~SPI_FLAG_MASTER;
  571. break;
  572. case ARM_SPI_SET_BUS_SPEED:
  573. if (!(spi->flags & SPI_FLAG_MASTER))
  574. {
  575. return ARM_DRIVER_ERROR_UNSUPPORTED;
  576. }
  577. SPI_MasterSetBaud(spi->resource->base, arg, spi->resource->GetFreq());
  578. spi->baudRate_Bps = arg;
  579. return ARM_DRIVER_OK;
  580. case ARM_SPI_GET_BUS_SPEED: /* Set Bus Speed in bps; arg = value */
  581. if (!(spi->flags & SPI_FLAG_MASTER))
  582. {
  583. return ARM_DRIVER_ERROR_UNSUPPORTED;
  584. }
  585. return spi->baudRate_Bps;
  586. case ARM_SPI_CONTROL_SS:
  587. return ARM_DRIVER_ERROR_UNSUPPORTED;
  588. case ARM_SPI_ABORT_TRANSFER:
  589. if (spi->flags & SPI_FLAG_MASTER)
  590. {
  591. SPI_MasterTransferAbortDMA(spi->resource->base, &spi->handle->masterHandle);
  592. }
  593. else
  594. {
  595. SPI_SlaveTransferAbortDMA(spi->resource->base, &spi->handle->slaveHandle);
  596. }
  597. return ARM_DRIVER_OK;
  598. case ARM_SPI_SET_DEFAULT_TX_VALUE: /* Set default Transmit value; arg = value */
  599. SPI_SetDummyData(spi->resource->base, (uint8_t)arg);
  600. return ARM_DRIVER_OK;
  601. case ARM_SPI_MODE_MASTER_SIMPLEX: /* SPI Master (Output/Input on MOSI); arg = Bus Speed in bps */
  602. /* Mode is not supported by current driver. */
  603. return ARM_DRIVER_ERROR_UNSUPPORTED;
  604. case ARM_SPI_MODE_SLAVE_SIMPLEX: /* SPI Slave (Output/Input on MISO) */
  605. /* Mode is not supported by current driver. */
  606. return ARM_DRIVER_ERROR_UNSUPPORTED;
  607. default:
  608. break;
  609. }
  610. if (spi->flags & SPI_FLAG_MASTER)
  611. {
  612. switch (control & ARM_SPI_SS_MASTER_MODE_Msk)
  613. {
  614. /*
  615. * Note:
  616. * ARM_SPI_SS_MASTER_HW_OUTPUT is default configuration in driver, if ARM_SPI_SS_MASTER_UNUSED or
  617. * ARM_SPI_SS_MASTER_SW is wanted, please disable pin function in SPIx_InitPins() which is configured
  618. * by user in extern file. Besides, ARM_SPI_SS_MASTER_HW_INPUT is not supported in this driver.
  619. */
  620. case ARM_SPI_SS_MASTER_UNUSED: /*!< SPI Slave Select when Master: Not used */
  621. break;
  622. case ARM_SPI_SS_MASTER_SW: /*!< SPI Slave Select when Master: Software controlled. */
  623. break;
  624. case ARM_SPI_SS_MASTER_HW_OUTPUT: /*!< SPI Slave Select when Master: Hardware controlled Output */
  625. break;
  626. case ARM_SPI_SS_MASTER_HW_INPUT: /*!< SPI Slave Select when Master: Hardware monitored Input */
  627. break;
  628. default:
  629. break;
  630. }
  631. spi_master_config_t masterConfig;
  632. SPI_MasterGetDefaultConfig(&masterConfig);
  633. masterConfig.baudRate_Bps = spi->baudRate_Bps;
  634. SPI_MasterCommonControl(control, spi->resource, &spi->flags, &masterConfig);
  635. if (spi->flags & SPI_FLAG_CONFIGURED)
  636. {
  637. SPI_Deinit(spi->resource->base);
  638. RESET_PeripheralReset(s_spiResetInstance[spi->resource->instance]);
  639. }
  640. SPI_MasterInit(spi->resource->base, &masterConfig, spi->resource->GetFreq());
  641. DMA_EnableChannel(spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel);
  642. DMA_EnableChannel(spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel);
  643. DMA_SetChannelPriority(spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel, kDMA_ChannelPriority3);
  644. DMA_SetChannelPriority(spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel, kDMA_ChannelPriority2);
  645. DMA_CreateHandle(spi->dmaTxDataHandle, spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel);
  646. DMA_CreateHandle(spi->dmaRxDataHandle, spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel);
  647. SPI_MasterTransferCreateHandleDMA(spi->resource->base, &(spi->handle->masterHandle), KSDK_SPI_MasterDMACallback,
  648. (void *)spi->cb_event, spi->dmaTxDataHandle, spi->dmaRxDataHandle);
  649. spi->flags |= SPI_FLAG_CONFIGURED;
  650. }
  651. else
  652. {
  653. /* The SPI slave select is controlled by hardware, software mode is not supported by current driver. */
  654. switch (control & ARM_SPI_SS_SLAVE_MODE_Msk)
  655. {
  656. case ARM_SPI_SS_SLAVE_HW:
  657. break;
  658. case ARM_SPI_SS_SLAVE_SW:
  659. break;
  660. default:
  661. break;
  662. }
  663. spi_slave_config_t slaveConfig;
  664. SPI_SlaveGetDefaultConfig(&slaveConfig);
  665. SPI_SlaveCommonControl(control, spi->resource, &spi->flags, &slaveConfig);
  666. if (spi->flags & SPI_FLAG_CONFIGURED)
  667. {
  668. SPI_Deinit(spi->resource->base);
  669. RESET_PeripheralReset(s_spiResetInstance[spi->resource->instance]);
  670. }
  671. SPI_SlaveInit(spi->resource->base, &slaveConfig);
  672. DMA_EnableChannel(spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel);
  673. DMA_EnableChannel(spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel);
  674. DMA_SetChannelPriority(spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel, kDMA_ChannelPriority0);
  675. DMA_SetChannelPriority(spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel, kDMA_ChannelPriority1);
  676. DMA_CreateHandle(spi->dmaTxDataHandle, spi->dmaResource->txdmaBase, spi->dmaResource->txdmaChannel);
  677. DMA_CreateHandle(spi->dmaRxDataHandle, spi->dmaResource->rxdmaBase, spi->dmaResource->rxdmaChannel);
  678. SPI_SlaveTransferCreateHandleDMA(spi->resource->base, &(spi->handle->slaveHandle), KSDK_SPI_SlaveDMACallback,
  679. (void *)spi->cb_event, spi->dmaTxDataHandle, spi->dmaRxDataHandle);
  680. spi->flags |= SPI_FLAG_CONFIGURED;
  681. }
  682. return ARM_DRIVER_OK;
  683. }
  684. ARM_SPI_STATUS SPI_DMAGetStatus(cmsis_spi_dma_driver_state_t *spi)
  685. {
  686. ARM_SPI_STATUS stat;
  687. if (spi->flags & SPI_FLAG_MASTER)
  688. {
  689. stat.busy =
  690. ((spi->handle->masterHandle.txInProgress == true) || (spi->handle->masterHandle.rxInProgress == true)) ?
  691. (0U) :
  692. (1U);
  693. stat.data_lost = (kStatus_SPI_Error == spi->handle->masterHandle.state) ? (1U) : (0U);
  694. }
  695. else
  696. {
  697. stat.busy =
  698. ((spi->handle->slaveHandle.txInProgress == true) || (spi->handle->slaveHandle.rxInProgress == true)) ?
  699. (0U) :
  700. (1U);
  701. stat.data_lost = (kStatus_SPI_Error == spi->handle->slaveHandle.state) ? (1U) : (0U);
  702. }
  703. stat.mode_fault = 0U;
  704. stat.reserved = 0U;
  705. return stat;
  706. }
  707. #endif /* defined(FSL_FEATURE_SOC_DMA_COUNT) */
  708. #endif
  709. #if ((RTE_SPI0 && !RTE_SPI0_DMA_EN) || (RTE_SPI1 && !RTE_SPI1_DMA_EN) || (RTE_SPI2 && !RTE_SPI2_DMA_EN) || \
  710. (RTE_SPI3 && !RTE_SPI3_DMA_EN) || (RTE_SPI4 && !RTE_SPI4_DMA_EN) || (RTE_SPI5 && !RTE_SPI5_DMA_EN) || \
  711. (RTE_SPI6 && !RTE_SPI6_DMA_EN) || (RTE_SPI7 && !RTE_SPI7_DMA_EN) || (RTE_SPI8 && !RTE_SPI8_DMA_EN) || \
  712. (RTE_SPI9 && !RTE_SPI9_DMA_EN))
  713. void KSDK_SPI_MasterInterruptCallback(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData)
  714. {
  715. uint32_t event = 0;
  716. if ((kStatus_Success == status) || (kStatus_SPI_Idle == status))
  717. {
  718. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  719. }
  720. if (kStatus_SPI_Error == status)
  721. {
  722. event = ARM_SPI_EVENT_DATA_LOST;
  723. }
  724. /* User data is actually CMSIS driver callback. */
  725. if (userData)
  726. {
  727. ((ARM_SPI_SignalEvent_t)userData)(event);
  728. }
  729. }
  730. void KSDK_SPI_SlaveInterruptCallback(SPI_Type *base, spi_slave_handle_t *handle, status_t status, void *userData)
  731. {
  732. uint32_t event = 0;
  733. if ((kStatus_Success == status) || (kStatus_SPI_Idle == status))
  734. {
  735. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  736. }
  737. if (kStatus_SPI_Error == status)
  738. {
  739. event = ARM_SPI_EVENT_DATA_LOST;
  740. }
  741. /* User data is actually CMSIS driver callback. */
  742. if (userData)
  743. {
  744. ((ARM_SPI_SignalEvent_t)userData)(event);
  745. }
  746. }
  747. static int32_t SPI_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event, cmsis_spi_interrupt_driver_state_t *spi)
  748. {
  749. if (!(spi->flags & SPI_FLAG_INIT))
  750. {
  751. spi->cb_event = cb_event;
  752. spi->flags = SPI_FLAG_INIT;
  753. }
  754. return ARM_DRIVER_OK;
  755. }
  756. static int32_t SPI_InterruptUninitialize(cmsis_spi_interrupt_driver_state_t *spi)
  757. {
  758. spi->flags = SPI_FLAG_UNINIT;
  759. return ARM_DRIVER_OK;
  760. }
  761. static int32_t SPI_InterruptPowerControl(ARM_POWER_STATE state, cmsis_spi_interrupt_driver_state_t *spi)
  762. {
  763. switch (state)
  764. {
  765. case ARM_POWER_OFF:
  766. if (spi->flags & SPI_FLAG_POWER)
  767. {
  768. SPI_Deinit(spi->resource->base);
  769. /* Reset Periphera instance, and disable the clock gate */
  770. RESET_PeripheralReset(s_spiResetInstance[spi->resource->instance]);
  771. spi->flags = SPI_FLAG_INIT;
  772. }
  773. break;
  774. case ARM_POWER_LOW:
  775. return ARM_DRIVER_ERROR_UNSUPPORTED;
  776. case ARM_POWER_FULL:
  777. if (spi->flags == SPI_FLAG_UNINIT)
  778. {
  779. return ARM_DRIVER_ERROR;
  780. }
  781. if (spi->flags & SPI_FLAG_POWER)
  782. {
  783. /* Driver already powered */
  784. break;
  785. }
  786. /* Enable flexcomm clock gate */
  787. CLOCK_EnableClock(s_flexcommClocks[spi->resource->instance]);
  788. spi->flags |= SPI_FLAG_POWER;
  789. break;
  790. default:
  791. return ARM_DRIVER_ERROR_UNSUPPORTED;
  792. }
  793. return ARM_DRIVER_OK;
  794. }
  795. static int32_t SPI_InterruptSend(const void *data, uint32_t num, cmsis_spi_interrupt_driver_state_t *spi)
  796. {
  797. int32_t ret;
  798. status_t status;
  799. spi_transfer_t xfer = {0};
  800. xfer.rxData = NULL;
  801. xfer.txData = (uint8_t *)data;
  802. xfer.dataSize = num;
  803. if (spi->flags & SPI_FLAG_MASTER)
  804. {
  805. xfer.configFlags |= kSPI_FrameAssert;
  806. }
  807. if (spi->flags & SPI_FLAG_MASTER)
  808. {
  809. status = SPI_MasterTransferNonBlocking(spi->resource->base, &spi->handle->masterHandle, &xfer);
  810. }
  811. else
  812. {
  813. status = SPI_SlaveTransferNonBlocking(spi->resource->base, &spi->handle->slaveHandle, &xfer);
  814. }
  815. switch (status)
  816. {
  817. case kStatus_Success:
  818. ret = ARM_DRIVER_OK;
  819. break;
  820. case kStatus_InvalidArgument:
  821. ret = ARM_DRIVER_ERROR_PARAMETER;
  822. break;
  823. case kStatus_SPI_Busy:
  824. ret = ARM_DRIVER_ERROR_BUSY;
  825. break;
  826. default:
  827. ret = ARM_DRIVER_ERROR;
  828. break;
  829. }
  830. return ret;
  831. }
  832. static int32_t SPI_InterruptReceive(void *data, uint32_t num, cmsis_spi_interrupt_driver_state_t *spi)
  833. {
  834. int32_t ret;
  835. status_t status;
  836. spi_transfer_t xfer = {0};
  837. xfer.txData = NULL;
  838. xfer.rxData = (uint8_t *)data;
  839. xfer.dataSize = num;
  840. if (spi->flags & SPI_FLAG_MASTER)
  841. {
  842. xfer.configFlags |= kSPI_FrameAssert;
  843. }
  844. if (spi->flags & SPI_FLAG_MASTER)
  845. {
  846. status = SPI_MasterTransferNonBlocking(spi->resource->base, &spi->handle->masterHandle, &xfer);
  847. }
  848. else
  849. {
  850. status = SPI_SlaveTransferNonBlocking(spi->resource->base, &spi->handle->slaveHandle, &xfer);
  851. }
  852. switch (status)
  853. {
  854. case kStatus_Success:
  855. ret = ARM_DRIVER_OK;
  856. break;
  857. case kStatus_InvalidArgument:
  858. ret = ARM_DRIVER_ERROR_PARAMETER;
  859. break;
  860. case kStatus_SPI_Busy:
  861. ret = ARM_DRIVER_ERROR_BUSY;
  862. break;
  863. default:
  864. ret = ARM_DRIVER_ERROR;
  865. break;
  866. }
  867. return ret;
  868. }
  869. static int32_t SPI_InterruptTransfer(const void *data_out,
  870. void *data_in,
  871. uint32_t num,
  872. cmsis_spi_interrupt_driver_state_t *spi)
  873. {
  874. int32_t ret;
  875. status_t status;
  876. spi_transfer_t xfer = {0};
  877. xfer.txData = (uint8_t *)data_out;
  878. xfer.rxData = (uint8_t *)data_in;
  879. xfer.dataSize = num;
  880. if (spi->flags & SPI_FLAG_MASTER)
  881. {
  882. xfer.configFlags |= kSPI_FrameAssert;
  883. }
  884. if (spi->flags & SPI_FLAG_MASTER)
  885. {
  886. status = SPI_MasterTransferNonBlocking(spi->resource->base, &spi->handle->masterHandle, &xfer);
  887. }
  888. else
  889. {
  890. status = SPI_SlaveTransferNonBlocking(spi->resource->base, &spi->handle->slaveHandle, &xfer);
  891. }
  892. switch (status)
  893. {
  894. case kStatus_Success:
  895. ret = ARM_DRIVER_OK;
  896. break;
  897. case kStatus_InvalidArgument:
  898. ret = ARM_DRIVER_ERROR_PARAMETER;
  899. break;
  900. case kStatus_SPI_Busy:
  901. ret = ARM_DRIVER_ERROR_BUSY;
  902. break;
  903. default:
  904. ret = ARM_DRIVER_ERROR;
  905. break;
  906. }
  907. return ret;
  908. }
  909. static uint32_t SPI_InterruptGetCount(cmsis_spi_interrupt_driver_state_t *spi)
  910. {
  911. if (spi->flags & SPI_FLAG_MASTER)
  912. {
  913. return spi->handle->masterHandle.totalByteCount - spi->handle->masterHandle.rxRemainingBytes;
  914. }
  915. else
  916. {
  917. return spi->handle->slaveHandle.toReceiveCount - spi->handle->slaveHandle.rxRemainingBytes;
  918. }
  919. }
  920. static int32_t SPI_InterruptControl(uint32_t control, uint32_t arg, cmsis_spi_interrupt_driver_state_t *spi)
  921. {
  922. if (!(spi->flags & SPI_FLAG_POWER))
  923. {
  924. return ARM_DRIVER_ERROR;
  925. }
  926. switch (control & ARM_SPI_CONTROL_Msk)
  927. {
  928. case ARM_SPI_MODE_INACTIVE: /* SPI mode Inactive */
  929. FLEXCOMM_Init(spi->resource->base, FLEXCOMM_PERIPH_NONE);
  930. break;
  931. case ARM_SPI_MODE_MASTER: /* SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps */
  932. spi->baudRate_Bps = arg;
  933. spi->flags |= SPI_FLAG_MASTER;
  934. break;
  935. case ARM_SPI_MODE_SLAVE: /* SPI Slave (Output on MISO, Input on MOSI) */
  936. spi->flags &= ~SPI_FLAG_MASTER;
  937. break;
  938. case ARM_SPI_GET_BUS_SPEED: /* Get Bus Speed in bps */
  939. if (!(spi->flags & SPI_FLAG_MASTER))
  940. {
  941. return ARM_DRIVER_ERROR_UNSUPPORTED;
  942. }
  943. return spi->baudRate_Bps;
  944. case ARM_SPI_SET_BUS_SPEED: /* Set Bus Speed in bps; */
  945. if (!(spi->flags & SPI_FLAG_MASTER))
  946. {
  947. return ARM_DRIVER_ERROR_UNSUPPORTED;
  948. }
  949. SPI_MasterSetBaud(spi->resource->base, arg, spi->resource->GetFreq());
  950. spi->baudRate_Bps = arg;
  951. return ARM_DRIVER_OK;
  952. case ARM_SPI_CONTROL_SS:
  953. return ARM_DRIVER_ERROR_UNSUPPORTED;
  954. case ARM_SPI_ABORT_TRANSFER: /* Abort current data transfer */
  955. if (spi->flags & SPI_FLAG_MASTER)
  956. {
  957. SPI_MasterTransferAbort(spi->resource->base, &spi->handle->masterHandle);
  958. }
  959. else
  960. {
  961. SPI_SlaveTransferAbort(spi->resource->base, &spi->handle->slaveHandle);
  962. }
  963. return ARM_DRIVER_OK;
  964. case ARM_SPI_SET_DEFAULT_TX_VALUE: /* Set default Transmit value; arg = value */
  965. SPI_SetDummyData(spi->resource->base, (uint8_t)arg);
  966. return ARM_DRIVER_OK;
  967. case ARM_SPI_MODE_MASTER_SIMPLEX: /* SPI Master (Output/Input on MOSI); arg = Bus Speed in bps */
  968. /* Mode is not supported by current driver. */
  969. return ARM_DRIVER_ERROR_UNSUPPORTED;
  970. case ARM_SPI_MODE_SLAVE_SIMPLEX: /* SPI Slave (Output/Input on MISO) */
  971. /* Mode is not supported by current driver. */
  972. return ARM_DRIVER_ERROR_UNSUPPORTED;
  973. default:
  974. break;
  975. }
  976. if (spi->flags & SPI_FLAG_MASTER)
  977. {
  978. switch (control & ARM_SPI_SS_MASTER_MODE_Msk)
  979. {
  980. /*
  981. * Note:
  982. * ARM_SPI_SS_MASTER_HW_OUTPUT is default configuration in driver, if ARM_SPI_SS_MASTER_UNUSED or
  983. * ARM_SPI_SS_MASTER_SW is wanted, please disable pin function in SPIx_InitPins() which is configured
  984. * by user in extern file. Besides ARM_SPI_SS_MASTER_HW_INPUT is not supported in this driver.
  985. */
  986. case ARM_SPI_SS_MASTER_UNUSED: /*!< SPI Slave Select when Master: Not used */
  987. break;
  988. case ARM_SPI_SS_MASTER_SW: /*!< SPI Slave Select when Master: Software controlled. */
  989. break;
  990. case ARM_SPI_SS_MASTER_HW_OUTPUT: /*!< SPI Slave Select when Master: Hardware controlled Output */
  991. break;
  992. case ARM_SPI_SS_MASTER_HW_INPUT: /*!< SPI Slave Select when Master: Hardware monitored Input */
  993. break;
  994. default:
  995. break;
  996. }
  997. spi_master_config_t masterConfig;
  998. SPI_MasterGetDefaultConfig(&masterConfig);
  999. masterConfig.baudRate_Bps = spi->baudRate_Bps;
  1000. SPI_MasterCommonControl(control, spi->resource, &spi->flags, &masterConfig);
  1001. if (spi->flags & SPI_FLAG_CONFIGURED)
  1002. {
  1003. SPI_Deinit(spi->resource->base);
  1004. RESET_PeripheralReset(s_spiResetInstance[spi->resource->instance]);
  1005. }
  1006. SPI_MasterInit(spi->resource->base, &masterConfig, spi->resource->GetFreq());
  1007. SPI_MasterTransferCreateHandle(spi->resource->base, &spi->handle->masterHandle,
  1008. KSDK_SPI_MasterInterruptCallback, (void *)spi->cb_event);
  1009. spi->flags |= SPI_FLAG_CONFIGURED;
  1010. }
  1011. else
  1012. {
  1013. /* The SPI slave select is controlled by hardware, software mode is not supported by current driver. */
  1014. switch (control & ARM_SPI_SS_SLAVE_MODE_Msk)
  1015. {
  1016. case ARM_SPI_SS_SLAVE_HW:
  1017. break;
  1018. case ARM_SPI_SS_SLAVE_SW:
  1019. break;
  1020. default:
  1021. break;
  1022. }
  1023. spi_slave_config_t slaveConfig;
  1024. SPI_SlaveGetDefaultConfig(&slaveConfig);
  1025. SPI_SlaveCommonControl(control, spi->resource, &spi->flags, &slaveConfig);
  1026. if (spi->flags & SPI_FLAG_CONFIGURED)
  1027. {
  1028. SPI_Deinit(spi->resource->base);
  1029. RESET_PeripheralReset(s_spiResetInstance[spi->resource->instance]);
  1030. }
  1031. SPI_SlaveInit(spi->resource->base, &slaveConfig);
  1032. SPI_SlaveTransferCreateHandle(spi->resource->base, &spi->handle->slaveHandle, KSDK_SPI_SlaveInterruptCallback,
  1033. (void *)spi->cb_event);
  1034. spi->flags |= SPI_FLAG_CONFIGURED;
  1035. }
  1036. return ARM_DRIVER_OK;
  1037. }
  1038. ARM_SPI_STATUS SPI_InterruptGetStatus(cmsis_spi_interrupt_driver_state_t *spi)
  1039. {
  1040. ARM_SPI_STATUS stat;
  1041. if (spi->flags & SPI_FLAG_MASTER)
  1042. {
  1043. stat.busy =
  1044. ((spi->handle->masterHandle.txRemainingBytes > 0) || (spi->handle->masterHandle.rxRemainingBytes > 0)) ?
  1045. (0U) :
  1046. (1U);
  1047. stat.data_lost = (kStatus_SPI_Error == spi->handle->masterHandle.state) ? (1U) : (0U);
  1048. }
  1049. else
  1050. {
  1051. stat.busy =
  1052. ((spi->handle->slaveHandle.txRemainingBytes > 0) || (spi->handle->slaveHandle.rxRemainingBytes > 0)) ?
  1053. (0U) :
  1054. (1U);
  1055. stat.data_lost = (kStatus_SPI_Error == spi->handle->slaveHandle.state) ? (1U) : (0U);
  1056. }
  1057. stat.mode_fault = 0U;
  1058. stat.reserved = 0U;
  1059. return stat;
  1060. }
  1061. #endif
  1062. #if defined(SPI0) && RTE_SPI0
  1063. /* User needs to provide the implementation for SPI0_GetFreq/InitPins/DeinitPins
  1064. in the application for enabling according instance. */
  1065. extern uint32_t SPI0_GetFreq(void);
  1066. extern void SPI0_InitPins(void);
  1067. extern void SPI0_DeinitPins(void);
  1068. cmsis_spi_resource_t SPI0_Resource = {SPI0, 0, SPI0_GetFreq};
  1069. #if RTE_SPI0_DMA_EN
  1070. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1071. cmsis_spi_dma_resource_t SPI0_DMAResource = {RTE_SPI0_DMA_TX_DMA_BASE, RTE_SPI0_DMA_TX_CH, RTE_SPI0_DMA_RX_DMA_BASE,
  1072. RTE_SPI0_DMA_RX_CH};
  1073. static cmsis_spi_dma_handle_t SPI0_DmaHandle;
  1074. static dma_handle_t SPI0_DmaTxDataHandle;
  1075. static dma_handle_t SPI0_DmaRxDataHandle;
  1076. #if defined(__CC_ARM)
  1077. ARMCC_SECTION("spi0_dma_driver_state")
  1078. static cmsis_spi_dma_driver_state_t SPI0_DMADriverState = {
  1079. #else
  1080. static cmsis_spi_dma_driver_state_t SPI0_DMADriverState = {
  1081. #endif
  1082. &SPI0_Resource, &SPI0_DMAResource, &SPI0_DmaHandle, &SPI0_DmaTxDataHandle, &SPI0_DmaRxDataHandle,
  1083. };
  1084. static int32_t SPI0_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1085. {
  1086. SPI0_InitPins();
  1087. return SPI_DMAInitialize(cb_event, &SPI0_DMADriverState);
  1088. }
  1089. static int32_t SPI0_DMAUninitialize(void)
  1090. {
  1091. SPI0_DeinitPins();
  1092. return SPI_DMAUninitialize(&SPI0_DMADriverState);
  1093. }
  1094. static int32_t SPI0_DMAPowerControl(ARM_POWER_STATE state)
  1095. {
  1096. return SPI_DMAPowerControl(state, &SPI0_DMADriverState);
  1097. }
  1098. static int32_t SPI0_DMASend(const void *data, uint32_t num)
  1099. {
  1100. return SPI_DMASend(data, num, &SPI0_DMADriverState);
  1101. }
  1102. static int32_t SPI0_DMAReceive(void *data, uint32_t num)
  1103. {
  1104. return SPI_DMAReceive(data, num, &SPI0_DMADriverState);
  1105. }
  1106. static int32_t SPI0_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1107. {
  1108. return SPI_DMATransfer(data_out, data_in, num, &SPI0_DMADriverState);
  1109. }
  1110. static uint32_t SPI0_DMAGetCount(void)
  1111. {
  1112. return SPI_DMAGetCount(&SPI0_DMADriverState);
  1113. }
  1114. static int32_t SPI0_DMAControl(uint32_t control, uint32_t arg)
  1115. {
  1116. return SPI_DMAControl(control, arg, &SPI0_DMADriverState);
  1117. }
  1118. static ARM_SPI_STATUS SPI0_DMAGetStatus(void)
  1119. {
  1120. return SPI_DMAGetStatus(&SPI0_DMADriverState);
  1121. }
  1122. #endif
  1123. #else
  1124. static cmsis_spi_handle_t SPI0_Handle;
  1125. #if defined(__CC_ARM)
  1126. ARMCC_SECTION("spi0_interrupt_driver_state")
  1127. static cmsis_spi_interrupt_driver_state_t SPI0_InterruptDriverState = {
  1128. #else
  1129. static cmsis_spi_interrupt_driver_state_t SPI0_InterruptDriverState = {
  1130. #endif
  1131. &SPI0_Resource, &SPI0_Handle,
  1132. };
  1133. static int32_t SPI0_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1134. {
  1135. SPI0_InitPins();
  1136. return SPI_InterruptInitialize(cb_event, &SPI0_InterruptDriverState);
  1137. }
  1138. static int32_t SPI0_InterruptUninitialize(void)
  1139. {
  1140. SPI0_DeinitPins();
  1141. return SPI_InterruptUninitialize(&SPI0_InterruptDriverState);
  1142. }
  1143. static int32_t SPI0_InterruptPowerControl(ARM_POWER_STATE state)
  1144. {
  1145. return SPI_InterruptPowerControl(state, &SPI0_InterruptDriverState);
  1146. }
  1147. static int32_t SPI0_InterruptSend(const void *data, uint32_t num)
  1148. {
  1149. return SPI_InterruptSend(data, num, &SPI0_InterruptDriverState);
  1150. }
  1151. static int32_t SPI0_InterruptReceive(void *data, uint32_t num)
  1152. {
  1153. return SPI_InterruptReceive(data, num, &SPI0_InterruptDriverState);
  1154. }
  1155. static int32_t SPI0_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1156. {
  1157. return SPI_InterruptTransfer(data_out, data_in, num, &SPI0_InterruptDriverState);
  1158. }
  1159. static uint32_t SPI0_InterruptGetCount(void)
  1160. {
  1161. return SPI_InterruptGetCount(&SPI0_InterruptDriverState);
  1162. }
  1163. static int32_t SPI0_InterruptControl(uint32_t control, uint32_t arg)
  1164. {
  1165. return SPI_InterruptControl(control, arg, &SPI0_InterruptDriverState);
  1166. }
  1167. static ARM_SPI_STATUS SPI0_InterruptGetStatus(void)
  1168. {
  1169. return SPI_InterruptGetStatus(&SPI0_InterruptDriverState);
  1170. }
  1171. #endif
  1172. ARM_DRIVER_SPI Driver_SPI0 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1173. #if RTE_SPI0_DMA_EN
  1174. SPI0_DMAInitialize, SPI0_DMAUninitialize, SPI0_DMAPowerControl, SPI0_DMASend,
  1175. SPI0_DMAReceive, SPI0_DMATransfer, SPI0_DMAGetCount, SPI0_DMAControl,
  1176. SPI0_DMAGetStatus
  1177. #else
  1178. SPI0_InterruptInitialize, SPI0_InterruptUninitialize, SPI0_InterruptPowerControl,
  1179. SPI0_InterruptSend, SPI0_InterruptReceive, SPI0_InterruptTransfer, SPI0_InterruptGetCount,
  1180. SPI0_InterruptControl, SPI0_InterruptGetStatus
  1181. #endif
  1182. };
  1183. #endif /* SPI0 */
  1184. #if defined(SPI1) && RTE_SPI1
  1185. /* User needs to provide the implementation for SPI1_GetFreq/InitPins/DeinitPins
  1186. in the application for enabling according instance. */
  1187. extern uint32_t SPI1_GetFreq(void);
  1188. extern void SPI1_InitPins(void);
  1189. extern void SPI1_DeinitPins(void);
  1190. cmsis_spi_resource_t SPI1_Resource = {SPI1, 1, SPI1_GetFreq};
  1191. #if RTE_SPI1_DMA_EN
  1192. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1193. cmsis_spi_dma_resource_t SPI1_DMAResource = {RTE_SPI1_DMA_TX_DMA_BASE, RTE_SPI1_DMA_TX_CH, RTE_SPI1_DMA_RX_DMA_BASE,
  1194. RTE_SPI1_DMA_RX_CH};
  1195. static cmsis_spi_dma_handle_t SPI1_DmaHandle;
  1196. static dma_handle_t SPI1_DmaTxDataHandle;
  1197. static dma_handle_t SPI1_DmaRxDataHandle;
  1198. #if defined(__CC_ARM)
  1199. ARMCC_SECTION("spi1_dma_driver_state")
  1200. static cmsis_spi_dma_driver_state_t SPI1_DMADriverState = {
  1201. #else
  1202. static cmsis_spi_dma_driver_state_t SPI1_DMADriverState = {
  1203. #endif
  1204. &SPI1_Resource, &SPI1_DMAResource, &SPI1_DmaHandle, &SPI1_DmaRxDataHandle, &SPI1_DmaTxDataHandle,
  1205. };
  1206. static int32_t SPI1_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1207. {
  1208. SPI1_InitPins();
  1209. return SPI_DMAInitialize(cb_event, &SPI1_DMADriverState);
  1210. }
  1211. static int32_t SPI1_DMAUninitialize(void)
  1212. {
  1213. SPI1_DeinitPins();
  1214. return SPI_DMAUninitialize(&SPI1_DMADriverState);
  1215. }
  1216. static int32_t SPI1_DMAPowerControl(ARM_POWER_STATE state)
  1217. {
  1218. return SPI_DMAPowerControl(state, &SPI1_DMADriverState);
  1219. }
  1220. static int32_t SPI1_DMASend(const void *data, uint32_t num)
  1221. {
  1222. return SPI_DMASend(data, num, &SPI1_DMADriverState);
  1223. }
  1224. static int32_t SPI1_DMAReceive(void *data, uint32_t num)
  1225. {
  1226. return SPI_DMAReceive(data, num, &SPI1_DMADriverState);
  1227. }
  1228. static int32_t SPI1_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1229. {
  1230. return SPI_DMATransfer(data_out, data_in, num, &SPI1_DMADriverState);
  1231. }
  1232. static uint32_t SPI1_DMAGetCount(void)
  1233. {
  1234. return SPI_DMAGetCount(&SPI1_DMADriverState);
  1235. }
  1236. static int32_t SPI1_DMAControl(uint32_t control, uint32_t arg)
  1237. {
  1238. return SPI_DMAControl(control, arg, &SPI1_DMADriverState);
  1239. }
  1240. static ARM_SPI_STATUS SPI1_DMAGetStatus(void)
  1241. {
  1242. return SPI_DMAGetStatus(&SPI1_DMADriverState);
  1243. }
  1244. #endif
  1245. #else
  1246. static cmsis_spi_handle_t SPI1_Handle;
  1247. #if defined(__CC_ARM)
  1248. ARMCC_SECTION("spi1_interrupt_driver_state")
  1249. static cmsis_spi_interrupt_driver_state_t SPI1_InterruptDriverState = {
  1250. #else
  1251. static cmsis_spi_interrupt_driver_state_t SPI1_InterruptDriverState = {
  1252. #endif
  1253. &SPI1_Resource, &SPI1_Handle,
  1254. };
  1255. static int32_t SPI1_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1256. {
  1257. SPI1_InitPins();
  1258. return SPI_InterruptInitialize(cb_event, &SPI1_InterruptDriverState);
  1259. }
  1260. static int32_t SPI1_InterruptUninitialize(void)
  1261. {
  1262. SPI1_DeinitPins();
  1263. return SPI_InterruptUninitialize(&SPI1_InterruptDriverState);
  1264. }
  1265. static int32_t SPI1_InterruptPowerControl(ARM_POWER_STATE state)
  1266. {
  1267. return SPI_InterruptPowerControl(state, &SPI1_InterruptDriverState);
  1268. }
  1269. static int32_t SPI1_InterruptSend(const void *data, uint32_t num)
  1270. {
  1271. return SPI_InterruptSend(data, num, &SPI1_InterruptDriverState);
  1272. }
  1273. static int32_t SPI1_InterruptReceive(void *data, uint32_t num)
  1274. {
  1275. return SPI_InterruptReceive(data, num, &SPI1_InterruptDriverState);
  1276. }
  1277. static int32_t SPI1_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1278. {
  1279. return SPI_InterruptTransfer(data_out, data_in, num, &SPI1_InterruptDriverState);
  1280. }
  1281. static uint32_t SPI1_InterruptGetCount(void)
  1282. {
  1283. return SPI_InterruptGetCount(&SPI1_InterruptDriverState);
  1284. }
  1285. static int32_t SPI1_InterruptControl(uint32_t control, uint32_t arg)
  1286. {
  1287. return SPI_InterruptControl(control, arg, &SPI1_InterruptDriverState);
  1288. }
  1289. static ARM_SPI_STATUS SPI1_InterruptGetStatus(void)
  1290. {
  1291. return SPI_InterruptGetStatus(&SPI1_InterruptDriverState);
  1292. }
  1293. #endif
  1294. ARM_DRIVER_SPI Driver_SPI1 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1295. #if RTE_SPI1_DMA_EN
  1296. SPI1_DMAInitialize, SPI1_DMAUninitialize, SPI1_DMAPowerControl, SPI1_DMASend,
  1297. SPI1_DMAReceive, SPI1_DMATransfer, SPI1_DMAGetCount, SPI1_DMAControl,
  1298. SPI1_DMAGetStatus
  1299. #else
  1300. SPI1_InterruptInitialize, SPI1_InterruptUninitialize, SPI1_InterruptPowerControl,
  1301. SPI1_InterruptSend, SPI1_InterruptReceive, SPI1_InterruptTransfer, SPI1_InterruptGetCount,
  1302. SPI1_InterruptControl, SPI1_InterruptGetStatus
  1303. #endif
  1304. };
  1305. #endif /* SPI1 */
  1306. #if defined(SPI2) && RTE_SPI2
  1307. /* User needs to provide the implementation for SPI2_GetFreq/InitPins/DeinitPins
  1308. in the application for enabling according instance. */
  1309. extern uint32_t SPI2_GetFreq(void);
  1310. extern void SPI2_InitPins(void);
  1311. extern void SPI2_DeinitPins(void);
  1312. cmsis_spi_resource_t SPI2_Resource = {SPI2, 2, SPI2_GetFreq};
  1313. #if RTE_SPI2_DMA_EN
  1314. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1315. cmsis_spi_dma_resource_t SPI2_DMAResource = {RTE_SPI2_DMA_TX_DMA_BASE, RTE_SPI2_DMA_TX_CH, RTE_SPI2_DMA_RX_DMA_BASE,
  1316. RTE_SPI2_DMA_RX_CH};
  1317. static cmsis_spi_dma_handle_t SPI2_DmaHandle;
  1318. static dma_handle_t SPI2_DmaTxDataHandle;
  1319. static dma_handle_t SPI2_DmaRxDataHandle;
  1320. #if defined(__CC_ARM)
  1321. ARMCC_SECTION("spi2_dma_driver_state")
  1322. static cmsis_spi_dma_driver_state_t SPI2_DMADriverState = {
  1323. #else
  1324. static cmsis_spi_dma_driver_state_t SPI2_DMADriverState = {
  1325. #endif
  1326. &SPI2_Resource, &SPI2_DMAResource, &SPI2_DmaHandle, &SPI2_DmaRxDataHandle, &SPI2_DmaTxDataHandle,
  1327. };
  1328. static int32_t SPI2_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1329. {
  1330. SPI2_InitPins();
  1331. return SPI_DMAInitialize(cb_event, &SPI2_DMADriverState);
  1332. }
  1333. static int32_t SPI2_DMAUninitialize(void)
  1334. {
  1335. SPI2_DeinitPins();
  1336. return SPI_DMAUninitialize(&SPI2_DMADriverState);
  1337. }
  1338. static int32_t SPI2_DMAPowerControl(ARM_POWER_STATE state)
  1339. {
  1340. return SPI_DMAPowerControl(state, &SPI2_DMADriverState);
  1341. }
  1342. static int32_t SPI2_DMASend(const void *data, uint32_t num)
  1343. {
  1344. return SPI_DMASend(data, num, &SPI2_DMADriverState);
  1345. }
  1346. static int32_t SPI2_DMAReceive(void *data, uint32_t num)
  1347. {
  1348. return SPI_DMAReceive(data, num, &SPI2_DMADriverState);
  1349. }
  1350. static int32_t SPI2_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1351. {
  1352. return SPI_DMATransfer(data_out, data_in, num, &SPI2_DMADriverState);
  1353. }
  1354. static uint32_t SPI2_DMAGetCount(void)
  1355. {
  1356. return SPI_DMAGetCount(&SPI2_DMADriverState);
  1357. }
  1358. static int32_t SPI2_DMAControl(uint32_t control, uint32_t arg)
  1359. {
  1360. return SPI_DMAControl(control, arg, &SPI2_DMADriverState);
  1361. }
  1362. static ARM_SPI_STATUS SPI2_DMAGetStatus(void)
  1363. {
  1364. return SPI_DMAGetStatus(&SPI2_DMADriverState);
  1365. }
  1366. #endif
  1367. #else
  1368. static cmsis_spi_handle_t SPI2_Handle;
  1369. #if defined(__CC_ARM)
  1370. ARMCC_SECTION("spi2_interrupt_driver_state")
  1371. static cmsis_spi_interrupt_driver_state_t SPI2_InterruptDriverState = {
  1372. #else
  1373. static cmsis_spi_interrupt_driver_state_t SPI2_InterruptDriverState = {
  1374. #endif
  1375. &SPI2_Resource, &SPI2_Handle,
  1376. };
  1377. static int32_t SPI2_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1378. {
  1379. SPI2_InitPins();
  1380. return SPI_InterruptInitialize(cb_event, &SPI2_InterruptDriverState);
  1381. }
  1382. static int32_t SPI2_InterruptUninitialize(void)
  1383. {
  1384. SPI2_DeinitPins();
  1385. return SPI_InterruptUninitialize(&SPI2_InterruptDriverState);
  1386. }
  1387. static int32_t SPI2_InterruptPowerControl(ARM_POWER_STATE state)
  1388. {
  1389. return SPI_InterruptPowerControl(state, &SPI2_InterruptDriverState);
  1390. }
  1391. static int32_t SPI2_InterruptSend(const void *data, uint32_t num)
  1392. {
  1393. return SPI_InterruptSend(data, num, &SPI2_InterruptDriverState);
  1394. }
  1395. static int32_t SPI2_InterruptReceive(void *data, uint32_t num)
  1396. {
  1397. return SPI_InterruptReceive(data, num, &SPI2_InterruptDriverState);
  1398. }
  1399. static int32_t SPI2_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1400. {
  1401. return SPI_InterruptTransfer(data_out, data_in, num, &SPI2_InterruptDriverState);
  1402. }
  1403. static uint32_t SPI2_InterruptGetCount(void)
  1404. {
  1405. return SPI_InterruptGetCount(&SPI2_InterruptDriverState);
  1406. }
  1407. static int32_t SPI2_InterruptControl(uint32_t control, uint32_t arg)
  1408. {
  1409. return SPI_InterruptControl(control, arg, &SPI2_InterruptDriverState);
  1410. }
  1411. static ARM_SPI_STATUS SPI2_InterruptGetStatus(void)
  1412. {
  1413. return SPI_InterruptGetStatus(&SPI2_InterruptDriverState);
  1414. }
  1415. #endif
  1416. ARM_DRIVER_SPI Driver_SPI2 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1417. #if RTE_SPI2_DMA_EN
  1418. SPI2_DMAInitialize, SPI2_DMAUninitialize, SPI2_DMAPowerControl, SPI2_DMASend,
  1419. SPI2_DMAReceive, SPI2_DMATransfer, SPI2_DMAGetCount, SPI2_DMAControl,
  1420. SPI2_DMAGetStatus
  1421. #else
  1422. SPI2_InterruptInitialize, SPI2_InterruptUninitialize, SPI2_InterruptPowerControl,
  1423. SPI2_InterruptSend, SPI2_InterruptReceive, SPI2_InterruptTransfer, SPI2_InterruptGetCount,
  1424. SPI2_InterruptControl, SPI2_InterruptGetStatus
  1425. #endif
  1426. };
  1427. #endif /* SPI2 */
  1428. #if defined(SPI3) && RTE_SPI3
  1429. /* User needs to provide the implementation for SPI3_GetFreq/InitPins/DeinitPins
  1430. in the application for enabling according instance. */
  1431. extern uint32_t SPI3_GetFreq(void);
  1432. extern void SPI3_InitPins(void);
  1433. extern void SPI3_DeinitPins(void);
  1434. cmsis_spi_resource_t SPI3_Resource = {SPI3, 3, SPI3_GetFreq};
  1435. #if RTE_SPI3_DMA_EN
  1436. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1437. cmsis_spi_dma_resource_t SPI3_DMAResource = {RTE_SPI3_DMA_TX_DMA_BASE, RTE_SPI3_DMA_TX_CH, RTE_SPI3_DMA_RX_DMA_BASE,
  1438. RTE_SPI3_DMA_RX_CH};
  1439. static cmsis_spi_dma_handle_t SPI3_DmaHandle;
  1440. static dma_handle_t SPI3_DmaTxDataHandle;
  1441. static dma_handle_t SPI3_DmaRxDataHandle;
  1442. #if defined(__CC_ARM)
  1443. ARMCC_SECTION("spi3_dma_driver_state")
  1444. static cmsis_spi_dma_driver_state_t SPI3_DMADriverState = {
  1445. #else
  1446. static cmsis_spi_dma_driver_state_t SPI3_DMADriverState = {
  1447. #endif
  1448. &SPI3_Resource, &SPI3_DMAResource, &SPI3_DmaHandle, &SPI3_DmaRxDataHandle, &SPI3_DmaTxDataHandle,
  1449. };
  1450. static int32_t SPI3_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1451. {
  1452. SPI3_InitPins();
  1453. return SPI_DMAInitialize(cb_event, &SPI3_DMADriverState);
  1454. }
  1455. static int32_t SPI3_DMAUninitialize(void)
  1456. {
  1457. SPI3_DeinitPins();
  1458. return SPI_DMAUninitialize(&SPI3_DMADriverState);
  1459. }
  1460. static int32_t SPI3_DMAPowerControl(ARM_POWER_STATE state)
  1461. {
  1462. return SPI_DMAPowerControl(state, &SPI3_DMADriverState);
  1463. }
  1464. static int32_t SPI3_DMASend(const void *data, uint32_t num)
  1465. {
  1466. return SPI_DMASend(data, num, &SPI3_DMADriverState);
  1467. }
  1468. static int32_t SPI3_DMAReceive(void *data, uint32_t num)
  1469. {
  1470. return SPI_DMAReceive(data, num, &SPI3_DMADriverState);
  1471. }
  1472. static int32_t SPI3_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1473. {
  1474. return SPI_DMATransfer(data_out, data_in, num, &SPI3_DMADriverState);
  1475. }
  1476. static uint32_t SPI3_DMAGetCount(void)
  1477. {
  1478. return SPI_DMAGetCount(&SPI3_DMADriverState);
  1479. }
  1480. static int32_t SPI3_DMAControl(uint32_t control, uint32_t arg)
  1481. {
  1482. return SPI_DMAControl(control, arg, &SPI3_DMADriverState);
  1483. }
  1484. static ARM_SPI_STATUS SPI3_DMAGetStatus(void)
  1485. {
  1486. return SPI_DMAGetStatus(&SPI3_DMADriverState);
  1487. }
  1488. #endif
  1489. #else
  1490. static cmsis_spi_handle_t SPI3_Handle;
  1491. #if defined(__CC_ARM)
  1492. ARMCC_SECTION("spi3_interrupt_driver_state")
  1493. static cmsis_spi_interrupt_driver_state_t SPI3_InterruptDriverState = {
  1494. #else
  1495. static cmsis_spi_interrupt_driver_state_t SPI3_InterruptDriverState = {
  1496. #endif
  1497. &SPI3_Resource, &SPI3_Handle,
  1498. };
  1499. static int32_t SPI3_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1500. {
  1501. SPI3_InitPins();
  1502. return SPI_InterruptInitialize(cb_event, &SPI3_InterruptDriverState);
  1503. }
  1504. static int32_t SPI3_InterruptUninitialize(void)
  1505. {
  1506. SPI3_DeinitPins();
  1507. return SPI_InterruptUninitialize(&SPI3_InterruptDriverState);
  1508. }
  1509. static int32_t SPI3_InterruptPowerControl(ARM_POWER_STATE state)
  1510. {
  1511. return SPI_InterruptPowerControl(state, &SPI3_InterruptDriverState);
  1512. }
  1513. static int32_t SPI3_InterruptSend(const void *data, uint32_t num)
  1514. {
  1515. return SPI_InterruptSend(data, num, &SPI3_InterruptDriverState);
  1516. }
  1517. static int32_t SPI3_InterruptReceive(void *data, uint32_t num)
  1518. {
  1519. return SPI_InterruptReceive(data, num, &SPI3_InterruptDriverState);
  1520. }
  1521. static int32_t SPI3_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1522. {
  1523. return SPI_InterruptTransfer(data_out, data_in, num, &SPI3_InterruptDriverState);
  1524. }
  1525. static uint32_t SPI3_InterruptGetCount(void)
  1526. {
  1527. return SPI_InterruptGetCount(&SPI3_InterruptDriverState);
  1528. }
  1529. static int32_t SPI3_InterruptControl(uint32_t control, uint32_t arg)
  1530. {
  1531. return SPI_InterruptControl(control, arg, &SPI3_InterruptDriverState);
  1532. }
  1533. static ARM_SPI_STATUS SPI3_InterruptGetStatus(void)
  1534. {
  1535. return SPI_InterruptGetStatus(&SPI3_InterruptDriverState);
  1536. }
  1537. #endif
  1538. ARM_DRIVER_SPI Driver_SPI3 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1539. #if RTE_SPI3_DMA_EN
  1540. SPI3_DMAInitialize, SPI3_DMAUninitialize, SPI3_DMAPowerControl, SPI3_DMASend,
  1541. SPI3_DMAReceive, SPI3_DMATransfer, SPI3_DMAGetCount, SPI3_DMAControl,
  1542. SPI3_DMAGetStatus
  1543. #else
  1544. SPI3_InterruptInitialize, SPI3_InterruptUninitialize, SPI3_InterruptPowerControl,
  1545. SPI3_InterruptSend, SPI3_InterruptReceive, SPI3_InterruptTransfer, SPI3_InterruptGetCount,
  1546. SPI3_InterruptControl, SPI3_InterruptGetStatus
  1547. #endif
  1548. };
  1549. #endif /* SPI3 */
  1550. #if defined(SPI4) && RTE_SPI4
  1551. /* User needs to provide the implementation for SPI4_GetFreq/InitPins/DeinitPins
  1552. in the application for enabling according instance. */
  1553. extern uint32_t SPI4_GetFreq(void);
  1554. extern void SPI4_InitPins(void);
  1555. extern void SPI4_DeinitPins(void);
  1556. cmsis_spi_resource_t SPI4_Resource = {SPI4, 4, SPI4_GetFreq};
  1557. #if RTE_SPI4_DMA_EN
  1558. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1559. cmsis_spi_dma_resource_t SPI4_DMAResource = {RTE_SPI4_DMA_TX_DMA_BASE, RTE_SPI4_DMA_TX_CH, RTE_SPI4_DMA_RX_DMA_BASE,
  1560. RTE_SPI4_DMA_RX_CH};
  1561. static cmsis_spi_dma_handle_t SPI4_DmaHandle;
  1562. static dma_handle_t SPI4_DmaTxDataHandle;
  1563. static dma_handle_t SPI4_DmaRxDataHandle;
  1564. #if defined(__CC_ARM)
  1565. ARMCC_SECTION("spi4_dma_driver_state")
  1566. static cmsis_spi_dma_driver_state_t SPI4_DMADriverState = {
  1567. #else
  1568. static cmsis_spi_dma_driver_state_t SPI4_DMADriverState = {
  1569. #endif
  1570. &SPI4_Resource, &SPI4_DMAResource, &SPI4_DmaHandle, &SPI4_DmaRxDataHandle, &SPI4_DmaTxDataHandle,
  1571. };
  1572. static int32_t SPI4_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1573. {
  1574. SPI4_InitPins();
  1575. return SPI_DMAInitialize(cb_event, &SPI4_DMADriverState);
  1576. }
  1577. static int32_t SPI4_DMAUninitialize(void)
  1578. {
  1579. SPI4_DeinitPins();
  1580. return SPI_DMAUninitialize(&SPI4_DMADriverState);
  1581. }
  1582. static int32_t SPI4_DMAPowerControl(ARM_POWER_STATE state)
  1583. {
  1584. return SPI_DMAPowerControl(state, &SPI4_DMADriverState);
  1585. }
  1586. static int32_t SPI4_DMASend(const void *data, uint32_t num)
  1587. {
  1588. return SPI_DMASend(data, num, &SPI4_DMADriverState);
  1589. }
  1590. static int32_t SPI4_DMAReceive(void *data, uint32_t num)
  1591. {
  1592. return SPI_DMAReceive(data, num, &SPI4_DMADriverState);
  1593. }
  1594. static int32_t SPI4_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1595. {
  1596. return SPI_DMATransfer(data_out, data_in, num, &SPI4_DMADriverState);
  1597. }
  1598. static uint32_t SPI4_DMAGetCount(void)
  1599. {
  1600. return SPI_DMAGetCount(&SPI4_DMADriverState);
  1601. }
  1602. static int32_t SPI4_DMAControl(uint32_t control, uint32_t arg)
  1603. {
  1604. return SPI_DMAControl(control, arg, &SPI4_DMADriverState);
  1605. }
  1606. static ARM_SPI_STATUS SPI4_DMAGetStatus(void)
  1607. {
  1608. return SPI_DMAGetStatus(&SPI4_DMADriverState);
  1609. }
  1610. #endif
  1611. #else
  1612. static cmsis_spi_handle_t SPI4_Handle;
  1613. #if defined(__CC_ARM)
  1614. ARMCC_SECTION("spi4_interrupt_driver_state")
  1615. static cmsis_spi_interrupt_driver_state_t SPI4_InterruptDriverState = {
  1616. #else
  1617. static cmsis_spi_interrupt_driver_state_t SPI4_InterruptDriverState = {
  1618. #endif
  1619. &SPI4_Resource, &SPI4_Handle,
  1620. };
  1621. static int32_t SPI4_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1622. {
  1623. SPI4_InitPins();
  1624. return SPI_InterruptInitialize(cb_event, &SPI4_InterruptDriverState);
  1625. }
  1626. static int32_t SPI4_InterruptUninitialize(void)
  1627. {
  1628. SPI4_DeinitPins();
  1629. return SPI_InterruptUninitialize(&SPI4_InterruptDriverState);
  1630. }
  1631. static int32_t SPI4_InterruptPowerControl(ARM_POWER_STATE state)
  1632. {
  1633. return SPI_InterruptPowerControl(state, &SPI4_InterruptDriverState);
  1634. }
  1635. static int32_t SPI4_InterruptSend(const void *data, uint32_t num)
  1636. {
  1637. return SPI_InterruptSend(data, num, &SPI4_InterruptDriverState);
  1638. }
  1639. static int32_t SPI4_InterruptReceive(void *data, uint32_t num)
  1640. {
  1641. return SPI_InterruptReceive(data, num, &SPI4_InterruptDriverState);
  1642. }
  1643. static int32_t SPI4_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1644. {
  1645. return SPI_InterruptTransfer(data_out, data_in, num, &SPI4_InterruptDriverState);
  1646. }
  1647. static uint32_t SPI4_InterruptGetCount(void)
  1648. {
  1649. return SPI_InterruptGetCount(&SPI4_InterruptDriverState);
  1650. }
  1651. static int32_t SPI4_InterruptControl(uint32_t control, uint32_t arg)
  1652. {
  1653. return SPI_InterruptControl(control, arg, &SPI4_InterruptDriverState);
  1654. }
  1655. static ARM_SPI_STATUS SPI4_InterruptGetStatus(void)
  1656. {
  1657. return SPI_InterruptGetStatus(&SPI4_InterruptDriverState);
  1658. }
  1659. #endif
  1660. ARM_DRIVER_SPI Driver_SPI4 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1661. #if RTE_SPI4_DMA_EN
  1662. SPI4_DMAInitialize, SPI4_DMAUninitialize, SPI4_DMAPowerControl, SPI4_DMASend,
  1663. SPI4_DMAReceive, SPI4_DMATransfer, SPI4_DMAGetCount, SPI4_DMAControl,
  1664. SPI4_DMAGetStatus
  1665. #else
  1666. SPI4_InterruptInitialize, SPI4_InterruptUninitialize, SPI4_InterruptPowerControl,
  1667. SPI4_InterruptSend, SPI4_InterruptReceive, SPI4_InterruptTransfer, SPI4_InterruptGetCount,
  1668. SPI4_InterruptControl, SPI4_InterruptGetStatus
  1669. #endif
  1670. };
  1671. #endif /* SPI4 */
  1672. #if defined(SPI5) && RTE_SPI5
  1673. /* User needs to provide the implementation for SPI5_GetFreq/InitPins/DeinitPins
  1674. in the application for enabling according instance. */
  1675. extern uint32_t SPI5_GetFreq(void);
  1676. extern void SPI5_InitPins(void);
  1677. extern void SPI5_DeinitPins(void);
  1678. cmsis_spi_resource_t SPI5_Resource = {SPI5, 5, SPI5_GetFreq};
  1679. #if RTE_SPI5_DMA_EN
  1680. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1681. cmsis_spi_dma_resource_t SPI5_DMAResource = {RTE_SPI5_DMA_TX_DMA_BASE, RTE_SPI5_DMA_TX_CH, RTE_SPI5_DMA_RX_DMA_BASE,
  1682. RTE_SPI5_DMA_RX_CH};
  1683. static cmsis_spi_dma_handle_t SPI5_DmaHandle;
  1684. static dma_handle_t SPI5_DmaTxDataHandle;
  1685. static dma_handle_t SPI5_DmaRxDataHandle;
  1686. #if defined(__CC_ARM)
  1687. ARMCC_SECTION("spi5_dma_driver_state")
  1688. static cmsis_spi_dma_driver_state_t SPI5_DMADriverState = {
  1689. #else
  1690. static cmsis_spi_dma_driver_state_t SPI5_DMADriverState = {
  1691. #endif
  1692. &SPI5_Resource, &SPI5_DMAResource, &SPI5_DmaHandle, &SPI5_DmaRxDataHandle, &SPI5_DmaTxDataHandle,
  1693. };
  1694. static int32_t SPI5_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1695. {
  1696. SPI5_InitPins();
  1697. return SPI_DMAInitialize(cb_event, &SPI5_DMADriverState);
  1698. }
  1699. static int32_t SPI5_DMAUninitialize(void)
  1700. {
  1701. SPI5_DeinitPins();
  1702. return SPI_DMAUninitialize(&SPI5_DMADriverState);
  1703. }
  1704. static int32_t SPI5_DMAPowerControl(ARM_POWER_STATE state)
  1705. {
  1706. return SPI_DMAPowerControl(state, &SPI5_DMADriverState);
  1707. }
  1708. static int32_t SPI5_DMASend(const void *data, uint32_t num)
  1709. {
  1710. return SPI_DMASend(data, num, &SPI5_DMADriverState);
  1711. }
  1712. static int32_t SPI5_DMAReceive(void *data, uint32_t num)
  1713. {
  1714. return SPI_DMAReceive(data, num, &SPI5_DMADriverState);
  1715. }
  1716. static int32_t SPI5_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1717. {
  1718. return SPI_DMATransfer(data_out, data_in, num, &SPI5_DMADriverState);
  1719. }
  1720. static uint32_t SPI5_DMAGetCount(void)
  1721. {
  1722. return SPI_DMAGetCount(&SPI5_DMADriverState);
  1723. }
  1724. static int32_t SPI5_DMAControl(uint32_t control, uint32_t arg)
  1725. {
  1726. return SPI_DMAControl(control, arg, &SPI5_DMADriverState);
  1727. }
  1728. static ARM_SPI_STATUS SPI5_DMAGetStatus(void)
  1729. {
  1730. return SPI_DMAGetStatus(&SPI5_DMADriverState);
  1731. }
  1732. #endif
  1733. #else
  1734. static cmsis_spi_handle_t SPI5_Handle;
  1735. #if defined(__CC_ARM)
  1736. ARMCC_SECTION("spi5_interrupt_driver_state")
  1737. static cmsis_spi_interrupt_driver_state_t SPI5_InterruptDriverState = {
  1738. #else
  1739. static cmsis_spi_interrupt_driver_state_t SPI5_InterruptDriverState = {
  1740. #endif
  1741. &SPI5_Resource, &SPI5_Handle,
  1742. };
  1743. static int32_t SPI5_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1744. {
  1745. SPI5_InitPins();
  1746. return SPI_InterruptInitialize(cb_event, &SPI5_InterruptDriverState);
  1747. }
  1748. static int32_t SPI5_InterruptUninitialize(void)
  1749. {
  1750. SPI5_DeinitPins();
  1751. return SPI_InterruptUninitialize(&SPI5_InterruptDriverState);
  1752. }
  1753. static int32_t SPI5_InterruptPowerControl(ARM_POWER_STATE state)
  1754. {
  1755. return SPI_InterruptPowerControl(state, &SPI5_InterruptDriverState);
  1756. }
  1757. static int32_t SPI5_InterruptSend(const void *data, uint32_t num)
  1758. {
  1759. return SPI_InterruptSend(data, num, &SPI5_InterruptDriverState);
  1760. }
  1761. static int32_t SPI5_InterruptReceive(void *data, uint32_t num)
  1762. {
  1763. return SPI_InterruptReceive(data, num, &SPI5_InterruptDriverState);
  1764. }
  1765. static int32_t SPI5_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1766. {
  1767. return SPI_InterruptTransfer(data_out, data_in, num, &SPI5_InterruptDriverState);
  1768. }
  1769. static uint32_t SPI5_InterruptGetCount(void)
  1770. {
  1771. return SPI_InterruptGetCount(&SPI5_InterruptDriverState);
  1772. }
  1773. static int32_t SPI5_InterruptControl(uint32_t control, uint32_t arg)
  1774. {
  1775. return SPI_InterruptControl(control, arg, &SPI5_InterruptDriverState);
  1776. }
  1777. static ARM_SPI_STATUS SPI5_InterruptGetStatus(void)
  1778. {
  1779. return SPI_InterruptGetStatus(&SPI5_InterruptDriverState);
  1780. }
  1781. #endif
  1782. ARM_DRIVER_SPI Driver_SPI5 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1783. #if RTE_SPI5_DMA_EN
  1784. SPI5_DMAInitialize, SPI5_DMAUninitialize, SPI5_DMAPowerControl, SPI5_DMASend,
  1785. SPI5_DMAReceive, SPI5_DMATransfer, SPI5_DMAGetCount, SPI5_DMAControl,
  1786. SPI5_DMAGetStatus
  1787. #else
  1788. SPI5_InterruptInitialize, SPI5_InterruptUninitialize, SPI5_InterruptPowerControl,
  1789. SPI5_InterruptSend, SPI5_InterruptReceive, SPI5_InterruptTransfer, SPI5_InterruptGetCount,
  1790. SPI5_InterruptControl, SPI5_InterruptGetStatus
  1791. #endif
  1792. };
  1793. #endif /* SPI5 */
  1794. #if defined(SPI6) && RTE_SPI6
  1795. /* User needs to provide the implementation for SPI6_GetFreq/InitPins/DeinitPins
  1796. in the application for enabling according instance. */
  1797. extern uint32_t SPI6_GetFreq(void);
  1798. extern void SPI6_InitPins(void);
  1799. extern void SPI6_DeinitPins(void);
  1800. cmsis_spi_resource_t SPI6_Resource = {SPI6, 6, SPI6_GetFreq};
  1801. #if RTE_SPI6_DMA_EN
  1802. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1803. cmsis_spi_dma_resource_t SPI6_DMAResource = {RTE_SPI6_DMA_TX_DMA_BASE, RTE_SPI6_DMA_TX_CH, RTE_SPI6_DMA_RX_DMA_BASE,
  1804. RTE_SPI6_DMA_RX_CH};
  1805. static cmsis_spi_dma_handle_t SPI6_DmaHandle;
  1806. static dma_handle_t SPI6_DmaTxDataHandle;
  1807. static dma_handle_t SPI6_DmaRxDataHandle;
  1808. #if defined(__CC_ARM)
  1809. ARMCC_SECTION("spi6_dma_driver_state")
  1810. static cmsis_spi_dma_driver_state_t SPI6_DMADriverState = {
  1811. #else
  1812. static cmsis_spi_dma_driver_state_t SPI6_DMADriverState = {
  1813. #endif
  1814. &SPI6_Resource, &SPI6_DMAResource, &SPI6_DmaHandle, &SPI6_DmaRxDataHandle, &SPI6_DmaTxDataHandle,
  1815. };
  1816. static int32_t SPI6_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1817. {
  1818. SPI6_InitPins();
  1819. return SPI_DMAInitialize(cb_event, &SPI6_DMADriverState);
  1820. }
  1821. static int32_t SPI6_DMAUninitialize(void)
  1822. {
  1823. SPI6_DeinitPins();
  1824. return SPI_DMAUninitialize(&SPI6_DMADriverState);
  1825. }
  1826. static int32_t SPI6_DMAPowerControl(ARM_POWER_STATE state)
  1827. {
  1828. return SPI_DMAPowerControl(state, &SPI6_DMADriverState);
  1829. }
  1830. static int32_t SPI6_DMASend(const void *data, uint32_t num)
  1831. {
  1832. return SPI_DMASend(data, num, &SPI6_DMADriverState);
  1833. }
  1834. static int32_t SPI6_DMAReceive(void *data, uint32_t num)
  1835. {
  1836. return SPI_DMAReceive(data, num, &SPI6_DMADriverState);
  1837. }
  1838. static int32_t SPI6_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1839. {
  1840. return SPI_DMATransfer(data_out, data_in, num, &SPI6_DMADriverState);
  1841. }
  1842. static uint32_t SPI6_DMAGetCount(void)
  1843. {
  1844. return SPI_DMAGetCount(&SPI6_DMADriverState);
  1845. }
  1846. static int32_t SPI6_DMAControl(uint32_t control, uint32_t arg)
  1847. {
  1848. return SPI_DMAControl(control, arg, &SPI6_DMADriverState);
  1849. }
  1850. static ARM_SPI_STATUS SPI6_DMAGetStatus(void)
  1851. {
  1852. return SPI_DMAGetStatus(&SPI6_DMADriverState);
  1853. }
  1854. #endif
  1855. #else
  1856. static cmsis_spi_handle_t SPI6_Handle;
  1857. #if defined(__CC_ARM)
  1858. ARMCC_SECTION("spi6_interrupt_driver_state")
  1859. static cmsis_spi_interrupt_driver_state_t SPI6_InterruptDriverState = {
  1860. #else
  1861. static cmsis_spi_interrupt_driver_state_t SPI6_InterruptDriverState = {
  1862. #endif
  1863. &SPI6_Resource, &SPI6_Handle,
  1864. };
  1865. static int32_t SPI6_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1866. {
  1867. SPI6_InitPins();
  1868. return SPI_InterruptInitialize(cb_event, &SPI6_InterruptDriverState);
  1869. }
  1870. static int32_t SPI6_InterruptUninitialize(void)
  1871. {
  1872. SPI6_DeinitPins();
  1873. return SPI_InterruptUninitialize(&SPI6_InterruptDriverState);
  1874. }
  1875. static int32_t SPI6_InterruptPowerControl(ARM_POWER_STATE state)
  1876. {
  1877. return SPI_InterruptPowerControl(state, &SPI6_InterruptDriverState);
  1878. }
  1879. static int32_t SPI6_InterruptSend(const void *data, uint32_t num)
  1880. {
  1881. return SPI_InterruptSend(data, num, &SPI6_InterruptDriverState);
  1882. }
  1883. static int32_t SPI6_InterruptReceive(void *data, uint32_t num)
  1884. {
  1885. return SPI_InterruptReceive(data, num, &SPI6_InterruptDriverState);
  1886. }
  1887. static int32_t SPI6_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1888. {
  1889. return SPI_InterruptTransfer(data_out, data_in, num, &SPI6_InterruptDriverState);
  1890. }
  1891. static uint32_t SPI6_InterruptGetCount(void)
  1892. {
  1893. return SPI_InterruptGetCount(&SPI6_InterruptDriverState);
  1894. }
  1895. static int32_t SPI6_InterruptControl(uint32_t control, uint32_t arg)
  1896. {
  1897. return SPI_InterruptControl(control, arg, &SPI6_InterruptDriverState);
  1898. }
  1899. static ARM_SPI_STATUS SPI6_InterruptGetStatus(void)
  1900. {
  1901. return SPI_InterruptGetStatus(&SPI6_InterruptDriverState);
  1902. }
  1903. #endif
  1904. ARM_DRIVER_SPI Driver_SPI6 = {SPIx_GetVersion, SPIx_GetCapabilities,
  1905. #if RTE_SPI6_DMA_EN
  1906. SPI6_DMAInitialize, SPI6_DMAUninitialize, SPI6_DMAPowerControl, SPI6_DMASend,
  1907. SPI6_DMAReceive, SPI6_DMATransfer, SPI6_DMAGetCount, SPI6_DMAControl,
  1908. SPI6_DMAGetStatus
  1909. #else
  1910. SPI6_InterruptInitialize, SPI6_InterruptUninitialize, SPI6_InterruptPowerControl,
  1911. SPI6_InterruptSend, SPI6_InterruptReceive, SPI6_InterruptTransfer, SPI6_InterruptGetCount,
  1912. SPI6_InterruptControl, SPI6_InterruptGetStatus
  1913. #endif
  1914. };
  1915. #endif /* SPI6 */
  1916. #if defined(SPI7) && RTE_SPI7
  1917. /* User needs to provide the implementation for SPI7_GetFreq/InitPins/DeinitPins
  1918. in the application for enabling according instance. */
  1919. extern uint32_t SPI7_GetFreq(void);
  1920. extern void SPI7_InitPins(void);
  1921. extern void SPI7_DeinitPins(void);
  1922. cmsis_spi_resource_t SPI7_Resource = {SPI7, 7, SPI7_GetFreq};
  1923. #if RTE_SPI7_DMA_EN
  1924. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  1925. cmsis_spi_dma_resource_t SPI7_DMAResource = {RTE_SPI7_DMA_TX_DMA_BASE, RTE_SPI7_DMA_TX_CH, RTE_SPI7_DMA_RX_DMA_BASE,
  1926. RTE_SPI7_DMA_RX_CH};
  1927. static cmsis_spi_dma_handle_t SPI7_DmaHandle;
  1928. static dma_handle_t SPI7_DmaTxDataHandle;
  1929. static dma_handle_t SPI7_DmaRxDataHandle;
  1930. #if defined(__CC_ARM)
  1931. ARMCC_SECTION("spi7_dma_driver_state")
  1932. static cmsis_spi_dma_driver_state_t SPI7_DMADriverState = {
  1933. #else
  1934. static cmsis_spi_dma_driver_state_t SPI7_DMADriverState = {
  1935. #endif
  1936. &SPI7_Resource, &SPI7_DMAResource, &SPI7_DmaHandle, &SPI7_DmaRxDataHandle, &SPI7_DmaTxDataHandle,
  1937. };
  1938. static int32_t SPI7_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  1939. {
  1940. SPI7_InitPins();
  1941. return SPI_DMAInitialize(cb_event, &SPI7_DMADriverState);
  1942. }
  1943. static int32_t SPI7_DMAUninitialize(void)
  1944. {
  1945. SPI7_DeinitPins();
  1946. return SPI_DMAUninitialize(&SPI7_DMADriverState);
  1947. }
  1948. static int32_t SPI7_DMAPowerControl(ARM_POWER_STATE state)
  1949. {
  1950. return SPI_DMAPowerControl(state, &SPI7_DMADriverState);
  1951. }
  1952. static int32_t SPI7_DMASend(const void *data, uint32_t num)
  1953. {
  1954. return SPI_DMASend(data, num, &SPI7_DMADriverState);
  1955. }
  1956. static int32_t SPI7_DMAReceive(void *data, uint32_t num)
  1957. {
  1958. return SPI_DMAReceive(data, num, &SPI7_DMADriverState);
  1959. }
  1960. static int32_t SPI7_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  1961. {
  1962. return SPI_DMATransfer(data_out, data_in, num, &SPI7_DMADriverState);
  1963. }
  1964. static uint32_t SPI7_DMAGetCount(void)
  1965. {
  1966. return SPI_DMAGetCount(&SPI7_DMADriverState);
  1967. }
  1968. static int32_t SPI7_DMAControl(uint32_t control, uint32_t arg)
  1969. {
  1970. return SPI_DMAControl(control, arg, &SPI7_DMADriverState);
  1971. }
  1972. static ARM_SPI_STATUS SPI7_DMAGetStatus(void)
  1973. {
  1974. return SPI_DMAGetStatus(&SPI7_DMADriverState);
  1975. }
  1976. #endif
  1977. #else
  1978. static cmsis_spi_handle_t SPI7_Handle;
  1979. #if defined(__CC_ARM)
  1980. ARMCC_SECTION("spi7_interrupt_driver_state")
  1981. static cmsis_spi_interrupt_driver_state_t SPI7_InterruptDriverState = {
  1982. #else
  1983. static cmsis_spi_interrupt_driver_state_t SPI7_InterruptDriverState = {
  1984. #endif
  1985. &SPI7_Resource, &SPI7_Handle,
  1986. };
  1987. static int32_t SPI7_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1988. {
  1989. SPI7_InitPins();
  1990. return SPI_InterruptInitialize(cb_event, &SPI7_InterruptDriverState);
  1991. }
  1992. static int32_t SPI7_InterruptUninitialize(void)
  1993. {
  1994. SPI7_DeinitPins();
  1995. return SPI_InterruptUninitialize(&SPI7_InterruptDriverState);
  1996. }
  1997. static int32_t SPI7_InterruptPowerControl(ARM_POWER_STATE state)
  1998. {
  1999. return SPI_InterruptPowerControl(state, &SPI7_InterruptDriverState);
  2000. }
  2001. static int32_t SPI7_InterruptSend(const void *data, uint32_t num)
  2002. {
  2003. return SPI_InterruptSend(data, num, &SPI7_InterruptDriverState);
  2004. }
  2005. static int32_t SPI7_InterruptReceive(void *data, uint32_t num)
  2006. {
  2007. return SPI_InterruptReceive(data, num, &SPI7_InterruptDriverState);
  2008. }
  2009. static int32_t SPI7_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  2010. {
  2011. return SPI_InterruptTransfer(data_out, data_in, num, &SPI7_InterruptDriverState);
  2012. }
  2013. static uint32_t SPI7_InterruptGetCount(void)
  2014. {
  2015. return SPI_InterruptGetCount(&SPI7_InterruptDriverState);
  2016. }
  2017. static int32_t SPI7_InterruptControl(uint32_t control, uint32_t arg)
  2018. {
  2019. return SPI_InterruptControl(control, arg, &SPI7_InterruptDriverState);
  2020. }
  2021. static ARM_SPI_STATUS SPI7_InterruptGetStatus(void)
  2022. {
  2023. return SPI_InterruptGetStatus(&SPI7_InterruptDriverState);
  2024. }
  2025. #endif
  2026. ARM_DRIVER_SPI Driver_SPI7 = {SPIx_GetVersion, SPIx_GetCapabilities,
  2027. #if RTE_SPI7_DMA_EN
  2028. SPI7_DMAInitialize, SPI7_DMAUninitialize, SPI7_DMAPowerControl, SPI7_DMASend,
  2029. SPI7_DMAReceive, SPI7_DMATransfer, SPI7_DMAGetCount, SPI7_DMAControl,
  2030. SPI7_DMAGetStatus
  2031. #else
  2032. SPI7_InterruptInitialize, SPI7_InterruptUninitialize, SPI7_InterruptPowerControl,
  2033. SPI7_InterruptSend, SPI7_InterruptReceive, SPI7_InterruptTransfer, SPI7_InterruptGetCount,
  2034. SPI7_InterruptControl, SPI7_InterruptGetStatus
  2035. #endif
  2036. };
  2037. #endif /* SPI7 */
  2038. #if defined(SPI8) && RTE_SPI8
  2039. /* User needs to provide the implementation for SPI8_GetFreq/InitPins/DeinitPins
  2040. in the application for enabling according instance. */
  2041. extern uint32_t SPI8_GetFreq(void);
  2042. extern void SPI8_InitPins(void);
  2043. extern void SPI8_DeinitPins(void);
  2044. cmsis_spi_resource_t SPI8_Resource = {SPI8, 8, SPI8_GetFreq};
  2045. #if RTE_SPI8_DMA_EN
  2046. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  2047. cmsis_spi_dma_resource_t SPI8_DMAResource = {RTE_SPI8_DMA_TX_DMA_BASE, RTE_SPI8_DMA_TX_CH, RTE_SPI8_DMA_RX_DMA_BASE,
  2048. RTE_SPI8_DMA_RX_CH};
  2049. static cmsis_spi_dma_handle_t SPI8_DmaHandle;
  2050. static dma_handle_t SPI8_DmaTxDataHandle;
  2051. static dma_handle_t SPI8_DmaRxDataHandle;
  2052. #if defined(__CC_ARM)
  2053. ARMCC_SECTION("spi8_dma_driver_state")
  2054. static cmsis_spi_dma_driver_state_t SPI8_DMADriverState = {
  2055. #else
  2056. static cmsis_spi_dma_driver_state_t SPI8_DMADriverState = {
  2057. #endif
  2058. &SPI8_Resource, &SPI8_DMAResource, &SPI8_DmaHandle, &SPI8_DmaRxDataHandle, &SPI8_DmaTxDataHandle,
  2059. };
  2060. static int32_t SPI8_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  2061. {
  2062. SPI8_InitPins();
  2063. return SPI_DMAInitialize(cb_event, &SPI8_DMADriverState);
  2064. }
  2065. static int32_t SPI8_DMAUninitialize(void)
  2066. {
  2067. SPI8_DeinitPins();
  2068. return SPI_DMAUninitialize(&SPI8_DMADriverState);
  2069. }
  2070. static int32_t SPI8_DMAPowerControl(ARM_POWER_STATE state)
  2071. {
  2072. return SPI_DMAPowerControl(state, &SPI8_DMADriverState);
  2073. }
  2074. static int32_t SPI8_DMASend(const void *data, uint32_t num)
  2075. {
  2076. return SPI_DMASend(data, num, &SPI8_DMADriverState);
  2077. }
  2078. static int32_t SPI8_DMAReceive(void *data, uint32_t num)
  2079. {
  2080. return SPI_DMAReceive(data, num, &SPI8_DMADriverState);
  2081. }
  2082. static int32_t SPI8_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  2083. {
  2084. return SPI_DMATransfer(data_out, data_in, num, &SPI8_DMADriverState);
  2085. }
  2086. static uint32_t SPI8_DMAGetCount(void)
  2087. {
  2088. return SPI_DMAGetCount(&SPI8_DMADriverState);
  2089. }
  2090. static int32_t SPI8_DMAControl(uint32_t control, uint32_t arg)
  2091. {
  2092. return SPI_DMAControl(control, arg, &SPI8_DMADriverState);
  2093. }
  2094. static ARM_SPI_STATUS SPI8_DMAGetStatus(void)
  2095. {
  2096. return SPI_DMAGetStatus(&SPI8_DMADriverState);
  2097. }
  2098. #endif
  2099. #else
  2100. static cmsis_spi_handle_t SPI8_Handle;
  2101. #if defined(__CC_ARM)
  2102. ARMCC_SECTION("spi8_interrupt_driver_state")
  2103. static cmsis_spi_interrupt_driver_state_t SPI8_InterruptDriverState = {
  2104. #else
  2105. static cmsis_spi_interrupt_driver_state_t SPI8_InterruptDriverState = {
  2106. #endif
  2107. &SPI8_Resource, &SPI8_Handle,
  2108. };
  2109. static int32_t SPI8_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  2110. {
  2111. SPI8_InitPins();
  2112. return SPI_InterruptInitialize(cb_event, &SPI8_InterruptDriverState);
  2113. }
  2114. static int32_t SPI8_InterruptUninitialize(void)
  2115. {
  2116. SPI8_DeinitPins();
  2117. return SPI_InterruptUninitialize(&SPI8_InterruptDriverState);
  2118. }
  2119. static int32_t SPI8_InterruptPowerControl(ARM_POWER_STATE state)
  2120. {
  2121. return SPI_InterruptPowerControl(state, &SPI8_InterruptDriverState);
  2122. }
  2123. static int32_t SPI8_InterruptSend(const void *data, uint32_t num)
  2124. {
  2125. return SPI_InterruptSend(data, num, &SPI8_InterruptDriverState);
  2126. }
  2127. static int32_t SPI8_InterruptReceive(void *data, uint32_t num)
  2128. {
  2129. return SPI_InterruptReceive(data, num, &SPI8_InterruptDriverState);
  2130. }
  2131. static int32_t SPI8_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  2132. {
  2133. return SPI_InterruptTransfer(data_out, data_in, num, &SPI8_InterruptDriverState);
  2134. }
  2135. static uint32_t SPI8_InterruptGetCount(void)
  2136. {
  2137. return SPI_InterruptGetCount(&SPI8_InterruptDriverState);
  2138. }
  2139. static int32_t SPI8_InterruptControl(uint32_t control, uint32_t arg)
  2140. {
  2141. return SPI_InterruptControl(control, arg, &SPI8_InterruptDriverState);
  2142. }
  2143. static ARM_SPI_STATUS SPI8_InterruptGetStatus(void)
  2144. {
  2145. return SPI_InterruptGetStatus(&SPI8_InterruptDriverState);
  2146. }
  2147. #endif
  2148. ARM_DRIVER_SPI Driver_SPI8 = {SPIx_GetVersion, SPIx_GetCapabilities,
  2149. #if RTE_SPI8_DMA_EN
  2150. SPI8_DMAInitialize, SPI8_DMAUninitialize, SPI8_DMAPowerControl, SPI8_DMASend,
  2151. SPI8_DMAReceive, SPI8_DMATransfer, SPI8_DMAGetCount, SPI8_DMAControl,
  2152. SPI8_DMAGetStatus
  2153. #else
  2154. SPI8_InterruptInitialize, SPI8_InterruptUninitialize, SPI8_InterruptPowerControl,
  2155. SPI8_InterruptSend, SPI8_InterruptReceive, SPI8_InterruptTransfer, SPI8_InterruptGetCount,
  2156. SPI8_InterruptControl, SPI8_InterruptGetStatus
  2157. #endif
  2158. };
  2159. #endif /* SPI8 */
  2160. #if defined(SPI9) && RTE_SPI9
  2161. /* User needs to provide the implementation for SPI9_GetFreq/InitPins/DeinitPins
  2162. in the application for enabling according instance. */
  2163. extern uint32_t SPI9_GetFreq(void);
  2164. extern void SPI9_InitPins(void);
  2165. extern void SPI9_DeinitPins(void);
  2166. cmsis_spi_resource_t SPI9_Resource = {SPI9, 9, SPI9_GetFreq};
  2167. #if RTE_SPI9_DMA_EN
  2168. #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
  2169. cmsis_spi_dma_resource_t SPI9_DMAResource = {RTE_SPI9_DMA_TX_DMA_BASE, RTE_SPI9_DMA_TX_CH, RTE_SPI9_DMA_RX_DMA_BASE,
  2170. RTE_SPI9_DMA_RX_CH};
  2171. static cmsis_spi_dma_handle_t SPI9_DmaHandle;
  2172. static dma_handle_t SPI9_DmaTxDataHandle;
  2173. static dma_handle_t SPI9_DmaRxDataHandle;
  2174. #if defined(__CC_ARM)
  2175. ARMCC_SECTION("spi9_dma_driver_state")
  2176. static cmsis_spi_dma_driver_state_t SPI9_DMADriverState = {
  2177. #else
  2178. static cmsis_spi_dma_driver_state_t SPI9_DMADriverState = {
  2179. #endif
  2180. &SPI9_Resource, &SPI9_DMAResource, &SPI9_DmaHandle, &SPI9_DmaRxDataHandle, &SPI9_DmaTxDataHandle,
  2181. };
  2182. static int32_t SPI9_DMAInitialize(ARM_SPI_SignalEvent_t cb_event)
  2183. {
  2184. SPI9_InitPins();
  2185. return SPI_DMAInitialize(cb_event, &SPI9_DMADriverState);
  2186. }
  2187. static int32_t SPI9_DMAUninitialize(void)
  2188. {
  2189. SPI9_DeinitPins();
  2190. return SPI_DMAUninitialize(&SPI9_DMADriverState);
  2191. }
  2192. static int32_t SPI9_DMAPowerControl(ARM_POWER_STATE state)
  2193. {
  2194. return SPI_DMAPowerControl(state, &SPI9_DMADriverState);
  2195. }
  2196. static int32_t SPI9_DMASend(const void *data, uint32_t num)
  2197. {
  2198. return SPI_DMASend(data, num, &SPI9_DMADriverState);
  2199. }
  2200. static int32_t SPI9_DMAReceive(void *data, uint32_t num)
  2201. {
  2202. return SPI_DMAReceive(data, num, &SPI9_DMADriverState);
  2203. }
  2204. static int32_t SPI9_DMATransfer(const void *data_out, void *data_in, uint32_t num)
  2205. {
  2206. return SPI_DMATransfer(data_out, data_in, num, &SPI9_DMADriverState);
  2207. }
  2208. static uint32_t SPI9_DMAGetCount(void)
  2209. {
  2210. return SPI_DMAGetCount(&SPI9_DMADriverState);
  2211. }
  2212. static int32_t SPI9_DMAControl(uint32_t control, uint32_t arg)
  2213. {
  2214. return SPI_DMAControl(control, arg, &SPI9_DMADriverState);
  2215. }
  2216. static ARM_SPI_STATUS SPI9_DMAGetStatus(void)
  2217. {
  2218. return SPI_DMAGetStatus(&SPI9_DMADriverState);
  2219. }
  2220. #endif
  2221. #else
  2222. static cmsis_spi_handle_t SPI9_Handle;
  2223. #if defined(__CC_ARM)
  2224. ARMCC_SECTION("spi9_interrupt_driver_state")
  2225. static cmsis_spi_interrupt_driver_state_t SPI9_InterruptDriverState = {
  2226. #else
  2227. static cmsis_spi_interrupt_driver_state_t SPI9_InterruptDriverState = {
  2228. #endif
  2229. &SPI9_Resource, &SPI9_Handle,
  2230. };
  2231. static int32_t SPI9_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  2232. {
  2233. SPI9_InitPins();
  2234. return SPI_InterruptInitialize(cb_event, &SPI9_InterruptDriverState);
  2235. }
  2236. static int32_t SPI9_InterruptUninitialize(void)
  2237. {
  2238. SPI9_DeinitPins();
  2239. return SPI_InterruptUninitialize(&SPI9_InterruptDriverState);
  2240. }
  2241. static int32_t SPI9_InterruptPowerControl(ARM_POWER_STATE state)
  2242. {
  2243. return SPI_InterruptPowerControl(state, &SPI9_InterruptDriverState);
  2244. }
  2245. static int32_t SPI9_InterruptSend(const void *data, uint32_t num)
  2246. {
  2247. return SPI_InterruptSend(data, num, &SPI9_InterruptDriverState);
  2248. }
  2249. static int32_t SPI9_InterruptReceive(void *data, uint32_t num)
  2250. {
  2251. return SPI_InterruptReceive(data, num, &SPI9_InterruptDriverState);
  2252. }
  2253. static int32_t SPI9_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  2254. {
  2255. return SPI_InterruptTransfer(data_out, data_in, num, &SPI9_InterruptDriverState);
  2256. }
  2257. static uint32_t SPI9_InterruptGetCount(void)
  2258. {
  2259. return SPI_InterruptGetCount(&SPI9_InterruptDriverState);
  2260. }
  2261. static int32_t SPI9_InterruptControl(uint32_t control, uint32_t arg)
  2262. {
  2263. return SPI_InterruptControl(control, arg, &SPI9_InterruptDriverState);
  2264. }
  2265. static ARM_SPI_STATUS SPI9_InterruptGetStatus(void)
  2266. {
  2267. return SPI_InterruptGetStatus(&SPI9_InterruptDriverState);
  2268. }
  2269. #endif
  2270. ARM_DRIVER_SPI Driver_SPI9 = {SPIx_GetVersion, SPIx_GetCapabilities,
  2271. #if RTE_SPI9_DMA_EN
  2272. SPI9_DMAInitialize, SPI9_DMAUninitialize, SPI9_DMAPowerControl, SPI9_DMASend,
  2273. SPI9_DMAReceive, SPI9_DMATransfer, SPI9_DMAGetCount, SPI9_DMAControl,
  2274. SPI9_DMAGetStatus
  2275. #else
  2276. SPI9_InterruptInitialize, SPI9_InterruptUninitialize, SPI9_InterruptPowerControl,
  2277. SPI9_InterruptSend, SPI9_InterruptReceive, SPI9_InterruptTransfer, SPI9_InterruptGetCount,
  2278. SPI9_InterruptControl, SPI9_InterruptGetStatus
  2279. #endif
  2280. };
  2281. #endif /* SPI9 */