fsl_lpspi_cmsis.c 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474
  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,2020,2021 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_lpspi_cmsis.h"
  21. /* Component ID definition, used by tools. */
  22. #ifndef FSL_COMPONENT_ID
  23. #define FSL_COMPONENT_ID "platform.drivers.lpspi_cmsis"
  24. #endif
  25. #if ((defined(RTE_SPI0) && RTE_SPI0 && defined(LPSPI0)) || (defined(RTE_SPI1) && RTE_SPI1 && defined(LPSPI1)) || \
  26. (defined(RTE_SPI2) && RTE_SPI2 && defined(LPSPI2)) || (defined(RTE_SPI3) && RTE_SPI3 && defined(LPSPI3)) || \
  27. (defined(RTE_SPI4) && RTE_SPI4 && defined(LPSPI4)) || (defined(RTE_SPI5) && RTE_SPI5 && defined(LPSPI5)))
  28. #define ARM_LPSPI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR((2), (4)) /* driver version */
  29. /*
  30. * ARMCC does not support split the data section automatically, so the driver
  31. * needs to split the data to separate sections explicitly, to reduce codesize.
  32. */
  33. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  34. #define ARMCC_SECTION(section_name) __attribute__((section(section_name)))
  35. #endif
  36. static clock_ip_name_t const s_lpspiClock[] = LPSPI_CLOCKS;
  37. typedef const struct _cmsis_lpspi_resource
  38. {
  39. LPSPI_Type *base;
  40. uint32_t instance;
  41. uint32_t (*GetFreq)(void);
  42. } cmsis_lpspi_resource_t;
  43. typedef union _cmsis_lpspi_handle
  44. {
  45. lpspi_master_handle_t masterHandle;
  46. lpspi_slave_handle_t slaveHandle;
  47. } cmsis_lpspi_handle_t;
  48. typedef struct _cmsis_lpspi_interrupt_driver_state
  49. {
  50. cmsis_lpspi_resource_t *resource;
  51. cmsis_lpspi_handle_t *handle;
  52. ARM_SPI_SignalEvent_t cb_event;
  53. uint32_t baudRate_Bps;
  54. uint8_t flags; /*!< Control and state flags. */
  55. } cmsis_lpspi_interrupt_driver_state_t;
  56. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  57. typedef const struct _cmsis_lpspi_edma_resource
  58. {
  59. DMA_Type *txEdmaBase;
  60. uint32_t txEdmaChannel;
  61. uint8_t txDmaRequest;
  62. DMA_Type *rxEdmaBase;
  63. uint32_t rxEdmaChannel;
  64. uint8_t rxDmaRequest;
  65. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  66. DMAMUX_Type *txDmamuxBase;
  67. DMAMUX_Type *rxDmamuxBase;
  68. #endif
  69. } cmsis_lpspi_edma_resource_t;
  70. typedef union _cmsis_lpspi_edma_handle
  71. {
  72. lpspi_master_edma_handle_t masterHandle;
  73. lpspi_slave_edma_handle_t slaveHandle;
  74. } cmsis_lpspi_edma_handle_t;
  75. typedef struct _cmsis_lpspi_edma_driver_state
  76. {
  77. cmsis_lpspi_resource_t *resource;
  78. cmsis_lpspi_edma_resource_t *dmaResource;
  79. cmsis_lpspi_edma_handle_t *handle;
  80. edma_handle_t *edmaRxRegToRxDataHandle;
  81. edma_handle_t *edmaTxDataToTxRegHandle;
  82. ARM_SPI_SignalEvent_t cb_event;
  83. uint32_t baudRate_Bps;
  84. uint8_t flags; /*!< Control and state flags. */
  85. } cmsis_lpspi_edma_driver_state_t;
  86. #endif
  87. /* Driver Version */
  88. static const ARM_DRIVER_VERSION s_lpspiDriverVersion = {ARM_SPI_API_VERSION, ARM_LPSPI_DRV_VERSION};
  89. /* Driver Capabilities */
  90. static const ARM_SPI_CAPABILITIES s_lpspiDriverCapabilities = {
  91. 1, /* Simplex Mode (Master and Slave) */
  92. 0, /* TI Synchronous Serial Interface */
  93. 0, /* Microwire Interface */
  94. 0 /* Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT */
  95. };
  96. /*
  97. *Common Control function used by LPSPI_InterruptControl / LPSPI_EdmaControl.
  98. */
  99. static int32_t LPSPI_CommonControl(uint32_t control,
  100. uint32_t arg,
  101. cmsis_lpspi_resource_t *resource,
  102. uint8_t *isConfigured)
  103. {
  104. lpspi_master_config_t masterConfig;
  105. LPSPI_MasterGetDefaultConfig(&masterConfig);
  106. lpspi_slave_config_t slaveConfig;
  107. LPSPI_SlaveGetDefaultConfig(&slaveConfig);
  108. masterConfig.baudRate = arg;
  109. if (ARM_SPI_MODE_MASTER_SIMPLEX == (control & (uint32_t)ARM_SPI_CONTROL_Msk))
  110. {
  111. masterConfig.pinCfg = kLPSPI_SdoInSdoOut;
  112. }
  113. if (ARM_SPI_MODE_SLAVE_SIMPLEX == (control & (uint32_t)ARM_SPI_CONTROL_Msk))
  114. {
  115. slaveConfig.pinCfg = kLPSPI_SdiInSdiOut;
  116. }
  117. #if (defined(RTE_SPI0_PCS_TO_SCK_DELAY) && defined(RTE_SPI0_SCK_TO_PSC_DELAY) && \
  118. defined(RTE_SPI0_BETWEEN_TRANSFER_DELAY))
  119. if (0U == resource->instance)
  120. {
  121. masterConfig.pcsToSckDelayInNanoSec = (uint32_t)RTE_SPI0_PCS_TO_SCK_DELAY;
  122. masterConfig.lastSckToPcsDelayInNanoSec = (uint32_t)RTE_SPI0_SCK_TO_PSC_DELAY;
  123. masterConfig.betweenTransferDelayInNanoSec = (uint32_t)RTE_SPI0_BETWEEN_TRANSFER_DELAY;
  124. }
  125. #endif /*RTE LPSPI0 trnafer delay time configure */
  126. #if (defined(RTE_SPI1_PCS_TO_SCK_DELAY) && defined(RTE_SPI1_SCK_TO_PSC_DELAY) && \
  127. defined(RTE_SPI1_BETWEEN_TRANSFER_DELAY))
  128. if (1U == resource->instance)
  129. {
  130. masterConfig.pcsToSckDelayInNanoSec = (uint32_t)RTE_SPI1_PCS_TO_SCK_DELAY;
  131. masterConfig.lastSckToPcsDelayInNanoSec = (uint32_t)RTE_SPI1_SCK_TO_PSC_DELAY;
  132. masterConfig.betweenTransferDelayInNanoSec = (uint32_t)RTE_SPI1_BETWEEN_TRANSFER_DELAY;
  133. }
  134. #endif /*RTE LPSPI1 trnafer delay time configure */
  135. #if (defined(RTE_SPI2_PCS_TO_SCK_DELAY) && defined(RTE_SPI2_SCK_TO_PSC_DELAY) && \
  136. defined(RTE_SPI2_BETWEEN_TRANSFER_DELAY))
  137. if (2U == resource->instance)
  138. {
  139. masterConfig.pcsToSckDelayInNanoSec = (uint32_t)RTE_SPI2_PCS_TO_SCK_DELAY;
  140. masterConfig.lastSckToPcsDelayInNanoSec = (uint32_t)RTE_SPI2_SCK_TO_PSC_DELAY;
  141. masterConfig.betweenTransferDelayInNanoSec = (uint32_t)RTE_SPI2_BETWEEN_TRANSFER_DELAY;
  142. }
  143. #endif /*RTE LPSPI2 trnafer delay time configure */
  144. #if (defined(RTE_SPI3_PCS_TO_SCK_DELAY) && defined(RTE_SPI3_SCK_TO_PSC_DELAY) && \
  145. defined(RTE_SPI3_BETWEEN_TRANSFER_DELAY))
  146. if (3U == resource->instance)
  147. {
  148. masterConfig.pcsToSckDelayInNanoSec = (uint32_t)RTE_SPI3_PCS_TO_SCK_DELAY;
  149. masterConfig.lastSckToPcsDelayInNanoSec = (uint32_t)RTE_SPI3_SCK_TO_PSC_DELAY;
  150. masterConfig.betweenTransferDelayInNanoSec = (uint32_t)RTE_SPI3_BETWEEN_TRANSFER_DELAY;
  151. }
  152. #endif /*RTE LPSPI3 trnafer delay time configure */
  153. #if (defined(RTE_SPI4_PCS_TO_SCK_DELAY) && defined(RTE_SPI4_SCK_TO_PSC_DELAY) && \
  154. defined(RTE_SPI4_BETWEEN_TRANSFER_DELAY))
  155. if (4U == resource->instance)
  156. {
  157. masterConfig.pcsToSckDelayInNanoSec = (uint32_t)RTE_SPI4_PCS_TO_SCK_DELAY;
  158. masterConfig.lastSckToPcsDelayInNanoSec = (uint32_t)RTE_SPI4_SCK_TO_PSC_DELAY;
  159. masterConfig.betweenTransferDelayInNanoSec = (uint32_t)RTE_SPI4_BETWEEN_TRANSFER_DELAY;
  160. }
  161. #endif /*RTE LPSPI4 trnafer delay time configure */
  162. #if (defined(RTE_SPI5_PCS_TO_SCK_DELAY) && defined(RTE_SPI5_SCK_TO_PSC_DELAY) && \
  163. defined(RTE_SPI5_BETWEEN_TRANSFER_DELAY))
  164. if (5U == resource->instance)
  165. {
  166. masterConfig.pcsToSckDelayInNanoSec = (uint32_t)RTE_SPI5_PCS_TO_SCK_DELAY;
  167. masterConfig.lastSckToPcsDelayInNanoSec = (uint32_t)RTE_SPI5_SCK_TO_PSC_DELAY;
  168. masterConfig.betweenTransferDelayInNanoSec = (uint32_t)RTE_SPI5_BETWEEN_TRANSFER_DELAY;
  169. }
  170. #endif /*RTE LPSPI5 trnafer delay time configure */
  171. switch (control & (uint32_t)ARM_SPI_FRAME_FORMAT_Msk)
  172. {
  173. case ARM_SPI_CPOL0_CPHA0: /* Clock Polarity 0, Clock Phase 0*/
  174. if (LPSPI_IsMaster(resource->base))
  175. {
  176. masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
  177. masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
  178. }
  179. else
  180. {
  181. slaveConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
  182. slaveConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
  183. }
  184. break;
  185. case ARM_SPI_CPOL0_CPHA1: /* Clock Polarity 0, Clock Phase 1*/
  186. if (LPSPI_IsMaster(resource->base))
  187. {
  188. masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
  189. masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge;
  190. }
  191. else
  192. {
  193. slaveConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
  194. slaveConfig.cpha = kLPSPI_ClockPhaseSecondEdge;
  195. }
  196. break;
  197. case ARM_SPI_CPOL1_CPHA0: /* Clock Polarity 1, Clock Phase 0*/
  198. if (LPSPI_IsMaster(resource->base))
  199. {
  200. masterConfig.cpol = kLPSPI_ClockPolarityActiveLow;
  201. masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
  202. }
  203. else
  204. {
  205. slaveConfig.cpol = kLPSPI_ClockPolarityActiveLow;
  206. slaveConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
  207. }
  208. break;
  209. case ARM_SPI_CPOL1_CPHA1: /* Clock Polarity 1, Clock Phase 1*/
  210. if (LPSPI_IsMaster(resource->base))
  211. {
  212. masterConfig.cpol = kLPSPI_ClockPolarityActiveLow;
  213. masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge;
  214. }
  215. else
  216. {
  217. slaveConfig.cpol = kLPSPI_ClockPolarityActiveLow;
  218. slaveConfig.cpha = kLPSPI_ClockPhaseSecondEdge;
  219. }
  220. break;
  221. default:
  222. /* Avoid MISRA 16.4 violations. */
  223. break;
  224. }
  225. if ((control & (uint32_t)ARM_SPI_DATA_BITS_Msk) != 0U) /* Number of Data bits */
  226. {
  227. if ((((control & (uint32_t)ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos) >= 8UL))
  228. {
  229. if (LPSPI_IsMaster(resource->base))
  230. {
  231. masterConfig.bitsPerFrame = ((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos);
  232. }
  233. else
  234. {
  235. slaveConfig.bitsPerFrame = ((control & ARM_SPI_DATA_BITS_Msk) >> ARM_SPI_DATA_BITS_Pos);
  236. }
  237. }
  238. else
  239. {
  240. return ARM_SPI_ERROR_DATA_BITS;
  241. }
  242. }
  243. switch (control & (uint32_t)ARM_SPI_BIT_ORDER_Msk)
  244. {
  245. case ARM_SPI_LSB_MSB: /* SPI Bit order from LSB to MSB */
  246. if (LPSPI_IsMaster(resource->base))
  247. {
  248. masterConfig.direction = kLPSPI_LsbFirst;
  249. }
  250. else
  251. {
  252. slaveConfig.direction = kLPSPI_LsbFirst;
  253. }
  254. break;
  255. case ARM_SPI_MSB_LSB: /* SPI Bit order from MSB to LSB */
  256. if (LPSPI_IsMaster(resource->base))
  257. {
  258. masterConfig.direction = kLPSPI_MsbFirst;
  259. }
  260. else
  261. {
  262. slaveConfig.direction = kLPSPI_MsbFirst;
  263. }
  264. break;
  265. default:
  266. /* Avoid MISRA 16.4 violations. */
  267. break;
  268. }
  269. if (LPSPI_IsMaster(resource->base))
  270. {
  271. /* The SPI slave select is controlled by hardware, the other mode is not supported by current driver. */
  272. switch (control & (uint32_t)ARM_SPI_SS_MASTER_MODE_Msk)
  273. {
  274. case ARM_SPI_SS_MASTER_UNUSED:
  275. break;
  276. case ARM_SPI_SS_MASTER_SW:
  277. break;
  278. case ARM_SPI_SS_MASTER_HW_OUTPUT:
  279. break;
  280. case ARM_SPI_SS_MASTER_HW_INPUT:
  281. break;
  282. default:
  283. /* Avoid MISRA 16.4 violations. */
  284. break;
  285. }
  286. }
  287. else
  288. {
  289. /* The SPI slave select is controlled by hardware, the other mode is not supported by current driver. */
  290. switch (control & (uint32_t)ARM_SPI_SS_SLAVE_MODE_Msk)
  291. {
  292. case ARM_SPI_SS_SLAVE_HW:
  293. break;
  294. case ARM_SPI_SS_SLAVE_SW:
  295. break;
  296. default:
  297. /* Avoid MISRA 16.4 violations. */
  298. break;
  299. }
  300. }
  301. /* LPSPI Init*/
  302. if (LPSPI_IsMaster(resource->base))
  303. {
  304. if (((*isConfigured) & (uint8_t)SPI_FLAG_CONFIGURED) != 0U)
  305. {
  306. LPSPI_Deinit(resource->base);
  307. }
  308. LPSPI_MasterInit(resource->base, &masterConfig, resource->GetFreq());
  309. *isConfigured |= (uint8_t)SPI_FLAG_CONFIGURED;
  310. }
  311. else
  312. {
  313. if (((*isConfigured) & (uint8_t)SPI_FLAG_CONFIGURED) != 0U)
  314. {
  315. LPSPI_Deinit(resource->base);
  316. }
  317. LPSPI_SlaveInit(resource->base, &slaveConfig);
  318. *isConfigured |= (uint8_t)SPI_FLAG_CONFIGURED;
  319. }
  320. return ARM_DRIVER_OK;
  321. }
  322. static void LPSPI_SetTransferConfigFlags(bool isMaster, uint32_t instance, lpspi_transfer_t *xfer)
  323. {
  324. if (isMaster)
  325. {
  326. /* Set default config flag */
  327. xfer->configFlags =
  328. (uint32_t)kLPSPI_MasterPcs0 | (uint32_t)kLPSPI_MasterByteSwap | (uint32_t)kLPSPI_MasterPcsContinuous;
  329. #if (defined(RTE_SPI0_MASTER_PCS_PIN_SEL))
  330. if (0U == instance)
  331. {
  332. xfer->configFlags = (uint32_t)RTE_SPI0_MASTER_PCS_PIN_SEL | (uint32_t)kLPSPI_MasterByteSwap |
  333. (uint32_t)kLPSPI_MasterPcsContinuous;
  334. }
  335. #endif /* LPSPI0 PCS pin configuration */
  336. #if (defined(RTE_SPI1_MASTER_PCS_PIN_SEL))
  337. if (1U == instance)
  338. {
  339. xfer->configFlags = (uint32_t)RTE_SPI1_MASTER_PCS_PIN_SEL | (uint32_t)kLPSPI_MasterByteSwap |
  340. (uint32_t)kLPSPI_MasterPcsContinuous;
  341. }
  342. #endif /* LPSPI1 PCS pin configuration */
  343. #if (defined(RTE_SPI2_MASTER_PCS_PIN_SEL))
  344. if (2U == instance)
  345. {
  346. xfer->configFlags = (uint32_t)RTE_SPI2_MASTER_PCS_PIN_SEL | (uint32_t)kLPSPI_MasterByteSwap |
  347. (uint32_t)kLPSPI_MasterPcsContinuous;
  348. }
  349. #endif /* LPSPI2 PCS pin configuration */
  350. #if (defined(RTE_SPI3_MASTER_PCS_PIN_SEL))
  351. if (3U == instance)
  352. {
  353. xfer->configFlags = (uint32_t)RTE_SPI3_MASTER_PCS_PIN_SEL | (uint32_t)kLPSPI_MasterByteSwap |
  354. (uint32_t)kLPSPI_MasterPcsContinuous;
  355. }
  356. #endif /* LPSPI3 PCS pin configuration */
  357. #if (defined(RTE_SPI4_MASTER_PCS_PIN_SEL))
  358. if (4U == instance)
  359. {
  360. xfer->configFlags = (uint32_t)RTE_SPI4_MASTER_PCS_PIN_SEL | (uint32_t)kLPSPI_MasterByteSwap |
  361. (uint32_t)kLPSPI_MasterPcsContinuous;
  362. }
  363. #endif /* LPSPI4 PCS pin configuration */
  364. #if (defined(RTE_SPI5_MASTER_PCS_PIN_SEL))
  365. if (5U == instance)
  366. {
  367. xfer->configFlags = (uint32_t)RTE_SPI5_MASTER_PCS_PIN_SEL | (uint32_t)kLPSPI_MasterByteSwap |
  368. (uint32_t)kLPSPI_MasterPcsContinuous;
  369. }
  370. #endif /* LPSPI5 PCS pin configuration */
  371. }
  372. else
  373. {
  374. /* Set default config flag */
  375. xfer->configFlags = (uint32_t)kLPSPI_SlavePcs0 | (uint32_t)kLPSPI_SlaveByteSwap;
  376. #if (defined(RTE_SPI0_SLAVE_PCS_PIN_SEL))
  377. if (0U == instance)
  378. {
  379. xfer->configFlags = (uint32_t)RTE_SPI0_SLAVE_PCS_PIN_SEL | (uint32_t)kLPSPI_SlaveByteSwap;
  380. }
  381. #endif /* LPSPI0 PCS pin configuration */
  382. #if (defined(RTE_SPI1_SLAVE_PCS_PIN_SEL))
  383. if (1U == instance)
  384. {
  385. xfer->configFlags = (uint32_t)RTE_SPI1_SLAVE_PCS_PIN_SEL | (uint32_t)kLPSPI_SlaveByteSwap;
  386. }
  387. #endif /* LPSPI1 PCS pin configuration */
  388. #if (defined(RTE_SPI2_SLAVE_PCS_PIN_SEL))
  389. if (2U == instance)
  390. {
  391. xfer->configFlags = (uint32_t)RTE_SPI2_SLAVE_PCS_PIN_SEL | (uint32_t)kLPSPI_SlaveByteSwap;
  392. }
  393. #endif /* LPSPI2 PCS pin configuration */
  394. #if (defined(RTE_SPI3_SLAVE_PCS_PIN_SEL))
  395. if (3U == instance)
  396. {
  397. xfer->configFlags = (uint32_t)RTE_SPI3_SLAVE_PCS_PIN_SEL | (uint32_t)kLPSPI_SlaveByteSwap;
  398. }
  399. #endif /* LPSPI3 PCS pin configuration */
  400. #if (defined(RTE_SPI4_SLAVE_PCS_PIN_SEL))
  401. if (4U == instance)
  402. {
  403. xfer->configFlags = (uint32_t)RTE_SPI4_SLAVE_PCS_PIN_SEL | (uint32_t)kLPSPI_SlaveByteSwap;
  404. }
  405. #endif /* LPSPI4 PCS pin configuration */
  406. #if (defined(RTE_SPI5_SLAVE_PCS_PIN_SEL))
  407. if (5U == instance)
  408. {
  409. xfer->configFlags = (uint32_t)RTE_SPI5_SLAVE_PCS_PIN_SEL | (uint32_t)kLPSPI_SlaveByteSwap;
  410. }
  411. #endif /* LPSPI5 PCS pin configuration */
  412. }
  413. }
  414. static ARM_DRIVER_VERSION LPSPIx_GetVersion(void)
  415. {
  416. return s_lpspiDriverVersion;
  417. }
  418. static ARM_SPI_CAPABILITIES LPSPIx_GetCapabilities(void)
  419. {
  420. return s_lpspiDriverCapabilities;
  421. }
  422. #endif
  423. #if ((defined(RTE_SPI0_DMA_EN) && RTE_SPI0_DMA_EN) || (defined(RTE_SPI1_DMA_EN) && RTE_SPI1_DMA_EN) || \
  424. (defined(RTE_SPI2_DMA_EN) && RTE_SPI2_DMA_EN) || (defined(RTE_SPI3_DMA_EN) && RTE_SPI3_DMA_EN) || \
  425. (defined(RTE_SPI4_DMA_EN) && RTE_SPI4_DMA_EN) || (defined(RTE_SPI5_DMA_EN) && RTE_SPI5_DMA_EN))
  426. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  427. static void KSDK_LPSPI_MasterEdmaCallback(LPSPI_Type *base,
  428. lpspi_master_edma_handle_t *handle,
  429. status_t status,
  430. void *userData)
  431. {
  432. uint32_t event = 0U;
  433. if (kStatus_Success == status)
  434. {
  435. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  436. }
  437. else if (kStatus_LPSPI_OutOfRange == status)
  438. {
  439. event = ARM_SPI_EVENT_DATA_LOST;
  440. }
  441. else
  442. {
  443. /* Avoid MISRA 15.7 violations. */
  444. }
  445. /* User data is actually CMSIS driver callback. */
  446. if ((0U != event) && (userData != NULL))
  447. {
  448. ((ARM_SPI_SignalEvent_t)userData)(event);
  449. }
  450. }
  451. static void KSDK_LPSPI_SlaveEdmaCallback(LPSPI_Type *base,
  452. lpspi_slave_edma_handle_t *handle,
  453. status_t status,
  454. void *userData)
  455. {
  456. uint32_t event = 0U;
  457. if (kStatus_Success == status)
  458. {
  459. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  460. }
  461. else if (kStatus_LPSPI_OutOfRange == status)
  462. {
  463. event = ARM_SPI_EVENT_DATA_LOST;
  464. }
  465. else
  466. {
  467. /* Avoid MISRA 15.7 violations. */
  468. }
  469. /* User data is actually CMSIS driver callback. */
  470. if ((0U != event) && (userData != NULL))
  471. {
  472. ((ARM_SPI_SignalEvent_t)userData)(event);
  473. }
  474. }
  475. static int32_t LPSPI_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event, cmsis_lpspi_edma_driver_state_t *lpspi)
  476. {
  477. if (0U == (lpspi->flags & (uint8_t)SPI_FLAG_INIT))
  478. {
  479. lpspi->cb_event = cb_event;
  480. lpspi->flags = (uint8_t)SPI_FLAG_INIT;
  481. }
  482. return ARM_DRIVER_OK;
  483. }
  484. static int32_t LPSPI_EdmaUninitialize(cmsis_lpspi_edma_driver_state_t *lpspi)
  485. {
  486. lpspi->flags = (uint8_t)SPI_FLAG_UNINIT;
  487. return ARM_DRIVER_OK;
  488. }
  489. static int32_t LPSPI_EdmaPowerControl(ARM_POWER_STATE state, cmsis_lpspi_edma_driver_state_t *lpspi)
  490. {
  491. cmsis_lpspi_edma_resource_t *dmaResource = lpspi->dmaResource;
  492. int32_t result = ARM_DRIVER_OK;
  493. switch (state)
  494. {
  495. case ARM_POWER_OFF:
  496. if ((lpspi->flags & (uint8_t)SPI_FLAG_POWER) != 0U)
  497. {
  498. LPSPI_Deinit(lpspi->resource->base);
  499. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  500. DMAMUX_DisableChannel(lpspi->dmaResource->rxDmamuxBase, lpspi->dmaResource->rxEdmaChannel);
  501. DMAMUX_DisableChannel(lpspi->dmaResource->txDmamuxBase, lpspi->dmaResource->txEdmaChannel);
  502. #endif
  503. lpspi->flags = (uint8_t)SPI_FLAG_INIT;
  504. }
  505. break;
  506. case ARM_POWER_LOW:
  507. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  508. break;
  509. case ARM_POWER_FULL:
  510. {
  511. if (lpspi->flags == (uint8_t)SPI_FLAG_UNINIT)
  512. {
  513. result = ARM_DRIVER_ERROR;
  514. break;
  515. }
  516. if ((lpspi->flags & (uint8_t)SPI_FLAG_POWER) != 0U)
  517. {
  518. /* Driver already powered */
  519. break;
  520. }
  521. /* Enable Clock gate */
  522. (void)CLOCK_EnableClock(s_lpspiClock[lpspi->resource->instance]);
  523. (void)memset(lpspi->edmaRxRegToRxDataHandle, 0, sizeof(edma_handle_t));
  524. (void)memset(lpspi->edmaTxDataToTxRegHandle, 0, sizeof(edma_handle_t));
  525. EDMA_CreateHandle(lpspi->edmaRxRegToRxDataHandle, dmaResource->rxEdmaBase, dmaResource->rxEdmaChannel);
  526. EDMA_CreateHandle(lpspi->edmaTxDataToTxRegHandle, dmaResource->txEdmaBase, dmaResource->txEdmaChannel);
  527. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  528. DMAMUX_SetSource(dmaResource->rxDmamuxBase, dmaResource->rxEdmaChannel, dmaResource->rxDmaRequest);
  529. DMAMUX_EnableChannel(dmaResource->rxDmamuxBase, dmaResource->rxEdmaChannel);
  530. DMAMUX_SetSource(dmaResource->txDmamuxBase, dmaResource->txEdmaChannel, dmaResource->txDmaRequest);
  531. DMAMUX_EnableChannel(dmaResource->txDmamuxBase, dmaResource->txEdmaChannel);
  532. #endif
  533. lpspi->flags |= (uint8_t)SPI_FLAG_POWER;
  534. break;
  535. }
  536. default:
  537. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  538. break;
  539. }
  540. return result;
  541. }
  542. static int32_t LPSPI_EdmaSend(const void *data, uint32_t num, cmsis_lpspi_edma_driver_state_t *lpspi)
  543. {
  544. int32_t ret;
  545. status_t status;
  546. lpspi_transfer_t xfer = {0};
  547. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  548. xfer.rxData = NULL;
  549. xfer.txData = (uint8_t *)data;
  550. xfer.dataSize = num * ((datawidth + 8U) / 8U);
  551. LPSPI_SetTransferConfigFlags(LPSPI_IsMaster(lpspi->resource->base), lpspi->resource->instance, &xfer);
  552. if (LPSPI_IsMaster(lpspi->resource->base))
  553. {
  554. status = LPSPI_MasterTransferEDMA(lpspi->resource->base, &(lpspi->handle->masterHandle), &xfer);
  555. }
  556. else
  557. {
  558. status = LPSPI_SlaveTransferEDMA(lpspi->resource->base, &(lpspi->handle->slaveHandle), &xfer);
  559. }
  560. switch (status)
  561. {
  562. case kStatus_Success:
  563. ret = ARM_DRIVER_OK;
  564. break;
  565. case kStatus_InvalidArgument:
  566. ret = ARM_DRIVER_ERROR_PARAMETER;
  567. break;
  568. case kStatus_LPSPI_Busy:
  569. ret = ARM_DRIVER_ERROR_BUSY;
  570. break;
  571. default:
  572. ret = ARM_DRIVER_ERROR;
  573. break;
  574. }
  575. return ret;
  576. }
  577. static int32_t LPSPI_EdmaReceive(void *data, uint32_t num, cmsis_lpspi_edma_driver_state_t *lpspi)
  578. {
  579. int32_t ret;
  580. status_t status;
  581. lpspi_transfer_t xfer = {0};
  582. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  583. xfer.txData = NULL;
  584. xfer.rxData = (uint8_t *)data;
  585. xfer.dataSize = num * ((datawidth + 8U) / 8U);
  586. LPSPI_SetTransferConfigFlags(LPSPI_IsMaster(lpspi->resource->base), lpspi->resource->instance, &xfer);
  587. if (LPSPI_IsMaster(lpspi->resource->base))
  588. {
  589. status = LPSPI_MasterTransferEDMA(lpspi->resource->base, &(lpspi->handle->masterHandle), &xfer);
  590. }
  591. else
  592. {
  593. status = LPSPI_SlaveTransferEDMA(lpspi->resource->base, &(lpspi->handle->slaveHandle), &xfer);
  594. }
  595. switch (status)
  596. {
  597. case kStatus_Success:
  598. ret = ARM_DRIVER_OK;
  599. break;
  600. case kStatus_InvalidArgument:
  601. ret = ARM_DRIVER_ERROR_PARAMETER;
  602. break;
  603. case kStatus_LPSPI_Busy:
  604. ret = ARM_DRIVER_ERROR_BUSY;
  605. break;
  606. default:
  607. ret = ARM_DRIVER_ERROR;
  608. break;
  609. }
  610. return ret;
  611. }
  612. static int32_t LPSPI_EdmaTransfer(const void *data_out,
  613. void *data_in,
  614. uint32_t num,
  615. cmsis_lpspi_edma_driver_state_t *lpspi)
  616. {
  617. int32_t ret;
  618. status_t status;
  619. lpspi_transfer_t xfer = {0};
  620. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  621. xfer.txData = (uint8_t *)data_out;
  622. xfer.rxData = (uint8_t *)data_in;
  623. xfer.dataSize = num * ((datawidth + 8U) / 8U);
  624. LPSPI_SetTransferConfigFlags(LPSPI_IsMaster(lpspi->resource->base), lpspi->resource->instance, &xfer);
  625. if (LPSPI_IsMaster(lpspi->resource->base))
  626. {
  627. status = LPSPI_MasterTransferEDMA(lpspi->resource->base, &(lpspi->handle->masterHandle), &xfer);
  628. }
  629. else
  630. {
  631. status = LPSPI_SlaveTransferEDMA(lpspi->resource->base, &(lpspi->handle->slaveHandle), &xfer);
  632. }
  633. switch (status)
  634. {
  635. case kStatus_Success:
  636. ret = ARM_DRIVER_OK;
  637. break;
  638. case kStatus_InvalidArgument:
  639. ret = ARM_DRIVER_ERROR_PARAMETER;
  640. break;
  641. case kStatus_LPSPI_Busy:
  642. ret = ARM_DRIVER_ERROR_BUSY;
  643. break;
  644. default:
  645. ret = ARM_DRIVER_ERROR;
  646. break;
  647. }
  648. return ret;
  649. }
  650. static uint32_t LPSPI_EdmaGetCount(cmsis_lpspi_edma_driver_state_t *lpspi)
  651. {
  652. uint32_t cnt;
  653. size_t bytes;
  654. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  655. if (LPSPI_IsMaster(lpspi->resource->base))
  656. {
  657. bytes = (uint32_t)lpspi->handle->masterHandle.nbytes *
  658. EDMA_GetRemainingMajorLoopCount(lpspi->dmaResource->rxEdmaBase, lpspi->dmaResource->rxEdmaChannel);
  659. cnt = lpspi->handle->masterHandle.totalByteCount - bytes;
  660. }
  661. else
  662. {
  663. bytes = (uint32_t)lpspi->handle->masterHandle.nbytes *
  664. EDMA_GetRemainingMajorLoopCount(lpspi->dmaResource->rxEdmaBase, lpspi->dmaResource->rxEdmaChannel);
  665. cnt = lpspi->handle->slaveHandle.totalByteCount - bytes;
  666. }
  667. cnt /= ((datawidth + 8U) / 8U);
  668. return cnt;
  669. }
  670. static int32_t LPSPI_EdmaControl(uint32_t control, uint32_t arg, cmsis_lpspi_edma_driver_state_t *lpspi)
  671. {
  672. int32_t result = ARM_DRIVER_OK;
  673. bool isContinue = false;
  674. if (0U == (lpspi->flags & (uint8_t)SPI_FLAG_POWER))
  675. {
  676. return ARM_DRIVER_ERROR;
  677. }
  678. switch (control & ARM_SPI_CONTROL_Msk)
  679. {
  680. case ARM_SPI_MODE_INACTIVE:
  681. LPSPI_Enable(lpspi->resource->base, false);
  682. break;
  683. case ARM_SPI_MODE_MASTER: /* SPI Master (Output on SOUT, Input on SIN); arg = Bus Speed in bps */
  684. {
  685. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Master);
  686. LPSPI_MasterTransferCreateHandleEDMA(lpspi->resource->base, &(lpspi->handle->masterHandle),
  687. KSDK_LPSPI_MasterEdmaCallback, (void *)lpspi->cb_event,
  688. lpspi->edmaRxRegToRxDataHandle, lpspi->edmaTxDataToTxRegHandle);
  689. lpspi->baudRate_Bps = arg;
  690. isContinue = true;
  691. break;
  692. }
  693. case ARM_SPI_MODE_SLAVE: /* SPI Slave (Output on SOUT, Input on SIN) */
  694. {
  695. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Slave);
  696. LPSPI_SlaveTransferCreateHandleEDMA(lpspi->resource->base, &(lpspi->handle->slaveHandle),
  697. KSDK_LPSPI_SlaveEdmaCallback, (void *)lpspi->cb_event,
  698. lpspi->edmaRxRegToRxDataHandle, lpspi->edmaTxDataToTxRegHandle);
  699. isContinue = true;
  700. break;
  701. }
  702. case ARM_SPI_SET_BUS_SPEED: /* Get Bus Speed in bps */
  703. {
  704. uint32_t tcrPrescaleValue = 0;
  705. LPSPI_Enable(lpspi->resource->base, false);
  706. if (!LPSPI_IsMaster(lpspi->resource->base))
  707. {
  708. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  709. break;
  710. }
  711. if (0UL ==
  712. LPSPI_MasterSetBaudRate(lpspi->resource->base, arg, lpspi->resource->GetFreq(), &tcrPrescaleValue))
  713. {
  714. result = ARM_DRIVER_ERROR;
  715. break;
  716. }
  717. LPSPI_Enable(lpspi->resource->base, true);
  718. lpspi->baudRate_Bps = arg;
  719. break;
  720. }
  721. case ARM_SPI_GET_BUS_SPEED: /* Set Bus Speed in bps; arg = value */
  722. if (!LPSPI_IsMaster(lpspi->resource->base))
  723. {
  724. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  725. break;
  726. }
  727. result = (int32_t)lpspi->baudRate_Bps;
  728. break;
  729. case ARM_SPI_CONTROL_SS: /* Control Slave Select; arg = 0:inactive, 1:active */
  730. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  731. break;
  732. case ARM_SPI_ABORT_TRANSFER: /* Abort current data transfer */
  733. if (LPSPI_IsMaster(lpspi->resource->base))
  734. {
  735. LPSPI_MasterTransferAbortEDMA(lpspi->resource->base, &(lpspi->handle->masterHandle));
  736. }
  737. else
  738. {
  739. LPSPI_SlaveTransferAbortEDMA(lpspi->resource->base, &(lpspi->handle->slaveHandle));
  740. }
  741. result = ARM_DRIVER_OK;
  742. break;
  743. case ARM_SPI_SET_DEFAULT_TX_VALUE: /* Set default Transmit value; arg = value */
  744. LPSPI_SetDummyData(lpspi->resource->base, (uint8_t)arg);
  745. result = ARM_DRIVER_OK;
  746. break;
  747. case ARM_SPI_MODE_MASTER_SIMPLEX: /* SPI Master (Output/Input on SOUT); arg = Bus Speed in bps */
  748. {
  749. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Master);
  750. LPSPI_MasterTransferCreateHandleEDMA(lpspi->resource->base, &(lpspi->handle->masterHandle),
  751. KSDK_LPSPI_MasterEdmaCallback, (void *)lpspi->cb_event,
  752. lpspi->edmaRxRegToRxDataHandle, lpspi->edmaTxDataToTxRegHandle);
  753. lpspi->baudRate_Bps = arg;
  754. isContinue = true;
  755. break;
  756. }
  757. case ARM_SPI_MODE_SLAVE_SIMPLEX: /* SPI Slave (Output/Input on SIN) */
  758. {
  759. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Slave);
  760. LPSPI_SlaveTransferCreateHandleEDMA(lpspi->resource->base, &(lpspi->handle->slaveHandle),
  761. KSDK_LPSPI_SlaveEdmaCallback, (void *)lpspi->cb_event,
  762. lpspi->edmaRxRegToRxDataHandle, lpspi->edmaTxDataToTxRegHandle);
  763. isContinue = true;
  764. break;
  765. }
  766. default:
  767. isContinue = true;
  768. break;
  769. }
  770. if (isContinue)
  771. {
  772. result = LPSPI_CommonControl(control, arg, lpspi->resource, &lpspi->flags);
  773. }
  774. return result;
  775. }
  776. static ARM_SPI_STATUS LPSPI_EdmaGetStatus(cmsis_lpspi_edma_driver_state_t *lpspi)
  777. {
  778. ARM_SPI_STATUS stat = {0};
  779. if (LPSPI_IsMaster(lpspi->resource->base))
  780. {
  781. stat.busy = ((uint8_t)kLPSPI_Busy == lpspi->handle->masterHandle.state) ? (1U) : (0U);
  782. stat.data_lost = ((uint8_t)kLPSPI_Error == lpspi->handle->masterHandle.state) ? (1U) : (0U);
  783. }
  784. else
  785. {
  786. stat.busy = ((uint8_t)kLPSPI_Busy == lpspi->handle->slaveHandle.state) ? (1U) : (0U);
  787. stat.data_lost = ((uint8_t)kLPSPI_Error == lpspi->handle->slaveHandle.state) ? (1U) : (0U);
  788. }
  789. stat.mode_fault = 0U;
  790. stat.reserved = 0U;
  791. return stat;
  792. }
  793. #endif /* defined(FSL_FEATURE_SOC_EDMA_COUNT) */
  794. #endif
  795. #if ((defined(RTE_SPI0) && RTE_SPI0 && !RTE_SPI0_DMA_EN) || (defined(RTE_SPI1) && RTE_SPI1 && !RTE_SPI1_DMA_EN) || \
  796. (defined(RTE_SPI2) && RTE_SPI2 && !RTE_SPI2_DMA_EN) || (defined(RTE_SPI3) && RTE_SPI3 && !RTE_SPI3_DMA_EN) || \
  797. (defined(RTE_SPI4) && RTE_SPI4 && !RTE_SPI4_DMA_EN) || (defined(RTE_SPI5) && RTE_SPI5 && !RTE_SPI5_DMA_EN))
  798. static void KSDK_LPSPI_MasterInterruptCallback(LPSPI_Type *base,
  799. lpspi_master_handle_t *handle,
  800. status_t status,
  801. void *userData)
  802. {
  803. uint32_t event = 0U;
  804. if (kStatus_Success == status)
  805. {
  806. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  807. }
  808. else if (kStatus_LPSPI_Error == status)
  809. {
  810. event = ARM_SPI_EVENT_DATA_LOST;
  811. }
  812. else
  813. {
  814. /* Avoid MISRA 15.7 violations. */
  815. }
  816. /* User data is actually CMSIS driver callback. */
  817. if ((0U != event) && (userData != NULL))
  818. {
  819. ((ARM_SPI_SignalEvent_t)userData)(event);
  820. }
  821. }
  822. static void KSDK_LPSPI_SlaveInterruptCallback(LPSPI_Type *base,
  823. lpspi_slave_handle_t *handle,
  824. status_t status,
  825. void *userData)
  826. {
  827. uint32_t event = 0U;
  828. if (kStatus_Success == status)
  829. {
  830. event = ARM_SPI_EVENT_TRANSFER_COMPLETE;
  831. }
  832. if (kStatus_LPSPI_Error == status)
  833. {
  834. event = ARM_SPI_EVENT_DATA_LOST;
  835. }
  836. else
  837. {
  838. /* Avoid MISRA 16.4 violations. */
  839. }
  840. /* User data is actually CMSIS driver callback. */
  841. if ((0U != event) && (userData != NULL))
  842. {
  843. ((ARM_SPI_SignalEvent_t)userData)(event);
  844. }
  845. }
  846. static int32_t LPSPI_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event, cmsis_lpspi_interrupt_driver_state_t *lpspi)
  847. {
  848. if (0U == (lpspi->flags & (uint8_t)SPI_FLAG_INIT))
  849. {
  850. lpspi->cb_event = cb_event;
  851. lpspi->flags = (uint8_t)SPI_FLAG_INIT;
  852. }
  853. return ARM_DRIVER_OK;
  854. }
  855. static int32_t LPSPI_InterruptUninitialize(cmsis_lpspi_interrupt_driver_state_t *lpspi)
  856. {
  857. lpspi->flags = (uint8_t)SPI_FLAG_UNINIT;
  858. return ARM_DRIVER_OK;
  859. }
  860. static int32_t LPSPI_InterruptPowerControl(ARM_POWER_STATE state, cmsis_lpspi_interrupt_driver_state_t *lpspi)
  861. {
  862. int32_t result = ARM_DRIVER_OK;
  863. switch (state)
  864. {
  865. case ARM_POWER_OFF:
  866. if ((lpspi->flags & (uint8_t)SPI_FLAG_POWER) != 0U)
  867. {
  868. LPSPI_Deinit(lpspi->resource->base);
  869. lpspi->flags = (uint8_t)SPI_FLAG_INIT;
  870. }
  871. break;
  872. case ARM_POWER_LOW:
  873. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  874. break;
  875. case ARM_POWER_FULL:
  876. if (lpspi->flags == (uint8_t)SPI_FLAG_UNINIT)
  877. {
  878. result = ARM_DRIVER_ERROR;
  879. break;
  880. }
  881. if ((lpspi->flags & (uint8_t)SPI_FLAG_POWER) != 0U)
  882. {
  883. /* Driver already powered */
  884. break;
  885. }
  886. (void)CLOCK_EnableClock(s_lpspiClock[lpspi->resource->instance]);
  887. lpspi->flags |= (uint8_t)SPI_FLAG_POWER;
  888. break;
  889. default:
  890. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  891. break;
  892. }
  893. return result;
  894. }
  895. static int32_t LPSPI_InterruptSend(const void *data, uint32_t num, cmsis_lpspi_interrupt_driver_state_t *lpspi)
  896. {
  897. int32_t ret;
  898. status_t status;
  899. lpspi_transfer_t xfer = {0};
  900. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  901. xfer.rxData = NULL;
  902. xfer.txData = (uint8_t *)data;
  903. xfer.dataSize = num * ((datawidth + 8U) / 8U);
  904. LPSPI_SetTransferConfigFlags(LPSPI_IsMaster(lpspi->resource->base), lpspi->resource->instance, &xfer);
  905. if (LPSPI_IsMaster(lpspi->resource->base))
  906. {
  907. status = LPSPI_MasterTransferNonBlocking(lpspi->resource->base, &(lpspi->handle->masterHandle), &xfer);
  908. }
  909. else
  910. {
  911. status = LPSPI_SlaveTransferNonBlocking(lpspi->resource->base, &(lpspi->handle->slaveHandle), &xfer);
  912. }
  913. switch (status)
  914. {
  915. case kStatus_Success:
  916. ret = ARM_DRIVER_OK;
  917. break;
  918. case kStatus_InvalidArgument:
  919. ret = ARM_DRIVER_ERROR_PARAMETER;
  920. break;
  921. case kStatus_LPSPI_Busy:
  922. ret = ARM_DRIVER_ERROR_BUSY;
  923. break;
  924. default:
  925. ret = ARM_DRIVER_ERROR;
  926. break;
  927. }
  928. return ret;
  929. }
  930. static int32_t LPSPI_InterruptReceive(void *data, uint32_t num, cmsis_lpspi_interrupt_driver_state_t *lpspi)
  931. {
  932. int32_t ret;
  933. status_t status;
  934. lpspi_transfer_t xfer = {0};
  935. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  936. xfer.txData = NULL;
  937. xfer.rxData = (uint8_t *)data;
  938. xfer.dataSize = num * ((datawidth + 8U) / 8U);
  939. LPSPI_SetTransferConfigFlags(LPSPI_IsMaster(lpspi->resource->base), lpspi->resource->instance, &xfer);
  940. if (LPSPI_IsMaster(lpspi->resource->base))
  941. {
  942. status = LPSPI_MasterTransferNonBlocking(lpspi->resource->base, &(lpspi->handle->masterHandle), &xfer);
  943. }
  944. else
  945. {
  946. status = LPSPI_SlaveTransferNonBlocking(lpspi->resource->base, &(lpspi->handle->slaveHandle), &xfer);
  947. }
  948. switch (status)
  949. {
  950. case kStatus_Success:
  951. ret = ARM_DRIVER_OK;
  952. break;
  953. case kStatus_InvalidArgument:
  954. ret = ARM_DRIVER_ERROR_PARAMETER;
  955. break;
  956. case kStatus_LPSPI_Busy:
  957. ret = ARM_DRIVER_ERROR_BUSY;
  958. break;
  959. default:
  960. ret = ARM_DRIVER_ERROR;
  961. break;
  962. }
  963. return ret;
  964. }
  965. static int32_t LPSPI_InterruptTransfer(const void *data_out,
  966. void *data_in,
  967. uint32_t num,
  968. cmsis_lpspi_interrupt_driver_state_t *lpspi)
  969. {
  970. int32_t ret;
  971. status_t status;
  972. lpspi_transfer_t xfer = {0};
  973. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  974. xfer.txData = (uint8_t *)data_out;
  975. xfer.rxData = (uint8_t *)data_in;
  976. xfer.dataSize = num * ((datawidth + 8U) / 8U);
  977. LPSPI_SetTransferConfigFlags(LPSPI_IsMaster(lpspi->resource->base), lpspi->resource->instance, &xfer);
  978. if (LPSPI_IsMaster(lpspi->resource->base))
  979. {
  980. status = LPSPI_MasterTransferNonBlocking(lpspi->resource->base, &(lpspi->handle->masterHandle), &xfer);
  981. }
  982. else
  983. {
  984. status = LPSPI_SlaveTransferNonBlocking(lpspi->resource->base, &(lpspi->handle->slaveHandle), &xfer);
  985. }
  986. switch (status)
  987. {
  988. case kStatus_Success:
  989. ret = ARM_DRIVER_OK;
  990. break;
  991. case kStatus_InvalidArgument:
  992. ret = ARM_DRIVER_ERROR_PARAMETER;
  993. break;
  994. case kStatus_LPSPI_Busy:
  995. ret = ARM_DRIVER_ERROR_BUSY;
  996. break;
  997. default:
  998. ret = ARM_DRIVER_ERROR;
  999. break;
  1000. }
  1001. return ret;
  1002. }
  1003. static uint32_t LPSPI_InterruptGetCount(cmsis_lpspi_interrupt_driver_state_t *lpspi)
  1004. {
  1005. uint32_t cnt;
  1006. uint32_t datawidth = (lpspi->resource->base->TCR & (uint32_t)LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT;
  1007. if (LPSPI_IsMaster(lpspi->resource->base))
  1008. {
  1009. cnt = (uint32_t)lpspi->handle->masterHandle.totalByteCount -
  1010. (uint32_t)lpspi->handle->masterHandle.rxRemainingByteCount;
  1011. }
  1012. else
  1013. {
  1014. cnt = (uint32_t)lpspi->handle->slaveHandle.totalByteCount -
  1015. (uint32_t)lpspi->handle->slaveHandle.rxRemainingByteCount;
  1016. }
  1017. cnt /= ((datawidth + 8U) / 8U);
  1018. return cnt;
  1019. }
  1020. static int32_t LPSPI_InterruptControl(uint32_t control, uint32_t arg, cmsis_lpspi_interrupt_driver_state_t *lpspi)
  1021. {
  1022. int32_t result = ARM_DRIVER_OK;
  1023. bool isContinue = false;
  1024. if (0U == (lpspi->flags & (uint8_t)SPI_FLAG_POWER))
  1025. {
  1026. return ARM_DRIVER_ERROR;
  1027. }
  1028. switch (control & ARM_SPI_CONTROL_Msk)
  1029. {
  1030. case ARM_SPI_MODE_INACTIVE:
  1031. LPSPI_Enable(lpspi->resource->base, false);
  1032. break;
  1033. case ARM_SPI_MODE_MASTER: /* SPI Master (Output on SOUT, Input on SIN); arg = Bus Speed in bps */
  1034. {
  1035. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Master);
  1036. LPSPI_MasterTransferCreateHandle(lpspi->resource->base, &(lpspi->handle->masterHandle),
  1037. KSDK_LPSPI_MasterInterruptCallback, (void *)lpspi->cb_event);
  1038. lpspi->baudRate_Bps = arg;
  1039. isContinue = true;
  1040. break;
  1041. }
  1042. case ARM_SPI_MODE_SLAVE: /* SPI Slave (Output on SOUT, Input on SIN) */
  1043. {
  1044. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Slave);
  1045. LPSPI_SlaveTransferCreateHandle(lpspi->resource->base, &(lpspi->handle->slaveHandle),
  1046. KSDK_LPSPI_SlaveInterruptCallback, (void *)lpspi->cb_event);
  1047. isContinue = true;
  1048. break;
  1049. }
  1050. case ARM_SPI_SET_BUS_SPEED: /* Set Bus Speed in bps; */
  1051. {
  1052. uint32_t tcrPrescaleValue = 0;
  1053. LPSPI_Enable(lpspi->resource->base, false);
  1054. if (!LPSPI_IsMaster(lpspi->resource->base))
  1055. {
  1056. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  1057. break;
  1058. }
  1059. if (0UL ==
  1060. LPSPI_MasterSetBaudRate(lpspi->resource->base, arg, lpspi->resource->GetFreq(), &tcrPrescaleValue))
  1061. {
  1062. result = ARM_DRIVER_ERROR;
  1063. break;
  1064. }
  1065. LPSPI_Enable(lpspi->resource->base, true);
  1066. lpspi->baudRate_Bps = arg;
  1067. break;
  1068. }
  1069. case ARM_SPI_GET_BUS_SPEED: /* Get Bus Speed in bps */
  1070. if (!LPSPI_IsMaster(lpspi->resource->base))
  1071. {
  1072. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  1073. break;
  1074. }
  1075. result = (int32_t)(lpspi->baudRate_Bps);
  1076. break;
  1077. case ARM_SPI_CONTROL_SS: /* Control Slave Select; arg = 0:inactive, 1:active */
  1078. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  1079. break;
  1080. case ARM_SPI_ABORT_TRANSFER: /* Abort current data transfer */
  1081. if (LPSPI_IsMaster(lpspi->resource->base))
  1082. {
  1083. LPSPI_MasterTransferAbort(lpspi->resource->base, &(lpspi->handle->masterHandle));
  1084. }
  1085. else
  1086. {
  1087. LPSPI_SlaveTransferAbort(lpspi->resource->base, &(lpspi->handle->slaveHandle));
  1088. }
  1089. break;
  1090. case ARM_SPI_SET_DEFAULT_TX_VALUE: /* Set default Transmit value; arg = value */
  1091. if (LPSPI_IsMaster(lpspi->resource->base))
  1092. {
  1093. LPSPI_SetDummyData(lpspi->resource->base, (uint8_t)arg);
  1094. }
  1095. else
  1096. {
  1097. /* Mode is not supported by current driver.
  1098. * In slave mode, if the tx buffer is NULL, the output pin will keep tristated.
  1099. */
  1100. result = ARM_DRIVER_ERROR_UNSUPPORTED;
  1101. }
  1102. break;
  1103. case ARM_SPI_MODE_MASTER_SIMPLEX: /* SPI Master (Output/Input on SOUT); arg = Bus Speed in bps */
  1104. {
  1105. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Master);
  1106. LPSPI_MasterTransferCreateHandle(lpspi->resource->base, &(lpspi->handle->masterHandle),
  1107. KSDK_LPSPI_MasterInterruptCallback, (void *)lpspi->cb_event);
  1108. lpspi->baudRate_Bps = arg;
  1109. isContinue = true;
  1110. break;
  1111. }
  1112. case ARM_SPI_MODE_SLAVE_SIMPLEX: /* SPI Slave (Output/Input on SIN) */
  1113. {
  1114. LPSPI_SetMasterSlaveMode(lpspi->resource->base, kLPSPI_Slave);
  1115. LPSPI_SlaveTransferCreateHandle(lpspi->resource->base, &(lpspi->handle->slaveHandle),
  1116. KSDK_LPSPI_SlaveInterruptCallback, (void *)lpspi->cb_event);
  1117. isContinue = true;
  1118. break;
  1119. }
  1120. default:
  1121. isContinue = true;
  1122. break;
  1123. }
  1124. if (isContinue)
  1125. {
  1126. result = LPSPI_CommonControl(control, lpspi->baudRate_Bps, lpspi->resource, &lpspi->flags);
  1127. }
  1128. return result;
  1129. }
  1130. static ARM_SPI_STATUS LPSPI_InterruptGetStatus(cmsis_lpspi_interrupt_driver_state_t *lpspi)
  1131. {
  1132. ARM_SPI_STATUS stat = {0};
  1133. if (LPSPI_IsMaster(lpspi->resource->base))
  1134. {
  1135. stat.busy = ((lpspi->handle->masterHandle.rxRemainingByteCount > 0U) ||
  1136. (lpspi->handle->masterHandle.txRemainingByteCount > 0U)) ?
  1137. (1U) :
  1138. (0U);
  1139. stat.data_lost = ((uint8_t)kLPSPI_Error == lpspi->handle->masterHandle.state) ? (1U) : (0U);
  1140. }
  1141. else
  1142. {
  1143. stat.busy = ((lpspi->handle->slaveHandle.rxRemainingByteCount > 0U) ||
  1144. (lpspi->handle->slaveHandle.txRemainingByteCount > 0U)) ?
  1145. (1U) :
  1146. (0U);
  1147. stat.data_lost = ((uint8_t)kLPSPI_Error == lpspi->handle->slaveHandle.state) ? (1U) : (0U);
  1148. }
  1149. stat.mode_fault = 0U;
  1150. stat.reserved = 0U;
  1151. return stat;
  1152. }
  1153. #endif
  1154. #if defined(LPSPI0) && defined(RTE_SPI0) && RTE_SPI0
  1155. /* User needs to provide the implementation for LPSPI0_GetFreq/InitPins/DeinitPins
  1156. in the application for enabling according instance. */
  1157. extern uint32_t LPSPI0_GetFreq(void);
  1158. static cmsis_lpspi_resource_t LPSPI0_Resource = {LPSPI0, 0, LPSPI0_GetFreq};
  1159. #if defined(RTE_SPI0_DMA_EN) && RTE_SPI0_DMA_EN
  1160. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1161. static cmsis_lpspi_edma_resource_t LPSPI0_EdmaResource = {
  1162. RTE_SPI0_DMA_TX_DMA_BASE, RTE_SPI0_DMA_TX_CH, RTE_SPI0_DMA_TX_PERI_SEL,
  1163. RTE_SPI0_DMA_RX_DMA_BASE, RTE_SPI0_DMA_RX_CH, RTE_SPI0_DMA_RX_PERI_SEL,
  1164. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1165. RTE_SPI0_DMA_TX_DMAMUX_BASE, RTE_SPI0_DMA_RX_DMAMUX_BASE,
  1166. #endif
  1167. };
  1168. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI0_EdmaHandle);
  1169. static edma_handle_t LPSPI0_EdmaTxDataToTxRegHandle;
  1170. static edma_handle_t LPSPI0_EdmaRxRegToRxDataHandle;
  1171. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1172. ARMCC_SECTION("lpspi0_edma_driver_state")
  1173. static cmsis_lpspi_edma_driver_state_t LPSPI0_EdmaDriverState = {
  1174. #else
  1175. static cmsis_lpspi_edma_driver_state_t LPSPI0_EdmaDriverState = {
  1176. #endif
  1177. &LPSPI0_Resource,
  1178. &LPSPI0_EdmaResource,
  1179. &LPSPI0_EdmaHandle,
  1180. &LPSPI0_EdmaRxRegToRxDataHandle,
  1181. &LPSPI0_EdmaTxDataToTxRegHandle,
  1182. };
  1183. static int32_t LPSPI0_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  1184. {
  1185. #ifdef RTE_SPI0_PIN_INIT
  1186. RTE_SPI0_PIN_INIT();
  1187. #endif
  1188. return LPSPI_EdmaInitialize(cb_event, &LPSPI0_EdmaDriverState);
  1189. }
  1190. static int32_t LPSPI0_EdmaUninitialize(void)
  1191. {
  1192. #ifdef RTE_SPI0_PIN_DEINIT
  1193. RTE_SPI0_PIN_DEINIT();
  1194. #endif
  1195. return LPSPI_EdmaUninitialize(&LPSPI0_EdmaDriverState);
  1196. }
  1197. static int32_t LPSPI0_EdmaPowerControl(ARM_POWER_STATE state)
  1198. {
  1199. return LPSPI_EdmaPowerControl(state, &LPSPI0_EdmaDriverState);
  1200. }
  1201. static int32_t LPSPI0_EdmaSend(const void *data, uint32_t num)
  1202. {
  1203. return LPSPI_EdmaSend(data, num, &LPSPI0_EdmaDriverState);
  1204. }
  1205. static int32_t LPSPI0_EdmaReceive(void *data, uint32_t num)
  1206. {
  1207. return LPSPI_EdmaReceive(data, num, &LPSPI0_EdmaDriverState);
  1208. }
  1209. static int32_t LPSPI0_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  1210. {
  1211. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI0_EdmaDriverState);
  1212. }
  1213. static uint32_t LPSPI0_EdmaGetCount(void)
  1214. {
  1215. return LPSPI_EdmaGetCount(&LPSPI0_EdmaDriverState);
  1216. }
  1217. static int32_t LPSPI0_EdmaControl(uint32_t control, uint32_t arg)
  1218. {
  1219. return LPSPI_EdmaControl(control, arg, &LPSPI0_EdmaDriverState);
  1220. }
  1221. static ARM_SPI_STATUS LPSPI0_EdmaGetStatus(void)
  1222. {
  1223. return LPSPI_EdmaGetStatus(&LPSPI0_EdmaDriverState);
  1224. }
  1225. #endif
  1226. #else
  1227. static cmsis_lpspi_handle_t LPSPI0_Handle;
  1228. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1229. ARMCC_SECTION("lpspi0_interrupt_driver_state")
  1230. static cmsis_lpspi_interrupt_driver_state_t LPSPI0_InterruptDriverState = {
  1231. #else
  1232. static cmsis_lpspi_interrupt_driver_state_t LPSPI0_InterruptDriverState = {
  1233. #endif
  1234. &LPSPI0_Resource,
  1235. &LPSPI0_Handle,
  1236. };
  1237. static int32_t LPSPI0_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1238. {
  1239. #ifdef RTE_SPI0_PIN_INIT
  1240. RTE_SPI0_PIN_INIT();
  1241. #endif
  1242. return LPSPI_InterruptInitialize(cb_event, &LPSPI0_InterruptDriverState);
  1243. }
  1244. static int32_t LPSPI0_InterruptUninitialize(void)
  1245. {
  1246. #ifdef RTE_SPI0_PIN_DEINIT
  1247. RTE_SPI0_PIN_DEINIT();
  1248. #endif
  1249. return LPSPI_InterruptUninitialize(&LPSPI0_InterruptDriverState);
  1250. }
  1251. static int32_t LPSPI0_InterruptPowerControl(ARM_POWER_STATE state)
  1252. {
  1253. return LPSPI_InterruptPowerControl(state, &LPSPI0_InterruptDriverState);
  1254. }
  1255. static int32_t LPSPI0_InterruptSend(const void *data, uint32_t num)
  1256. {
  1257. return LPSPI_InterruptSend(data, num, &LPSPI0_InterruptDriverState);
  1258. }
  1259. static int32_t LPSPI0_InterruptReceive(void *data, uint32_t num)
  1260. {
  1261. return LPSPI_InterruptReceive(data, num, &LPSPI0_InterruptDriverState);
  1262. }
  1263. static int32_t LPSPI0_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1264. {
  1265. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI0_InterruptDriverState);
  1266. }
  1267. static uint32_t LPSPI0_InterruptGetCount(void)
  1268. {
  1269. return LPSPI_InterruptGetCount(&LPSPI0_InterruptDriverState);
  1270. }
  1271. static int32_t LPSPI0_InterruptControl(uint32_t control, uint32_t arg)
  1272. {
  1273. return LPSPI_InterruptControl(control, arg, &LPSPI0_InterruptDriverState);
  1274. }
  1275. static ARM_SPI_STATUS LPSPI0_InterruptGetStatus(void)
  1276. {
  1277. return LPSPI_InterruptGetStatus(&LPSPI0_InterruptDriverState);
  1278. }
  1279. #endif
  1280. ARM_DRIVER_SPI Driver_SPI0 = {
  1281. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  1282. #if defined(RTE_SPI0_DMA_EN) && RTE_SPI0_DMA_EN
  1283. LPSPI0_EdmaInitialize, LPSPI0_EdmaUninitialize, LPSPI0_EdmaPowerControl, LPSPI0_EdmaSend, LPSPI0_EdmaReceive,
  1284. LPSPI0_EdmaTransfer, LPSPI0_EdmaGetCount, LPSPI0_EdmaControl, LPSPI0_EdmaGetStatus
  1285. #else
  1286. LPSPI0_InterruptInitialize, LPSPI0_InterruptUninitialize, LPSPI0_InterruptPowerControl, LPSPI0_InterruptSend,
  1287. LPSPI0_InterruptReceive, LPSPI0_InterruptTransfer, LPSPI0_InterruptGetCount, LPSPI0_InterruptControl,
  1288. LPSPI0_InterruptGetStatus
  1289. #endif
  1290. };
  1291. #endif /* LPSPI0 */
  1292. #if defined(LPSPI1) && defined(RTE_SPI1) && RTE_SPI1
  1293. /* User needs to provide the implementation for LPSPI1_GetFreq/InitPins/DeinitPins
  1294. in the application for enabling according instance. */
  1295. extern uint32_t LPSPI1_GetFreq(void);
  1296. static cmsis_lpspi_resource_t LPSPI1_Resource = {LPSPI1, 1, LPSPI1_GetFreq};
  1297. #if defined(RTE_SPI1_DMA_EN) && RTE_SPI1_DMA_EN
  1298. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1299. static cmsis_lpspi_edma_resource_t LPSPI1_EdmaResource = {
  1300. RTE_SPI1_DMA_TX_DMA_BASE, RTE_SPI1_DMA_TX_CH, RTE_SPI1_DMA_TX_PERI_SEL,
  1301. RTE_SPI1_DMA_RX_DMA_BASE, RTE_SPI1_DMA_RX_CH, RTE_SPI1_DMA_RX_PERI_SEL,
  1302. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1303. RTE_SPI1_DMA_TX_DMAMUX_BASE, RTE_SPI1_DMA_RX_DMAMUX_BASE,
  1304. #endif
  1305. };
  1306. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI1_EdmaHandle);
  1307. static edma_handle_t LPSPI1_EdmaTxDataToTxRegHandle;
  1308. static edma_handle_t LPSPI1_EdmaRxRegToRxDataHandle;
  1309. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1310. ARMCC_SECTION("lpspi1_edma_driver_state")
  1311. static cmsis_lpspi_edma_driver_state_t LPSPI1_EdmaDriverState = {
  1312. #else
  1313. static cmsis_lpspi_edma_driver_state_t LPSPI1_EdmaDriverState = {
  1314. #endif
  1315. &LPSPI1_Resource,
  1316. &LPSPI1_EdmaResource,
  1317. &LPSPI1_EdmaHandle,
  1318. &LPSPI1_EdmaRxRegToRxDataHandle,
  1319. &LPSPI1_EdmaTxDataToTxRegHandle,
  1320. };
  1321. static int32_t LPSPI1_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  1322. {
  1323. #ifdef RTE_SPI1_PIN_INIT
  1324. RTE_SPI1_PIN_INIT();
  1325. #endif
  1326. return LPSPI_EdmaInitialize(cb_event, &LPSPI1_EdmaDriverState);
  1327. }
  1328. static int32_t LPSPI1_EdmaUninitialize(void)
  1329. {
  1330. #ifdef RTE_SPI1_PIN_DEINIT
  1331. RTE_SPI1_PIN_DEINIT();
  1332. #endif
  1333. return LPSPI_EdmaUninitialize(&LPSPI1_EdmaDriverState);
  1334. }
  1335. static int32_t LPSPI1_EdmaPowerControl(ARM_POWER_STATE state)
  1336. {
  1337. return LPSPI_EdmaPowerControl(state, &LPSPI1_EdmaDriverState);
  1338. }
  1339. static int32_t LPSPI1_EdmaSend(const void *data, uint32_t num)
  1340. {
  1341. return LPSPI_EdmaSend(data, num, &LPSPI1_EdmaDriverState);
  1342. }
  1343. static int32_t LPSPI1_EdmaReceive(void *data, uint32_t num)
  1344. {
  1345. return LPSPI_EdmaReceive(data, num, &LPSPI1_EdmaDriverState);
  1346. }
  1347. static int32_t LPSPI1_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  1348. {
  1349. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI1_EdmaDriverState);
  1350. }
  1351. static uint32_t LPSPI1_EdmaGetCount(void)
  1352. {
  1353. return LPSPI_EdmaGetCount(&LPSPI1_EdmaDriverState);
  1354. }
  1355. static int32_t LPSPI1_EdmaControl(uint32_t control, uint32_t arg)
  1356. {
  1357. return LPSPI_EdmaControl(control, arg, &LPSPI1_EdmaDriverState);
  1358. }
  1359. static ARM_SPI_STATUS LPSPI1_EdmaGetStatus(void)
  1360. {
  1361. return LPSPI_EdmaGetStatus(&LPSPI1_EdmaDriverState);
  1362. }
  1363. #endif
  1364. #else
  1365. static cmsis_lpspi_handle_t LPSPI1_Handle;
  1366. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1367. ARMCC_SECTION("lpspi1_interrupt_driver_state")
  1368. static cmsis_lpspi_interrupt_driver_state_t LPSPI1_InterruptDriverState = {
  1369. #else
  1370. static cmsis_lpspi_interrupt_driver_state_t LPSPI1_InterruptDriverState = {
  1371. #endif
  1372. &LPSPI1_Resource,
  1373. &LPSPI1_Handle,
  1374. };
  1375. static int32_t LPSPI1_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1376. {
  1377. #ifdef RTE_SPI1_PIN_INIT
  1378. RTE_SPI1_PIN_INIT();
  1379. #endif
  1380. return LPSPI_InterruptInitialize(cb_event, &LPSPI1_InterruptDriverState);
  1381. }
  1382. static int32_t LPSPI1_InterruptUninitialize(void)
  1383. {
  1384. #ifdef RTE_SPI1_PIN_DEINIT
  1385. RTE_SPI1_PIN_DEINIT();
  1386. #endif
  1387. return LPSPI_InterruptUninitialize(&LPSPI1_InterruptDriverState);
  1388. }
  1389. static int32_t LPSPI1_InterruptPowerControl(ARM_POWER_STATE state)
  1390. {
  1391. return LPSPI_InterruptPowerControl(state, &LPSPI1_InterruptDriverState);
  1392. }
  1393. static int32_t LPSPI1_InterruptSend(const void *data, uint32_t num)
  1394. {
  1395. return LPSPI_InterruptSend(data, num, &LPSPI1_InterruptDriverState);
  1396. }
  1397. static int32_t LPSPI1_InterruptReceive(void *data, uint32_t num)
  1398. {
  1399. return LPSPI_InterruptReceive(data, num, &LPSPI1_InterruptDriverState);
  1400. }
  1401. static int32_t LPSPI1_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1402. {
  1403. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI1_InterruptDriverState);
  1404. }
  1405. static uint32_t LPSPI1_InterruptGetCount(void)
  1406. {
  1407. return LPSPI_InterruptGetCount(&LPSPI1_InterruptDriverState);
  1408. }
  1409. static int32_t LPSPI1_InterruptControl(uint32_t control, uint32_t arg)
  1410. {
  1411. return LPSPI_InterruptControl(control, arg, &LPSPI1_InterruptDriverState);
  1412. }
  1413. static ARM_SPI_STATUS LPSPI1_InterruptGetStatus(void)
  1414. {
  1415. return LPSPI_InterruptGetStatus(&LPSPI1_InterruptDriverState);
  1416. }
  1417. #endif
  1418. ARM_DRIVER_SPI Driver_SPI1 = {
  1419. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  1420. #if defined(RTE_SPI1_DMA_EN) && RTE_SPI1_DMA_EN
  1421. LPSPI1_EdmaInitialize, LPSPI1_EdmaUninitialize, LPSPI1_EdmaPowerControl, LPSPI1_EdmaSend, LPSPI1_EdmaReceive,
  1422. LPSPI1_EdmaTransfer, LPSPI1_EdmaGetCount, LPSPI1_EdmaControl, LPSPI1_EdmaGetStatus
  1423. #else
  1424. LPSPI1_InterruptInitialize, LPSPI1_InterruptUninitialize, LPSPI1_InterruptPowerControl, LPSPI1_InterruptSend,
  1425. LPSPI1_InterruptReceive, LPSPI1_InterruptTransfer, LPSPI1_InterruptGetCount, LPSPI1_InterruptControl,
  1426. LPSPI1_InterruptGetStatus
  1427. #endif
  1428. };
  1429. #endif /* LPSPI1 */
  1430. #if defined(LPSPI2) && defined(RTE_SPI2) && RTE_SPI2
  1431. /* User needs to provide the implementation for LPSPI2_GetFreq/InitPins/DeinitPins
  1432. in the application for enabling according instance. */
  1433. extern uint32_t LPSPI2_GetFreq(void);
  1434. static cmsis_lpspi_resource_t LPSPI2_Resource = {LPSPI2, 2, LPSPI2_GetFreq};
  1435. #if defined(RTE_SPI2_DMA_EN) && RTE_SPI2_DMA_EN
  1436. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1437. static cmsis_lpspi_edma_resource_t LPSPI2_EdmaResource = {
  1438. RTE_SPI2_DMA_TX_DMA_BASE, RTE_SPI2_DMA_TX_CH, RTE_SPI2_DMA_TX_PERI_SEL,
  1439. RTE_SPI2_DMA_RX_DMA_BASE, RTE_SPI2_DMA_RX_CH, RTE_SPI2_DMA_RX_PERI_SEL,
  1440. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1441. RTE_SPI2_DMA_TX_DMAMUX_BASE, RTE_SPI2_DMA_RX_DMAMUX_BASE,
  1442. #endif
  1443. };
  1444. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI2_EdmaHandle);
  1445. static edma_handle_t LPSPI2_EdmaTxDataToTxRegHandle;
  1446. static edma_handle_t LPSPI2_EdmaRxRegToRxDataHandle;
  1447. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1448. ARMCC_SECTION("lpspi2_edma_driver_state")
  1449. static cmsis_lpspi_edma_driver_state_t LPSPI2_EdmaDriverState = {
  1450. #else
  1451. static cmsis_lpspi_edma_driver_state_t LPSPI2_EdmaDriverState = {
  1452. #endif
  1453. &LPSPI2_Resource,
  1454. &LPSPI2_EdmaResource,
  1455. &LPSPI2_EdmaHandle,
  1456. &LPSPI2_EdmaRxRegToRxDataHandle,
  1457. &LPSPI2_EdmaTxDataToTxRegHandle,
  1458. };
  1459. static int32_t LPSPI2_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  1460. {
  1461. #ifdef RTE_SPI2_PIN_INIT
  1462. RTE_SPI2_PIN_INIT();
  1463. #endif
  1464. return LPSPI_EdmaInitialize(cb_event, &LPSPI2_EdmaDriverState);
  1465. }
  1466. static int32_t LPSPI2_EdmaUninitialize(void)
  1467. {
  1468. #ifdef RTE_SPI2_PIN_DEINIT
  1469. RTE_SPI2_PIN_DEINIT();
  1470. #endif
  1471. return LPSPI_EdmaUninitialize(&LPSPI2_EdmaDriverState);
  1472. }
  1473. static int32_t LPSPI2_EdmaPowerControl(ARM_POWER_STATE state)
  1474. {
  1475. return LPSPI_EdmaPowerControl(state, &LPSPI2_EdmaDriverState);
  1476. }
  1477. static int32_t LPSPI2_EdmaSend(const void *data, uint32_t num)
  1478. {
  1479. return LPSPI_EdmaSend(data, num, &LPSPI2_EdmaDriverState);
  1480. }
  1481. static int32_t LPSPI2_EdmaReceive(void *data, uint32_t num)
  1482. {
  1483. return LPSPI_EdmaReceive(data, num, &LPSPI2_EdmaDriverState);
  1484. }
  1485. static int32_t LPSPI2_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  1486. {
  1487. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI2_EdmaDriverState);
  1488. }
  1489. static uint32_t LPSPI2_EdmaGetCount(void)
  1490. {
  1491. return LPSPI_EdmaGetCount(&LPSPI2_EdmaDriverState);
  1492. }
  1493. static int32_t LPSPI2_EdmaControl(uint32_t control, uint32_t arg)
  1494. {
  1495. return LPSPI_EdmaControl(control, arg, &LPSPI2_EdmaDriverState);
  1496. }
  1497. static ARM_SPI_STATUS LPSPI2_EdmaGetStatus(void)
  1498. {
  1499. return LPSPI_EdmaGetStatus(&LPSPI2_EdmaDriverState);
  1500. }
  1501. #endif
  1502. #else
  1503. static cmsis_lpspi_handle_t LPSPI2_Handle;
  1504. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1505. ARMCC_SECTION("lpspi2_interrupt_driver_state")
  1506. static cmsis_lpspi_interrupt_driver_state_t LPSPI2_InterruptDriverState = {
  1507. #else
  1508. static cmsis_lpspi_interrupt_driver_state_t LPSPI2_InterruptDriverState = {
  1509. #endif
  1510. &LPSPI2_Resource,
  1511. &LPSPI2_Handle,
  1512. };
  1513. static int32_t LPSPI2_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1514. {
  1515. #ifdef RTE_SPI2_PIN_INIT
  1516. RTE_SPI2_PIN_INIT();
  1517. #endif
  1518. return LPSPI_InterruptInitialize(cb_event, &LPSPI2_InterruptDriverState);
  1519. }
  1520. static int32_t LPSPI2_InterruptUninitialize(void)
  1521. {
  1522. #ifdef RTE_SPI2_PIN_DEINIT
  1523. RTE_SPI2_PIN_DEINIT();
  1524. #endif
  1525. return LPSPI_InterruptUninitialize(&LPSPI2_InterruptDriverState);
  1526. }
  1527. static int32_t LPSPI2_InterruptPowerControl(ARM_POWER_STATE state)
  1528. {
  1529. return LPSPI_InterruptPowerControl(state, &LPSPI2_InterruptDriverState);
  1530. }
  1531. static int32_t LPSPI2_InterruptSend(const void *data, uint32_t num)
  1532. {
  1533. return LPSPI_InterruptSend(data, num, &LPSPI2_InterruptDriverState);
  1534. }
  1535. static int32_t LPSPI2_InterruptReceive(void *data, uint32_t num)
  1536. {
  1537. return LPSPI_InterruptReceive(data, num, &LPSPI2_InterruptDriverState);
  1538. }
  1539. static int32_t LPSPI2_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1540. {
  1541. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI2_InterruptDriverState);
  1542. }
  1543. static uint32_t LPSPI2_InterruptGetCount(void)
  1544. {
  1545. return LPSPI_InterruptGetCount(&LPSPI2_InterruptDriverState);
  1546. }
  1547. static int32_t LPSPI2_InterruptControl(uint32_t control, uint32_t arg)
  1548. {
  1549. return LPSPI_InterruptControl(control, arg, &LPSPI2_InterruptDriverState);
  1550. }
  1551. static ARM_SPI_STATUS LPSPI2_InterruptGetStatus(void)
  1552. {
  1553. return LPSPI_InterruptGetStatus(&LPSPI2_InterruptDriverState);
  1554. }
  1555. #endif
  1556. ARM_DRIVER_SPI Driver_SPI2 = {
  1557. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  1558. #if defined(RTE_SPI2_DMA_EN) && RTE_SPI2_DMA_EN
  1559. LPSPI2_EdmaInitialize, LPSPI2_EdmaUninitialize, LPSPI2_EdmaPowerControl, LPSPI2_EdmaSend, LPSPI2_EdmaReceive,
  1560. LPSPI2_EdmaTransfer, LPSPI2_EdmaGetCount, LPSPI2_EdmaControl, LPSPI2_EdmaGetStatus
  1561. #else
  1562. LPSPI2_InterruptInitialize, LPSPI2_InterruptUninitialize, LPSPI2_InterruptPowerControl, LPSPI2_InterruptSend,
  1563. LPSPI2_InterruptReceive, LPSPI2_InterruptTransfer, LPSPI2_InterruptGetCount, LPSPI2_InterruptControl,
  1564. LPSPI2_InterruptGetStatus
  1565. #endif
  1566. };
  1567. #endif /* LPSPI2 */
  1568. #if defined(LPSPI3) && defined(RTE_SPI3) && RTE_SPI3
  1569. /* User needs to provide the implementation for LPSPI3_GetFreq/InitPins/DeinitPins
  1570. in the application for enabling according instance. */
  1571. extern uint32_t LPSPI3_GetFreq(void);
  1572. static cmsis_lpspi_resource_t LPSPI3_Resource = {LPSPI3, 3, LPSPI3_GetFreq};
  1573. #if defined(RTE_SPI3_DMA_EN) && RTE_SPI3_DMA_EN
  1574. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1575. static cmsis_lpspi_edma_resource_t LPSPI3_EdmaResource = {
  1576. RTE_SPI3_DMA_TX_DMA_BASE, RTE_SPI3_DMA_TX_CH, RTE_SPI3_DMA_TX_PERI_SEL,
  1577. RTE_SPI3_DMA_RX_DMA_BASE, RTE_SPI3_DMA_RX_CH, RTE_SPI3_DMA_RX_PERI_SEL,
  1578. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1579. RTE_SPI3_DMA_TX_DMAMUX_BASE, RTE_SPI3_DMA_RX_DMAMUX_BASE,
  1580. #endif
  1581. };
  1582. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI3_EdmaHandle);
  1583. static edma_handle_t LPSPI3_EdmaTxDataToTxRegHandle;
  1584. static edma_handle_t LPSPI3_EdmaRxRegToRxDataHandle;
  1585. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1586. ARMCC_SECTION("lpspi3_edma_driver_state")
  1587. static cmsis_lpspi_edma_driver_state_t LPSPI3_EdmaDriverState = {
  1588. #else
  1589. static cmsis_lpspi_edma_driver_state_t LPSPI3_EdmaDriverState = {
  1590. #endif
  1591. &LPSPI3_Resource,
  1592. &LPSPI3_EdmaResource,
  1593. &LPSPI3_EdmaHandle,
  1594. &LPSPI3_EdmaRxRegToRxDataHandle,
  1595. &LPSPI3_EdmaTxDataToTxRegHandle,
  1596. };
  1597. static int32_t LPSPI3_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  1598. {
  1599. #ifdef RTE_SPI3_PIN_INIT
  1600. RTE_SPI3_PIN_INIT();
  1601. #endif
  1602. return LPSPI_EdmaInitialize(cb_event, &LPSPI3_EdmaDriverState);
  1603. }
  1604. static int32_t LPSPI3_EdmaUninitialize(void)
  1605. {
  1606. #ifdef RTE_SPI3_PIN_DEINIT
  1607. RTE_SPI3_PIN_DEINIT();
  1608. #endif
  1609. return LPSPI_EdmaUninitialize(&LPSPI3_EdmaDriverState);
  1610. }
  1611. static int32_t LPSPI3_EdmaPowerControl(ARM_POWER_STATE state)
  1612. {
  1613. return LPSPI_EdmaPowerControl(state, &LPSPI3_EdmaDriverState);
  1614. }
  1615. static int32_t LPSPI3_EdmaSend(const void *data, uint32_t num)
  1616. {
  1617. return LPSPI_EdmaSend(data, num, &LPSPI3_EdmaDriverState);
  1618. }
  1619. static int32_t LPSPI3_EdmaReceive(void *data, uint32_t num)
  1620. {
  1621. return LPSPI_EdmaReceive(data, num, &LPSPI3_EdmaDriverState);
  1622. }
  1623. static int32_t LPSPI3_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  1624. {
  1625. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI3_EdmaDriverState);
  1626. }
  1627. static uint32_t LPSPI3_EdmaGetCount(void)
  1628. {
  1629. return LPSPI_EdmaGetCount(&LPSPI3_EdmaDriverState);
  1630. }
  1631. static int32_t LPSPI3_EdmaControl(uint32_t control, uint32_t arg)
  1632. {
  1633. return LPSPI_EdmaControl(control, arg, &LPSPI3_EdmaDriverState);
  1634. }
  1635. static ARM_SPI_STATUS LPSPI3_EdmaGetStatus(void)
  1636. {
  1637. return LPSPI_EdmaGetStatus(&LPSPI3_EdmaDriverState);
  1638. }
  1639. #endif
  1640. #else
  1641. static cmsis_lpspi_handle_t LPSPI3_Handle;
  1642. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1643. ARMCC_SECTION("lpspi3_interrupt_driver_state")
  1644. static cmsis_lpspi_interrupt_driver_state_t LPSPI3_InterruptDriverState = {
  1645. #else
  1646. static cmsis_lpspi_interrupt_driver_state_t LPSPI3_InterruptDriverState = {
  1647. #endif
  1648. &LPSPI3_Resource,
  1649. &LPSPI3_Handle,
  1650. };
  1651. static int32_t LPSPI3_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1652. {
  1653. #ifdef RTE_SPI3_PIN_INIT
  1654. RTE_SPI3_PIN_INIT();
  1655. #endif
  1656. return LPSPI_InterruptInitialize(cb_event, &LPSPI3_InterruptDriverState);
  1657. }
  1658. static int32_t LPSPI3_InterruptUninitialize(void)
  1659. {
  1660. #ifdef RTE_SPI3_PIN_DEINIT
  1661. RTE_SPI3_PIN_DEINIT();
  1662. #endif
  1663. return LPSPI_InterruptUninitialize(&LPSPI3_InterruptDriverState);
  1664. }
  1665. static int32_t LPSPI3_InterruptPowerControl(ARM_POWER_STATE state)
  1666. {
  1667. return LPSPI_InterruptPowerControl(state, &LPSPI3_InterruptDriverState);
  1668. }
  1669. static int32_t LPSPI3_InterruptSend(const void *data, uint32_t num)
  1670. {
  1671. return LPSPI_InterruptSend(data, num, &LPSPI3_InterruptDriverState);
  1672. }
  1673. static int32_t LPSPI3_InterruptReceive(void *data, uint32_t num)
  1674. {
  1675. return LPSPI_InterruptReceive(data, num, &LPSPI3_InterruptDriverState);
  1676. }
  1677. static int32_t LPSPI3_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1678. {
  1679. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI3_InterruptDriverState);
  1680. }
  1681. static uint32_t LPSPI3_InterruptGetCount(void)
  1682. {
  1683. return LPSPI_InterruptGetCount(&LPSPI3_InterruptDriverState);
  1684. }
  1685. static int32_t LPSPI3_InterruptControl(uint32_t control, uint32_t arg)
  1686. {
  1687. return LPSPI_InterruptControl(control, arg, &LPSPI3_InterruptDriverState);
  1688. }
  1689. static ARM_SPI_STATUS LPSPI3_InterruptGetStatus(void)
  1690. {
  1691. return LPSPI_InterruptGetStatus(&LPSPI3_InterruptDriverState);
  1692. }
  1693. #endif
  1694. ARM_DRIVER_SPI Driver_SPI3 = {
  1695. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  1696. #if defined(RTE_SPI3_DMA_EN) && RTE_SPI3_DMA_EN
  1697. LPSPI3_EdmaInitialize, LPSPI3_EdmaUninitialize, LPSPI3_EdmaPowerControl, LPSPI3_EdmaSend, LPSPI3_EdmaReceive,
  1698. LPSPI3_EdmaTransfer, LPSPI3_EdmaGetCount, LPSPI3_EdmaControl, LPSPI3_EdmaGetStatus
  1699. #else
  1700. LPSPI3_InterruptInitialize, LPSPI3_InterruptUninitialize, LPSPI3_InterruptPowerControl, LPSPI3_InterruptSend,
  1701. LPSPI3_InterruptReceive, LPSPI3_InterruptTransfer, LPSPI3_InterruptGetCount, LPSPI3_InterruptControl,
  1702. LPSPI3_InterruptGetStatus
  1703. #endif
  1704. };
  1705. #endif /* LPSPI3 */
  1706. #if defined(LPSPI4) && defined(RTE_SPI4) && RTE_SPI4
  1707. /* User needs to provide the implementation for LPSPI4_GetFreq/InitPins/DeinitPins
  1708. in the application for enabling according instance. */
  1709. extern uint32_t LPSPI4_GetFreq(void);
  1710. static cmsis_lpspi_resource_t LPSPI4_Resource = {LPSPI4, 4, LPSPI4_GetFreq};
  1711. #if defined(RTE_SPI4_DMA_EN) && RTE_SPI4_DMA_EN
  1712. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1713. static cmsis_lpspi_edma_resource_t LPSPI4_EdmaResource = {
  1714. RTE_SPI4_DMA_TX_DMA_BASE, RTE_SPI4_DMA_TX_CH, RTE_SPI4_DMA_TX_PERI_SEL,
  1715. RTE_SPI4_DMA_RX_DMA_BASE, RTE_SPI4_DMA_RX_CH, RTE_SPI4_DMA_RX_PERI_SEL,
  1716. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1717. RTE_SPI4_DMA_TX_DMAMUX_BASE, RTE_SPI4_DMA_RX_DMAMUX_BASE,
  1718. #endif
  1719. };
  1720. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI4_EdmaHandle);
  1721. static edma_handle_t LPSPI4_EdmaTxDataToTxRegHandle;
  1722. static edma_handle_t LPSPI4_EdmaRxRegToRxDataHandle;
  1723. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1724. ARMCC_SECTION("lpspi4_edma_driver_state")
  1725. static cmsis_lpspi_edma_driver_state_t LPSPI4_EdmaDriverState = {
  1726. #else
  1727. static cmsis_lpspi_edma_driver_state_t LPSPI4_EdmaDriverState = {
  1728. #endif
  1729. &LPSPI4_Resource,
  1730. &LPSPI4_EdmaResource,
  1731. &LPSPI4_EdmaHandle,
  1732. &LPSPI4_EdmaRxRegToRxDataHandle,
  1733. &LPSPI4_EdmaTxDataToTxRegHandle,
  1734. };
  1735. static int32_t LPSPI4_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  1736. {
  1737. #ifdef RTE_SPI4_PIN_INIT
  1738. RTE_SPI4_PIN_INIT();
  1739. #endif
  1740. return LPSPI_EdmaInitialize(cb_event, &LPSPI4_EdmaDriverState);
  1741. }
  1742. static int32_t LPSPI4_EdmaUninitialize(void)
  1743. {
  1744. #ifdef RTE_SPI4_PIN_DEINIT
  1745. RTE_SPI4_PIN_DEINIT();
  1746. #endif
  1747. return LPSPI_EdmaUninitialize(&LPSPI4_EdmaDriverState);
  1748. }
  1749. static int32_t LPSPI4_EdmaPowerControl(ARM_POWER_STATE state)
  1750. {
  1751. return LPSPI_EdmaPowerControl(state, &LPSPI4_EdmaDriverState);
  1752. }
  1753. static int32_t LPSPI4_EdmaSend(const void *data, uint32_t num)
  1754. {
  1755. return LPSPI_EdmaSend(data, num, &LPSPI4_EdmaDriverState);
  1756. }
  1757. static int32_t LPSPI4_EdmaReceive(void *data, uint32_t num)
  1758. {
  1759. return LPSPI_EdmaReceive(data, num, &LPSPI4_EdmaDriverState);
  1760. }
  1761. static int32_t LPSPI4_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  1762. {
  1763. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI4_EdmaDriverState);
  1764. }
  1765. static uint32_t LPSPI4_EdmaGetCount(void)
  1766. {
  1767. return LPSPI_EdmaGetCount(&LPSPI4_EdmaDriverState);
  1768. }
  1769. static int32_t LPSPI4_EdmaControl(uint32_t control, uint32_t arg)
  1770. {
  1771. return LPSPI_EdmaControl(control, arg, &LPSPI4_EdmaDriverState);
  1772. }
  1773. static ARM_SPI_STATUS LPSPI4_EdmaGetStatus(void)
  1774. {
  1775. return LPSPI_EdmaGetStatus(&LPSPI4_EdmaDriverState);
  1776. }
  1777. #endif
  1778. #else
  1779. static cmsis_lpspi_handle_t LPSPI4_Handle;
  1780. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1781. ARMCC_SECTION("lpspi4_interrupt_driver_state")
  1782. static cmsis_lpspi_interrupt_driver_state_t LPSPI4_InterruptDriverState = {
  1783. #else
  1784. static cmsis_lpspi_interrupt_driver_state_t LPSPI4_InterruptDriverState = {
  1785. #endif
  1786. &LPSPI4_Resource,
  1787. &LPSPI4_Handle,
  1788. };
  1789. static int32_t LPSPI4_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1790. {
  1791. #ifdef RTE_SPI4_PIN_INIT
  1792. RTE_SPI4_PIN_INIT();
  1793. #endif
  1794. return LPSPI_InterruptInitialize(cb_event, &LPSPI4_InterruptDriverState);
  1795. }
  1796. static int32_t LPSPI4_InterruptUninitialize(void)
  1797. {
  1798. #ifdef RTE_SPI4_PIN_DEINIT
  1799. RTE_SPI4_PIN_DEINIT();
  1800. #endif
  1801. return LPSPI_InterruptUninitialize(&LPSPI4_InterruptDriverState);
  1802. }
  1803. static int32_t LPSPI4_InterruptPowerControl(ARM_POWER_STATE state)
  1804. {
  1805. return LPSPI_InterruptPowerControl(state, &LPSPI4_InterruptDriverState);
  1806. }
  1807. static int32_t LPSPI4_InterruptSend(const void *data, uint32_t num)
  1808. {
  1809. return LPSPI_InterruptSend(data, num, &LPSPI4_InterruptDriverState);
  1810. }
  1811. static int32_t LPSPI4_InterruptReceive(void *data, uint32_t num)
  1812. {
  1813. return LPSPI_InterruptReceive(data, num, &LPSPI4_InterruptDriverState);
  1814. }
  1815. static int32_t LPSPI4_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1816. {
  1817. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI4_InterruptDriverState);
  1818. }
  1819. static uint32_t LPSPI4_InterruptGetCount(void)
  1820. {
  1821. return LPSPI_InterruptGetCount(&LPSPI4_InterruptDriverState);
  1822. }
  1823. static int32_t LPSPI4_InterruptControl(uint32_t control, uint32_t arg)
  1824. {
  1825. return LPSPI_InterruptControl(control, arg, &LPSPI4_InterruptDriverState);
  1826. }
  1827. static ARM_SPI_STATUS LPSPI4_InterruptGetStatus(void)
  1828. {
  1829. return LPSPI_InterruptGetStatus(&LPSPI4_InterruptDriverState);
  1830. }
  1831. #endif
  1832. ARM_DRIVER_SPI Driver_SPI4 = {
  1833. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  1834. #if defined(RTE_SPI4_DMA_EN) && RTE_SPI4_DMA_EN
  1835. LPSPI4_EdmaInitialize, LPSPI4_EdmaUninitialize, LPSPI4_EdmaPowerControl, LPSPI4_EdmaSend, LPSPI4_EdmaReceive,
  1836. LPSPI4_EdmaTransfer, LPSPI4_EdmaGetCount, LPSPI4_EdmaControl, LPSPI4_EdmaGetStatus
  1837. #else
  1838. LPSPI4_InterruptInitialize, LPSPI4_InterruptUninitialize, LPSPI4_InterruptPowerControl, LPSPI4_InterruptSend,
  1839. LPSPI4_InterruptReceive, LPSPI4_InterruptTransfer, LPSPI4_InterruptGetCount, LPSPI4_InterruptControl,
  1840. LPSPI4_InterruptGetStatus
  1841. #endif
  1842. };
  1843. #endif /* LPSPI4 */
  1844. #if defined(LPSPI5) && defined(RTE_SPI5) && RTE_SPI5
  1845. /* User needs to provide the implementation for LPSPI5_GetFreq/InitPins/DeinitPins
  1846. in the application for enabling according instance. */
  1847. extern uint32_t LPSPI5_GetFreq(void);
  1848. static cmsis_lpspi_resource_t LPSPI5_Resource = {LPSPI5, 5, LPSPI5_GetFreq};
  1849. #if defined(RTE_SPI5_DMA_EN) && RTE_SPI5_DMA_EN
  1850. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1851. static cmsis_lpspi_edma_resource_t LPSPI5_EdmaResource = {
  1852. RTE_SPI5_DMA_TX_DMA_BASE, RTE_SPI5_DMA_TX_CH, RTE_SPI5_DMA_TX_PERI_SEL,
  1853. RTE_SPI5_DMA_RX_DMA_BASE, RTE_SPI5_DMA_RX_CH, RTE_SPI5_DMA_RX_PERI_SEL,
  1854. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1855. RTE_SPI5_DMA_TX_DMAMUX_BASE, RTE_SPI5_DMA_RX_DMAMUX_BASE,
  1856. #endif
  1857. };
  1858. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI5_EdmaHandle);
  1859. static edma_handle_t LPSPI5_EdmaTxDataToTxRegHandle;
  1860. static edma_handle_t LPSPI5_EdmaRxRegToRxDataHandle;
  1861. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1862. ARMCC_SECTION("lpspi5_edma_driver_state")
  1863. static cmsis_lpspi_edma_driver_state_t LPSPI5_EdmaDriverState = {
  1864. #else
  1865. static cmsis_lpspi_edma_driver_state_t LPSPI5_EdmaDriverState = {
  1866. #endif
  1867. &LPSPI5_Resource,
  1868. &LPSPI5_EdmaResource,
  1869. &LPSPI5_EdmaHandle,
  1870. &LPSPI5_EdmaRxRegToRxDataHandle,
  1871. &LPSPI5_EdmaTxDataToTxRegHandle,
  1872. };
  1873. static int32_t LPSPI5_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  1874. {
  1875. #ifdef RTE_SPI5_PIN_INIT
  1876. RTE_SPI5_PIN_INIT();
  1877. #endif
  1878. return LPSPI_EdmaInitialize(cb_event, &LPSPI5_EdmaDriverState);
  1879. }
  1880. static int32_t LPSPI5_EdmaUninitialize(void)
  1881. {
  1882. #ifdef RTE_SPI5_PIN_DEINIT
  1883. RTE_SPI5_PIN_DEINIT();
  1884. #endif
  1885. return LPSPI_EdmaUninitialize(&LPSPI5_EdmaDriverState);
  1886. }
  1887. static int32_t LPSPI5_EdmaPowerControl(ARM_POWER_STATE state)
  1888. {
  1889. return LPSPI_EdmaPowerControl(state, &LPSPI5_EdmaDriverState);
  1890. }
  1891. static int32_t LPSPI5_EdmaSend(const void *data, uint32_t num)
  1892. {
  1893. return LPSPI_EdmaSend(data, num, &LPSPI5_EdmaDriverState);
  1894. }
  1895. static int32_t LPSPI5_EdmaReceive(void *data, uint32_t num)
  1896. {
  1897. return LPSPI_EdmaReceive(data, num, &LPSPI5_EdmaDriverState);
  1898. }
  1899. static int32_t LPSPI5_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  1900. {
  1901. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI5_EdmaDriverState);
  1902. }
  1903. static uint32_t LPSPI5_EdmaGetCount(void)
  1904. {
  1905. return LPSPI_EdmaGetCount(&LPSPI5_EdmaDriverState);
  1906. }
  1907. static int32_t LPSPI5_EdmaControl(uint32_t control, uint32_t arg)
  1908. {
  1909. return LPSPI_EdmaControl(control, arg, &LPSPI5_EdmaDriverState);
  1910. }
  1911. static ARM_SPI_STATUS LPSPI5_EdmaGetStatus(void)
  1912. {
  1913. return LPSPI_EdmaGetStatus(&LPSPI5_EdmaDriverState);
  1914. }
  1915. #endif
  1916. #else
  1917. static cmsis_lpspi_handle_t LPSPI5_Handle;
  1918. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  1919. ARMCC_SECTION("lpspi5_interrupt_driver_state")
  1920. static cmsis_lpspi_interrupt_driver_state_t LPSPI5_InterruptDriverState = {
  1921. #else
  1922. static cmsis_lpspi_interrupt_driver_state_t LPSPI5_InterruptDriverState = {
  1923. #endif
  1924. &LPSPI5_Resource,
  1925. &LPSPI5_Handle,
  1926. };
  1927. static int32_t LPSPI5_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  1928. {
  1929. #ifdef RTE_SPI5_PIN_INIT
  1930. RTE_SPI5_PIN_INIT();
  1931. #endif
  1932. return LPSPI_InterruptInitialize(cb_event, &LPSPI5_InterruptDriverState);
  1933. }
  1934. static int32_t LPSPI5_InterruptUninitialize(void)
  1935. {
  1936. #ifdef RTE_SPI5_PIN_DEINIT
  1937. RTE_SPI5_PIN_DEINIT();
  1938. #endif
  1939. return LPSPI_InterruptUninitialize(&LPSPI5_InterruptDriverState);
  1940. }
  1941. static int32_t LPSPI5_InterruptPowerControl(ARM_POWER_STATE state)
  1942. {
  1943. return LPSPI_InterruptPowerControl(state, &LPSPI5_InterruptDriverState);
  1944. }
  1945. static int32_t LPSPI5_InterruptSend(const void *data, uint32_t num)
  1946. {
  1947. return LPSPI_InterruptSend(data, num, &LPSPI5_InterruptDriverState);
  1948. }
  1949. static int32_t LPSPI5_InterruptReceive(void *data, uint32_t num)
  1950. {
  1951. return LPSPI_InterruptReceive(data, num, &LPSPI5_InterruptDriverState);
  1952. }
  1953. static int32_t LPSPI5_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  1954. {
  1955. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI5_InterruptDriverState);
  1956. }
  1957. static uint32_t LPSPI5_InterruptGetCount(void)
  1958. {
  1959. return LPSPI_InterruptGetCount(&LPSPI5_InterruptDriverState);
  1960. }
  1961. static int32_t LPSPI5_InterruptControl(uint32_t control, uint32_t arg)
  1962. {
  1963. return LPSPI_InterruptControl(control, arg, &LPSPI5_InterruptDriverState);
  1964. }
  1965. static ARM_SPI_STATUS LPSPI5_InterruptGetStatus(void)
  1966. {
  1967. return LPSPI_InterruptGetStatus(&LPSPI5_InterruptDriverState);
  1968. }
  1969. #endif
  1970. ARM_DRIVER_SPI Driver_SPI5 = {
  1971. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  1972. #if defined(RTE_SPI5_DMA_EN) && RTE_SPI5_DMA_EN
  1973. LPSPI5_EdmaInitialize, LPSPI5_EdmaUninitialize, LPSPI5_EdmaPowerControl, LPSPI5_EdmaSend, LPSPI5_EdmaReceive,
  1974. LPSPI5_EdmaTransfer, LPSPI5_EdmaGetCount, LPSPI5_EdmaControl, LPSPI5_EdmaGetStatus
  1975. #else
  1976. LPSPI5_InterruptInitialize, LPSPI5_InterruptUninitialize, LPSPI5_InterruptPowerControl, LPSPI5_InterruptSend,
  1977. LPSPI5_InterruptReceive, LPSPI5_InterruptTransfer, LPSPI5_InterruptGetCount, LPSPI5_InterruptControl,
  1978. LPSPI5_InterruptGetStatus
  1979. #endif
  1980. };
  1981. #endif /* LPSPI5 */
  1982. #if defined(LPSPI6) && defined(RTE_SPI6) && RTE_SPI6
  1983. /* User needs to provide the implementation for LPSPI6_GetFreq/InitPins/DeinitPins
  1984. in the application for enabling according instance. */
  1985. extern uint32_t LPSPI6_GetFreq(void);
  1986. static cmsis_lpspi_resource_t LPSPI6_Resource = {LPSPI6, 6, LPSPI6_GetFreq};
  1987. #if defined(RTE_SPI6_DMA_EN) && RTE_SPI6_DMA_EN
  1988. #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
  1989. static cmsis_lpspi_edma_resource_t LPSPI6_EdmaResource = {
  1990. RTE_SPI6_DMA_TX_DMA_BASE, RTE_SPI6_DMA_TX_CH, RTE_SPI6_DMA_TX_PERI_SEL,
  1991. RTE_SPI6_DMA_RX_DMA_BASE, RTE_SPI6_DMA_RX_CH, RTE_SPI6_DMA_RX_PERI_SEL,
  1992. #if (defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT)
  1993. RTE_SPI6_DMA_TX_DMAMUX_BASE, RTE_SPI6_DMA_RX_DMAMUX_BASE,
  1994. #endif
  1995. };
  1996. AT_NONCACHEABLE_SECTION(static cmsis_lpspi_edma_handle_t LPSPI6_EdmaHandle);
  1997. static edma_handle_t LPSPI6_EdmaTxDataToTxRegHandle;
  1998. static edma_handle_t LPSPI6_EdmaRxRegToRxDataHandle;
  1999. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  2000. ARMCC_SECTION("lpspi6_edma_driver_state")
  2001. static cmsis_lpspi_edma_driver_state_t LPSPI6_EdmaDriverState = {
  2002. #else
  2003. static cmsis_lpspi_edma_driver_state_t LPSPI6_EdmaDriverState = {
  2004. #endif
  2005. &LPSPI6_Resource,
  2006. &LPSPI6_EdmaResource,
  2007. &LPSPI6_EdmaHandle,
  2008. &LPSPI6_EdmaRxRegToRxDataHandle,
  2009. &LPSPI6_EdmaTxDataToTxRegHandle,
  2010. };
  2011. static int32_t LPSPI6_EdmaInitialize(ARM_SPI_SignalEvent_t cb_event)
  2012. {
  2013. #ifdef RTE_SPI6_PIN_INIT
  2014. RTE_SPI6_PIN_INIT();
  2015. #endif
  2016. return LPSPI_EdmaInitialize(cb_event, &LPSPI6_EdmaDriverState);
  2017. }
  2018. static int32_t LPSPI6_EdmaUninitialize(void)
  2019. {
  2020. #ifdef RTE_SPI6_PIN_DEINIT
  2021. RTE_SPI6_PIN_DEINIT();
  2022. #endif
  2023. return LPSPI_EdmaUninitialize(&LPSPI6_EdmaDriverState);
  2024. }
  2025. static int32_t LPSPI6_EdmaPowerControl(ARM_POWER_STATE state)
  2026. {
  2027. return LPSPI_EdmaPowerControl(state, &LPSPI6_EdmaDriverState);
  2028. }
  2029. static int32_t LPSPI6_EdmaSend(const void *data, uint32_t num)
  2030. {
  2031. return LPSPI_EdmaSend(data, num, &LPSPI6_EdmaDriverState);
  2032. }
  2033. static int32_t LPSPI6_EdmaReceive(void *data, uint32_t num)
  2034. {
  2035. return LPSPI_EdmaReceive(data, num, &LPSPI6_EdmaDriverState);
  2036. }
  2037. static int32_t LPSPI6_EdmaTransfer(const void *data_out, void *data_in, uint32_t num)
  2038. {
  2039. return LPSPI_EdmaTransfer(data_out, data_in, num, &LPSPI6_EdmaDriverState);
  2040. }
  2041. static uint32_t LPSPI6_EdmaGetCount(void)
  2042. {
  2043. return LPSPI_EdmaGetCount(&LPSPI6_EdmaDriverState);
  2044. }
  2045. static int32_t LPSPI6_EdmaControl(uint32_t control, uint32_t arg)
  2046. {
  2047. return LPSPI_EdmaControl(control, arg, &LPSPI6_EdmaDriverState);
  2048. }
  2049. static ARM_SPI_STATUS LPSPI6_EdmaGetStatus(void)
  2050. {
  2051. return LPSPI_EdmaGetStatus(&LPSPI6_EdmaDriverState);
  2052. }
  2053. #endif
  2054. #else
  2055. static cmsis_lpspi_handle_t LPSPI6_Handle;
  2056. #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
  2057. ARMCC_SECTION("lpspi6_interrupt_driver_state")
  2058. static cmsis_lpspi_interrupt_driver_state_t LPSPI6_InterruptDriverState = {
  2059. #else
  2060. static cmsis_lpspi_interrupt_driver_state_t LPSPI6_InterruptDriverState = {
  2061. #endif
  2062. &LPSPI6_Resource,
  2063. &LPSPI6_Handle,
  2064. };
  2065. static int32_t LPSPI6_InterruptInitialize(ARM_SPI_SignalEvent_t cb_event)
  2066. {
  2067. #ifdef RTE_SPI6_PIN_INIT
  2068. RTE_SPI6_PIN_INIT();
  2069. #endif
  2070. return LPSPI_InterruptInitialize(cb_event, &LPSPI6_InterruptDriverState);
  2071. }
  2072. static int32_t LPSPI6_InterruptUninitialize(void)
  2073. {
  2074. #ifdef RTE_SPI6_PIN_DEINIT
  2075. RTE_SPI6_PIN_DEINIT();
  2076. #endif
  2077. return LPSPI_InterruptUninitialize(&LPSPI6_InterruptDriverState);
  2078. }
  2079. static int32_t LPSPI6_InterruptPowerControl(ARM_POWER_STATE state)
  2080. {
  2081. return LPSPI_InterruptPowerControl(state, &LPSPI6_InterruptDriverState);
  2082. }
  2083. static int32_t LPSPI6_InterruptSend(const void *data, uint32_t num)
  2084. {
  2085. return LPSPI_InterruptSend(data, num, &LPSPI6_InterruptDriverState);
  2086. }
  2087. static int32_t LPSPI6_InterruptReceive(void *data, uint32_t num)
  2088. {
  2089. return LPSPI_InterruptReceive(data, num, &LPSPI6_InterruptDriverState);
  2090. }
  2091. static int32_t LPSPI6_InterruptTransfer(const void *data_out, void *data_in, uint32_t num)
  2092. {
  2093. return LPSPI_InterruptTransfer(data_out, data_in, num, &LPSPI6_InterruptDriverState);
  2094. }
  2095. static uint32_t LPSPI6_InterruptGetCount(void)
  2096. {
  2097. return LPSPI_InterruptGetCount(&LPSPI6_InterruptDriverState);
  2098. }
  2099. static int32_t LPSPI6_InterruptControl(uint32_t control, uint32_t arg)
  2100. {
  2101. return LPSPI_InterruptControl(control, arg, &LPSPI6_InterruptDriverState);
  2102. }
  2103. static ARM_SPI_STATUS LPSPI6_InterruptGetStatus(void)
  2104. {
  2105. return LPSPI_InterruptGetStatus(&LPSPI6_InterruptDriverState);
  2106. }
  2107. #endif
  2108. ARM_DRIVER_SPI Driver_SPI6 = {
  2109. LPSPIx_GetVersion, LPSPIx_GetCapabilities,
  2110. #if defined(RTE_SPI6_DMA_EN) && RTE_SPI6_DMA_EN
  2111. LPSPI6_EdmaInitialize, LPSPI6_EdmaUninitialize, LPSPI6_EdmaPowerControl, LPSPI6_EdmaSend, LPSPI6_EdmaReceive,
  2112. LPSPI6_EdmaTransfer, LPSPI6_EdmaGetCount, LPSPI6_EdmaControl, LPSPI6_EdmaGetStatus
  2113. #else
  2114. LPSPI6_InterruptInitialize, LPSPI6_InterruptUninitialize, LPSPI6_InterruptPowerControl, LPSPI6_InterruptSend,
  2115. LPSPI6_InterruptReceive, LPSPI6_InterruptTransfer, LPSPI6_InterruptGetCount, LPSPI6_InterruptControl,
  2116. LPSPI6_InterruptGetStatus
  2117. #endif
  2118. };
  2119. #endif /* LPSPI6 */