cyhal_clock.c 126 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954
  1. /*******************************************************************************
  2. * File Name: cyhal_clock.c
  3. *
  4. * Description:
  5. * Provides an implementation for high level interface for interacting with the
  6. * Cypress Clocks. This is a wrapper around the lower level PDL API.
  7. *
  8. ********************************************************************************
  9. * \copyright
  10. * Copyright 2018-2022 Cypress Semiconductor Corporation (an Infineon company) or
  11. * an affiliate of Cypress Semiconductor Corporation
  12. *
  13. * SPDX-License-Identifier: Apache-2.0
  14. *
  15. * Licensed under the Apache License, Version 2.0 (the "License");
  16. * you may not use this file except in compliance with the License.
  17. * You may obtain a copy of the License at
  18. *
  19. * http://www.apache.org/licenses/LICENSE-2.0
  20. *
  21. * Unless required by applicable law or agreed to in writing, software
  22. * distributed under the License is distributed on an "AS IS" BASIS,
  23. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  24. * See the License for the specific language governing permissions and
  25. * limitations under the License.
  26. *******************************************************************************/
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include "cy_sysclk.h"
  30. #include "cy_utils.h"
  31. #include "cyhal_clock.h"
  32. #include "cyhal_system.h"
  33. #include "cyhal_utils.h"
  34. #include "cyhal_hwmgr.h"
  35. #if (CYHAL_DRIVER_AVAILABLE_CLOCK)
  36. #if defined(__cplusplus)
  37. extern "C"
  38. {
  39. #endif
  40. #define _CYHAL_CLOCK_FLL_LOCK_TIME (20000UL)
  41. #define _CYHAL_CLOCK_PLL_LOCK_TIME (10000UL)
  42. #if defined(PERI_PCLK_GR_NUM_Pos)
  43. #define _CYHAL_CLOCK_GET_PCLK_GR_NUM(block) ((en_clk_dst_t)(_CYHAL_PERIPHERAL_GROUP_GET_GROUP(block) << PERI_PCLK_GR_NUM_Pos))
  44. #else
  45. #define _CYHAL_CLOCK_GET_PCLK_GR_NUM(block) ((en_clk_dst_t)0) /* Value is not used for devices that don't have PCLK groups. */
  46. #endif
  47. /* We can't use the PDL-defined _CYHAL_SRSS_PILO_PRESENT because on CAT1A devices it performs a struct lookup
  48. * which won't work in preprocessor expressions */
  49. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  50. #define _CYHAL_SRSS_PILO_PRESENT (SRSS_PILO_PRESENT)
  51. #elif defined(COMPONENT_CAT1B)
  52. #define _CYHAL_SRSS_PILO_PRESENT (SRSS_S40S_PILO_PRESENT)
  53. #endif
  54. /******************************************************************************
  55. ****************************** Clock Resources *******************************
  56. *****************************************************************************/
  57. const cyhal_clock_tolerance_t CYHAL_CLOCK_TOLERANCE_0_P = {CYHAL_TOLERANCE_PERCENT, 0};
  58. const cyhal_clock_tolerance_t CYHAL_CLOCK_TOLERANCE_1_P = {CYHAL_TOLERANCE_PERCENT, 1};
  59. const cyhal_clock_tolerance_t CYHAL_CLOCK_TOLERANCE_5_P = {CYHAL_TOLERANCE_PERCENT, 5};
  60. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_IMO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_IMO, 0 };
  61. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_EXT = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_EXT, 0 };
  62. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  63. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ILO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ILO, 0 };
  64. #elif defined(COMPONENT_CAT1C)
  65. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ILO[_CYHAL_SRSS_NUM_ILO] =
  66. {
  67. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ILO, 0 },
  68. #if (SRSS_HT_VARIANT > 0)
  69. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ILO, 1 },
  70. #endif
  71. };
  72. #endif
  73. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_LF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_LF, 0 };
  74. /* PUMP clock is only available on CAT1A and CAT1B devices */
  75. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
  76. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PUMP = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PUMP, 0 };
  77. #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
  78. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_BAK = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_BAK, 0 };
  79. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ALT_SYS_TICK = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ALT_SYS_TICK, 0 };
  80. #if defined(COMPONENT_CAT1C)
  81. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_MEM = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_MEM, 0 };
  82. #endif
  83. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PATHMUX[SRSS_NUM_CLKPATH] =
  84. {
  85. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 0 },
  86. #if (SRSS_NUM_CLKPATH > 1)
  87. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 1 },
  88. #endif
  89. #if (SRSS_NUM_CLKPATH > 2)
  90. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 2 },
  91. #endif
  92. #if (SRSS_NUM_CLKPATH > 3)
  93. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 3 },
  94. #endif
  95. #if (SRSS_NUM_CLKPATH > 4)
  96. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 4 },
  97. #endif
  98. #if (SRSS_NUM_CLKPATH > 5)
  99. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 5 },
  100. #endif
  101. #if (SRSS_NUM_CLKPATH > 6)
  102. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 6 },
  103. #endif
  104. #if (SRSS_NUM_CLKPATH > 7)
  105. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 7 },
  106. #endif
  107. #if (SRSS_NUM_CLKPATH > 8)
  108. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 8 },
  109. #endif
  110. #if (SRSS_NUM_CLKPATH > 9)
  111. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 9 },
  112. #endif
  113. #if (SRSS_NUM_CLKPATH > 10)
  114. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 10 },
  115. #endif
  116. #if (SRSS_NUM_CLKPATH > 11)
  117. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 11 },
  118. #endif
  119. #if (SRSS_NUM_CLKPATH > 12)
  120. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 12 },
  121. #endif
  122. #if (SRSS_NUM_CLKPATH > 13)
  123. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 13 },
  124. #endif
  125. #if (SRSS_NUM_CLKPATH > 14)
  126. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 14 },
  127. #endif
  128. #if (SRSS_NUM_CLKPATH > 15)
  129. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 15 },
  130. #endif
  131. };
  132. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_HF[SRSS_NUM_HFROOT] =
  133. {
  134. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 0 },
  135. #if (SRSS_NUM_HFROOT > 1)
  136. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 1 },
  137. #endif
  138. #if (SRSS_NUM_HFROOT > 2)
  139. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 2 },
  140. #endif
  141. #if (SRSS_NUM_HFROOT > 3)
  142. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 3 },
  143. #endif
  144. #if (SRSS_NUM_HFROOT > 4)
  145. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 4 },
  146. #endif
  147. #if (SRSS_NUM_HFROOT > 5)
  148. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 5 },
  149. #endif
  150. #if (SRSS_NUM_HFROOT > 6)
  151. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 6 },
  152. #endif
  153. #if (SRSS_NUM_HFROOT > 7)
  154. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 7 },
  155. #endif
  156. #if (SRSS_NUM_HFROOT > 8)
  157. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 8 },
  158. #endif
  159. #if (SRSS_NUM_HFROOT > 9)
  160. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 9 },
  161. #endif
  162. #if (SRSS_NUM_HFROOT > 10)
  163. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 10 },
  164. #endif
  165. #if (SRSS_NUM_HFROOT > 11)
  166. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 11 },
  167. #endif
  168. #if (SRSS_NUM_HFROOT > 12)
  169. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 12 },
  170. #endif
  171. #if (SRSS_NUM_HFROOT > 13)
  172. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 13 },
  173. #endif
  174. #if (SRSS_NUM_HFROOT > 14)
  175. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 14 },
  176. #endif
  177. #if (SRSS_NUM_HFROOT > 15)
  178. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 15 },
  179. #endif
  180. };
  181. #if SRSS_ECO_PRESENT
  182. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ECO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ECO, 0 };
  183. #endif
  184. #if SRSS_ALTHF_PRESENT
  185. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ALTHF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ALTHF, 0 };
  186. #endif
  187. #if SRSS_ALTLF_PRESENT
  188. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ALTLF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ALTLF, 0 };
  189. #endif
  190. #if _CYHAL_SRSS_PILO_PRESENT
  191. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PILO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PILO, 0 };
  192. #endif
  193. #if SRSS_BACKUP_PRESENT
  194. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_WCO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_WCO, 0 };
  195. #endif
  196. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  197. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_MFO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_MFO, 0 };
  198. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_MF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_MF, 0 };
  199. #endif
  200. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  201. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_FLL = { CYHAL_RSC_CLOCK, CYHAL_CLOCK_BLOCK_FLL, 0 };
  202. #endif
  203. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  204. #if defined(COMPONENT_CAT1A)
  205. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_FAST = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_FAST, 0 };
  206. #else
  207. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_FAST[_CYHAL_SRSS_NUM_FAST] =
  208. {
  209. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_FAST, 0 },
  210. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_FAST, 1 },
  211. };
  212. #endif
  213. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_SLOW = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_SLOW, 0 };
  214. #endif
  215. #if defined(COMPONENT_CAT1A)
  216. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PERI = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 0 };
  217. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_TIMER = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_TIMER, 0 };
  218. #if (_CYHAL_SRSS_NUM_PLL > 0)
  219. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PLL[_CYHAL_SRSS_NUM_PLL] =
  220. {
  221. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 0 },
  222. #if (_CYHAL_SRSS_NUM_PLL > 1)
  223. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 1 },
  224. #endif
  225. #if (_CYHAL_SRSS_NUM_PLL > 2)
  226. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 2 },
  227. #endif
  228. #if (_CYHAL_SRSS_NUM_PLL > 3)
  229. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 3 },
  230. #endif
  231. #if (_CYHAL_SRSS_NUM_PLL > 4)
  232. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 4 },
  233. #endif
  234. #if (_CYHAL_SRSS_NUM_PLL > 5)
  235. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 5 },
  236. #endif
  237. #if (_CYHAL_SRSS_NUM_PLL > 6)
  238. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 6 },
  239. #endif
  240. #if (_CYHAL_SRSS_NUM_PLL > 7)
  241. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 7 },
  242. #endif
  243. #if (_CYHAL_SRSS_NUM_PLL > 8)
  244. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 8 },
  245. #endif
  246. #if (_CYHAL_SRSS_NUM_PLL > 9)
  247. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 9 },
  248. #endif
  249. #if (_CYHAL_SRSS_NUM_PLL > 10)
  250. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 10 },
  251. #endif
  252. #if (_CYHAL_SRSS_NUM_PLL > 11)
  253. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 11 },
  254. #endif
  255. #if (_CYHAL_SRSS_NUM_PLL > 12)
  256. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 12 },
  257. #endif
  258. #if (_CYHAL_SRSS_NUM_PLL > 13)
  259. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 13 },
  260. #endif
  261. #if (_CYHAL_SRSS_NUM_PLL > 14)
  262. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 14 },
  263. #endif
  264. };
  265. #endif
  266. #endif
  267. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  268. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  269. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_IHO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_IHO, 0 };
  270. #if SRSS_ECO_PRESENT
  271. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ECO_PRESCALER = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ECO_PRESCALER, 0 };
  272. #endif
  273. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  274. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_LPECO_PRESCALER = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_LPECO_PRESCALER, 0 };
  275. #endif
  276. #endif
  277. /* COMPONENT_CAT1C uses a hybrid approach from what was done on CAT1A and CAT1B. Facelift CAT1C supports ClkPeri as well
  278. as Peripheral Clock Groups. For CAT1C, ClkPeri is used to source everything in Peripheral Clock Group 0 (HF0) and other
  279. Peripheral Clock Groups derive from one of the HFClks and have their own group divider. Thus we declare RSC_PERI Peri array for CAT1C */
  280. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PERI[CY_PERI_GROUP_NR] =
  281. {
  282. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 0 },
  283. #if (CY_PERI_GROUP_NR > 1)
  284. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 1 },
  285. #endif
  286. #if (CY_PERI_GROUP_NR > 2)
  287. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 2 },
  288. #endif
  289. #if (CY_PERI_GROUP_NR > 3)
  290. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 3 },
  291. #endif
  292. #if (CY_PERI_GROUP_NR > 4)
  293. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 4 },
  294. #endif
  295. #if (CY_PERI_GROUP_NR > 5)
  296. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 5 },
  297. #endif
  298. #if (CY_PERI_GROUP_NR > 6)
  299. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 6 },
  300. #endif
  301. #if (CY_PERI_GROUP_NR > 7)
  302. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 7 },
  303. #endif
  304. #if (CY_PERI_GROUP_NR > 8)
  305. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 8 },
  306. #endif
  307. #if (CY_PERI_GROUP_NR > 9)
  308. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 9 },
  309. #endif
  310. #if (CY_PERI_GROUP_NR > 10)
  311. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 10 },
  312. #endif
  313. #if (CY_PERI_GROUP_NR > 11)
  314. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 11 },
  315. #endif
  316. #if (CY_PERI_GROUP_NR > 12)
  317. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 12 },
  318. #endif
  319. #if (CY_PERI_GROUP_NR > 13)
  320. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 13 },
  321. #endif
  322. #if (CY_PERI_GROUP_NR > 14)
  323. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 14 },
  324. #endif
  325. #if (CY_PERI_GROUP_NR > 15)
  326. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 15 },
  327. #endif
  328. };
  329. #if (SRSS_NUM_PLL200M > 0)
  330. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PLL200M[SRSS_NUM_PLL200M] =
  331. {
  332. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 0 },
  333. #if (SRSS_NUM_PLL200M > 1)
  334. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 1 },
  335. #endif
  336. #if (SRSS_NUM_PLL200M > 2)
  337. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 2 },
  338. #endif
  339. #if (SRSS_NUM_PLL200M > 3)
  340. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 3 },
  341. #endif
  342. #if (SRSS_NUM_PLL200M > 4)
  343. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 4 },
  344. #endif
  345. #if (SRSS_NUM_PLL200M > 5)
  346. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 5 },
  347. #endif
  348. #if (SRSS_NUM_PLL200M > 6)
  349. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 6 },
  350. #endif
  351. #if (SRSS_NUM_PLL200M > 7)
  352. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 7 },
  353. #endif
  354. #if (SRSS_NUM_PLL200M > 8)
  355. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 8 },
  356. #endif
  357. #if (SRSS_NUM_PLL200M > 9)
  358. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 9 },
  359. #endif
  360. #if (SRSS_NUM_PLL200M > 10)
  361. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 10 },
  362. #endif
  363. #if (SRSS_NUM_PLL200M > 11)
  364. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 11 },
  365. #endif
  366. #if (SRSS_NUM_PLL200M > 12)
  367. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 12 },
  368. #endif
  369. #if (SRSS_NUM_PLL200M > 13)
  370. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 13 },
  371. #endif
  372. #if (SRSS_NUM_PLL200M > 14)
  373. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 14 },
  374. #endif
  375. };
  376. #endif
  377. #if (SRSS_NUM_PLL400M > 0)
  378. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PLL400M[SRSS_NUM_PLL400M] =
  379. {
  380. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 0 },
  381. #if (SRSS_NUM_PLL400M > 1)
  382. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 1 },
  383. #endif
  384. #if (SRSS_NUM_PLL400M > 2)
  385. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 2 },
  386. #endif
  387. #if (SRSS_NUM_PLL400M > 3)
  388. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 3 },
  389. #endif
  390. #if (SRSS_NUM_PLL400M > 4)
  391. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 4 },
  392. #endif
  393. #if (SRSS_NUM_PLL400M > 5)
  394. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 5 },
  395. #endif
  396. #if (SRSS_NUM_PLL400M > 6)
  397. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 6 },
  398. #endif
  399. #if (SRSS_NUM_PLL400M > 7)
  400. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 7 },
  401. #endif
  402. #if (SRSS_NUM_PLL400M > 8)
  403. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 8 },
  404. #endif
  405. #if (SRSS_NUM_PLL400M > 9)
  406. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 9 },
  407. #endif
  408. #if (SRSS_NUM_PLL400M > 10)
  409. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 10 },
  410. #endif
  411. #if (SRSS_NUM_PLL400M > 11)
  412. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 11 },
  413. #endif
  414. #if (SRSS_NUM_PLL400M > 12)
  415. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 12 },
  416. #endif
  417. #if (SRSS_NUM_PLL400M > 13)
  418. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 13 },
  419. #endif
  420. #if (SRSS_NUM_PLL400M > 14)
  421. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 14 },
  422. #endif
  423. };
  424. #endif
  425. #if (SRSS_NUM_DPLL_LP > 0)
  426. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_DPLL_LP[SRSS_NUM_DPLL_LP] =
  427. {
  428. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 0 },
  429. #if (SRSS_NUM_DPLL_LP > 1)
  430. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 1 },
  431. #endif
  432. #if (SRSS_NUM_DPLL_LP > 2)
  433. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 2 },
  434. #endif
  435. #if (SRSS_NUM_DPLL_LP > 3)
  436. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 3 },
  437. #endif
  438. #if (SRSS_NUM_DPLL_LP > 4)
  439. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 4 },
  440. #endif
  441. #if (SRSS_NUM_DPLL_LP > 5)
  442. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 5 },
  443. #endif
  444. #if (SRSS_NUM_DPLL_LP > 6)
  445. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 6 },
  446. #endif
  447. #if (SRSS_NUM_DPLL_LP > 7)
  448. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 7 },
  449. #endif
  450. #if (SRSS_NUM_DPLL_LP > 8)
  451. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 8 },
  452. #endif
  453. #if (SRSS_NUM_DPLL_LP > 9)
  454. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 9 },
  455. #endif
  456. #if (SRSS_NUM_DPLL_LP > 10)
  457. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 10 },
  458. #endif
  459. #if (SRSS_NUM_DPLL_LP > 11)
  460. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 11 },
  461. #endif
  462. #if (SRSS_NUM_DPLL_LP > 12)
  463. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 12 },
  464. #endif
  465. #if (SRSS_NUM_DPLL_LP > 13)
  466. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 13 },
  467. #endif
  468. #if (SRSS_NUM_DPLL_LP > 14)
  469. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 14 },
  470. #endif
  471. };
  472. #endif
  473. #if (SRSS_NUM_DPLL_HP > 0)
  474. const cyhal_resource_inst_t CYHAL_CLOCK_RSC_DPLL_HP[SRSS_NUM_DPLL_HP] =
  475. {
  476. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 0 },
  477. #if (SRSS_NUM_DPLL_HP > 1)
  478. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 1 },
  479. #endif
  480. #if (SRSS_NUM_DPLL_HP > 2)
  481. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 2 },
  482. #endif
  483. #if (SRSS_NUM_DPLL_HP > 3)
  484. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 3 },
  485. #endif
  486. #if (SRSS_NUM_DPLL_HP > 4)
  487. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 4 },
  488. #endif
  489. #if (SRSS_NUM_DPLL_HP > 5)
  490. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 5 },
  491. #endif
  492. #if (SRSS_NUM_DPLL_HP > 6)
  493. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 6 },
  494. #endif
  495. #if (SRSS_NUM_DPLL_HP > 7)
  496. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 7 },
  497. #endif
  498. #if (SRSS_NUM_DPLL_HP > 8)
  499. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 8 },
  500. #endif
  501. #if (SRSS_NUM_DPLL_HP > 9)
  502. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 9 },
  503. #endif
  504. #if (SRSS_NUM_DPLL_HP > 10)
  505. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 10 },
  506. #endif
  507. #if (SRSS_NUM_DPLL_HP > 11)
  508. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 11 },
  509. #endif
  510. #if (SRSS_NUM_DPLL_HP > 12)
  511. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 12 },
  512. #endif
  513. #if (SRSS_NUM_DPLL_HP > 13)
  514. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 13 },
  515. #endif
  516. #if (SRSS_NUM_DPLL_HP > 14)
  517. { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 14 },
  518. #endif
  519. };
  520. #endif
  521. #if ((SRSS_NUM_PLL400M > 0) && (SRSS_NUM_PLL200M == 0))
  522. #define CYHAL_CLOCK_RSC_PLL CYHAL_CLOCK_RSC_PLL400M
  523. #elif ((SRSS_NUM_PLL400M == 0) && (SRSS_NUM_PLL200M > 0))
  524. #define CYHAL_CLOCK_RSC_PLL CYHAL_CLOCK_RSC_PLL200M
  525. #endif
  526. #endif
  527. /******************************************************************************
  528. ***************************** Support Functions*******************************
  529. *****************************************************************************/
  530. static cy_rslt_t _cyhal_clock_compute_div(uint64_t input_hz, uint32_t desired_hz, uint32_t divider_bits, const cyhal_clock_tolerance_t *tolerance, uint32_t *div)
  531. {
  532. uint32_t max_div = (1 << divider_bits);
  533. *div = (input_hz + (desired_hz / 2)) / desired_hz;
  534. if (*div > max_div)
  535. *div = max_div;
  536. uint32_t diff = (tolerance != NULL)
  537. ? (uint32_t)abs(_cyhal_utils_calculate_tolerance(tolerance->type, desired_hz, input_hz / *div))
  538. : 0;
  539. return ((tolerance != NULL) && (diff > tolerance->value))
  540. ? CYHAL_CLOCK_RSLT_ERR_FREQ
  541. : CY_RSLT_SUCCESS;
  542. }
  543. static uint32_t _cyhal_clock_get_lf_frequency(void)
  544. {
  545. cy_en_clklf_in_sources_t source = Cy_SysClk_ClkLfGetSource();
  546. switch (source)
  547. {
  548. case CY_SYSCLK_CLKLF_IN_ILO:
  549. #if defined(COMPONENT_CAT1C)
  550. case CY_SYSCLK_CLKLF_IN_ILO1:
  551. #endif
  552. return CY_SYSCLK_ILO_FREQ;
  553. #if _CYHAL_SRSS_PILO_PRESENT
  554. case CY_SYSCLK_CLKLF_IN_PILO:
  555. return CY_SYSCLK_PILO_FREQ;
  556. #endif
  557. #if SRSS_BACKUP_PRESENT
  558. case CY_SYSCLK_CLKLF_IN_WCO:
  559. return CY_SYSCLK_WCO_FREQ;
  560. #endif
  561. #if SRSS_ALTLF_PRESENT
  562. case CY_SYSCLK_CLKLF_IN_ALTLF:
  563. return Cy_SysClk_AltLfGetFrequency();
  564. #endif
  565. #if defined(COMPONENT_CAT1B)
  566. #if SRSS_ECO_PRESENT
  567. case CY_SYSCLK_CLKLF_IN_ECO_PRESCALER:
  568. //return Cy_SysClk_EcoPrescalerGetFrequency();
  569. return 0;
  570. #endif
  571. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  572. case CY_SYSCLK_CLKLF_IN_LPECO_PRESCALER:
  573. return Cy_SysClk_LpEcoPrescalerGetFrequency();
  574. #endif
  575. #endif
  576. default:
  577. CY_ASSERT(false);
  578. return 0;
  579. }
  580. }
  581. static void _cyhal_clock_update_system_state(bool before_change, uint32_t old_sysclk_freq_hz, uint32_t new_sysclk_freq_hz)
  582. {
  583. // If increasing the clock frequency we need to update the speeds
  584. // before the change. If decreasing the frequency we need to update
  585. // after the change.
  586. if ((before_change == (bool)(new_sysclk_freq_hz > old_sysclk_freq_hz)) ||
  587. (!before_change == (new_sysclk_freq_hz < old_sysclk_freq_hz)))
  588. {
  589. #if defined(COMPONENT_CAT1A)
  590. bool is_ulp = Cy_SysPm_IsSystemUlp();
  591. #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  592. bool is_ulp = true;
  593. #elif defined(COMPONENT_CAT1C)
  594. bool is_ulp = false;
  595. #endif
  596. Cy_SysLib_SetWaitStates(is_ulp, new_sysclk_freq_hz / 1000000);
  597. }
  598. // If after the change, update the clock
  599. if (!before_change)
  600. SystemCoreClockUpdate();
  601. }
  602. static cy_rslt_t _cyhal_clock_set_enabled_unsupported(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  603. {
  604. CY_UNUSED_PARAMETER(clock);
  605. CY_UNUSED_PARAMETER(enabled);
  606. CY_UNUSED_PARAMETER(wait_for_lock);
  607. CY_ASSERT(false); // Unhandled clock
  608. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  609. }
  610. static cy_rslt_t _cyhal_clock_set_frequency_unsupported(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  611. {
  612. CY_UNUSED_PARAMETER(clock);
  613. CY_UNUSED_PARAMETER(hz);
  614. CY_UNUSED_PARAMETER(tolerance);
  615. CY_ASSERT(false); // Unhandled clock
  616. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  617. }
  618. static cy_rslt_t _cyhal_clock_set_divider_unsupported(cyhal_clock_t *clock, uint32_t divider)
  619. {
  620. CY_UNUSED_PARAMETER(clock);
  621. CY_UNUSED_PARAMETER(divider);
  622. CY_ASSERT(false); // Unhandled clock
  623. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  624. }
  625. static cy_rslt_t _cyhal_clock_set_source_unsupported(cyhal_clock_t *clock, const cyhal_clock_t *source)
  626. {
  627. CY_UNUSED_PARAMETER(clock);
  628. CY_UNUSED_PARAMETER(source);
  629. CY_ASSERT(false); // Unhandled clock
  630. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  631. }
  632. static bool _cyhal_clock_is_enabled_true(const cyhal_clock_t *clock)
  633. {
  634. CY_UNUSED_PARAMETER(clock);
  635. return true;
  636. }
  637. static cy_rslt_t _cyhal_clock_get_sources_none(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  638. {
  639. CY_UNUSED_PARAMETER(clock);
  640. CY_UNUSED_PARAMETER(sources);
  641. *count = 0;
  642. return CY_RSLT_SUCCESS;
  643. }
  644. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_HF[] =
  645. {
  646. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  647. &CYHAL_CLOCK_RSC_FLL,
  648. #endif
  649. #if defined(COMPONENT_CAT1A)
  650. #if (_CYHAL_SRSS_NUM_PLL > 0)
  651. &CYHAL_CLOCK_RSC_PLL[0],
  652. #endif
  653. #if (_CYHAL_SRSS_NUM_PLL > 1)
  654. &CYHAL_CLOCK_RSC_PLL[1],
  655. #endif
  656. #if (_CYHAL_SRSS_NUM_PLL > 2)
  657. &CYHAL_CLOCK_RSC_PLL[2],
  658. #endif
  659. #if (_CYHAL_SRSS_NUM_PLL > 3)
  660. &CYHAL_CLOCK_RSC_PLL[3],
  661. #endif
  662. #if (_CYHAL_SRSS_NUM_PLL > 4)
  663. &CYHAL_CLOCK_RSC_PLL[4],
  664. #endif
  665. #if (_CYHAL_SRSS_NUM_PLL > 5)
  666. &CYHAL_CLOCK_RSC_PLL[5],
  667. #endif
  668. #if (_CYHAL_SRSS_NUM_PLL > 6)
  669. &CYHAL_CLOCK_RSC_PLL[6],
  670. #endif
  671. #if (_CYHAL_SRSS_NUM_PLL > 7)
  672. &CYHAL_CLOCK_RSC_PLL[7],
  673. #endif
  674. #if (_CYHAL_SRSS_NUM_PLL > 8)
  675. &CYHAL_CLOCK_RSC_PLL[8],
  676. #endif
  677. #if (_CYHAL_SRSS_NUM_PLL > 9)
  678. &CYHAL_CLOCK_RSC_PLL[9],
  679. #endif
  680. #if (_CYHAL_SRSS_NUM_PLL > 10)
  681. &CYHAL_CLOCK_RSC_PLL[10],
  682. #endif
  683. #if (_CYHAL_SRSS_NUM_PLL > 11)
  684. &CYHAL_CLOCK_RSC_PLL[11],
  685. #endif
  686. #if (_CYHAL_SRSS_NUM_PLL > 12)
  687. &CYHAL_CLOCK_RSC_PLL[12],
  688. #endif
  689. #if (_CYHAL_SRSS_NUM_PLL > 13)
  690. &CYHAL_CLOCK_RSC_PLL[13],
  691. #endif
  692. #elif defined(COMPONENT_CAT1C)
  693. #if (SRSS_NUM_PLL200M > 0)
  694. &CYHAL_CLOCK_RSC_PLL200M[0],
  695. #endif
  696. #if (SRSS_NUM_PLL200M > 1)
  697. &CYHAL_CLOCK_RSC_PLL200M[1],
  698. #endif
  699. #if (SRSS_NUM_PLL200M > 2)
  700. &CYHAL_CLOCK_RSC_PLL200M[2],
  701. #endif
  702. #if (SRSS_NUM_PLL200M > 3)
  703. &CYHAL_CLOCK_RSC_PLL200M[3],
  704. #endif
  705. #if (SRSS_NUM_PLL200M > 4)
  706. &CYHAL_CLOCK_RSC_PLL200M[4],
  707. #endif
  708. #if (SRSS_NUM_PLL200M > 5)
  709. &CYHAL_CLOCK_RSC_PLL200M[5],
  710. #endif
  711. #if (SRSS_NUM_PLL200M > 6)
  712. &CYHAL_CLOCK_RSC_PLL200M[6],
  713. #endif
  714. #if (SRSS_NUM_PLL200M > 7)
  715. &CYHAL_CLOCK_RSC_PLL200M[7],
  716. #endif
  717. #if (SRSS_NUM_PLL200M > 8)
  718. &CYHAL_CLOCK_RSC_PLL200M[8],
  719. #endif
  720. #if (SRSS_NUM_PLL200M > 9)
  721. &CYHAL_CLOCK_RSC_PLL200M[9],
  722. #endif
  723. #if (SRSS_NUM_PLL200M > 10)
  724. &CYHAL_CLOCK_RSC_PLL200M[10],
  725. #endif
  726. #if (SRSS_NUM_PLL200M > 11)
  727. &CYHAL_CLOCK_RSC_PLL200M[11],
  728. #endif
  729. #if (SRSS_NUM_PLL200M > 12)
  730. &CYHAL_CLOCK_RSC_PLL200M[12],
  731. #endif
  732. #if (SRSS_NUM_PLL200M > 13)
  733. &CYHAL_CLOCK_RSC_PLL200M[13],
  734. #endif
  735. #if (SRSS_NUM_PLL200M > 14)
  736. &CYHAL_CLOCK_RSC_PLL200M[14],
  737. #endif
  738. #if (SRSS_NUM_PLL200M > 15)
  739. &CYHAL_CLOCK_RSC_PLL200M[15],
  740. #endif
  741. #if (SRSS_NUM_PLL400M > 0)
  742. &CYHAL_CLOCK_RSC_PLL400M[0],
  743. #endif
  744. #if (SRSS_NUM_PLL400M > 1)
  745. &CYHAL_CLOCK_RSC_PLL400M[1],
  746. #endif
  747. #if (SRSS_NUM_PLL400M > 2)
  748. &CYHAL_CLOCK_RSC_PLL400M[2],
  749. #endif
  750. #if (SRSS_NUM_PLL400M > 3)
  751. &CYHAL_CLOCK_RSC_PLL400M[3],
  752. #endif
  753. #if (SRSS_NUM_PLL400M > 4)
  754. &CYHAL_CLOCK_RSC_PLL400M[4],
  755. #endif
  756. #if (SRSS_NUM_PLL400M > 5)
  757. &CYHAL_CLOCK_RSC_PLL400M[5],
  758. #endif
  759. #if (SRSS_NUM_PLL400M > 6)
  760. &CYHAL_CLOCK_RSC_PLL400M[6],
  761. #endif
  762. #if (SRSS_NUM_PLL400M > 7)
  763. &CYHAL_CLOCK_RSC_PLL400M[7],
  764. #endif
  765. #if (SRSS_NUM_PLL400M > 8)
  766. &CYHAL_CLOCK_RSC_PLL400M[8],
  767. #endif
  768. #if (SRSS_NUM_PLL400M > 9)
  769. &CYHAL_CLOCK_RSC_PLL400M[9],
  770. #endif
  771. #if (SRSS_NUM_PLL400M > 10)
  772. &CYHAL_CLOCK_RSC_PLL400M[10],
  773. #endif
  774. #if (SRSS_NUM_PLL400M > 11)
  775. &CYHAL_CLOCK_RSC_PLL400M[11],
  776. #endif
  777. #if (SRSS_NUM_PLL400M > 12)
  778. &CYHAL_CLOCK_RSC_PLL400M[12],
  779. #endif
  780. #if (SRSS_NUM_PLL400M > 13)
  781. &CYHAL_CLOCK_RSC_PLL400M[13],
  782. #endif
  783. #if (SRSS_NUM_PLL400M > 14)
  784. &CYHAL_CLOCK_RSC_PLL400M[14],
  785. #endif
  786. #if (SRSS_NUM_PLL400M > 15)
  787. &CYHAL_CLOCK_RSC_PLL400M[15],
  788. #endif
  789. #elif defined(COMPONENT_CAT1D)
  790. #if (SRSS_NUM_DPLL_LP > 0)
  791. &CYHAL_CLOCK_RSC_DPLL_LP[0],
  792. #endif
  793. #if (SRSS_NUM_DPLL_LP > 1)
  794. &CYHAL_CLOCK_RSC_DPLL_LP[1],
  795. #endif
  796. #if (SRSS_NUM_DPLL_LP > 2)
  797. &CYHAL_CLOCK_RSC_DPLL_LP[2],
  798. #endif
  799. #if (SRSS_NUM_DPLL_LP > 3)
  800. &CYHAL_CLOCK_RSC_DPLL_LP[3],
  801. #endif
  802. #if (SRSS_NUM_DPLL_LP > 4)
  803. &CYHAL_CLOCK_RSC_DPLL_LP[4],
  804. #endif
  805. #if (SRSS_NUM_DPLL_LP > 5)
  806. &CYHAL_CLOCK_RSC_DPLL_LP[5],
  807. #endif
  808. #if (SRSS_NUM_DPLL_LP > 6)
  809. &CYHAL_CLOCK_RSC_DPLL_LP[6],
  810. #endif
  811. #if (SRSS_NUM_DPLL_LP > 7)
  812. &CYHAL_CLOCK_RSC_DPLL_LP[7],
  813. #endif
  814. #if (SRSS_NUM_DPLL_LP > 8)
  815. &CYHAL_CLOCK_RSC_DPLL_LP[8],
  816. #endif
  817. #if (SRSS_NUM_DPLL_LP > 9)
  818. &CYHAL_CLOCK_RSC_DPLL_LP[9],
  819. #endif
  820. #if (SRSS_NUM_DPLL_LP > 10)
  821. &CYHAL_CLOCK_RSC_DPLL_LP[10],
  822. #endif
  823. #if (SRSS_NUM_DPLL_LP > 11)
  824. &CYHAL_CLOCK_RSC_DPLL_LP[11],
  825. #endif
  826. #if (SRSS_NUM_DPLL_LP > 12)
  827. &CYHAL_CLOCK_RSC_DPLL_LP[12],
  828. #endif
  829. #if (SRSS_NUM_DPLL_LP > 13)
  830. &CYHAL_CLOCK_RSC_DPLL_LP[13],
  831. #endif
  832. #if (SRSS_NUM_DPLL_LP > 14)
  833. &CYHAL_CLOCK_RSC_DPLL_LP[14],
  834. #endif
  835. #if (SRSS_NUM_DPLL_LP > 15)
  836. &CYHAL_CLOCK_RSC_DPLL_LP[15],
  837. #endif
  838. #if (SRSS_NUM_DPLL_HP > 0)
  839. &CYHAL_CLOCK_RSC_DPLL_HP[0],
  840. #endif
  841. #if (SRSS_NUM_DPLL_HP > 1)
  842. &CYHAL_CLOCK_RSC_DPLL_HP[1],
  843. #endif
  844. #if (SRSS_NUM_DPLL_HP > 2)
  845. &CYHAL_CLOCK_RSC_DPLL_HP[2],
  846. #endif
  847. #if (SRSS_NUM_DPLL_HP > 3)
  848. &CYHAL_CLOCK_RSC_DPLL_HP[3],
  849. #endif
  850. #if (SRSS_NUM_DPLL_HP > 4)
  851. &CYHAL_CLOCK_RSC_DPLL_HP[4],
  852. #endif
  853. #if (SRSS_NUM_DPLL_HP > 5)
  854. &CYHAL_CLOCK_RSC_DPLL_HP[5],
  855. #endif
  856. #if (SRSS_NUM_DPLL_HP > 6)
  857. &CYHAL_CLOCK_RSC_DPLL_HP[6],
  858. #endif
  859. #if (SRSS_NUM_DPLL_HP > 7)
  860. &CYHAL_CLOCK_RSC_DPLL_HP[7],
  861. #endif
  862. #if (SRSS_NUM_DPLL_HP > 8)
  863. &CYHAL_CLOCK_RSC_DPLL_HP[8],
  864. #endif
  865. #if (SRSS_NUM_DPLL_HP > 9)
  866. &CYHAL_CLOCK_RSC_DPLL_HP[9],
  867. #endif
  868. #if (SRSS_NUM_DPLL_HP > 10)
  869. &CYHAL_CLOCK_RSC_DPLL_HP[10],
  870. #endif
  871. #if (SRSS_NUM_DPLL_HP > 11)
  872. &CYHAL_CLOCK_RSC_DPLL_HP[11],
  873. #endif
  874. #if (SRSS_NUM_DPLL_HP > 12)
  875. &CYHAL_CLOCK_RSC_DPLL_HP[12],
  876. #endif
  877. #if (SRSS_NUM_DPLL_HP > 13)
  878. &CYHAL_CLOCK_RSC_DPLL_HP[13],
  879. #endif
  880. #if (SRSS_NUM_DPLL_HP > 14)
  881. &CYHAL_CLOCK_RSC_DPLL_HP[14],
  882. #endif
  883. #if (SRSS_NUM_DPLL_HP > 15)
  884. &CYHAL_CLOCK_RSC_DPLL_HP[15],
  885. #endif
  886. #endif
  887. &CYHAL_CLOCK_RSC_PATHMUX[0],
  888. #if (SRSS_NUM_CLKPATH > 1)
  889. &CYHAL_CLOCK_RSC_PATHMUX[1],
  890. #endif
  891. #if (SRSS_NUM_CLKPATH > 2)
  892. &CYHAL_CLOCK_RSC_PATHMUX[2],
  893. #endif
  894. #if (SRSS_NUM_CLKPATH > 3)
  895. &CYHAL_CLOCK_RSC_PATHMUX[3],
  896. #endif
  897. #if (SRSS_NUM_CLKPATH > 4)
  898. &CYHAL_CLOCK_RSC_PATHMUX[4],
  899. #endif
  900. #if (SRSS_NUM_CLKPATH > 5)
  901. &CYHAL_CLOCK_RSC_PATHMUX[5],
  902. #endif
  903. #if (SRSS_NUM_CLKPATH > 6)
  904. &CYHAL_CLOCK_RSC_PATHMUX[6],
  905. #endif
  906. #if (SRSS_NUM_CLKPATH > 7)
  907. &CYHAL_CLOCK_RSC_PATHMUX[7],
  908. #endif
  909. #if (SRSS_NUM_CLKPATH > 8)
  910. &CYHAL_CLOCK_RSC_PATHMUX[8],
  911. #endif
  912. #if (SRSS_NUM_CLKPATH > 9)
  913. &CYHAL_CLOCK_RSC_PATHMUX[9],
  914. #endif
  915. #if (SRSS_NUM_CLKPATH > 10)
  916. &CYHAL_CLOCK_RSC_PATHMUX[10],
  917. #endif
  918. #if (SRSS_NUM_CLKPATH > 11)
  919. &CYHAL_CLOCK_RSC_PATHMUX[11],
  920. #endif
  921. #if (SRSS_NUM_CLKPATH > 12)
  922. &CYHAL_CLOCK_RSC_PATHMUX[12],
  923. #endif
  924. #if (SRSS_NUM_CLKPATH > 13)
  925. &CYHAL_CLOCK_RSC_PATHMUX[13],
  926. #endif
  927. #if (SRSS_NUM_CLKPATH > 14)
  928. &CYHAL_CLOCK_RSC_PATHMUX[14],
  929. #endif
  930. #if (SRSS_NUM_CLKPATH > 15)
  931. &CYHAL_CLOCK_RSC_PATHMUX[15],
  932. #endif
  933. };
  934. #if defined (COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  935. static cy_rslt_t _cyhal_clock_get_sources_peri_peripheral(uint8_t idx, const cyhal_resource_inst_t **sources[], uint32_t *count)
  936. {
  937. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_PERI[SRSS_NUM_HFROOT] =
  938. {
  939. &CYHAL_CLOCK_RSC_HF[0],
  940. #if (SRSS_NUM_HFROOT > 1)
  941. &CYHAL_CLOCK_RSC_HF[1],
  942. #endif
  943. #if (SRSS_NUM_HFROOT > 2)
  944. &CYHAL_CLOCK_RSC_HF[2],
  945. #endif
  946. #if (SRSS_NUM_HFROOT > 3)
  947. &CYHAL_CLOCK_RSC_HF[3],
  948. #endif
  949. #if (SRSS_NUM_HFROOT > 4)
  950. &CYHAL_CLOCK_RSC_HF[4],
  951. #endif
  952. #if (SRSS_NUM_HFROOT > 5)
  953. &CYHAL_CLOCK_RSC_HF[5],
  954. #endif
  955. #if (SRSS_NUM_HFROOT > 6)
  956. &CYHAL_CLOCK_RSC_HF[6],
  957. #endif
  958. #if (SRSS_NUM_HFROOT > 7)
  959. &CYHAL_CLOCK_RSC_HF[7],
  960. #endif
  961. #if (SRSS_NUM_HFROOT > 8)
  962. &CYHAL_CLOCK_RSC_HF[8],
  963. #endif
  964. #if (SRSS_NUM_HFROOT > 9)
  965. &CYHAL_CLOCK_RSC_HF[9],
  966. #endif
  967. #if (SRSS_NUM_HFROOT > 10)
  968. &CYHAL_CLOCK_RSC_HF[10],
  969. #endif
  970. #if (SRSS_NUM_HFROOT > 11)
  971. &CYHAL_CLOCK_RSC_HF[11],
  972. #endif
  973. #if (SRSS_NUM_HFROOT > 12)
  974. &CYHAL_CLOCK_RSC_HF[12],
  975. #endif
  976. #if (SRSS_NUM_HFROOT > 13)
  977. &CYHAL_CLOCK_RSC_HF[13],
  978. #endif
  979. #if (SRSS_NUM_HFROOT > 14)
  980. &CYHAL_CLOCK_RSC_HF[14],
  981. #endif
  982. #if (SRSS_NUM_HFROOT > 15)
  983. &CYHAL_CLOCK_RSC_HF[15],
  984. #endif
  985. };
  986. *sources = &(_CYHAL_CLOCK_SOURCE_PERI[idx]);
  987. *count = 1;
  988. return CY_RSLT_SUCCESS;
  989. }
  990. #endif
  991. // IMO
  992. static uint32_t _cyhal_clock_get_frequency_imo(const cyhal_clock_t *clock)
  993. {
  994. CY_UNUSED_PARAMETER(clock);
  995. return CY_SYSCLK_IMO_FREQ;
  996. }
  997. // ECO
  998. #if SRSS_ECO_PRESENT
  999. static bool _cyhal_clock_is_enabled_eco(const cyhal_clock_t *clock)
  1000. {
  1001. CY_UNUSED_PARAMETER(clock);
  1002. return 0u != (SRSS_CLK_ECO_CONFIG & SRSS_CLK_ECO_CONFIG_ECO_EN_Msk);
  1003. }
  1004. static cy_rslt_t _cyhal_clock_set_enabled_eco(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1005. {
  1006. CY_UNUSED_PARAMETER(clock);
  1007. if (enabled)
  1008. {
  1009. if (0u != (SRSS_CLK_ECO_CONFIG & SRSS_CLK_ECO_CONFIG_ECO_EN_Msk))
  1010. {
  1011. // Already enabled
  1012. if (wait_for_lock)
  1013. {
  1014. for (int t = 0; t < 3 && Cy_SysClk_EcoGetStatus() != CY_SYSCLK_ECOSTAT_STABLE; ++t)
  1015. {
  1016. cyhal_system_delay_us(1000UL);
  1017. }
  1018. return Cy_SysClk_EcoGetStatus() == CY_SYSCLK_ECOSTAT_STABLE
  1019. ? CY_RSLT_SUCCESS
  1020. : CY_SYSCLK_TIMEOUT;
  1021. }
  1022. return CY_RSLT_SUCCESS;
  1023. }
  1024. else
  1025. {
  1026. return Cy_SysClk_EcoEnable(wait_for_lock ? 3000UL : 0UL);
  1027. }
  1028. }
  1029. else
  1030. {
  1031. Cy_SysClk_EcoDisable();
  1032. return CY_RSLT_SUCCESS;
  1033. }
  1034. }
  1035. static uint32_t _cyhal_clock_get_frequency_eco(const cyhal_clock_t *clock)
  1036. {
  1037. CY_UNUSED_PARAMETER(clock);
  1038. return Cy_SysClk_EcoGetFrequency();
  1039. }
  1040. #endif
  1041. // EXT
  1042. static bool _cyhal_clock_is_enabled_ext(const cyhal_clock_t *clock)
  1043. {
  1044. CY_UNUSED_PARAMETER(clock);
  1045. return (Cy_SysClk_ExtClkGetFrequency() > 0);
  1046. }
  1047. static uint32_t _cyhal_clock_get_frequency_ext(const cyhal_clock_t *clock)
  1048. {
  1049. CY_UNUSED_PARAMETER(clock);
  1050. return Cy_SysClk_ExtClkGetFrequency();
  1051. }
  1052. static cy_rslt_t _cyhal_clock_set_frequency_ext(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  1053. {
  1054. CY_UNUSED_PARAMETER(clock);
  1055. CY_UNUSED_PARAMETER(tolerance);
  1056. Cy_SysClk_ExtClkSetFrequency(hz);
  1057. return CY_RSLT_SUCCESS;
  1058. }
  1059. // ALTHF
  1060. #if SRSS_ALTHF_PRESENT
  1061. static bool _cyhal_clock_is_enabled_althf(const cyhal_clock_t *clock)
  1062. {
  1063. CY_UNUSED_PARAMETER(clock);
  1064. return (Cy_SysClk_AltHfGetFrequency() > 0);
  1065. }
  1066. static uint32_t _cyhal_clock_get_frequency_althf(const cyhal_clock_t *clock)
  1067. {
  1068. CY_UNUSED_PARAMETER(clock);
  1069. return Cy_SysClk_AltHfGetFrequency();
  1070. }
  1071. #endif
  1072. // ALTLF
  1073. #if SRSS_ALTLF_PRESENT
  1074. static bool _cyhal_clock_is_enabled_altlf(const cyhal_clock_t *clock)
  1075. {
  1076. CY_UNUSED_PARAMETER(clock);
  1077. return Cy_SysClk_AltLfIsEnabled();
  1078. }
  1079. static uint32_t _cyhal_clock_get_frequency_altlf(const cyhal_clock_t *clock)
  1080. {
  1081. CY_UNUSED_PARAMETER(clock);
  1082. return Cy_SysClk_AltLfGetFrequency();
  1083. }
  1084. #endif
  1085. // IHO
  1086. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  1087. static bool _cyhal_clock_is_enabled_iho(const cyhal_clock_t *clock)
  1088. {
  1089. CY_UNUSED_PARAMETER(clock);
  1090. return Cy_SysClk_IhoIsEnabled();
  1091. }
  1092. static cy_rslt_t _cyhal_clock_set_enabled_iho(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1093. {
  1094. CY_UNUSED_PARAMETER(clock);
  1095. CY_UNUSED_PARAMETER(wait_for_lock);
  1096. if (enabled)
  1097. Cy_SysClk_IhoEnable();
  1098. else
  1099. Cy_SysClk_IhoDisable();
  1100. return CY_RSLT_SUCCESS;
  1101. }
  1102. static uint32_t _cyhal_clock_get_frequency_iho(const cyhal_clock_t *clock)
  1103. {
  1104. CY_UNUSED_PARAMETER(clock);
  1105. return CY_SYSCLK_IHO_FREQ;
  1106. }
  1107. #endif
  1108. // ILO
  1109. static bool _cyhal_clock_is_enabled_ilo(const cyhal_clock_t *clock)
  1110. {
  1111. CY_UNUSED_PARAMETER(clock);
  1112. #if defined(COMPONENT_CAT1C)
  1113. return Cy_SysClk_IloSrcIsEnabled(clock->channel);
  1114. #else
  1115. return Cy_SysClk_IloIsEnabled();
  1116. #endif
  1117. }
  1118. static cy_rslt_t _cyhal_clock_set_enabled_ilo(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1119. {
  1120. CY_UNUSED_PARAMETER(clock);
  1121. CY_UNUSED_PARAMETER(wait_for_lock);
  1122. #if defined(COMPONENT_CAT1C)
  1123. if (enabled)
  1124. {
  1125. Cy_SysPm_BgRefCtrl(true);
  1126. Cy_WDT_Unlock();
  1127. Cy_SysClk_IloSrcEnable(clock->channel);
  1128. Cy_WDT_Lock();
  1129. }
  1130. else
  1131. {
  1132. Cy_SysPm_BgRefCtrl(false);
  1133. Cy_WDT_Unlock();
  1134. Cy_SysClk_IloSrcDisable(clock->channel);
  1135. Cy_WDT_Lock();
  1136. }
  1137. #else
  1138. if (enabled)
  1139. Cy_SysClk_IloEnable();
  1140. else
  1141. Cy_SysClk_IloDisable();
  1142. #endif
  1143. return CY_RSLT_SUCCESS;
  1144. }
  1145. static uint32_t _cyhal_clock_get_frequency_ilo(const cyhal_clock_t *clock)
  1146. {
  1147. CY_UNUSED_PARAMETER(clock);
  1148. return CY_SYSCLK_ILO_FREQ;
  1149. }
  1150. // PILO
  1151. #if _CYHAL_SRSS_PILO_PRESENT
  1152. static bool _cyhal_clock_is_enabled_pilo(const cyhal_clock_t *clock)
  1153. {
  1154. CY_UNUSED_PARAMETER(clock);
  1155. return Cy_SysClk_PiloIsEnabled();
  1156. }
  1157. static cy_rslt_t _cyhal_clock_set_enabled_pilo(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1158. {
  1159. CY_UNUSED_PARAMETER(clock);
  1160. CY_UNUSED_PARAMETER(wait_for_lock);
  1161. if (enabled)
  1162. Cy_SysClk_PiloEnable();
  1163. else
  1164. Cy_SysClk_PiloDisable();
  1165. return CY_RSLT_SUCCESS;
  1166. }
  1167. static uint32_t _cyhal_clock_get_frequency_pilo(const cyhal_clock_t *clock)
  1168. {
  1169. CY_UNUSED_PARAMETER(clock);
  1170. return CY_SYSCLK_PILO_FREQ;
  1171. }
  1172. #endif
  1173. // WCO
  1174. #if SRSS_BACKUP_PRESENT
  1175. static bool _cyhal_clock_is_enabled_wco(const cyhal_clock_t *clock)
  1176. {
  1177. CY_UNUSED_PARAMETER(clock);
  1178. #if defined(CY_IP_MXS28SRSS)
  1179. return 0u != (BACKUP_CTL & BACKUP_WCO_CTL_WCO_EN_Msk);
  1180. #else
  1181. return 0u != (BACKUP_CTL & BACKUP_CTL_WCO_EN_Msk);
  1182. #endif
  1183. }
  1184. static cy_rslt_t _cyhal_clock_set_enabled_wco(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1185. {
  1186. CY_UNUSED_PARAMETER(clock);
  1187. if (enabled)
  1188. {
  1189. cy_rslt_t rslt = Cy_SysClk_WcoEnable(wait_for_lock ? 1000000UL : 0UL);
  1190. // Ignore CY_SYSCLK_TIMEOUT unless wait_for_lock is true
  1191. return wait_for_lock ? rslt : CY_RSLT_SUCCESS;
  1192. }
  1193. else
  1194. {
  1195. Cy_SysClk_WcoDisable();
  1196. return CY_RSLT_SUCCESS;
  1197. }
  1198. }
  1199. static uint32_t _cyhal_clock_get_frequency_wco(const cyhal_clock_t *clock)
  1200. {
  1201. CY_UNUSED_PARAMETER(clock);
  1202. return CY_SYSCLK_WCO_FREQ;
  1203. }
  1204. #endif
  1205. // MFO
  1206. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  1207. static bool _cyhal_clock_is_enabled_mfo(const cyhal_clock_t *clock)
  1208. {
  1209. CY_UNUSED_PARAMETER(clock);
  1210. return Cy_SysClk_MfoIsEnabled();
  1211. }
  1212. static cy_rslt_t _cyhal_clock_set_enabled_mfo(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1213. {
  1214. CY_UNUSED_PARAMETER(clock);
  1215. CY_UNUSED_PARAMETER(wait_for_lock);
  1216. if (enabled)
  1217. Cy_SysClk_MfoEnable(true);
  1218. else
  1219. Cy_SysClk_MfoDisable();
  1220. return CY_RSLT_SUCCESS;
  1221. }
  1222. static uint32_t _cyhal_clock_get_frequency_mfo(const cyhal_clock_t *clock)
  1223. {
  1224. CY_UNUSED_PARAMETER(clock);
  1225. return CY_SYSCLK_MFO_FREQ;
  1226. }
  1227. static cy_rslt_t _cyhal_clock_get_sources_mfo(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1228. {
  1229. CY_UNUSED_PARAMETER(clock);
  1230. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_MFO[] =
  1231. {
  1232. &CYHAL_CLOCK_RSC_IMO,
  1233. };
  1234. *sources = _CYHAL_CLOCK_SOURCE_MFO;
  1235. *count = sizeof(_CYHAL_CLOCK_SOURCE_MFO) / sizeof(_CYHAL_CLOCK_SOURCE_MFO[0]);
  1236. return CY_RSLT_SUCCESS;
  1237. }
  1238. #endif
  1239. // PathMux
  1240. static uint32_t _cyhal_clock_get_frequency_pathmux(const cyhal_clock_t *clock)
  1241. {
  1242. return Cy_SysClk_ClkPathMuxGetFrequency(clock->channel);
  1243. }
  1244. static cy_rslt_t _cyhal_clock_get_sources_pathmux(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1245. {
  1246. CY_UNUSED_PARAMETER(clock);
  1247. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_PATHMUX[] =
  1248. {
  1249. &CYHAL_CLOCK_RSC_IMO,
  1250. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  1251. &CYHAL_CLOCK_RSC_IHO,
  1252. #endif
  1253. #if SRSS_ECO_PRESENT
  1254. &CYHAL_CLOCK_RSC_ECO,
  1255. #endif
  1256. &CYHAL_CLOCK_RSC_EXT,
  1257. #if SRSS_ALTHF_PRESENT
  1258. &CYHAL_CLOCK_RSC_ALTHF,
  1259. #endif
  1260. #if defined(COMPONENT_CAT1C)
  1261. &CYHAL_CLOCK_RSC_ILO[0],
  1262. #if (SRSS_HT_VARIANT > 0)
  1263. &CYHAL_CLOCK_RSC_ILO[1],
  1264. #endif
  1265. /* There are no ILO clock available on CAT1D */
  1266. #elif !defined(COMPONENT_CAT1D)
  1267. &CYHAL_CLOCK_RSC_ILO,
  1268. #endif
  1269. #if _CYHAL_SRSS_PILO_PRESENT
  1270. &CYHAL_CLOCK_RSC_PILO,
  1271. #endif
  1272. #if SRSS_BACKUP_PRESENT
  1273. &CYHAL_CLOCK_RSC_WCO,
  1274. #endif
  1275. #if SRSS_ALTLF_PRESENT
  1276. &CYHAL_CLOCK_RSC_ALTLF,
  1277. #endif
  1278. };
  1279. *sources = _CYHAL_CLOCK_SOURCE_PATHMUX;
  1280. *count = sizeof(_CYHAL_CLOCK_SOURCE_PATHMUX) / sizeof(_CYHAL_CLOCK_SOURCE_PATHMUX[0]);
  1281. return CY_RSLT_SUCCESS;
  1282. }
  1283. static cy_rslt_t _cyhal_clock_set_source_pathmux(cyhal_clock_t *clock, const cyhal_clock_t *source)
  1284. {
  1285. uint32_t new_freq;
  1286. cy_en_clkpath_in_sources_t clkpath_src;
  1287. switch (source->block)
  1288. {
  1289. case CYHAL_CLOCK_BLOCK_IMO:
  1290. clkpath_src = CY_SYSCLK_CLKPATH_IN_IMO;
  1291. new_freq = CY_SYSCLK_IMO_FREQ;
  1292. break;
  1293. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  1294. case CYHAL_CLOCK_BLOCK_IHO:
  1295. clkpath_src = CY_SYSCLK_CLKPATH_IN_IHO;
  1296. new_freq = CY_SYSCLK_IHO_FREQ;
  1297. break;
  1298. #endif
  1299. case CYHAL_CLOCK_BLOCK_EXT:
  1300. clkpath_src = CY_SYSCLK_CLKPATH_IN_EXT;
  1301. new_freq = Cy_SysClk_ExtClkGetFrequency();
  1302. break;
  1303. #if SRSS_ECO_PRESENT
  1304. case CYHAL_CLOCK_BLOCK_ECO:
  1305. clkpath_src = CY_SYSCLK_CLKPATH_IN_ECO;
  1306. new_freq = Cy_SysClk_EcoGetFrequency();
  1307. break;
  1308. #endif
  1309. #if SRSS_ALTHF_PRESENT
  1310. case CYHAL_CLOCK_BLOCK_ALTHF:
  1311. clkpath_src = CY_SYSCLK_CLKPATH_IN_ALTHF;
  1312. new_freq = Cy_SysClk_AltHfGetFrequency();
  1313. break;
  1314. #endif
  1315. case CYHAL_CLOCK_BLOCK_ILO:
  1316. #if defined(COMPONENT_CAT1C)
  1317. if (1 == source->channel)
  1318. {
  1319. clkpath_src = CY_SYSCLK_CLKPATH_IN_ILO1;
  1320. new_freq = CY_SYSCLK_ILO_FREQ;
  1321. }
  1322. else
  1323. #endif
  1324. {
  1325. clkpath_src = CY_SYSCLK_CLKPATH_IN_ILO;
  1326. new_freq = CY_SYSCLK_ILO_FREQ;
  1327. }
  1328. break;
  1329. #if SRSS_BACKUP_PRESENT
  1330. case CYHAL_CLOCK_BLOCK_WCO:
  1331. clkpath_src = CY_SYSCLK_CLKPATH_IN_WCO;
  1332. new_freq = CY_SYSCLK_WCO_FREQ;
  1333. break;
  1334. #endif
  1335. #if SRSS_ALTLF_PRESENT
  1336. case CYHAL_CLOCK_BLOCK_ALTLF:
  1337. clkpath_src = CY_SYSCLK_CLKPATH_IN_ALTLF;
  1338. new_freq = Cy_SysClk_AltLfGetFrequency();
  1339. break;
  1340. #endif
  1341. #if _CYHAL_SRSS_PILO_PRESENT
  1342. case CYHAL_CLOCK_BLOCK_PILO:
  1343. clkpath_src = CY_SYSCLK_CLKPATH_IN_PILO;
  1344. new_freq = CY_SYSCLK_PILO_FREQ;
  1345. break;
  1346. #endif
  1347. default:
  1348. CY_ASSERT(false); //Unhandled clock
  1349. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  1350. }
  1351. uint32_t old_hf_freq = Cy_SysClk_ClkHfGetFrequency(0);
  1352. uint32_t new_hf_freq = new_freq >> ((uint8_t)Cy_SysClk_ClkHfGetDivider(0));
  1353. bool is_sysclk_path = (clock->channel == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
  1354. if (is_sysclk_path)
  1355. _cyhal_clock_update_system_state(true, old_hf_freq, new_hf_freq);
  1356. cy_rslt_t rslt = Cy_SysClk_ClkPathSetSource(clock->channel, clkpath_src);
  1357. if (is_sysclk_path)
  1358. {
  1359. if (CY_RSLT_SUCCESS == rslt)
  1360. _cyhal_clock_update_system_state(false, old_hf_freq, new_hf_freq);
  1361. else // revert the change if there was one
  1362. _cyhal_clock_update_system_state(false, new_hf_freq, old_hf_freq);
  1363. }
  1364. return rslt;
  1365. }
  1366. // FLL
  1367. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  1368. static bool _cyhal_clock_is_enabled_fll(const cyhal_clock_t *clock)
  1369. {
  1370. CY_UNUSED_PARAMETER(clock);
  1371. return Cy_SysClk_FllIsEnabled();
  1372. }
  1373. static cy_rslt_t _cyhal_clock_set_enabled_fll(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1374. {
  1375. CY_UNUSED_PARAMETER(clock);
  1376. CY_UNUSED_PARAMETER(wait_for_lock);
  1377. cy_stc_fll_manual_config_t cfg;
  1378. Cy_SysClk_FllGetConfiguration(&cfg);
  1379. uint32_t new_freq, old_freq;
  1380. uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
  1381. uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(0);
  1382. uint32_t fll_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * (uint64_t)cfg.fllMult, (uint32_t)cfg.refDiv * ((cfg.enableOutputDiv) ? 2UL : 1UL));
  1383. if (enabled)
  1384. {
  1385. new_freq = fll_freq >> div;
  1386. old_freq = src_freq >> div;
  1387. }
  1388. else
  1389. {
  1390. new_freq = src_freq >> div;
  1391. old_freq = fll_freq >> div;
  1392. }
  1393. bool fll_sources_hf0 = (0 == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
  1394. if (fll_sources_hf0)
  1395. _cyhal_clock_update_system_state(true, old_freq, new_freq);
  1396. cy_rslt_t rslt = (enabled)
  1397. ? Cy_SysClk_FllEnable(wait_for_lock ? _CYHAL_CLOCK_FLL_LOCK_TIME : 0UL)
  1398. : Cy_SysClk_FllDisable();
  1399. if (fll_sources_hf0)
  1400. {
  1401. if (CY_RSLT_SUCCESS == rslt)
  1402. _cyhal_clock_update_system_state(false, old_freq, new_freq);
  1403. else // revert the change if there was one
  1404. _cyhal_clock_update_system_state(false, new_freq, old_freq);
  1405. }
  1406. return rslt;
  1407. }
  1408. static uint32_t _cyhal_clock_get_frequency_fll(const cyhal_clock_t *clock)
  1409. {
  1410. CY_UNUSED_PARAMETER(clock);
  1411. return Cy_SysClk_ClkPathGetFrequency(0);
  1412. }
  1413. static cy_rslt_t _cyhal_clock_set_frequency_fll(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  1414. {
  1415. CY_UNUSED_PARAMETER(clock);
  1416. CY_UNUSED_PARAMETER(tolerance);
  1417. cy_rslt_t rslt = CY_RSLT_SUCCESS;
  1418. cy_stc_fll_manual_config_t cfg;
  1419. Cy_SysClk_FllGetConfiguration(&cfg);
  1420. uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(0);
  1421. if (0 == src_freq)
  1422. rslt = CYHAL_CLOCK_RSLT_ERR_SOURCE;
  1423. else
  1424. {
  1425. uint32_t old_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * (uint64_t)cfg.fllMult, (uint32_t)cfg.refDiv * ((cfg.enableOutputDiv) ? 2UL : 1UL));
  1426. uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
  1427. uint32_t old_hf_freq = old_freq >> div;
  1428. uint32_t new_hf_freq = hz /*new_freq*/ >> div;
  1429. bool fll_sources_hf0 = (0 == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
  1430. if (fll_sources_hf0)
  1431. _cyhal_clock_update_system_state(true, old_hf_freq, new_hf_freq);
  1432. bool enabled = Cy_SysClk_FllIsEnabled();
  1433. if (enabled)
  1434. rslt = Cy_SysClk_FllDisable();
  1435. if (CY_RSLT_SUCCESS == rslt)
  1436. {
  1437. rslt = Cy_SysClk_FllConfigure(src_freq, hz/*new_freq*/, CY_SYSCLK_FLLPLL_OUTPUT_AUTO);
  1438. if (enabled)
  1439. {
  1440. cy_rslt_t rslt2 = Cy_SysClk_FllEnable(_CYHAL_CLOCK_FLL_LOCK_TIME);
  1441. if (CY_RSLT_SUCCESS == rslt)
  1442. rslt = rslt2;
  1443. }
  1444. }
  1445. if (fll_sources_hf0)
  1446. {
  1447. if (CY_RSLT_SUCCESS == rslt)
  1448. _cyhal_clock_update_system_state(false, old_hf_freq, new_hf_freq);
  1449. else // revert the change if there was one
  1450. _cyhal_clock_update_system_state(false, new_hf_freq, old_hf_freq);
  1451. }
  1452. }
  1453. return rslt;
  1454. }
  1455. static cy_rslt_t _cyhal_clock_get_sources_fll(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1456. {
  1457. CY_UNUSED_PARAMETER(clock);
  1458. *sources = &(_CYHAL_CLOCK_SOURCE_HF[1 + _CYHAL_SRSS_NUM_PLL]);
  1459. *count = 1;
  1460. return CY_RSLT_SUCCESS;
  1461. }
  1462. #endif
  1463. // PLL
  1464. #if (_CYHAL_SRSS_NUM_PLL > 0)
  1465. static bool _cyhal_clock_is_enabled_pll(const cyhal_clock_t *clock)
  1466. {
  1467. #if defined(COMPONENT_CAT1C)
  1468. if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
  1469. {
  1470. return Cy_SysClk_PllIsEnabled(clock->channel + 1 + SRSS_NUM_PLL400M);
  1471. }
  1472. #endif
  1473. return Cy_SysClk_PllIsEnabled(clock->channel + 1);
  1474. }
  1475. static void _cyhal_clock_extract_pll_params(cyhal_clock_t *clock, cy_stc_pll_manual_config_t *cfg, uint64_t *feedbackDiv,
  1476. uint32_t *referenceDiv, uint32_t *outputDiv)
  1477. {
  1478. #if defined (CY_IP_MXS40SRSS)
  1479. *feedbackDiv = cfg->feedbackDiv;
  1480. *referenceDiv = cfg->referenceDiv;
  1481. *outputDiv = cfg->outputDiv;
  1482. CY_UNUSED_PARAMETER(clock);
  1483. #elif defined (CY_IP_MXS22SRSS)
  1484. if (clock->block == CYHAL_CLOCK_BLOCK_DPLL_LP)
  1485. {
  1486. *feedbackDiv = cfg->lpPllCfg->feedbackDiv;
  1487. *referenceDiv = cfg->lpPllCfg->referenceDiv;
  1488. *outputDiv = cfg->lpPllCfg->outputDiv;
  1489. }
  1490. else if (clock->block == CYHAL_CLOCK_BLOCK_DPLL_HP)
  1491. {
  1492. /* Per IP block documentation, each divider requires +1 for correct output clock calculation */
  1493. *feedbackDiv = cfg->hpPllCfg->nDiv + 1;
  1494. *referenceDiv = cfg->hpPllCfg->pDiv + 1;
  1495. *outputDiv = cfg->hpPllCfg->kDiv + 1;
  1496. }
  1497. #else
  1498. #error "Unhandled SRSS block type"
  1499. #endif /* defined (CY_IP_MXS40SRSS) or defined (CY_IP_MXS22SRSS) or other (error) */
  1500. }
  1501. static cy_rslt_t _cyhal_clock_set_enabled_pll(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1502. {
  1503. CY_UNUSED_PARAMETER(clock);
  1504. CY_UNUSED_PARAMETER(wait_for_lock);
  1505. //pll_idx is the path mux index (eg PLL number + 1) as used by PDL APIs
  1506. uint32_t pll_idx = clock->channel + 1;
  1507. #if defined(COMPONENT_CAT1C)
  1508. if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
  1509. {
  1510. pll_idx = pll_idx + SRSS_NUM_PLL400M;
  1511. }
  1512. #endif
  1513. cy_stc_pll_manual_config_t cfg;
  1514. cy_rslt_t rslt = Cy_SysClk_PllGetConfiguration(pll_idx, &cfg);
  1515. if (CY_RSLT_SUCCESS == rslt)
  1516. {
  1517. uint32_t new_freq, old_freq;
  1518. uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
  1519. uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(pll_idx);
  1520. uint64_t feedbackDiv = 0;
  1521. uint32_t referenceDiv = 0;
  1522. uint32_t outputDiv = 0;
  1523. _cyhal_clock_extract_pll_params(clock, &cfg, &feedbackDiv, &referenceDiv, &outputDiv);
  1524. uint32_t pll_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * feedbackDiv, referenceDiv * outputDiv);
  1525. if (enabled)
  1526. {
  1527. new_freq = pll_freq >> div;
  1528. old_freq = src_freq >> div;
  1529. }
  1530. else
  1531. {
  1532. new_freq = src_freq >> div;
  1533. old_freq = pll_freq >> div;
  1534. }
  1535. bool pll_sources_hf0 = (pll_idx == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
  1536. if (pll_sources_hf0)
  1537. _cyhal_clock_update_system_state(true, old_freq, new_freq);
  1538. rslt = (enabled)
  1539. ? Cy_SysClk_PllEnable(pll_idx, wait_for_lock ? _CYHAL_CLOCK_PLL_LOCK_TIME : 0UL)
  1540. : Cy_SysClk_PllDisable(pll_idx);
  1541. if (pll_sources_hf0)
  1542. {
  1543. if (CY_RSLT_SUCCESS == rslt)
  1544. _cyhal_clock_update_system_state(false, old_freq, new_freq);
  1545. else // revert the change if there was one
  1546. _cyhal_clock_update_system_state(false, new_freq, old_freq);
  1547. }
  1548. }
  1549. return rslt;
  1550. }
  1551. static uint32_t _cyhal_clock_get_frequency_pll(const cyhal_clock_t *clock)
  1552. {
  1553. #if defined(COMPONENT_CAT1C)
  1554. if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
  1555. {
  1556. return Cy_SysClk_ClkPathGetFrequency(clock->channel + 1 + SRSS_NUM_PLL400M);
  1557. }
  1558. #endif
  1559. return Cy_SysClk_ClkPathGetFrequency(clock->channel + 1);
  1560. }
  1561. static cy_rslt_t _cyhal_clock_set_frequency_pll(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  1562. {
  1563. CY_UNUSED_PARAMETER(tolerance);
  1564. cy_stc_pll_manual_config_t cfg;
  1565. uint8_t pll_idx = clock->channel + 1;
  1566. #if defined(COMPONENT_CAT1C)
  1567. if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
  1568. {
  1569. pll_idx = pll_idx + SRSS_NUM_PLL400M;
  1570. }
  1571. #endif
  1572. cy_rslt_t rslt = Cy_SysClk_PllGetConfiguration(pll_idx, &cfg);
  1573. if (CY_RSLT_SUCCESS == rslt)
  1574. {
  1575. bool enabled = Cy_SysClk_PllIsEnabled(pll_idx);
  1576. if (enabled)
  1577. rslt = Cy_SysClk_PllDisable(pll_idx);
  1578. if (CY_RSLT_SUCCESS == rslt)
  1579. {
  1580. uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(pll_idx);
  1581. uint64_t feedbackDiv = 0;
  1582. uint32_t referenceDiv = 0;
  1583. uint32_t outputDiv = 0;
  1584. _cyhal_clock_extract_pll_params(clock, &cfg, &feedbackDiv, &referenceDiv, &outputDiv);
  1585. uint32_t old_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * feedbackDiv, referenceDiv * outputDiv);
  1586. uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
  1587. uint32_t old_hf_freq = old_freq >> div;
  1588. uint32_t new_hf_freq = hz/*new_freq*/ >> div;
  1589. bool pll_sources_hf0 = (pll_idx == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
  1590. if (pll_sources_hf0)
  1591. _cyhal_clock_update_system_state(true, old_hf_freq, new_hf_freq);
  1592. uint32_t input_hz = Cy_SysClk_ClkPathMuxGetFrequency(pll_idx);
  1593. cy_stc_pll_config_t cfg2 =
  1594. {
  1595. .inputFreq = input_hz,
  1596. .outputFreq = hz/*new_freq*/,
  1597. .lfMode = false,
  1598. .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO,
  1599. };
  1600. rslt = Cy_SysClk_PllConfigure(pll_idx, &cfg2);
  1601. if (enabled)
  1602. {
  1603. cy_rslt_t rslt2 = Cy_SysClk_PllEnable(pll_idx, _CYHAL_CLOCK_PLL_LOCK_TIME);
  1604. if (CY_RSLT_SUCCESS == rslt)
  1605. rslt = rslt2;
  1606. }
  1607. if (pll_sources_hf0)
  1608. {
  1609. if (CY_RSLT_SUCCESS == rslt)
  1610. _cyhal_clock_update_system_state(false, old_hf_freq, new_hf_freq);
  1611. else // revert the change if there was one
  1612. _cyhal_clock_update_system_state(false, new_hf_freq, old_hf_freq);
  1613. }
  1614. }
  1615. }
  1616. return rslt;
  1617. }
  1618. static cy_rslt_t _cyhal_clock_get_sources_pll(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1619. {
  1620. // _CYHAL_CLOCK_SOURCE_HF has entries for FLL, PLL[n], PathMux[m]
  1621. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  1622. #if defined(COMPONENT_CAT1C)
  1623. uint8_t channel = clock->channel;
  1624. if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
  1625. {
  1626. channel = channel + SRSS_NUM_PLL400M;
  1627. }
  1628. *sources = &(_CYHAL_CLOCK_SOURCE_HF[2 + _CYHAL_SRSS_NUM_PLL + channel]);
  1629. #endif
  1630. *sources = &(_CYHAL_CLOCK_SOURCE_HF[2 + _CYHAL_SRSS_NUM_PLL + clock->channel]); /* PATHMUX[n] entry is after the FLL (+1), PLLs (+num) and FLL path mux (+1) */
  1631. #else
  1632. *sources = &(_CYHAL_CLOCK_SOURCE_HF[_CYHAL_SRSS_NUM_PLL + clock->channel]); /* PATHMUX[n] entry is after the PLLs (+num) */
  1633. #endif
  1634. *count = 1;
  1635. return CY_RSLT_SUCCESS;
  1636. }
  1637. #endif
  1638. // MF
  1639. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  1640. static bool _cyhal_clock_is_enabled_mf(const cyhal_clock_t *clock)
  1641. {
  1642. CY_UNUSED_PARAMETER(clock);
  1643. return Cy_SysClk_ClkMfIsEnabled();
  1644. }
  1645. static cy_rslt_t _cyhal_clock_set_enabled_mf(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1646. {
  1647. CY_UNUSED_PARAMETER(clock);
  1648. CY_UNUSED_PARAMETER(wait_for_lock);
  1649. if (enabled)
  1650. Cy_SysClk_ClkMfEnable();
  1651. else
  1652. Cy_SysClk_ClkMfDisable();
  1653. return CY_RSLT_SUCCESS;
  1654. }
  1655. static uint32_t _cyhal_clock_get_frequency_mf(const cyhal_clock_t *clock)
  1656. {
  1657. CY_UNUSED_PARAMETER(clock);
  1658. return Cy_SysClk_ClkMfGetFrequency();
  1659. }
  1660. static cy_rslt_t _cyhal_clock_set_frequency_mf(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  1661. {
  1662. CY_UNUSED_PARAMETER(clock);
  1663. uint32_t div;
  1664. cy_rslt_t rslt = _cyhal_clock_compute_div(CY_SYSCLK_MFO_FREQ, hz, 8, tolerance, &div);
  1665. if(false == CY_SYSCLK_IS_MF_DIVIDER_VALID(div))
  1666. rslt = CYHAL_CLOCK_RSLT_ERR_FREQ;
  1667. if (CY_RSLT_SUCCESS == rslt)
  1668. Cy_SysClk_ClkMfSetDivider(div);
  1669. return rslt;
  1670. }
  1671. static cy_rslt_t _cyhal_clock_set_divider_mf(cyhal_clock_t *clock, uint32_t divider)
  1672. {
  1673. CY_UNUSED_PARAMETER(clock);
  1674. if (divider <= 256)
  1675. {
  1676. Cy_SysClk_ClkMfSetDivider(divider);
  1677. return CY_RSLT_SUCCESS;
  1678. }
  1679. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  1680. }
  1681. static cy_rslt_t _cyhal_clock_get_sources_mf(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1682. {
  1683. CY_UNUSED_PARAMETER(clock);
  1684. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_MF[] =
  1685. {
  1686. &CYHAL_CLOCK_RSC_MFO,
  1687. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D) /* CAT1A only supports driving from the MFO */
  1688. &CYHAL_CLOCK_RSC_ILO,
  1689. #if SRSS_BACKUP_PRESENT
  1690. &CYHAL_CLOCK_RSC_WCO,
  1691. #endif
  1692. #if _CYHAL_SRSS_PILO_PRESENT
  1693. &CYHAL_CLOCK_RSC_PILO,
  1694. #endif
  1695. #if SRSS_ALTLF_PRESENT
  1696. &CYHAL_CLOCK_RSC_ALTLF,
  1697. #endif
  1698. #if SRSS_ECO_PRESENT
  1699. &CYHAL_CLOCK_RSC_ECO_PRESCALER,
  1700. #endif
  1701. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  1702. &CYHAL_CLOCK_RSC_LPECO_PRESCALER,
  1703. #endif
  1704. #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D) */
  1705. };
  1706. *sources = _CYHAL_CLOCK_SOURCE_MF;
  1707. *count = sizeof(_CYHAL_CLOCK_SOURCE_MF) / sizeof(_CYHAL_CLOCK_SOURCE_MF[0]);
  1708. return CY_RSLT_SUCCESS;
  1709. }
  1710. static cy_rslt_t _cyhal_clock_set_source_mf(cyhal_clock_t *clock, const cyhal_clock_t *source)
  1711. {
  1712. CY_UNUSED_PARAMETER(clock);
  1713. switch(source->block)
  1714. {
  1715. case CYHAL_CLOCK_BLOCK_MFO:
  1716. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_MFO);
  1717. return CY_RSLT_SUCCESS;
  1718. case CYHAL_CLOCK_BLOCK_ILO:
  1719. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_ILO);
  1720. return CY_RSLT_SUCCESS;
  1721. #if SRSS_BACKUP_PRESENT
  1722. case CYHAL_CLOCK_BLOCK_WCO:
  1723. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_WCO);
  1724. return CY_RSLT_SUCCESS;
  1725. #endif
  1726. #if _CYHAL_SRSS_PILO_PRESENT
  1727. case CYHAL_CLOCK_BLOCK_PILO:
  1728. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_PILO);
  1729. return CY_RSLT_SUCCESS;
  1730. #endif
  1731. #if SRSS_ALTLF_PRESENT
  1732. case CYHAL_CLOCK_BLOCK_ALTLF:
  1733. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_ALTLF);
  1734. return CY_RSLT_SUCCESS;
  1735. #endif
  1736. #if SRSS_ECO_PRESENT
  1737. case CYHAL_CLOCK_BLOCK_ECO_PRESCALER:
  1738. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_ECO_PRESCALER);
  1739. return CY_RSLT_SUCCESS;
  1740. #endif
  1741. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  1742. case CYHAL_CLOCK_BLOCK_LPECO_PRESCALER:
  1743. Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_LPECO);
  1744. return CY_RSLT_SUCCESS;
  1745. #endif
  1746. default:
  1747. CY_ASSERT(false); //Unhandled clock
  1748. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  1749. }
  1750. }
  1751. #endif
  1752. // HF
  1753. static bool _cyhal_clock_is_enabled_hf(const cyhal_clock_t *clock)
  1754. {
  1755. return Cy_SysClk_ClkHfIsEnabled(clock->channel);
  1756. }
  1757. static cy_rslt_t _cyhal_clock_set_enabled_hf(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  1758. {
  1759. CY_UNUSED_PARAMETER(wait_for_lock);
  1760. return (enabled)
  1761. ? Cy_SysClk_ClkHfEnable(clock->channel)
  1762. : Cy_SysClk_ClkHfDisable(clock->channel);
  1763. }
  1764. static uint32_t _cyhal_clock_get_frequency_hf(const cyhal_clock_t *clock)
  1765. {
  1766. return Cy_SysClk_ClkHfGetFrequency(clock->channel);
  1767. }
  1768. static cy_rslt_t _cyhal_clock_set_divider_hf(cyhal_clock_t *clock, uint32_t divider)
  1769. {
  1770. cy_en_clkhf_dividers_t new_div;
  1771. switch (divider)
  1772. {
  1773. case 1:
  1774. new_div = CY_SYSCLK_CLKHF_NO_DIVIDE;
  1775. break;
  1776. case 2:
  1777. new_div = CY_SYSCLK_CLKHF_DIVIDE_BY_2;
  1778. break;
  1779. case 4:
  1780. new_div = CY_SYSCLK_CLKHF_DIVIDE_BY_4;
  1781. break;
  1782. case 8:
  1783. new_div = CY_SYSCLK_CLKHF_DIVIDE_BY_8;
  1784. break;
  1785. default:
  1786. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  1787. }
  1788. /* Only used if updating HFClk 0 */
  1789. uint32_t old_div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
  1790. uint32_t src = (uint32_t)Cy_SysClk_ClkHfGetSource(0);
  1791. uint32_t path_freq = Cy_SysClk_ClkPathGetFrequency(src);
  1792. uint32_t old_freq = path_freq >> old_div;
  1793. uint32_t new_freq = path_freq >> ((uint32_t)new_div);
  1794. if (0 == clock->channel)
  1795. _cyhal_clock_update_system_state(true, old_freq, new_freq);
  1796. cy_rslt_t rslt = (cy_rslt_t)Cy_SysClk_ClkHfSetDivider(clock->channel, new_div);
  1797. if (0 == clock->channel)
  1798. {
  1799. if (CY_RSLT_SUCCESS == rslt)
  1800. _cyhal_clock_update_system_state(false, old_freq, new_freq);
  1801. else // revert the change if there was one
  1802. _cyhal_clock_update_system_state(false, new_freq, old_freq);
  1803. }
  1804. return rslt;
  1805. }
  1806. static cy_rslt_t _cyhal_clock_get_sources_hf(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1807. {
  1808. CY_UNUSED_PARAMETER(clock);
  1809. *sources = _CYHAL_CLOCK_SOURCE_HF;
  1810. *count = sizeof(_CYHAL_CLOCK_SOURCE_HF) / sizeof(_CYHAL_CLOCK_SOURCE_HF[0]);
  1811. return CY_RSLT_SUCCESS;
  1812. }
  1813. static cy_rslt_t _cyhal_clock_set_source_hf(cyhal_clock_t *clock, const cyhal_clock_t *source)
  1814. {
  1815. uint32_t new_src;
  1816. if (source->block == CYHAL_CLOCK_BLOCK_PATHMUX || source->block == CYHAL_CLOCK_BLOCK_FLL)
  1817. new_src = source->channel;
  1818. #if defined(COMPONENT_CAT1A)
  1819. else if (source->block == CYHAL_CLOCK_BLOCK_PLL)
  1820. #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
  1821. else if ((source->block == CYHAL_CLOCK_BLOCK_PLL200) || (source->block == CYHAL_CLOCK_BLOCK_PLL400))
  1822. #elif defined(COMPONENT_CAT1D)
  1823. else if ((source->block == CYHAL_CLOCK_BLOCK_DPLL_LP) || (source->block == CYHAL_CLOCK_BLOCK_DPLL_HP))
  1824. #endif
  1825. {
  1826. new_src = source->channel + 1;
  1827. #if defined(SRSS_NUM_PLL400M) && (defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C))
  1828. if (source->block == CYHAL_CLOCK_BLOCK_PLL200)
  1829. {
  1830. /* As PLL200 and PLL400 has their own channels and PLL400 sits on lower PATH_MUX numbers
  1831. * we need to increase calculated source num with respect to number of PLL400's */
  1832. new_src += SRSS_NUM_PLL400M;
  1833. }
  1834. #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) */
  1835. }
  1836. else
  1837. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  1838. /* Only used if updating HFClk 0 */
  1839. uint32_t div_hf0 = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
  1840. uint32_t old_src_hf0 = (uint32_t)Cy_SysClk_ClkHfGetSource(0);
  1841. uint32_t old_freq_hf0 = Cy_SysClk_ClkPathGetFrequency(old_src_hf0) >> div_hf0;
  1842. uint32_t new_freq_hf0 = Cy_SysClk_ClkPathGetFrequency(new_src) >> div_hf0;
  1843. if (0 == clock->channel)
  1844. _cyhal_clock_update_system_state(true, old_freq_hf0, new_freq_hf0);
  1845. cy_rslt_t rslt = Cy_SysClk_ClkHfSetSource(clock->channel, (cy_en_clkhf_in_sources_t)new_src);
  1846. if (0 == clock->channel)
  1847. {
  1848. if (CY_RSLT_SUCCESS == rslt)
  1849. _cyhal_clock_update_system_state(false, old_freq_hf0, new_freq_hf0);
  1850. else // revert the change if there was one
  1851. _cyhal_clock_update_system_state(false, new_freq_hf0, old_freq_hf0);
  1852. }
  1853. return rslt;
  1854. }
  1855. // LF
  1856. static uint32_t _cyhal_clock_get_frequency_lf(const cyhal_clock_t *clock)
  1857. {
  1858. CY_UNUSED_PARAMETER(clock);
  1859. return _cyhal_clock_get_lf_frequency();
  1860. }
  1861. static cy_rslt_t _cyhal_clock_get_sources_lf(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  1862. {
  1863. CY_UNUSED_PARAMETER(clock);
  1864. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_LF[] =
  1865. {
  1866. #if defined(COMPONENT_CAT1C)
  1867. &CYHAL_CLOCK_RSC_ILO[0],
  1868. #if (SRSS_HT_VARIANT > 0)
  1869. &CYHAL_CLOCK_RSC_ILO[1],
  1870. #endif
  1871. /* There are no ILO clock available on CAT1D */
  1872. #elif !defined(COMPONENT_CAT1D)
  1873. &CYHAL_CLOCK_RSC_ILO,
  1874. #endif
  1875. #if _CYHAL_SRSS_PILO_PRESENT
  1876. &CYHAL_CLOCK_RSC_PILO,
  1877. #endif
  1878. #if SRSS_BACKUP_PRESENT
  1879. &CYHAL_CLOCK_RSC_WCO,
  1880. #endif
  1881. #if SRSS_ALTLF_PRESENT
  1882. &CYHAL_CLOCK_RSC_ALTLF,
  1883. #endif
  1884. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  1885. #if SRSS_ECO_PRESENT
  1886. &CYHAL_CLOCK_RSC_ECO_PRESCALER,
  1887. #endif
  1888. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  1889. &CYHAL_CLOCK_RSC_LPECO_PRESCALER,
  1890. #endif
  1891. #endif
  1892. };
  1893. *sources = _CYHAL_CLOCK_SOURCE_LF;
  1894. *count = sizeof(_CYHAL_CLOCK_SOURCE_LF) / sizeof(_CYHAL_CLOCK_SOURCE_LF[0]);
  1895. return CY_RSLT_SUCCESS;
  1896. }
  1897. static cy_rslt_t _cyhal_clock_set_source_lf(cyhal_clock_t *clock, const cyhal_clock_t *source)
  1898. {
  1899. CY_UNUSED_PARAMETER(clock);
  1900. cy_rslt_t result = CY_RSLT_SUCCESS;
  1901. #if defined(COMPONENT_CAT1C)
  1902. Cy_WDT_Unlock();
  1903. #endif
  1904. switch (source->block)
  1905. {
  1906. case CYHAL_CLOCK_BLOCK_ILO:
  1907. #if defined(COMPONENT_CAT1C)
  1908. if(1 == source->channel)
  1909. {
  1910. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO1);
  1911. }
  1912. else
  1913. #endif
  1914. {
  1915. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO);
  1916. }
  1917. break;
  1918. #if SRSS_BACKUP_PRESENT
  1919. case CYHAL_CLOCK_BLOCK_WCO:
  1920. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO);
  1921. break;
  1922. #endif
  1923. #if SRSS_ALTLF_PRESENT
  1924. case CYHAL_CLOCK_BLOCK_ALTLF:
  1925. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ALTLF);
  1926. break;
  1927. #endif
  1928. #if _CYHAL_SRSS_PILO_PRESENT
  1929. case CYHAL_CLOCK_BLOCK_PILO:
  1930. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_PILO);
  1931. break;
  1932. #endif
  1933. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  1934. #if SRSS_ECO_PRESENT
  1935. case CYHAL_CLOCK_BLOCK_ECO_PRESCALER:
  1936. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ECO_PRESCALER);
  1937. break;
  1938. #endif
  1939. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  1940. case CYHAL_CLOCK_BLOCK_LPECO_PRESCALER:
  1941. Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_LPECO_PRESCALER);
  1942. break;
  1943. #endif
  1944. #endif
  1945. default:
  1946. CY_ASSERT(false); //Unhandled clock
  1947. result = CYHAL_CLOCK_RSLT_ERR_SOURCE;
  1948. }
  1949. #if defined(COMPONENT_CAT1C)
  1950. Cy_WDT_Lock();
  1951. #endif
  1952. return result;
  1953. }
  1954. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  1955. // FAST
  1956. static uint32_t _cyhal_clock_get_frequency_fast(const cyhal_clock_t *clock)
  1957. {
  1958. CY_UNUSED_PARAMETER(clock);
  1959. #if defined(COMPONENT_CAT1A)
  1960. return Cy_SysClk_ClkFastGetFrequency();
  1961. #else
  1962. return Cy_SysClk_ClkFastSrcGetFrequency(clock->channel);
  1963. #endif
  1964. }
  1965. static cy_rslt_t _cyhal_clock_set_frequency_fast(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  1966. {
  1967. CY_UNUSED_PARAMETER(clock);
  1968. uint32_t div;
  1969. cy_rslt_t rslt;
  1970. #if defined(COMPONENT_CAT1A)
  1971. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(0);
  1972. rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
  1973. #else
  1974. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(1);
  1975. rslt = _cyhal_clock_compute_div(((uint64_t)input_hz) << 5, hz, 13, tolerance, &div);
  1976. #endif
  1977. if (CY_RSLT_SUCCESS == rslt)
  1978. {
  1979. #if defined(COMPONENT_CAT1A)
  1980. Cy_SysClk_ClkFastSetDivider((uint8_t)(div - 1));
  1981. #else
  1982. uint32_t div_int = (div >> 5) - 1;
  1983. uint32_t div_frac = div & 0x1F;
  1984. Cy_SysClk_ClkFastSrcSetDivider(clock->channel, (uint8_t)div_int, (uint8_t)div_frac);
  1985. Cy_SysLib_SetWaitStates(false, 340);
  1986. #endif
  1987. SystemCoreClockUpdate();
  1988. }
  1989. return rslt;
  1990. }
  1991. static cy_rslt_t _cyhal_clock_set_divider_fast(cyhal_clock_t *clock, uint32_t divider)
  1992. {
  1993. CY_UNUSED_PARAMETER(clock);
  1994. if (divider <= 256)
  1995. {
  1996. uint32_t divVal = divider - 1;
  1997. #if defined(COMPONENT_CAT1A)
  1998. Cy_SysClk_ClkFastSetDivider((uint8_t)divVal);
  1999. #else
  2000. Cy_SysClk_ClkFastSrcSetDivider(clock->channel, (uint8_t)divVal, 0);
  2001. #endif
  2002. SystemCoreClockUpdate();
  2003. return CY_RSLT_SUCCESS;
  2004. }
  2005. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  2006. }
  2007. static cy_rslt_t _cyhal_clock_get_sources_fast(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2008. {
  2009. CY_UNUSED_PARAMETER(clock);
  2010. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_FAST[] =
  2011. {
  2012. #if defined(COMPONENT_CAT1C)
  2013. &CYHAL_CLOCK_RSC_HF[1],
  2014. #else
  2015. &CYHAL_CLOCK_RSC_HF[0],
  2016. #endif
  2017. };
  2018. *sources = _CYHAL_CLOCK_SOURCE_FAST;
  2019. *count = sizeof(_CYHAL_CLOCK_SOURCE_FAST) / sizeof(_CYHAL_CLOCK_SOURCE_FAST[0]);
  2020. return CY_RSLT_SUCCESS;
  2021. }
  2022. // SLOW
  2023. static uint32_t _cyhal_clock_get_frequency_slow(const cyhal_clock_t *clock)
  2024. {
  2025. CY_UNUSED_PARAMETER(clock);
  2026. return Cy_SysClk_ClkSlowGetFrequency();
  2027. }
  2028. static cy_rslt_t _cyhal_clock_set_frequency_slow(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  2029. {
  2030. CY_UNUSED_PARAMETER(clock);
  2031. uint32_t div;
  2032. uint32_t input_hz = Cy_SysClk_ClkPeriGetFrequency();
  2033. cy_rslt_t rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
  2034. if (CY_RSLT_SUCCESS == rslt)
  2035. {
  2036. Cy_SysClk_ClkSlowSetDivider((uint8_t)(div - 1));
  2037. SystemCoreClockUpdate();
  2038. }
  2039. return rslt;
  2040. }
  2041. static cy_rslt_t _cyhal_clock_set_divider_slow(cyhal_clock_t *clock, uint32_t divider)
  2042. {
  2043. CY_UNUSED_PARAMETER(clock);
  2044. if (divider <= 256)
  2045. {
  2046. uint32_t divVal = divider - 1;
  2047. Cy_SysClk_ClkSlowSetDivider((uint8_t)divVal);
  2048. SystemCoreClockUpdate();
  2049. return CY_RSLT_SUCCESS;
  2050. }
  2051. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  2052. }
  2053. static cy_rslt_t _cyhal_clock_get_sources_slow(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2054. {
  2055. CY_UNUSED_PARAMETER(clock);
  2056. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_SLOW[] =
  2057. {
  2058. #if defined(COMPONENT_CAT1A)
  2059. &CYHAL_CLOCK_RSC_PERI,
  2060. #else
  2061. &CYHAL_CLOCK_RSC_MEM,
  2062. #endif
  2063. };
  2064. *sources = _CYHAL_CLOCK_SOURCE_SLOW;
  2065. *count = sizeof(_CYHAL_CLOCK_SOURCE_SLOW) / sizeof(_CYHAL_CLOCK_SOURCE_SLOW[0]);
  2066. return CY_RSLT_SUCCESS;
  2067. }
  2068. #endif
  2069. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  2070. #if SRSS_ECO_PRESENT
  2071. // ECO_PRESCALER - NOTE: This clock is not supported on any device yet
  2072. static uint32_t _cyhal_clock_get_frequency_eco_prescaler(const cyhal_clock_t *clock)
  2073. {
  2074. CY_UNUSED_PARAMETER(clock);
  2075. //return Cy_SysClk_EcoPrescalerGetFrequency();
  2076. return 0;
  2077. }
  2078. static cy_rslt_t _cyhal_clock_set_divider_eco_prescaler(cyhal_clock_t *clock, uint32_t divider)
  2079. {
  2080. CY_UNUSED_PARAMETER(clock);
  2081. CY_UNUSED_PARAMETER(divider);
  2082. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  2083. }
  2084. static cy_rslt_t _cyhal_clock_get_sources_eco_prescaler(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2085. {
  2086. CY_UNUSED_PARAMETER(clock);
  2087. CY_UNUSED_PARAMETER(sources);
  2088. CY_UNUSED_PARAMETER(count);
  2089. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  2090. }
  2091. #endif
  2092. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  2093. // LPECO_PRESCALER - NOTE: This clock is not supported on any device yet
  2094. static uint32_t _cyhal_clock_get_frequency_lpeco_prescaler(const cyhal_clock_t *clock)
  2095. {
  2096. CY_UNUSED_PARAMETER(clock);
  2097. return Cy_SysClk_LpEcoPrescalerGetFrequency();
  2098. }
  2099. static cy_rslt_t _cyhal_clock_set_divider_lpeco_prescaler(cyhal_clock_t *clock, uint32_t divider)
  2100. {
  2101. CY_UNUSED_PARAMETER(clock);
  2102. CY_UNUSED_PARAMETER(divider);
  2103. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  2104. }
  2105. static cy_rslt_t _cyhal_clock_get_sources_lpeco_prescaler(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2106. {
  2107. CY_UNUSED_PARAMETER(clock);
  2108. CY_UNUSED_PARAMETER(sources);
  2109. CY_UNUSED_PARAMETER(count);
  2110. return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
  2111. }
  2112. #endif
  2113. #endif
  2114. // MEM
  2115. #if defined(COMPONENT_CAT1C)
  2116. static cy_rslt_t _cyhal_clock_set_divider_mem(cyhal_clock_t *clock, uint32_t divider)
  2117. {
  2118. CY_UNUSED_PARAMETER(clock);
  2119. if (divider <= 256)
  2120. {
  2121. uint32_t divVal = divider - 1;
  2122. Cy_SysClk_ClkMemSetDivider((uint8_t)divVal);
  2123. SystemCoreClockUpdate();
  2124. return CY_RSLT_SUCCESS;
  2125. }
  2126. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  2127. }
  2128. static uint32_t _cyhal_clock_get_frequency_mem(const cyhal_clock_t *clock)
  2129. {
  2130. CY_UNUSED_PARAMETER(clock);
  2131. return Cy_SysClk_ClkMemGetFrequency();
  2132. }
  2133. static cy_rslt_t _cyhal_clock_set_frequency_mem(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  2134. {
  2135. CY_UNUSED_PARAMETER(clock);
  2136. uint32_t div;
  2137. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(0);
  2138. cy_rslt_t rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
  2139. if (CY_RSLT_SUCCESS == rslt)
  2140. {
  2141. Cy_SysClk_ClkMemSetDivider((uint8_t)(div - 1));
  2142. SystemCoreClockUpdate();
  2143. }
  2144. return rslt;
  2145. }
  2146. static cy_rslt_t _cyhal_clock_get_sources_mem(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2147. {
  2148. CY_UNUSED_PARAMETER(clock);
  2149. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_MEM[] =
  2150. {
  2151. &CYHAL_CLOCK_RSC_HF[0],
  2152. };
  2153. *sources = _CYHAL_CLOCK_SOURCE_MEM;
  2154. *count = 1;
  2155. return CY_RSLT_SUCCESS;
  2156. }
  2157. #endif
  2158. // PERI
  2159. static uint32_t _cyhal_clock_get_frequency_peri(const cyhal_clock_t *clock)
  2160. {
  2161. CY_UNUSED_PARAMETER(clock);
  2162. #if defined(COMPONENT_CAT1C)
  2163. if(clock->channel == 0)
  2164. #endif
  2165. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2166. {
  2167. return Cy_SysClk_ClkPeriGetFrequency();
  2168. }
  2169. #endif
  2170. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  2171. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
  2172. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(clock->channel);
  2173. #elif defined(COMPONENT_CAT1D)
  2174. uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
  2175. uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
  2176. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
  2177. #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) or defined(COMPONENT_CAT1D) or other */
  2178. return Cy_SysClk_ClkHfGetFrequency(hfclk) / (Cy_SysClk_PeriGroupGetDivider(clock->channel) + 1);
  2179. #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D) */
  2180. }
  2181. static cy_rslt_t _cyhal_clock_set_frequency_peri(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  2182. {
  2183. CY_UNUSED_PARAMETER(clock);
  2184. uint32_t div;
  2185. cy_rslt_t rslt;
  2186. #if defined(COMPONENT_CAT1C)
  2187. if(clock->channel == 0)
  2188. #endif
  2189. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2190. {
  2191. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(0);
  2192. rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
  2193. if (CY_RSLT_SUCCESS == rslt)
  2194. {
  2195. Cy_SysClk_ClkPeriSetDivider((uint8_t)(div - 1));
  2196. SystemCoreClockUpdate();
  2197. }
  2198. return rslt;
  2199. }
  2200. #endif
  2201. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  2202. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
  2203. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(clock->channel == 1 ? 1 : 0);
  2204. #elif defined(COMPONENT_CAT1D)
  2205. uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
  2206. uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
  2207. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(_cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group)));
  2208. #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) or defined(COMPONENT_CAT1D) */
  2209. rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
  2210. if (CY_RSLT_SUCCESS == rslt)
  2211. {
  2212. uint32_t group_num = clock->channel;
  2213. #if defined(COMPONENT_CAT1D)
  2214. /* I'm not completely confident in line below */
  2215. group_num += _VAL2FLD(PERI_GR_INST_NUM, instance);
  2216. #endif /* defined(COMPONENT_CAT1D) or other */
  2217. Cy_SysClk_PeriGroupSetDivider(group_num, (uint8_t)(div - 1));
  2218. }
  2219. return rslt;
  2220. #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D) */
  2221. }
  2222. static cy_rslt_t _cyhal_clock_set_divider_peri(cyhal_clock_t *clock, uint32_t divider)
  2223. {
  2224. CY_UNUSED_PARAMETER(clock);
  2225. if (divider <= 256)
  2226. {
  2227. uint32_t divVal = divider - 1;
  2228. #if defined(COMPONENT_CAT1C)
  2229. if (clock->channel == 0)
  2230. #endif
  2231. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2232. {
  2233. Cy_SysClk_ClkPeriSetDivider((uint8_t)divVal);
  2234. SystemCoreClockUpdate();
  2235. return CY_RSLT_SUCCESS;
  2236. }
  2237. #endif
  2238. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  2239. Cy_SysClk_PeriGroupSetDivider(clock->channel, (uint8_t)divVal);
  2240. SystemCoreClockUpdate();
  2241. return CY_RSLT_SUCCESS;
  2242. #endif
  2243. }
  2244. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  2245. }
  2246. static cy_rslt_t _cyhal_clock_get_sources_peri(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2247. {
  2248. #if defined(COMPONENT_CAT1A)
  2249. CY_UNUSED_PARAMETER(clock);
  2250. #endif
  2251. #if defined(COMPONENT_CAT1C)
  2252. if (clock->channel == 0)
  2253. #endif
  2254. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2255. {
  2256. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_PERI[] =
  2257. {
  2258. &CYHAL_CLOCK_RSC_HF[0],
  2259. };
  2260. *sources = _CYHAL_CLOCK_SOURCE_PERI;
  2261. *count = 1;
  2262. return CY_RSLT_SUCCESS;
  2263. }
  2264. #endif
  2265. #if defined (COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  2266. #if !defined(COMPONENT_CAT1D)
  2267. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(clock->channel);
  2268. #else /* defined(COMPONENT_CAT1D) */
  2269. uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
  2270. uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
  2271. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
  2272. #endif /* !defined(COMPONENT_CAT1D) or other */
  2273. return _cyhal_clock_get_sources_peri_peripheral(hfclk, sources, count);
  2274. #endif
  2275. }
  2276. // PUMP (only available on CAT1A and CAT1B devices)
  2277. #if defined (COMPONENT_CAT1A) || defined (COMPONENT_CAT1B)
  2278. static bool _cyhal_clock_is_enabled_pump(const cyhal_clock_t *clock)
  2279. {
  2280. CY_UNUSED_PARAMETER(clock);
  2281. return Cy_SysClk_ClkPumpIsEnabled();
  2282. }
  2283. static cy_rslt_t _cyhal_clock_set_enabled_pump(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  2284. {
  2285. CY_UNUSED_PARAMETER(clock);
  2286. CY_UNUSED_PARAMETER(wait_for_lock);
  2287. if (enabled)
  2288. Cy_SysClk_ClkPumpEnable();
  2289. else
  2290. Cy_SysClk_ClkPumpDisable();
  2291. return CY_RSLT_SUCCESS;
  2292. }
  2293. static uint32_t _cyhal_clock_get_frequency_pump(const cyhal_clock_t *clock)
  2294. {
  2295. CY_UNUSED_PARAMETER(clock);
  2296. return Cy_SysClk_ClkPumpGetFrequency();
  2297. }
  2298. static cy_rslt_t _cyhal_clock_set_divider_pump(cyhal_clock_t *clock, uint32_t divider)
  2299. {
  2300. CY_UNUSED_PARAMETER(clock);
  2301. cy_en_clkpump_divide_t divVal;
  2302. switch (divider)
  2303. {
  2304. case 1:
  2305. divVal = CY_SYSCLK_PUMP_NO_DIV;
  2306. break;
  2307. case 2:
  2308. divVal = CY_SYSCLK_PUMP_DIV_2;
  2309. break;
  2310. case 4:
  2311. divVal = CY_SYSCLK_PUMP_DIV_4;
  2312. break;
  2313. case 8:
  2314. divVal = CY_SYSCLK_PUMP_DIV_8;
  2315. break;
  2316. case 16:
  2317. divVal = CY_SYSCLK_PUMP_DIV_16;
  2318. break;
  2319. default:
  2320. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  2321. }
  2322. Cy_SysClk_ClkPumpSetDivider(divVal);
  2323. return CY_RSLT_SUCCESS;
  2324. }
  2325. #define _cyhal_clock_get_sources_pump _cyhal_clock_get_sources_hf
  2326. static cy_rslt_t _cyhal_clock_set_source_pump(cyhal_clock_t *clock, const cyhal_clock_t *source)
  2327. {
  2328. CY_UNUSED_PARAMETER(clock);
  2329. if (source->block == CYHAL_CLOCK_BLOCK_PATHMUX || source->block == CYHAL_CLOCK_BLOCK_FLL)
  2330. {
  2331. Cy_SysClk_ClkPumpSetSource((cy_en_clkpump_in_sources_t)source->channel);
  2332. return CY_RSLT_SUCCESS;
  2333. }
  2334. #if defined(COMPONENT_CAT1A)
  2335. else if (source->block == CYHAL_CLOCK_BLOCK_PLL)
  2336. #elif defined(COMPONENT_CAT1B)
  2337. else if ((source->block == CYHAL_CLOCK_BLOCK_PLL200) || (source->block == CYHAL_CLOCK_BLOCK_PLL400))
  2338. #endif
  2339. {
  2340. Cy_SysClk_ClkPumpSetSource((cy_en_clkpump_in_sources_t)(source->channel + 1));
  2341. return CY_RSLT_SUCCESS;
  2342. }
  2343. else
  2344. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  2345. }
  2346. #endif /* defined (COMPONENT_CAT1A) || defined (COMPONENT_CAT1B) */
  2347. // TIMER
  2348. // TODO: Need to enable timer functionality for CAT1C once PDL team updates clk_timer API's
  2349. #if defined(COMPONENT_CAT1A)
  2350. static bool _cyhal_clock_is_enabled_timer(const cyhal_clock_t *clock)
  2351. {
  2352. CY_UNUSED_PARAMETER(clock);
  2353. return Cy_SysClk_ClkTimerIsEnabled();
  2354. }
  2355. static cy_rslt_t _cyhal_clock_set_enabled_timer(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  2356. {
  2357. CY_UNUSED_PARAMETER(clock);
  2358. CY_UNUSED_PARAMETER(wait_for_lock);
  2359. if (enabled)
  2360. Cy_SysClk_ClkTimerEnable();
  2361. else
  2362. Cy_SysClk_ClkTimerDisable();
  2363. return CY_RSLT_SUCCESS;
  2364. }
  2365. static uint32_t _cyhal_clock_get_frequency_timer(const cyhal_clock_t *clock)
  2366. {
  2367. CY_UNUSED_PARAMETER(clock);
  2368. return Cy_SysClk_ClkTimerGetFrequency();
  2369. }
  2370. static cy_rslt_t _cyhal_clock_set_divider_timer(cyhal_clock_t *clock, uint32_t divider)
  2371. {
  2372. CY_UNUSED_PARAMETER(clock);
  2373. if (divider <= 256)
  2374. {
  2375. uint32_t divVal = divider - 1;
  2376. Cy_SysClk_ClkTimerSetDivider((uint8_t)divVal);
  2377. return CY_RSLT_SUCCESS;
  2378. }
  2379. return CYHAL_CLOCK_RSLT_ERR_FREQ;
  2380. }
  2381. static cy_rslt_t _cyhal_clock_get_sources_timer(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2382. {
  2383. CY_UNUSED_PARAMETER(clock);
  2384. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_TIMER[] =
  2385. {
  2386. &CYHAL_CLOCK_RSC_IMO,
  2387. &CYHAL_CLOCK_RSC_HF[0],
  2388. };
  2389. *sources = _CYHAL_CLOCK_SOURCE_TIMER;
  2390. *count = sizeof(_CYHAL_CLOCK_SOURCE_TIMER) / sizeof(_CYHAL_CLOCK_SOURCE_TIMER[0]);
  2391. return CY_RSLT_SUCCESS;
  2392. }
  2393. static cy_rslt_t _cyhal_clock_set_source_timer(cyhal_clock_t *clock, const cyhal_clock_t *source)
  2394. {
  2395. CY_UNUSED_PARAMETER(clock);
  2396. if (source->block == CYHAL_CLOCK_BLOCK_IMO)
  2397. {
  2398. Cy_SysClk_ClkTimerSetSource(CY_SYSCLK_CLKTIMER_IN_IMO);
  2399. return CY_RSLT_SUCCESS;
  2400. }
  2401. else if (source->block == CYHAL_CLOCK_BLOCK_HF && source->channel == 0)
  2402. {
  2403. Cy_SysClk_ClkTimerSetSource(CY_SYSCLK_CLKTIMER_IN_HF0_NODIV);
  2404. return CY_RSLT_SUCCESS;
  2405. }
  2406. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  2407. }
  2408. #endif
  2409. // BAK
  2410. static uint32_t _cyhal_clock_get_frequency_bak(const cyhal_clock_t *clock)
  2411. {
  2412. CY_UNUSED_PARAMETER(clock);
  2413. cy_en_clkbak_in_sources_t src = Cy_SysClk_ClkBakGetSource();
  2414. #if SRSS_BACKUP_PRESENT
  2415. if (src == CY_SYSCLK_BAK_IN_WCO)
  2416. return CY_SYSCLK_WCO_FREQ;
  2417. #else
  2418. (void)src;
  2419. #endif
  2420. return _cyhal_clock_get_lf_frequency();
  2421. }
  2422. static cy_rslt_t _cyhal_clock_get_sources_bak(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2423. {
  2424. CY_UNUSED_PARAMETER(clock);
  2425. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_BAK[] =
  2426. {
  2427. &CYHAL_CLOCK_RSC_LF,
  2428. #if SRSS_BACKUP_PRESENT
  2429. &CYHAL_CLOCK_RSC_WCO,
  2430. #endif
  2431. #if defined(COMPONENT_CAT1C)
  2432. &CYHAL_CLOCK_RSC_ILO[0],
  2433. #elif defined(COMPONENT_CAT1B)
  2434. &CYHAL_CLOCK_RSC_ILO,
  2435. #endif
  2436. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  2437. #if _CYHAL_SRSS_PILO_PRESENT
  2438. &CYHAL_CLOCK_RSC_PILO,
  2439. #endif
  2440. #endif
  2441. #if defined(COMPONENT_CAT1B)
  2442. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  2443. &CYHAL_CLOCK_RSC_LPECO_PRESCALER,
  2444. #endif
  2445. #endif
  2446. };
  2447. *sources = _CYHAL_CLOCK_SOURCE_BAK;
  2448. *count = sizeof(_CYHAL_CLOCK_SOURCE_BAK) / sizeof(_CYHAL_CLOCK_SOURCE_BAK[0]);
  2449. return CY_RSLT_SUCCESS;
  2450. }
  2451. static cy_rslt_t _cyhal_clock_set_source_bak(cyhal_clock_t *clock, const cyhal_clock_t *source)
  2452. {
  2453. CY_UNUSED_PARAMETER(clock);
  2454. switch (source->block)
  2455. {
  2456. case CYHAL_CLOCK_BLOCK_WCO:
  2457. Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_WCO);
  2458. return CY_RSLT_SUCCESS;
  2459. case CYHAL_CLOCK_BLOCK_LF:
  2460. Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_CLKLF);
  2461. return CY_RSLT_SUCCESS;
  2462. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
  2463. case CYHAL_CLOCK_BLOCK_ILO:
  2464. if(1 == source->channel)
  2465. {
  2466. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  2467. }
  2468. Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_ILO);
  2469. return CY_RSLT_SUCCESS;
  2470. #if _CYHAL_SRSS_PILO_PRESENT
  2471. case CYHAL_CLOCK_BLOCK_PILO:
  2472. Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_PILO);
  2473. return CY_RSLT_SUCCESS;
  2474. #endif
  2475. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  2476. case CYHAL_CLOCK_BLOCK_LPECO_PRESCALER:
  2477. Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_LPECO_PRESCALER);
  2478. return CY_RSLT_SUCCESS;
  2479. #endif
  2480. #endif
  2481. default:
  2482. CY_ASSERT(false); //Unhandled clock
  2483. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  2484. }
  2485. }
  2486. // ALT_SYS_TICK
  2487. static uint32_t _cyhal_clock_get_frequency_alt_sys_tick(const cyhal_clock_t *clock)
  2488. {
  2489. CY_UNUSED_PARAMETER(clock);
  2490. CY_ASSERT(false); // This is not supported at this time
  2491. return 0;
  2492. }
  2493. static cy_rslt_t _cyhal_clock_get_sources_alt_sys_tick(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2494. {
  2495. CY_UNUSED_PARAMETER(clock);
  2496. static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_ALT_SYS_TICK[] =
  2497. {
  2498. &CYHAL_CLOCK_RSC_IMO,
  2499. #if SRSS_ECO_PRESENT
  2500. &CYHAL_CLOCK_RSC_ECO,
  2501. #endif
  2502. &CYHAL_CLOCK_RSC_LF,
  2503. #if defined(COMPONENT_CAT1A)
  2504. &CYHAL_CLOCK_RSC_TIMER, /* Technically present on CAT1B and CAT1C, but deprecated */
  2505. #endif
  2506. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2507. #if defined(COMPONENT_CAT1C)
  2508. &CYHAL_CLOCK_RSC_FAST[0],
  2509. &CYHAL_CLOCK_RSC_FAST[1],
  2510. #else
  2511. &CYHAL_CLOCK_RSC_FAST,
  2512. #endif
  2513. &CYHAL_CLOCK_RSC_SLOW,
  2514. #elif defined(COMPONENT_CAT1B)
  2515. &CYHAL_CLOCK_RSC_HF[0], /* CPU clock */
  2516. #endif
  2517. };
  2518. *sources = _CYHAL_CLOCK_SOURCE_ALT_SYS_TICK;
  2519. *count = sizeof(_CYHAL_CLOCK_SOURCE_ALT_SYS_TICK) / sizeof(_CYHAL_CLOCK_SOURCE_ALT_SYS_TICK[0]);
  2520. return CY_RSLT_SUCCESS;
  2521. }
  2522. static cy_rslt_t _cyhal_clock_set_source_alt_sys_tick(cyhal_clock_t *clock, const cyhal_clock_t *source)
  2523. {
  2524. CY_UNUSED_PARAMETER(clock);
  2525. switch (source->block)
  2526. {
  2527. case CYHAL_CLOCK_BLOCK_LF:
  2528. Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_LF);
  2529. return CY_RSLT_SUCCESS;
  2530. case CYHAL_CLOCK_BLOCK_IMO:
  2531. Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_IMO);
  2532. return CY_RSLT_SUCCESS;
  2533. #if SRSS_ECO_PRESENT
  2534. case CYHAL_CLOCK_BLOCK_ECO:
  2535. Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_ECO);
  2536. return CY_RSLT_SUCCESS;
  2537. #endif
  2538. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2539. #if defined(COMPONENT_CAT1A)
  2540. case CYHAL_CLOCK_BLOCK_TIMER:
  2541. Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_TIMER);
  2542. return CY_RSLT_SUCCESS;
  2543. #endif
  2544. case CYHAL_CLOCK_BLOCK_FAST:
  2545. case CYHAL_CLOCK_BLOCK_SLOW:
  2546. Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_CPU);
  2547. return CY_RSLT_SUCCESS;
  2548. #endif
  2549. default:
  2550. CY_ASSERT(false); //Unhandled clock
  2551. return CYHAL_CLOCK_RSLT_ERR_SOURCE;
  2552. }
  2553. }
  2554. // Peripheral
  2555. static bool _cyhal_clock_is_enabled_peripheral(const cyhal_clock_t *clock)
  2556. {
  2557. return _cyhal_utils_peri_pclk_is_divider_enabled(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock);
  2558. }
  2559. static cy_rslt_t _cyhal_clock_set_enabled_peripheral(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  2560. {
  2561. CY_UNUSED_PARAMETER(wait_for_lock);
  2562. return (enabled)
  2563. ? _cyhal_utils_peri_pclk_enable_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock)
  2564. : _cyhal_utils_peri_pclk_disable_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock);
  2565. }
  2566. static uint32_t _cyhal_clock_get_frequency_peripheral(const cyhal_clock_t *clock)
  2567. {
  2568. return _cyhal_utils_peri_pclk_get_frequency(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock);
  2569. }
  2570. static cy_rslt_t _cyhal_clock_set_frequency_peripheral(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  2571. {
  2572. CY_UNUSED_PARAMETER(clock);
  2573. CY_UNUSED_PARAMETER(tolerance);
  2574. // blocks 0b00 & 0b01 are integer, 0b10 & 0b11 are fractional
  2575. uint32_t div;
  2576. #if defined(COMPONENT_CAT1A)
  2577. uint32_t input_hz = Cy_SysClk_ClkPeriGetFrequency();
  2578. #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  2579. #if defined(COMPONENT_CAT1D)
  2580. uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
  2581. uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
  2582. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
  2583. #else /* !defined(COMPONENT_CAT1D) */
  2584. uint8_t group = _CYHAL_PERIPHERAL_GROUP_GET_GROUP(clock->block);
  2585. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(group);
  2586. #endif /* defined(COMPONENT_CAT1D) or other */
  2587. uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(hfclk);
  2588. #endif
  2589. if ((clock->block & 0x02) == 0) // Integer (8 or 16)
  2590. {
  2591. uint32_t bits = (clock->block & 0x01) ? 16 : 8;
  2592. cy_rslt_t rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, bits, tolerance, &div);
  2593. return (CY_RSLT_SUCCESS == rslt)
  2594. ? _cyhal_utils_peri_pclk_set_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, (div - 1))
  2595. : rslt;
  2596. }
  2597. else //Fractional (16.5 or 24.5)
  2598. {
  2599. // Multiply input by 32 so we can treat the 5 fractional bits as though they are extentions of the integer divider
  2600. // Leave the the desired frequency alone, so we can just strip out the integer & fractional bits at the end.
  2601. uint32_t bits = (clock->block & 0x01) ? 29 : 21; // Integer bits + 5
  2602. cy_rslt_t rslt = _cyhal_clock_compute_div(((uint64_t)input_hz) << 5, hz, bits, tolerance, &div);
  2603. if (CY_RSLT_SUCCESS == rslt)
  2604. {
  2605. uint32_t div_int = (div >> 5) - 1;
  2606. uint32_t div_frac = div & 0x1F;
  2607. return _cyhal_utils_peri_pclk_set_frac_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, div_int, div_frac);
  2608. }
  2609. else
  2610. return rslt;
  2611. }
  2612. }
  2613. static cy_rslt_t _cyhal_clock_set_divider_peripheral(cyhal_clock_t *clock, uint32_t divider)
  2614. {
  2615. CY_UNUSED_PARAMETER(clock);
  2616. // blocks 0b00 & 0b01 are integer, 0b10 & 0b11 are fractional
  2617. return ((clock->block & 0x02) == 0)
  2618. ? _cyhal_utils_peri_pclk_set_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, divider - 1)
  2619. : _cyhal_utils_peri_pclk_set_frac_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, divider - 1, 0);
  2620. }
  2621. static cy_rslt_t _cyhal_clock_get_sources_peripheral(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  2622. {
  2623. #if defined(COMPONENT_CAT1A)
  2624. return _cyhal_clock_get_sources_slow(clock, sources, count);
  2625. #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
  2626. #if defined(COMPONENT_CAT1D)
  2627. uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
  2628. uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
  2629. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
  2630. #else /* !defined(COMPONENT_CAT1D) */
  2631. uint8_t group = _CYHAL_PERIPHERAL_GROUP_GET_GROUP(clock->block);
  2632. uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(group);
  2633. #endif /* defined(COMPONENT_CAT1D) or other */
  2634. return _cyhal_clock_get_sources_peri_peripheral(hfclk, sources, count);
  2635. #endif
  2636. }
  2637. /******************************************************************************
  2638. ******************************* Clock Structs ********************************
  2639. *****************************************************************************/
  2640. /* Use a structure with function pointers to allow the driver to optimize out entire clocks if they
  2641. * are not used. We make two exceptions to this. HF and peripheral clocks are called directly by
  2642. * the public functions. This allows those clocks to be optimized based on what the user actually
  2643. * calls. This distinction is done based on what the user is most likely to do with the HAL driver.
  2644. * HF & peripheral clocks are likely to be configured at runtime based on setting up different
  2645. * peripherals. Other system clocks are likely to be be set once at startup and never modified.
  2646. * Based on this, we design the code so the compiler can optimize out the unused items most
  2647. * efficiently.
  2648. */
  2649. typedef struct
  2650. {
  2651. bool (*is_enabled)(const cyhal_clock_t *clock);
  2652. cy_rslt_t (*set_enabled)(cyhal_clock_t *clock, bool enabled, bool wait_for_lock);
  2653. uint32_t (*get_frequency)(const cyhal_clock_t *clock);
  2654. cy_rslt_t (*set_frequency)(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance);
  2655. cy_rslt_t (*set_divider)(cyhal_clock_t *clock, uint32_t divider);
  2656. cy_rslt_t (*get_sources)(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count);
  2657. cy_rslt_t (*set_source)(cyhal_clock_t *clock, const cyhal_clock_t *source);
  2658. cyhal_clock_feature_t features;
  2659. } cyhal_clock_funcs_t;
  2660. static const cyhal_clock_funcs_t FUNCS_IMO =
  2661. {
  2662. .features = CYHAL_CLOCK_FEATURE_NONE,
  2663. .is_enabled = _cyhal_clock_is_enabled_true,
  2664. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2665. .get_frequency = _cyhal_clock_get_frequency_imo,
  2666. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2667. .set_divider = _cyhal_clock_set_divider_unsupported,
  2668. .get_sources = _cyhal_clock_get_sources_none,
  2669. .set_source = _cyhal_clock_set_source_unsupported,
  2670. };
  2671. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  2672. static const cyhal_clock_funcs_t FUNCS_IHO =
  2673. {
  2674. .features = CYHAL_CLOCK_FEATURE_ENABLE,
  2675. .is_enabled = _cyhal_clock_is_enabled_iho,
  2676. .set_enabled = _cyhal_clock_set_enabled_iho,
  2677. .get_frequency = _cyhal_clock_get_frequency_iho,
  2678. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2679. .set_divider = _cyhal_clock_set_divider_unsupported,
  2680. .get_sources = _cyhal_clock_get_sources_none,
  2681. .set_source = _cyhal_clock_set_source_unsupported,
  2682. };
  2683. #endif
  2684. #if defined(COMPONENT_CAT1C)
  2685. static const cyhal_clock_funcs_t FUNCS_MEM =
  2686. {
  2687. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2688. .is_enabled = _cyhal_clock_is_enabled_true,
  2689. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2690. .get_frequency = _cyhal_clock_get_frequency_mem,
  2691. .set_frequency = _cyhal_clock_set_frequency_mem,
  2692. .set_divider = _cyhal_clock_set_divider_mem,
  2693. .get_sources = _cyhal_clock_get_sources_mem,
  2694. .set_source = _cyhal_clock_set_source_unsupported,
  2695. };
  2696. #endif
  2697. #if SRSS_ECO_PRESENT
  2698. static const cyhal_clock_funcs_t FUNCS_ECO =
  2699. {
  2700. .features = CYHAL_CLOCK_FEATURE_ENABLE,
  2701. .is_enabled = _cyhal_clock_is_enabled_eco,
  2702. .set_enabled = _cyhal_clock_set_enabled_eco,
  2703. .get_frequency = _cyhal_clock_get_frequency_eco,
  2704. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2705. .set_divider = _cyhal_clock_set_divider_unsupported,
  2706. .get_sources = _cyhal_clock_get_sources_none,
  2707. .set_source = _cyhal_clock_set_source_unsupported,
  2708. };
  2709. #endif
  2710. static const cyhal_clock_funcs_t FUNCS_EXT =
  2711. {
  2712. .features = CYHAL_CLOCK_FEATURE_FREQUENCY,
  2713. .is_enabled = _cyhal_clock_is_enabled_ext,
  2714. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2715. .get_frequency = _cyhal_clock_get_frequency_ext,
  2716. .set_frequency = _cyhal_clock_set_frequency_ext,
  2717. .set_divider = _cyhal_clock_set_divider_unsupported,
  2718. .get_sources = _cyhal_clock_get_sources_none,
  2719. .set_source = _cyhal_clock_set_source_unsupported,
  2720. };
  2721. #if SRSS_ALTHF_PRESENT
  2722. static const cyhal_clock_funcs_t FUNCS_ALTHF =
  2723. {
  2724. .features = CYHAL_CLOCK_FEATURE_NONE,
  2725. .is_enabled = _cyhal_clock_is_enabled_althf,
  2726. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2727. .get_frequency = _cyhal_clock_get_frequency_althf,
  2728. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2729. .set_divider = _cyhal_clock_set_divider_unsupported,
  2730. .get_sources = _cyhal_clock_get_sources_none,
  2731. .set_source = _cyhal_clock_set_source_unsupported,
  2732. };
  2733. #endif
  2734. #if SRSS_ALTLF_PRESENT
  2735. static const cyhal_clock_funcs_t FUNCS_ALTLF =
  2736. {
  2737. .features = CYHAL_CLOCK_FEATURE_NONE,
  2738. .is_enabled = _cyhal_clock_is_enabled_altlf,
  2739. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2740. .get_frequency = _cyhal_clock_get_frequency_altlf,
  2741. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2742. .set_divider = _cyhal_clock_set_divider_unsupported,
  2743. .get_sources = _cyhal_clock_get_sources_none,
  2744. .set_source = _cyhal_clock_set_source_unsupported,
  2745. };
  2746. #endif
  2747. static const cyhal_clock_funcs_t FUNCS_ILO =
  2748. {
  2749. .features = CYHAL_CLOCK_FEATURE_ENABLE,
  2750. .is_enabled = _cyhal_clock_is_enabled_ilo,
  2751. .set_enabled = _cyhal_clock_set_enabled_ilo,
  2752. .get_frequency = _cyhal_clock_get_frequency_ilo,
  2753. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2754. .set_divider = _cyhal_clock_set_divider_unsupported,
  2755. .get_sources = _cyhal_clock_get_sources_none,
  2756. .set_source = _cyhal_clock_set_source_unsupported,
  2757. };
  2758. #if _CYHAL_SRSS_PILO_PRESENT
  2759. static const cyhal_clock_funcs_t FUNCS_PILO =
  2760. {
  2761. .features = CYHAL_CLOCK_FEATURE_ENABLE,
  2762. .is_enabled = _cyhal_clock_is_enabled_pilo,
  2763. .set_enabled = _cyhal_clock_set_enabled_pilo,
  2764. .get_frequency = _cyhal_clock_get_frequency_pilo,
  2765. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2766. .set_divider = _cyhal_clock_set_divider_unsupported,
  2767. .get_sources = _cyhal_clock_get_sources_none,
  2768. .set_source = _cyhal_clock_set_source_unsupported,
  2769. };
  2770. #endif
  2771. #if SRSS_BACKUP_PRESENT
  2772. static const cyhal_clock_funcs_t FUNCS_WCO =
  2773. {
  2774. .features = CYHAL_CLOCK_FEATURE_ENABLE,
  2775. .is_enabled = _cyhal_clock_is_enabled_wco,
  2776. .set_enabled = _cyhal_clock_set_enabled_wco,
  2777. .get_frequency = _cyhal_clock_get_frequency_wco,
  2778. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2779. .set_divider = _cyhal_clock_set_divider_unsupported,
  2780. .get_sources = _cyhal_clock_get_sources_none,
  2781. .set_source = _cyhal_clock_set_source_unsupported,
  2782. };
  2783. #endif
  2784. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  2785. static const cyhal_clock_funcs_t FUNCS_MFO =
  2786. {
  2787. .features = CYHAL_CLOCK_FEATURE_ENABLE,
  2788. .is_enabled = _cyhal_clock_is_enabled_mfo,
  2789. .set_enabled = _cyhal_clock_set_enabled_mfo,
  2790. .get_frequency = _cyhal_clock_get_frequency_mfo,
  2791. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2792. .set_divider = _cyhal_clock_set_divider_unsupported,
  2793. .get_sources = _cyhal_clock_get_sources_mfo,
  2794. .set_source = _cyhal_clock_set_source_unsupported,
  2795. };
  2796. #endif
  2797. static const cyhal_clock_funcs_t FUNCS_PATHMUX =
  2798. {
  2799. .features = CYHAL_CLOCK_FEATURE_SOURCE,
  2800. .is_enabled = _cyhal_clock_is_enabled_true,
  2801. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2802. .get_frequency = _cyhal_clock_get_frequency_pathmux,
  2803. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2804. .set_divider = _cyhal_clock_set_divider_unsupported,
  2805. .get_sources = _cyhal_clock_get_sources_pathmux,
  2806. .set_source = _cyhal_clock_set_source_pathmux,
  2807. };
  2808. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  2809. static const cyhal_clock_funcs_t FUNCS_FLL =
  2810. {
  2811. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2812. .is_enabled = _cyhal_clock_is_enabled_fll,
  2813. .set_enabled = _cyhal_clock_set_enabled_fll,
  2814. .get_frequency = _cyhal_clock_get_frequency_fll,
  2815. .set_frequency = _cyhal_clock_set_frequency_fll,
  2816. .set_divider = _cyhal_clock_set_divider_unsupported,
  2817. .get_sources = _cyhal_clock_get_sources_fll,
  2818. .set_source = _cyhal_clock_set_source_unsupported,
  2819. };
  2820. #endif
  2821. #if (_CYHAL_SRSS_NUM_PLL > 0)
  2822. static const cyhal_clock_funcs_t FUNCS_PLL =
  2823. {
  2824. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2825. .is_enabled = _cyhal_clock_is_enabled_pll,
  2826. .set_enabled = _cyhal_clock_set_enabled_pll,
  2827. .get_frequency = _cyhal_clock_get_frequency_pll,
  2828. .set_frequency = _cyhal_clock_set_frequency_pll,
  2829. .set_divider = _cyhal_clock_set_divider_unsupported,
  2830. .get_sources = _cyhal_clock_get_sources_pll,
  2831. .set_source = _cyhal_clock_set_source_unsupported,
  2832. };
  2833. #endif
  2834. #if defined(COMPONENT_CAT1C)
  2835. #if (SRSS_NUM_PLL > 0)
  2836. #define FUNCS_PLL200 FUNCS_PLL
  2837. #endif
  2838. #if (SRSS_NUM_PLL400M > 0)
  2839. #define FUNCS_PLL400 FUNCS_PLL
  2840. #endif
  2841. #endif /* defined(COMPONENT_CAT1C) */
  2842. #if defined(COMPONENT_CAT1D)
  2843. #if (SRSS_NUM_DPLL_LP > 0)
  2844. #define FUNCS_DPLL_LP FUNCS_PLL
  2845. #endif
  2846. #if (SRSS_NUM_DPLL_HP > 0)
  2847. #define FUNCS_DPLL_HP FUNCS_PLL
  2848. #endif
  2849. #endif /* defined(COMPONENT_CAT1D) */
  2850. static const cyhal_clock_funcs_t FUNCS_LF =
  2851. {
  2852. .features = CYHAL_CLOCK_FEATURE_SOURCE,
  2853. .is_enabled = _cyhal_clock_is_enabled_true,
  2854. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2855. .get_frequency = _cyhal_clock_get_frequency_lf,
  2856. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2857. .set_divider = _cyhal_clock_set_divider_unsupported,
  2858. .get_sources = _cyhal_clock_get_sources_lf,
  2859. .set_source = _cyhal_clock_set_source_lf,
  2860. };
  2861. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  2862. static const cyhal_clock_funcs_t FUNCS_MF =
  2863. {
  2864. #if defined(COMPONENT_CAT1A) /* CAT1A only supports driving clk_mf from the MFO */
  2865. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2866. #else
  2867. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY | CYHAL_CLOCK_FEATURE_SOURCE),
  2868. #endif
  2869. .is_enabled = _cyhal_clock_is_enabled_mf,
  2870. .set_enabled = _cyhal_clock_set_enabled_mf,
  2871. .get_frequency = _cyhal_clock_get_frequency_mf,
  2872. .set_frequency = _cyhal_clock_set_frequency_mf,
  2873. .set_divider = _cyhal_clock_set_divider_mf,
  2874. .get_sources = _cyhal_clock_get_sources_mf,
  2875. .set_source = _cyhal_clock_set_source_mf,
  2876. };
  2877. #endif
  2878. static const cyhal_clock_funcs_t FUNCS_HF =
  2879. {
  2880. // NOTE: HF0 cannot be disabled, it would stop the MCUs. Ideally HF0 would not support
  2881. // CYHAL_CLOCK_FEATURE_ENABLE, but this struct is never actually used in practice so it doesn't
  2882. // matter.
  2883. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER),
  2884. .is_enabled = _cyhal_clock_is_enabled_hf,
  2885. .set_enabled = _cyhal_clock_set_enabled_hf,
  2886. .get_frequency = _cyhal_clock_get_frequency_hf,
  2887. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2888. .set_divider = _cyhal_clock_set_divider_hf,
  2889. .get_sources = _cyhal_clock_get_sources_hf,
  2890. .set_source = _cyhal_clock_set_source_hf,
  2891. };
  2892. // PUMP clock is only available on CAT1A and CAT1B devices
  2893. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
  2894. static const cyhal_clock_funcs_t FUNCS_PUMP =
  2895. {
  2896. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER),
  2897. .is_enabled = _cyhal_clock_is_enabled_pump,
  2898. .set_enabled = _cyhal_clock_set_enabled_pump,
  2899. .get_frequency = _cyhal_clock_get_frequency_pump,
  2900. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2901. .set_divider = _cyhal_clock_set_divider_pump,
  2902. .get_sources = _cyhal_clock_get_sources_pump,
  2903. .set_source = _cyhal_clock_set_source_pump,
  2904. };
  2905. #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
  2906. #if defined(COMPONENT_CAT1A)
  2907. static const cyhal_clock_funcs_t FUNCS_TIMER =
  2908. {
  2909. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER),
  2910. .is_enabled = _cyhal_clock_is_enabled_timer,
  2911. .set_enabled = _cyhal_clock_set_enabled_timer,
  2912. .get_frequency = _cyhal_clock_get_frequency_timer,
  2913. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2914. .set_divider = _cyhal_clock_set_divider_timer,
  2915. .get_sources = _cyhal_clock_get_sources_timer,
  2916. .set_source = _cyhal_clock_set_source_timer,
  2917. };
  2918. #endif
  2919. static const cyhal_clock_funcs_t FUNCS_BAK =
  2920. {
  2921. .features = CYHAL_CLOCK_FEATURE_SOURCE,
  2922. .is_enabled = _cyhal_clock_is_enabled_true,
  2923. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2924. .get_frequency = _cyhal_clock_get_frequency_bak,
  2925. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2926. .set_divider = _cyhal_clock_set_divider_unsupported,
  2927. .get_sources = _cyhal_clock_get_sources_bak,
  2928. .set_source = _cyhal_clock_set_source_bak,
  2929. };
  2930. static const cyhal_clock_funcs_t FUNCS_ALT_SYS_TICK =
  2931. {
  2932. .features = CYHAL_CLOCK_FEATURE_SOURCE,
  2933. .is_enabled = _cyhal_clock_is_enabled_true,
  2934. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2935. .get_frequency = _cyhal_clock_get_frequency_alt_sys_tick,
  2936. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2937. .set_divider = _cyhal_clock_set_divider_unsupported,
  2938. .get_sources = _cyhal_clock_get_sources_alt_sys_tick,
  2939. .set_source = _cyhal_clock_set_source_alt_sys_tick,
  2940. };
  2941. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  2942. static const cyhal_clock_funcs_t FUNCS_FAST =
  2943. {
  2944. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2945. .is_enabled = _cyhal_clock_is_enabled_true,
  2946. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2947. .get_frequency = _cyhal_clock_get_frequency_fast,
  2948. .set_frequency = _cyhal_clock_set_frequency_fast,
  2949. .set_divider = _cyhal_clock_set_divider_fast,
  2950. .get_sources = _cyhal_clock_get_sources_fast,
  2951. .set_source = _cyhal_clock_set_source_unsupported,
  2952. };
  2953. static const cyhal_clock_funcs_t FUNCS_SLOW =
  2954. {
  2955. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2956. .is_enabled = _cyhal_clock_is_enabled_true,
  2957. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2958. .get_frequency = _cyhal_clock_get_frequency_slow,
  2959. .set_frequency = _cyhal_clock_set_frequency_slow,
  2960. .set_divider = _cyhal_clock_set_divider_slow,
  2961. .get_sources = _cyhal_clock_get_sources_slow,
  2962. .set_source = _cyhal_clock_set_source_unsupported,
  2963. };
  2964. #endif
  2965. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  2966. #if SRSS_ECO_PRESENT
  2967. static const cyhal_clock_funcs_t FUNCS_ECO_PRESCALER =
  2968. {
  2969. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER),
  2970. .is_enabled = _cyhal_clock_is_enabled_true,
  2971. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2972. .get_frequency = _cyhal_clock_get_frequency_eco_prescaler,
  2973. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2974. .set_divider = _cyhal_clock_set_divider_eco_prescaler,
  2975. .get_sources = _cyhal_clock_get_sources_eco_prescaler,
  2976. .set_source = _cyhal_clock_set_source_unsupported,
  2977. };
  2978. #endif
  2979. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  2980. static const cyhal_clock_funcs_t FUNCS_LPECO_PRESCALER =
  2981. {
  2982. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER),
  2983. .is_enabled = _cyhal_clock_is_enabled_true,
  2984. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2985. .get_frequency = _cyhal_clock_get_frequency_lpeco_prescaler,
  2986. .set_frequency = _cyhal_clock_set_frequency_unsupported,
  2987. .set_divider = _cyhal_clock_set_divider_lpeco_prescaler,
  2988. .get_sources = _cyhal_clock_get_sources_lpeco_prescaler,
  2989. .set_source = _cyhal_clock_set_source_unsupported,
  2990. };
  2991. #endif
  2992. #endif
  2993. static const cyhal_clock_funcs_t FUNCS_PERI =
  2994. {
  2995. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
  2996. .is_enabled = _cyhal_clock_is_enabled_true,
  2997. .set_enabled = _cyhal_clock_set_enabled_unsupported,
  2998. .get_frequency = _cyhal_clock_get_frequency_peri,
  2999. .set_frequency = _cyhal_clock_set_frequency_peri,
  3000. .set_divider = _cyhal_clock_set_divider_peri,
  3001. .get_sources = _cyhal_clock_get_sources_peri,
  3002. .set_source = _cyhal_clock_set_source_unsupported,
  3003. };
  3004. static const cyhal_clock_funcs_t FUNCS_PERIPHERAL =
  3005. {
  3006. .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
  3007. .is_enabled = _cyhal_clock_is_enabled_peripheral,
  3008. .set_enabled = _cyhal_clock_set_enabled_peripheral,
  3009. .get_frequency = _cyhal_clock_get_frequency_peripheral,
  3010. .set_frequency = _cyhal_clock_set_frequency_peripheral,
  3011. .set_divider = _cyhal_clock_set_divider_peripheral,
  3012. .get_sources = _cyhal_clock_get_sources_peripheral,
  3013. .set_source = _cyhal_clock_set_source_unsupported,
  3014. };
  3015. static const cyhal_clock_funcs_t FUNCS_EMPTY =
  3016. {
  3017. .features = CYHAL_CLOCK_FEATURE_NONE,
  3018. .is_enabled = NULL,
  3019. .set_enabled = NULL,
  3020. .get_frequency = NULL,
  3021. .set_frequency = NULL,
  3022. .set_divider = NULL,
  3023. .get_sources = NULL,
  3024. .set_source = NULL,
  3025. };
  3026. const void* _cyhal_clock_get_funcs_pathmux(void) { return &FUNCS_PATHMUX; }
  3027. #if (_CYHAL_SRSS_NUM_PLL > 0)
  3028. const void* _cyhal_clock_get_funcs_pll(void) { return &FUNCS_PLL; }
  3029. #endif
  3030. // HF and peripheral functions are called directly from the public APIs and do not go through
  3031. // the struct lookup. This allows them to get optimized out based on what the user calls. We
  3032. // return FUNCS_EMPTY here so as to avoid unnecessarily pulling in all functions for those clocks.
  3033. const void* _cyhal_clock_get_funcs_hf(void) { return &FUNCS_EMPTY/*FUNCS_HF*/; }
  3034. const void* _cyhal_clock_get_funcs_peripheral(void) { return &FUNCS_EMPTY/*FUNCS_PERIPHERAL*/; }
  3035. static const cyhal_clock_funcs_t* _cyhal_clock_get_funcs_all(cyhal_clock_block_t block)
  3036. {
  3037. switch (block)
  3038. {
  3039. case CYHAL_CLOCK_BLOCK_IMO:
  3040. return &FUNCS_IMO;
  3041. #if SRSS_ECO_PRESENT
  3042. case CYHAL_CLOCK_BLOCK_ECO:
  3043. return &FUNCS_ECO;
  3044. #endif
  3045. case CYHAL_CLOCK_BLOCK_EXT:
  3046. return &FUNCS_EXT;
  3047. #if SRSS_ALTHF_PRESENT
  3048. case CYHAL_CLOCK_BLOCK_ALTHF:
  3049. return &FUNCS_ALTHF;
  3050. #endif
  3051. #if SRSS_ALTLF_PRESENT
  3052. case CYHAL_CLOCK_BLOCK_ALTLF:
  3053. return &FUNCS_ALTLF;
  3054. #endif
  3055. case CYHAL_CLOCK_BLOCK_ILO:
  3056. return &FUNCS_ILO;
  3057. #if _CYHAL_SRSS_PILO_PRESENT
  3058. case CYHAL_CLOCK_BLOCK_PILO:
  3059. return &FUNCS_PILO;
  3060. #endif
  3061. #if SRSS_BACKUP_PRESENT
  3062. case CYHAL_CLOCK_BLOCK_WCO:
  3063. return &FUNCS_WCO;
  3064. #endif
  3065. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  3066. case CYHAL_CLOCK_BLOCK_MFO:
  3067. return &FUNCS_MFO;
  3068. #endif
  3069. case CYHAL_CLOCK_BLOCK_PATHMUX:
  3070. return &FUNCS_PATHMUX;
  3071. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  3072. case CYHAL_CLOCK_BLOCK_FLL:
  3073. return &FUNCS_FLL;
  3074. #endif
  3075. case CYHAL_CLOCK_BLOCK_LF:
  3076. return &FUNCS_LF;
  3077. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  3078. case CYHAL_CLOCK_BLOCK_MF:
  3079. return &FUNCS_MF;
  3080. #endif
  3081. case CYHAL_CLOCK_BLOCK_HF:
  3082. return &FUNCS_HF;
  3083. // PUMP clock is only available on CAT1A and CAT1B devices
  3084. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
  3085. case CYHAL_CLOCK_BLOCK_PUMP:
  3086. return &FUNCS_PUMP;
  3087. #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
  3088. case CYHAL_CLOCK_BLOCK_BAK:
  3089. return &FUNCS_BAK;
  3090. case CYHAL_CLOCK_BLOCK_ALT_SYS_TICK:
  3091. return &FUNCS_ALT_SYS_TICK;
  3092. case CYHAL_CLOCK_BLOCK_PERI:
  3093. return &FUNCS_PERI;
  3094. #if defined(COMPONENT_CAT1A)
  3095. #if (_CYHAL_SRSS_NUM_PLL > 0)
  3096. case CYHAL_CLOCK_BLOCK_PLL:
  3097. return &FUNCS_PLL;
  3098. #endif
  3099. #endif
  3100. #if defined(COMPONENT_CAT1C)
  3101. case CYHAL_CLOCK_BLOCK_MEM:
  3102. return &FUNCS_MEM;
  3103. #endif
  3104. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  3105. #if defined(COMPONENT_CAT1A)
  3106. case CYHAL_CLOCK_BLOCK_TIMER:
  3107. return &FUNCS_TIMER;
  3108. #endif
  3109. case CYHAL_CLOCK_BLOCK_FAST:
  3110. return &FUNCS_FAST;
  3111. case CYHAL_CLOCK_BLOCK_SLOW:
  3112. return &FUNCS_SLOW;
  3113. #endif
  3114. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
  3115. #if (_CYHAL_SRSS_NUM_PLL > 0)
  3116. case CYHAL_CLOCK_BLOCK_PLL200:
  3117. return &FUNCS_PLL200;
  3118. case CYHAL_CLOCK_BLOCK_PLL400:
  3119. return &FUNCS_PLL400;
  3120. #endif
  3121. #endif
  3122. #if defined(COMPONENT_CAT1D)
  3123. #if (_CYHAL_SRSS_NUM_PLL > 0)
  3124. case CYHAL_CLOCK_BLOCK_DPLL_LP:
  3125. return &FUNCS_DPLL_LP;
  3126. case CYHAL_CLOCK_BLOCK_DPLL_HP:
  3127. return &FUNCS_DPLL_HP;
  3128. #endif
  3129. #endif
  3130. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
  3131. case CYHAL_CLOCK_BLOCK_IHO:
  3132. return &FUNCS_IHO;
  3133. #if SRSS_ECO_PRESENT
  3134. case CYHAL_CLOCK_BLOCK_ECO_PRESCALER:
  3135. return &FUNCS_ECO_PRESCALER;
  3136. #endif
  3137. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  3138. case CY_SYSCLK_CLKLF_IN_LPECO_PRESCALER:
  3139. return &FUNCS_LPECO_PRESCALER;
  3140. #endif
  3141. #endif
  3142. default:
  3143. return &FUNCS_PERIPHERAL;
  3144. }
  3145. }
  3146. #define _CYHAL_CLOCK_CREATE(x,y) { .block = (CYHAL_CLOCK_BLOCK_##x), .channel = (y), .reserved = false, .funcs = &(FUNCS_##x) }
  3147. const cyhal_clock_t CYHAL_CLOCK_IMO = _CYHAL_CLOCK_CREATE(IMO, 0);
  3148. const cyhal_clock_t CYHAL_CLOCK_EXT = _CYHAL_CLOCK_CREATE(EXT, 0);
  3149. #if defined(COMPONENT_CAT1C)
  3150. const cyhal_clock_t CYHAL_CLOCK_ILO[_CYHAL_SRSS_NUM_ILO] =
  3151. {
  3152. _CYHAL_CLOCK_CREATE(ILO, 0),
  3153. #if (SRSS_HT_VARIANT > 0)
  3154. _CYHAL_CLOCK_CREATE(ILO, 1),
  3155. #endif
  3156. };
  3157. #else
  3158. const cyhal_clock_t CYHAL_CLOCK_ILO = _CYHAL_CLOCK_CREATE(ILO, 0);
  3159. #endif
  3160. const cyhal_clock_t CYHAL_CLOCK_LF = _CYHAL_CLOCK_CREATE(LF, 0);
  3161. // PUMP clock is only available on CAT1A and CAT1B devices
  3162. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
  3163. const cyhal_clock_t CYHAL_CLOCK_PUMP = _CYHAL_CLOCK_CREATE(PUMP, 0);
  3164. #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
  3165. const cyhal_clock_t CYHAL_CLOCK_BAK = _CYHAL_CLOCK_CREATE(BAK, 0);
  3166. const cyhal_clock_t CYHAL_CLOCK_ALT_SYS_TICK = _CYHAL_CLOCK_CREATE(ALT_SYS_TICK, 0);
  3167. const cyhal_clock_t CYHAL_CLOCK_PATHMUX[SRSS_NUM_CLKPATH] =
  3168. {
  3169. _CYHAL_CLOCK_CREATE(PATHMUX, 0),
  3170. #if (SRSS_NUM_CLKPATH > 1)
  3171. _CYHAL_CLOCK_CREATE(PATHMUX, 1),
  3172. #endif
  3173. #if (SRSS_NUM_CLKPATH > 2)
  3174. _CYHAL_CLOCK_CREATE(PATHMUX, 2),
  3175. #endif
  3176. #if (SRSS_NUM_CLKPATH > 3)
  3177. _CYHAL_CLOCK_CREATE(PATHMUX, 3),
  3178. #endif
  3179. #if (SRSS_NUM_CLKPATH > 4)
  3180. _CYHAL_CLOCK_CREATE(PATHMUX, 4),
  3181. #endif
  3182. #if (SRSS_NUM_CLKPATH > 5)
  3183. _CYHAL_CLOCK_CREATE(PATHMUX, 5),
  3184. #endif
  3185. #if (SRSS_NUM_CLKPATH > 6)
  3186. _CYHAL_CLOCK_CREATE(PATHMUX, 6),
  3187. #endif
  3188. #if (SRSS_NUM_CLKPATH > 7)
  3189. _CYHAL_CLOCK_CREATE(PATHMUX, 7),
  3190. #endif
  3191. #if (SRSS_NUM_CLKPATH > 8)
  3192. _CYHAL_CLOCK_CREATE(PATHMUX, 8),
  3193. #endif
  3194. #if (SRSS_NUM_CLKPATH > 9)
  3195. _CYHAL_CLOCK_CREATE(PATHMUX, 9),
  3196. #endif
  3197. #if (SRSS_NUM_CLKPATH > 10)
  3198. _CYHAL_CLOCK_CREATE(PATHMUX, 10),
  3199. #endif
  3200. #if (SRSS_NUM_CLKPATH > 11)
  3201. _CYHAL_CLOCK_CREATE(PATHMUX, 11),
  3202. #endif
  3203. #if (SRSS_NUM_CLKPATH > 12)
  3204. _CYHAL_CLOCK_CREATE(PATHMUX, 12),
  3205. #endif
  3206. #if (SRSS_NUM_CLKPATH > 13)
  3207. _CYHAL_CLOCK_CREATE(PATHMUX, 13),
  3208. #endif
  3209. #if (SRSS_NUM_CLKPATH > 14)
  3210. _CYHAL_CLOCK_CREATE(PATHMUX, 14),
  3211. #endif
  3212. #if (SRSS_NUM_CLKPATH > 15)
  3213. _CYHAL_CLOCK_CREATE(PATHMUX, 15),
  3214. #endif
  3215. };
  3216. const cyhal_clock_t CYHAL_CLOCK_HF[SRSS_NUM_HFROOT] =
  3217. {
  3218. _CYHAL_CLOCK_CREATE(HF, 0),
  3219. #if (SRSS_NUM_HFROOT > 1)
  3220. _CYHAL_CLOCK_CREATE(HF, 1),
  3221. #endif
  3222. #if (SRSS_NUM_HFROOT > 2)
  3223. _CYHAL_CLOCK_CREATE(HF, 2),
  3224. #endif
  3225. #if (SRSS_NUM_HFROOT > 3)
  3226. _CYHAL_CLOCK_CREATE(HF, 3),
  3227. #endif
  3228. #if (SRSS_NUM_HFROOT > 4)
  3229. _CYHAL_CLOCK_CREATE(HF, 4),
  3230. #endif
  3231. #if (SRSS_NUM_HFROOT > 5)
  3232. _CYHAL_CLOCK_CREATE(HF, 5),
  3233. #endif
  3234. #if (SRSS_NUM_HFROOT > 6)
  3235. _CYHAL_CLOCK_CREATE(HF, 6),
  3236. #endif
  3237. #if (SRSS_NUM_HFROOT > 7)
  3238. _CYHAL_CLOCK_CREATE(HF, 7),
  3239. #endif
  3240. #if (SRSS_NUM_HFROOT > 8)
  3241. _CYHAL_CLOCK_CREATE(HF, 8),
  3242. #endif
  3243. #if (SRSS_NUM_HFROOT > 9)
  3244. _CYHAL_CLOCK_CREATE(HF, 9),
  3245. #endif
  3246. #if (SRSS_NUM_HFROOT > 10)
  3247. _CYHAL_CLOCK_CREATE(HF, 10),
  3248. #endif
  3249. #if (SRSS_NUM_HFROOT > 11)
  3250. _CYHAL_CLOCK_CREATE(HF, 11),
  3251. #endif
  3252. #if (SRSS_NUM_HFROOT > 12)
  3253. _CYHAL_CLOCK_CREATE(HF, 12),
  3254. #endif
  3255. #if (SRSS_NUM_HFROOT > 13)
  3256. _CYHAL_CLOCK_CREATE(HF, 13),
  3257. #endif
  3258. #if (SRSS_NUM_HFROOT > 14)
  3259. _CYHAL_CLOCK_CREATE(HF, 14),
  3260. #endif
  3261. #if (SRSS_NUM_HFROOT > 15)
  3262. _CYHAL_CLOCK_CREATE(HF, 15),
  3263. #endif
  3264. };
  3265. #if SRSS_ECO_PRESENT
  3266. const cyhal_clock_t CYHAL_CLOCK_ECO = _CYHAL_CLOCK_CREATE(ECO, 0);
  3267. #endif
  3268. #if SRSS_ALTHF_PRESENT
  3269. const cyhal_clock_t CYHAL_CLOCK_ALTHF = _CYHAL_CLOCK_CREATE(ALTHF, 0);
  3270. #endif
  3271. #if SRSS_ALTLF_PRESENT
  3272. const cyhal_clock_t CYHAL_CLOCK_ALTLF = _CYHAL_CLOCK_CREATE(ALTLF, 0);
  3273. #endif
  3274. #if _CYHAL_SRSS_PILO_PRESENT
  3275. const cyhal_clock_t CYHAL_CLOCK_PILO = _CYHAL_CLOCK_CREATE(PILO, 0);
  3276. #endif
  3277. #if SRSS_BACKUP_PRESENT
  3278. const cyhal_clock_t CYHAL_CLOCK_WCO = _CYHAL_CLOCK_CREATE(WCO, 0);
  3279. #endif
  3280. #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
  3281. const cyhal_clock_t CYHAL_CLOCK_MFO = _CYHAL_CLOCK_CREATE(MFO, 0);
  3282. const cyhal_clock_t CYHAL_CLOCK_MF = _CYHAL_CLOCK_CREATE(MF, 0);
  3283. #endif
  3284. #if defined(COMPONENT_CAT1C)
  3285. const cyhal_clock_t CYHAL_CLOCK_MEM = _CYHAL_CLOCK_CREATE(MEM, 0);
  3286. #endif
  3287. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
  3288. const cyhal_clock_t CYHAL_CLOCK_FLL = _CYHAL_CLOCK_CREATE(FLL, 0);
  3289. #endif
  3290. #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
  3291. #if defined(COMPONENT_CAT1C)
  3292. const cyhal_clock_t CYHAL_CLOCK_FAST[2] =
  3293. {
  3294. _CYHAL_CLOCK_CREATE(FAST, 0),
  3295. _CYHAL_CLOCK_CREATE(FAST, 1),
  3296. };
  3297. #else
  3298. const cyhal_clock_t CYHAL_CLOCK_FAST = _CYHAL_CLOCK_CREATE(FAST, 0);
  3299. #endif
  3300. const cyhal_clock_t CYHAL_CLOCK_SLOW = _CYHAL_CLOCK_CREATE(SLOW, 0);
  3301. #if defined(COMPONENT_CAT1A)
  3302. const cyhal_clock_t CYHAL_CLOCK_PERI = _CYHAL_CLOCK_CREATE(PERI, 0);
  3303. const cyhal_clock_t CYHAL_CLOCK_TIMER = _CYHAL_CLOCK_CREATE(TIMER, 0);
  3304. #endif
  3305. #if (_CYHAL_SRSS_NUM_PLL > 0) && defined(COMPONENT_CAT1A)
  3306. const cyhal_clock_t CYHAL_CLOCK_PLL[_CYHAL_SRSS_NUM_PLL] =
  3307. {
  3308. _CYHAL_CLOCK_CREATE(PLL, 0),
  3309. #if (_CYHAL_SRSS_NUM_PLL > 1)
  3310. _CYHAL_CLOCK_CREATE(PLL, 1),
  3311. #endif
  3312. #if (_CYHAL_SRSS_NUM_PLL > 2)
  3313. _CYHAL_CLOCK_CREATE(PLL, 2),
  3314. #endif
  3315. #if (_CYHAL_SRSS_NUM_PLL > 3)
  3316. _CYHAL_CLOCK_CREATE(PLL, 3),
  3317. #endif
  3318. #if (_CYHAL_SRSS_NUM_PLL > 4)
  3319. _CYHAL_CLOCK_CREATE(PLL, 4),
  3320. #endif
  3321. #if (_CYHAL_SRSS_NUM_PLL > 5)
  3322. _CYHAL_CLOCK_CREATE(PLL, 5),
  3323. #endif
  3324. #if (_CYHAL_SRSS_NUM_PLL > 6)
  3325. _CYHAL_CLOCK_CREATE(PLL, 6),
  3326. #endif
  3327. #if (_CYHAL_SRSS_NUM_PLL > 7)
  3328. _CYHAL_CLOCK_CREATE(PLL, 7),
  3329. #endif
  3330. #if (_CYHAL_SRSS_NUM_PLL > 8)
  3331. _CYHAL_CLOCK_CREATE(PLL, 8),
  3332. #endif
  3333. #if (_CYHAL_SRSS_NUM_PLL > 9)
  3334. _CYHAL_CLOCK_CREATE(PLL, 9),
  3335. #endif
  3336. #if (_CYHAL_SRSS_NUM_PLL > 10)
  3337. _CYHAL_CLOCK_CREATE(PLL, 10),
  3338. #endif
  3339. #if (_CYHAL_SRSS_NUM_PLL > 11)
  3340. _CYHAL_CLOCK_CREATE(PLL, 11),
  3341. #endif
  3342. #if (_CYHAL_SRSS_NUM_PLL > 12)
  3343. _CYHAL_CLOCK_CREATE(PLL, 12),
  3344. #endif
  3345. #if (_CYHAL_SRSS_NUM_PLL > 13)
  3346. _CYHAL_CLOCK_CREATE(PLL, 13),
  3347. #endif
  3348. #if (_CYHAL_SRSS_NUM_PLL > 14)
  3349. _CYHAL_CLOCK_CREATE(PLL, 14),
  3350. #endif
  3351. };
  3352. #endif
  3353. #endif
  3354. #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
  3355. #if defined(COMPONENT_CAT1B)
  3356. const cyhal_clock_t CYHAL_CLOCK_IHO = _CYHAL_CLOCK_CREATE(IHO, 0);
  3357. #if SRSS_ECO_PRESENT
  3358. const cyhal_clock_t CYHAL_CLOCK_ECO_PRESCALER = _CYHAL_CLOCK_CREATE(ECO_PRESCALER, 0);
  3359. #endif
  3360. #if SRSS_BACKUP_S40E_LPECO_PRESENT
  3361. const cyhal_clock_t CYHAL_CLOCK_LPECO_PRESCALER = _CYHAL_CLOCK_CREATE(LPECO_PRESCALER, 0);
  3362. #endif
  3363. #endif
  3364. const cyhal_clock_t CYHAL_CLOCK_PERI[CY_PERI_GROUP_NR] =
  3365. {
  3366. _CYHAL_CLOCK_CREATE(PERI, 0),
  3367. #if (CY_PERI_GROUP_NR > 1)
  3368. _CYHAL_CLOCK_CREATE(PERI, 1),
  3369. #endif
  3370. #if (CY_PERI_GROUP_NR > 2)
  3371. _CYHAL_CLOCK_CREATE(PERI, 2),
  3372. #endif
  3373. #if (CY_PERI_GROUP_NR > 3)
  3374. _CYHAL_CLOCK_CREATE(PERI, 3),
  3375. #endif
  3376. #if (CY_PERI_GROUP_NR > 4)
  3377. _CYHAL_CLOCK_CREATE(PERI, 4),
  3378. #endif
  3379. #if (CY_PERI_GROUP_NR > 5)
  3380. _CYHAL_CLOCK_CREATE(PERI, 5),
  3381. #endif
  3382. #if (CY_PERI_GROUP_NR > 6)
  3383. _CYHAL_CLOCK_CREATE(PERI, 6),
  3384. #endif
  3385. #if (CY_PERI_GROUP_NR > 7)
  3386. _CYHAL_CLOCK_CREATE(PERI, 7),
  3387. #endif
  3388. #if (CY_PERI_GROUP_NR > 8)
  3389. _CYHAL_CLOCK_CREATE(PERI, 8),
  3390. #endif
  3391. #if (CY_PERI_GROUP_NR > 9)
  3392. _CYHAL_CLOCK_CREATE(PERI, 9),
  3393. #endif
  3394. #if (CY_PERI_GROUP_NR > 10)
  3395. _CYHAL_CLOCK_CREATE(PERI, 10),
  3396. #endif
  3397. #if (CY_PERI_GROUP_NR > 11)
  3398. _CYHAL_CLOCK_CREATE(PERI, 11),
  3399. #endif
  3400. #if (CY_PERI_GROUP_NR > 12)
  3401. _CYHAL_CLOCK_CREATE(PERI, 12),
  3402. #endif
  3403. #if (CY_PERI_GROUP_NR > 13)
  3404. _CYHAL_CLOCK_CREATE(PERI, 13),
  3405. #endif
  3406. #if (CY_PERI_GROUP_NR > 14)
  3407. _CYHAL_CLOCK_CREATE(PERI, 14),
  3408. #endif
  3409. #if (CY_PERI_GROUP_NR > 15)
  3410. _CYHAL_CLOCK_CREATE(PERI, 15),
  3411. #endif
  3412. };
  3413. #if (SRSS_NUM_PLL200M > 0)
  3414. #if defined(COMPONENT_CAT1B)
  3415. const cyhal_clock_t CYHAL_CLOCK_PLL[SRSS_NUM_PLL200M] =
  3416. {
  3417. #else
  3418. const cyhal_clock_t CYHAL_CLOCK_PLL200[SRSS_NUM_PLL200M] =
  3419. {
  3420. #endif
  3421. _CYHAL_CLOCK_CREATE(PLL200, 0),
  3422. #if (SRSS_NUM_PLL200M > 1)
  3423. _CYHAL_CLOCK_CREATE(PLL200, 1),
  3424. #endif
  3425. #if (SRSS_NUM_PLL200M > 2)
  3426. _CYHAL_CLOCK_CREATE(PLL200, 2),
  3427. #endif
  3428. #if (SRSS_NUM_PLL200M > 3)
  3429. _CYHAL_CLOCK_CREATE(PLL200, 3),
  3430. #endif
  3431. #if (SRSS_NUM_PLL200M > 4)
  3432. _CYHAL_CLOCK_CREATE(PLL200, 4),
  3433. #endif
  3434. #if (SRSS_NUM_PLL200M > 5)
  3435. _CYHAL_CLOCK_CREATE(PLL200, 5),
  3436. #endif
  3437. #if (SRSS_NUM_PLL200M > 6)
  3438. _CYHAL_CLOCK_CREATE(PLL200, 6),
  3439. #endif
  3440. #if (SRSS_NUM_PLL200M > 7)
  3441. _CYHAL_CLOCK_CREATE(PLL200, 7),
  3442. #endif
  3443. #if (SRSS_NUM_PLL200M > 8)
  3444. _CYHAL_CLOCK_CREATE(PLL200, 8),
  3445. #endif
  3446. #if (SRSS_NUM_PLL200M > 9)
  3447. _CYHAL_CLOCK_CREATE(PLL200, 9),
  3448. #endif
  3449. #if (SRSS_NUM_PLL200M > 10)
  3450. _CYHAL_CLOCK_CREATE(PLL200, 10),
  3451. #endif
  3452. #if (SRSS_NUM_PLL200M > 11)
  3453. _CYHAL_CLOCK_CREATE(PLL200, 11),
  3454. #endif
  3455. #if (SRSS_NUM_PLL200M > 12)
  3456. _CYHAL_CLOCK_CREATE(PLL200, 12),
  3457. #endif
  3458. #if (SRSS_NUM_PLL200M > 13)
  3459. _CYHAL_CLOCK_CREATE(PLL200, 13),
  3460. #endif
  3461. #if (SRSS_NUM_PLL200M > 14)
  3462. _CYHAL_CLOCK_CREATE(PLL200, 14),
  3463. #endif
  3464. };
  3465. #endif
  3466. #if (SRSS_NUM_PLL400M > 0)
  3467. #if defined(COMPONENT_CAT1B)
  3468. const cyhal_clock_t CYHAL_CLOCK_PLL[SRSS_NUM_PLL400M] =
  3469. {
  3470. #else
  3471. const cyhal_clock_t CYHAL_CLOCK_PLL400[SRSS_NUM_PLL400M] =
  3472. {
  3473. #endif
  3474. _CYHAL_CLOCK_CREATE(PLL400, 0),
  3475. #if (SRSS_NUM_PLL400M > 1)
  3476. _CYHAL_CLOCK_CREATE(PLL400, 1),
  3477. #endif
  3478. #if (SRSS_NUM_PLL400M > 2)
  3479. _CYHAL_CLOCK_CREATE(PLL400, 2),
  3480. #endif
  3481. #if (SRSS_NUM_PLL400M > 3)
  3482. _CYHAL_CLOCK_CREATE(PLL400, 3),
  3483. #endif
  3484. #if (SRSS_NUM_PLL400M > 4)
  3485. _CYHAL_CLOCK_CREATE(PLL400, 4),
  3486. #endif
  3487. #if (SRSS_NUM_PLL400M > 5)
  3488. _CYHAL_CLOCK_CREATE(PLL400, 5),
  3489. #endif
  3490. #if (SRSS_NUM_PLL400M > 6)
  3491. _CYHAL_CLOCK_CREATE(PLL400, 6),
  3492. #endif
  3493. #if (SRSS_NUM_PLL400M > 7)
  3494. _CYHAL_CLOCK_CREATE(PLL400, 7),
  3495. #endif
  3496. #if (SRSS_NUM_PLL400M > 8)
  3497. _CYHAL_CLOCK_CREATE(PLL400, 8),
  3498. #endif
  3499. #if (SRSS_NUM_PLL400M > 9)
  3500. _CYHAL_CLOCK_CREATE(PLL400, 9),
  3501. #endif
  3502. #if (SRSS_NUM_PLL400M > 10)
  3503. _CYHAL_CLOCK_CREATE(PLL400, 10),
  3504. #endif
  3505. #if (SRSS_NUM_PLL400M > 11)
  3506. _CYHAL_CLOCK_CREATE(PLL400, 11),
  3507. #endif
  3508. #if (SRSS_NUM_PLL400M > 12)
  3509. _CYHAL_CLOCK_CREATE(PLL400, 12),
  3510. #endif
  3511. #if (SRSS_NUM_PLL400M > 13)
  3512. _CYHAL_CLOCK_CREATE(PLL400, 13),
  3513. #endif
  3514. #if (SRSS_NUM_PLL400M > 14)
  3515. _CYHAL_CLOCK_CREATE(PLL400, 14),
  3516. #endif
  3517. };
  3518. #endif
  3519. #endif
  3520. #if defined(COMPONENT_CAT1D)
  3521. const cyhal_clock_t CYHAL_CLOCK_DPLL_LP[SRSS_NUM_DPLL_LP] =
  3522. {
  3523. #if (SRSS_NUM_DPLL_LP > 0)
  3524. _CYHAL_CLOCK_CREATE(DPLL_LP, 0),
  3525. #endif
  3526. #if (SRSS_NUM_DPLL_LP > 1)
  3527. _CYHAL_CLOCK_CREATE(DPLL_LP, 1),
  3528. #endif
  3529. #if (SRSS_NUM_DPLL_LP > 2)
  3530. _CYHAL_CLOCK_CREATE(DPLL_LP, 2),
  3531. #endif
  3532. #if (SRSS_NUM_DPLL_LP > 3)
  3533. _CYHAL_CLOCK_CREATE(DPLL_LP, 4),
  3534. #endif
  3535. #if (SRSS_NUM_DPLL_LP > 4)
  3536. _CYHAL_CLOCK_CREATE(DPLL_LP, 4),
  3537. #endif
  3538. };
  3539. const cyhal_clock_t CYHAL_CLOCK_DPLL_HP[SRSS_NUM_DPLL_HP] =
  3540. {
  3541. #if (SRSS_NUM_DPLL_HP > 0)
  3542. _CYHAL_CLOCK_CREATE(DPLL_HP, 0),
  3543. #endif
  3544. #if (SRSS_NUM_DPLL_HP > 1)
  3545. _CYHAL_CLOCK_CREATE(DPLL_HP, 1),
  3546. #endif
  3547. #if (SRSS_NUM_DPLL_HP > 2)
  3548. _CYHAL_CLOCK_CREATE(DPLL_HP, 2),
  3549. #endif
  3550. #if (SRSS_NUM_DPLL_HP > 3)
  3551. _CYHAL_CLOCK_CREATE(DPLL_HP, 4),
  3552. #endif
  3553. #if (SRSS_NUM_DPLL_HP > 4)
  3554. _CYHAL_CLOCK_CREATE(DPLL_HP, 4),
  3555. #endif
  3556. };
  3557. #endif /* defined(COMPONENT_CAT1D) */
  3558. /******************************************************************************
  3559. **************************** Public API (clocks) *****************************
  3560. *****************************************************************************/
  3561. cy_rslt_t _cyhal_clock_allocate_channel(cyhal_clock_t *clock, cyhal_clock_block_t block, const void* funcs)
  3562. {
  3563. uint8_t maxChannels = (uint8_t)_cyhal_utils_get_clock_count(block);
  3564. for (uint8_t i = 0; i < maxChannels; i++)
  3565. {
  3566. cyhal_resource_inst_t clock_resource = { CYHAL_RSC_CLOCK, block, i };
  3567. if (CY_RSLT_SUCCESS == cyhal_hwmgr_reserve(&clock_resource))
  3568. {
  3569. clock->block = block;
  3570. clock->channel = i;
  3571. clock->reserved = true;
  3572. clock->funcs = funcs;
  3573. return CY_RSLT_SUCCESS;
  3574. }
  3575. }
  3576. return CYHAL_HWMGR_RSLT_ERR_NONE_FREE;
  3577. }
  3578. cy_rslt_t cyhal_clock_get(cyhal_clock_t *clock, const cyhal_resource_inst_t *resource)
  3579. {
  3580. CY_ASSERT(NULL != clock);
  3581. CY_ASSERT(NULL != resource);
  3582. CY_ASSERT(CYHAL_RSC_CLOCK == resource->type);
  3583. clock->block = (cyhal_clock_block_t)resource->block_num;
  3584. clock->channel = resource->channel_num;
  3585. clock->reserved = false;
  3586. clock->funcs = _cyhal_clock_get_funcs_all((cyhal_clock_block_t)resource->block_num);
  3587. return CY_RSLT_SUCCESS;
  3588. }
  3589. cy_rslt_t cyhal_clock_reserve(cyhal_clock_t *clock, const cyhal_clock_t *clock_)
  3590. {
  3591. CY_ASSERT(NULL != clock);
  3592. CY_ASSERT(NULL != clock_);
  3593. cyhal_resource_inst_t clock_resource = { CYHAL_RSC_CLOCK, clock_->block, clock_->channel };
  3594. cy_rslt_t rslt = cyhal_hwmgr_reserve(&clock_resource);
  3595. if (CY_RSLT_SUCCESS == rslt)
  3596. {
  3597. memcpy(clock, clock_, sizeof(cyhal_clock_t));
  3598. clock->reserved = true;
  3599. }
  3600. return rslt;
  3601. }
  3602. cyhal_clock_feature_t cyhal_clock_get_features(const cyhal_clock_t *clock)
  3603. {
  3604. CY_ASSERT(NULL != clock);
  3605. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3606. {
  3607. return (clock->channel == 0) // HF0 cannot be disabled
  3608. ? (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER)
  3609. : (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER);
  3610. }
  3611. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3612. return (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY);
  3613. else
  3614. return ((cyhal_clock_funcs_t*)clock->funcs)->features;
  3615. }
  3616. bool cyhal_clock_is_enabled(const cyhal_clock_t *clock)
  3617. {
  3618. CY_ASSERT(NULL != clock);
  3619. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3620. return _cyhal_clock_is_enabled_hf(clock);
  3621. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3622. return _cyhal_clock_is_enabled_peripheral(clock);
  3623. else
  3624. return ((cyhal_clock_funcs_t*)clock->funcs)->is_enabled(clock);
  3625. }
  3626. cy_rslt_t cyhal_clock_set_enabled(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
  3627. {
  3628. CY_ASSERT(NULL != clock);
  3629. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3630. return _cyhal_clock_set_enabled_hf(clock, enabled, wait_for_lock);
  3631. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3632. return _cyhal_clock_set_enabled_peripheral(clock, enabled, wait_for_lock);
  3633. else
  3634. return ((cyhal_clock_funcs_t*)clock->funcs)->set_enabled(clock, enabled, wait_for_lock);
  3635. }
  3636. uint32_t cyhal_clock_get_frequency(const cyhal_clock_t *clock)
  3637. {
  3638. CY_ASSERT(NULL != clock);
  3639. if (cyhal_clock_is_enabled(clock))
  3640. {
  3641. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3642. return _cyhal_clock_get_frequency_hf(clock);
  3643. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3644. return _cyhal_clock_get_frequency_peripheral(clock);
  3645. else
  3646. return ((cyhal_clock_funcs_t*)clock->funcs)->get_frequency(clock);
  3647. }
  3648. return 0;
  3649. }
  3650. cy_rslt_t cyhal_clock_set_frequency(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
  3651. {
  3652. CY_ASSERT(NULL != clock);
  3653. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3654. return _cyhal_clock_set_frequency_unsupported(clock, hz, tolerance);
  3655. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3656. return _cyhal_clock_set_frequency_peripheral(clock, hz, tolerance);
  3657. else
  3658. return ((cyhal_clock_funcs_t*)clock->funcs)->set_frequency(clock, hz, tolerance);
  3659. }
  3660. cy_rslt_t cyhal_clock_set_divider(cyhal_clock_t *clock, uint32_t divider)
  3661. {
  3662. CY_ASSERT(NULL != clock);
  3663. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3664. return _cyhal_clock_set_divider_hf(clock, divider);
  3665. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3666. return _cyhal_clock_set_divider_peripheral(clock, divider);
  3667. else
  3668. return ((cyhal_clock_funcs_t*)clock->funcs)->set_divider(clock, divider);
  3669. }
  3670. cy_rslt_t cyhal_clock_get_sources(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
  3671. {
  3672. CY_ASSERT(NULL != clock);
  3673. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3674. return _cyhal_clock_get_sources_hf(clock, sources, count);
  3675. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3676. return _cyhal_clock_get_sources_peripheral(clock, sources, count);
  3677. else
  3678. return ((cyhal_clock_funcs_t*)clock->funcs)->get_sources(clock, sources, count);
  3679. }
  3680. cy_rslt_t cyhal_clock_set_source(cyhal_clock_t *clock, const cyhal_clock_t *source)
  3681. {
  3682. CY_ASSERT(NULL != clock && NULL != source);
  3683. if (clock->block == CYHAL_CLOCK_BLOCK_HF)
  3684. return _cyhal_clock_set_source_hf(clock, source);
  3685. else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
  3686. return _cyhal_clock_set_source_unsupported(clock, source);
  3687. else
  3688. return ((cyhal_clock_funcs_t*)clock->funcs)->set_source(clock, source);
  3689. }
  3690. void cyhal_clock_free(cyhal_clock_t *clock)
  3691. {
  3692. CY_ASSERT(NULL != clock);
  3693. CY_ASSERT(clock->reserved);
  3694. cyhal_resource_inst_t rsc = { CYHAL_RSC_CLOCK, clock->block, clock->channel };
  3695. cyhal_hwmgr_free(&rsc);
  3696. clock->reserved = false;
  3697. }
  3698. #if defined(__cplusplus)
  3699. }
  3700. #endif
  3701. #endif // CYHAL_DRIVER_AVAILABLE_CLOCK