| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954 |
- /*******************************************************************************
- * File Name: cyhal_clock.c
- *
- * Description:
- * Provides an implementation for high level interface for interacting with the
- * Cypress Clocks. This is a wrapper around the lower level PDL API.
- *
- ********************************************************************************
- * \copyright
- * Copyright 2018-2022 Cypress Semiconductor Corporation (an Infineon company) or
- * an affiliate of Cypress Semiconductor Corporation
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *******************************************************************************/
- #include <stdlib.h>
- #include <string.h>
- #include "cy_sysclk.h"
- #include "cy_utils.h"
- #include "cyhal_clock.h"
- #include "cyhal_system.h"
- #include "cyhal_utils.h"
- #include "cyhal_hwmgr.h"
- #if (CYHAL_DRIVER_AVAILABLE_CLOCK)
- #if defined(__cplusplus)
- extern "C"
- {
- #endif
- #define _CYHAL_CLOCK_FLL_LOCK_TIME (20000UL)
- #define _CYHAL_CLOCK_PLL_LOCK_TIME (10000UL)
- #if defined(PERI_PCLK_GR_NUM_Pos)
- #define _CYHAL_CLOCK_GET_PCLK_GR_NUM(block) ((en_clk_dst_t)(_CYHAL_PERIPHERAL_GROUP_GET_GROUP(block) << PERI_PCLK_GR_NUM_Pos))
- #else
- #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. */
- #endif
- /* We can't use the PDL-defined _CYHAL_SRSS_PILO_PRESENT because on CAT1A devices it performs a struct lookup
- * which won't work in preprocessor expressions */
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #define _CYHAL_SRSS_PILO_PRESENT (SRSS_PILO_PRESENT)
- #elif defined(COMPONENT_CAT1B)
- #define _CYHAL_SRSS_PILO_PRESENT (SRSS_S40S_PILO_PRESENT)
- #endif
- /******************************************************************************
- ****************************** Clock Resources *******************************
- *****************************************************************************/
- const cyhal_clock_tolerance_t CYHAL_CLOCK_TOLERANCE_0_P = {CYHAL_TOLERANCE_PERCENT, 0};
- const cyhal_clock_tolerance_t CYHAL_CLOCK_TOLERANCE_1_P = {CYHAL_TOLERANCE_PERCENT, 1};
- const cyhal_clock_tolerance_t CYHAL_CLOCK_TOLERANCE_5_P = {CYHAL_TOLERANCE_PERCENT, 5};
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_IMO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_IMO, 0 };
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_EXT = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_EXT, 0 };
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ILO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ILO, 0 };
- #elif defined(COMPONENT_CAT1C)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ILO[_CYHAL_SRSS_NUM_ILO] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ILO, 0 },
- #if (SRSS_HT_VARIANT > 0)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ILO, 1 },
- #endif
- };
- #endif
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_LF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_LF, 0 };
- /* PUMP clock is only available on CAT1A and CAT1B devices */
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PUMP = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PUMP, 0 };
- #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_BAK = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_BAK, 0 };
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ALT_SYS_TICK = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ALT_SYS_TICK, 0 };
- #if defined(COMPONENT_CAT1C)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_MEM = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_MEM, 0 };
- #endif
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PATHMUX[SRSS_NUM_CLKPATH] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 0 },
- #if (SRSS_NUM_CLKPATH > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 1 },
- #endif
- #if (SRSS_NUM_CLKPATH > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 2 },
- #endif
- #if (SRSS_NUM_CLKPATH > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 3 },
- #endif
- #if (SRSS_NUM_CLKPATH > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 4 },
- #endif
- #if (SRSS_NUM_CLKPATH > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 5 },
- #endif
- #if (SRSS_NUM_CLKPATH > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 6 },
- #endif
- #if (SRSS_NUM_CLKPATH > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 7 },
- #endif
- #if (SRSS_NUM_CLKPATH > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 8 },
- #endif
- #if (SRSS_NUM_CLKPATH > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 9 },
- #endif
- #if (SRSS_NUM_CLKPATH > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 10 },
- #endif
- #if (SRSS_NUM_CLKPATH > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 11 },
- #endif
- #if (SRSS_NUM_CLKPATH > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 12 },
- #endif
- #if (SRSS_NUM_CLKPATH > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 13 },
- #endif
- #if (SRSS_NUM_CLKPATH > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 14 },
- #endif
- #if (SRSS_NUM_CLKPATH > 15)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PATHMUX, 15 },
- #endif
- };
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_HF[SRSS_NUM_HFROOT] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 0 },
- #if (SRSS_NUM_HFROOT > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 1 },
- #endif
- #if (SRSS_NUM_HFROOT > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 2 },
- #endif
- #if (SRSS_NUM_HFROOT > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 3 },
- #endif
- #if (SRSS_NUM_HFROOT > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 4 },
- #endif
- #if (SRSS_NUM_HFROOT > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 5 },
- #endif
- #if (SRSS_NUM_HFROOT > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 6 },
- #endif
- #if (SRSS_NUM_HFROOT > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 7 },
- #endif
- #if (SRSS_NUM_HFROOT > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 8 },
- #endif
- #if (SRSS_NUM_HFROOT > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 9 },
- #endif
- #if (SRSS_NUM_HFROOT > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 10 },
- #endif
- #if (SRSS_NUM_HFROOT > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 11 },
- #endif
- #if (SRSS_NUM_HFROOT > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 12 },
- #endif
- #if (SRSS_NUM_HFROOT > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 13 },
- #endif
- #if (SRSS_NUM_HFROOT > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 14 },
- #endif
- #if (SRSS_NUM_HFROOT > 15)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_HF, 15 },
- #endif
- };
- #if SRSS_ECO_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ECO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ECO, 0 };
- #endif
- #if SRSS_ALTHF_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ALTHF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ALTHF, 0 };
- #endif
- #if SRSS_ALTLF_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ALTLF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ALTLF, 0 };
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PILO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PILO, 0 };
- #endif
- #if SRSS_BACKUP_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_WCO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_WCO, 0 };
- #endif
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_MFO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_MFO, 0 };
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_MF = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_MF, 0 };
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_FLL = { CYHAL_RSC_CLOCK, CYHAL_CLOCK_BLOCK_FLL, 0 };
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- #if defined(COMPONENT_CAT1A)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_FAST = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_FAST, 0 };
- #else
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_FAST[_CYHAL_SRSS_NUM_FAST] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_FAST, 0 },
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_FAST, 1 },
- };
- #endif
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_SLOW = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_SLOW, 0 };
- #endif
- #if defined(COMPONENT_CAT1A)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PERI = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 0 };
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_TIMER = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_TIMER, 0 };
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PLL[_CYHAL_SRSS_NUM_PLL] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 0 },
- #if (_CYHAL_SRSS_NUM_PLL > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 1 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 2 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 3 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 4 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 5 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 6 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 7 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 8 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 9 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 10 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 11 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 12 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 13 },
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL, 14 },
- #endif
- };
- #endif
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_IHO = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_IHO, 0 };
- #if SRSS_ECO_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_ECO_PRESCALER = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_ECO_PRESCALER, 0 };
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_LPECO_PRESCALER = { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_LPECO_PRESCALER, 0 };
- #endif
- #endif
- /* COMPONENT_CAT1C uses a hybrid approach from what was done on CAT1A and CAT1B. Facelift CAT1C supports ClkPeri as well
- as Peripheral Clock Groups. For CAT1C, ClkPeri is used to source everything in Peripheral Clock Group 0 (HF0) and other
- Peripheral Clock Groups derive from one of the HFClks and have their own group divider. Thus we declare RSC_PERI Peri array for CAT1C */
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PERI[CY_PERI_GROUP_NR] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 0 },
- #if (CY_PERI_GROUP_NR > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 1 },
- #endif
- #if (CY_PERI_GROUP_NR > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 2 },
- #endif
- #if (CY_PERI_GROUP_NR > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 3 },
- #endif
- #if (CY_PERI_GROUP_NR > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 4 },
- #endif
- #if (CY_PERI_GROUP_NR > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 5 },
- #endif
- #if (CY_PERI_GROUP_NR > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 6 },
- #endif
- #if (CY_PERI_GROUP_NR > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 7 },
- #endif
- #if (CY_PERI_GROUP_NR > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 8 },
- #endif
- #if (CY_PERI_GROUP_NR > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 9 },
- #endif
- #if (CY_PERI_GROUP_NR > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 10 },
- #endif
- #if (CY_PERI_GROUP_NR > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 11 },
- #endif
- #if (CY_PERI_GROUP_NR > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 12 },
- #endif
- #if (CY_PERI_GROUP_NR > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 13 },
- #endif
- #if (CY_PERI_GROUP_NR > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 14 },
- #endif
- #if (CY_PERI_GROUP_NR > 15)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PERI, 15 },
- #endif
- };
- #if (SRSS_NUM_PLL200M > 0)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PLL200M[SRSS_NUM_PLL200M] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 0 },
- #if (SRSS_NUM_PLL200M > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 1 },
- #endif
- #if (SRSS_NUM_PLL200M > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 2 },
- #endif
- #if (SRSS_NUM_PLL200M > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 3 },
- #endif
- #if (SRSS_NUM_PLL200M > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 4 },
- #endif
- #if (SRSS_NUM_PLL200M > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 5 },
- #endif
- #if (SRSS_NUM_PLL200M > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 6 },
- #endif
- #if (SRSS_NUM_PLL200M > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 7 },
- #endif
- #if (SRSS_NUM_PLL200M > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 8 },
- #endif
- #if (SRSS_NUM_PLL200M > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 9 },
- #endif
- #if (SRSS_NUM_PLL200M > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 10 },
- #endif
- #if (SRSS_NUM_PLL200M > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 11 },
- #endif
- #if (SRSS_NUM_PLL200M > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 12 },
- #endif
- #if (SRSS_NUM_PLL200M > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 13 },
- #endif
- #if (SRSS_NUM_PLL200M > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL200, 14 },
- #endif
- };
- #endif
- #if (SRSS_NUM_PLL400M > 0)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_PLL400M[SRSS_NUM_PLL400M] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 0 },
- #if (SRSS_NUM_PLL400M > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 1 },
- #endif
- #if (SRSS_NUM_PLL400M > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 2 },
- #endif
- #if (SRSS_NUM_PLL400M > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 3 },
- #endif
- #if (SRSS_NUM_PLL400M > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 4 },
- #endif
- #if (SRSS_NUM_PLL400M > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 5 },
- #endif
- #if (SRSS_NUM_PLL400M > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 6 },
- #endif
- #if (SRSS_NUM_PLL400M > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 7 },
- #endif
- #if (SRSS_NUM_PLL400M > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 8 },
- #endif
- #if (SRSS_NUM_PLL400M > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 9 },
- #endif
- #if (SRSS_NUM_PLL400M > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 10 },
- #endif
- #if (SRSS_NUM_PLL400M > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 11 },
- #endif
- #if (SRSS_NUM_PLL400M > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 12 },
- #endif
- #if (SRSS_NUM_PLL400M > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 13 },
- #endif
- #if (SRSS_NUM_PLL400M > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_PLL400, 14 },
- #endif
- };
- #endif
- #if (SRSS_NUM_DPLL_LP > 0)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_DPLL_LP[SRSS_NUM_DPLL_LP] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 0 },
- #if (SRSS_NUM_DPLL_LP > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 1 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 2 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 3 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 4 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 5 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 6 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 7 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 8 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 9 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 10 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 11 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 12 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 13 },
- #endif
- #if (SRSS_NUM_DPLL_LP > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_LP, 14 },
- #endif
- };
- #endif
- #if (SRSS_NUM_DPLL_HP > 0)
- const cyhal_resource_inst_t CYHAL_CLOCK_RSC_DPLL_HP[SRSS_NUM_DPLL_HP] =
- {
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 0 },
- #if (SRSS_NUM_DPLL_HP > 1)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 1 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 2)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 2 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 3)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 3 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 4)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 4 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 5)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 5 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 6)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 6 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 7)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 7 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 8)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 8 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 9)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 9 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 10)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 10 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 11)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 11 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 12)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 12 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 13)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 13 },
- #endif
- #if (SRSS_NUM_DPLL_HP > 14)
- { CYHAL_RSC_CLOCK, (uint8_t)CYHAL_CLOCK_BLOCK_DPLL_HP, 14 },
- #endif
- };
- #endif
- #if ((SRSS_NUM_PLL400M > 0) && (SRSS_NUM_PLL200M == 0))
- #define CYHAL_CLOCK_RSC_PLL CYHAL_CLOCK_RSC_PLL400M
- #elif ((SRSS_NUM_PLL400M == 0) && (SRSS_NUM_PLL200M > 0))
- #define CYHAL_CLOCK_RSC_PLL CYHAL_CLOCK_RSC_PLL200M
- #endif
- #endif
- /******************************************************************************
- ***************************** Support Functions*******************************
- *****************************************************************************/
- 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)
- {
- uint32_t max_div = (1 << divider_bits);
- *div = (input_hz + (desired_hz / 2)) / desired_hz;
- if (*div > max_div)
- *div = max_div;
- uint32_t diff = (tolerance != NULL)
- ? (uint32_t)abs(_cyhal_utils_calculate_tolerance(tolerance->type, desired_hz, input_hz / *div))
- : 0;
- return ((tolerance != NULL) && (diff > tolerance->value))
- ? CYHAL_CLOCK_RSLT_ERR_FREQ
- : CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_lf_frequency(void)
- {
- cy_en_clklf_in_sources_t source = Cy_SysClk_ClkLfGetSource();
- switch (source)
- {
- case CY_SYSCLK_CLKLF_IN_ILO:
- #if defined(COMPONENT_CAT1C)
- case CY_SYSCLK_CLKLF_IN_ILO1:
- #endif
- return CY_SYSCLK_ILO_FREQ;
- #if _CYHAL_SRSS_PILO_PRESENT
- case CY_SYSCLK_CLKLF_IN_PILO:
- return CY_SYSCLK_PILO_FREQ;
- #endif
- #if SRSS_BACKUP_PRESENT
- case CY_SYSCLK_CLKLF_IN_WCO:
- return CY_SYSCLK_WCO_FREQ;
- #endif
- #if SRSS_ALTLF_PRESENT
- case CY_SYSCLK_CLKLF_IN_ALTLF:
- return Cy_SysClk_AltLfGetFrequency();
- #endif
- #if defined(COMPONENT_CAT1B)
- #if SRSS_ECO_PRESENT
- case CY_SYSCLK_CLKLF_IN_ECO_PRESCALER:
- //return Cy_SysClk_EcoPrescalerGetFrequency();
- return 0;
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- case CY_SYSCLK_CLKLF_IN_LPECO_PRESCALER:
- return Cy_SysClk_LpEcoPrescalerGetFrequency();
- #endif
- #endif
- default:
- CY_ASSERT(false);
- return 0;
- }
- }
- static void _cyhal_clock_update_system_state(bool before_change, uint32_t old_sysclk_freq_hz, uint32_t new_sysclk_freq_hz)
- {
- // If increasing the clock frequency we need to update the speeds
- // before the change. If decreasing the frequency we need to update
- // after the change.
- if ((before_change == (bool)(new_sysclk_freq_hz > old_sysclk_freq_hz)) ||
- (!before_change == (new_sysclk_freq_hz < old_sysclk_freq_hz)))
- {
- #if defined(COMPONENT_CAT1A)
- bool is_ulp = Cy_SysPm_IsSystemUlp();
- #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- bool is_ulp = true;
- #elif defined(COMPONENT_CAT1C)
- bool is_ulp = false;
- #endif
- Cy_SysLib_SetWaitStates(is_ulp, new_sysclk_freq_hz / 1000000);
- }
- // If after the change, update the clock
- if (!before_change)
- SystemCoreClockUpdate();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_unsupported(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(enabled);
- CY_UNUSED_PARAMETER(wait_for_lock);
- CY_ASSERT(false); // Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- static cy_rslt_t _cyhal_clock_set_frequency_unsupported(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(hz);
- CY_UNUSED_PARAMETER(tolerance);
- CY_ASSERT(false); // Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- static cy_rslt_t _cyhal_clock_set_divider_unsupported(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(divider);
- CY_ASSERT(false); // Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- static cy_rslt_t _cyhal_clock_set_source_unsupported(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(source);
- CY_ASSERT(false); // Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- static bool _cyhal_clock_is_enabled_true(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return true;
- }
- static cy_rslt_t _cyhal_clock_get_sources_none(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(sources);
- *count = 0;
- return CY_RSLT_SUCCESS;
- }
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_HF[] =
- {
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- &CYHAL_CLOCK_RSC_FLL,
- #endif
- #if defined(COMPONENT_CAT1A)
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- &CYHAL_CLOCK_RSC_PLL[0],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 1)
- &CYHAL_CLOCK_RSC_PLL[1],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 2)
- &CYHAL_CLOCK_RSC_PLL[2],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 3)
- &CYHAL_CLOCK_RSC_PLL[3],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 4)
- &CYHAL_CLOCK_RSC_PLL[4],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 5)
- &CYHAL_CLOCK_RSC_PLL[5],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 6)
- &CYHAL_CLOCK_RSC_PLL[6],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 7)
- &CYHAL_CLOCK_RSC_PLL[7],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 8)
- &CYHAL_CLOCK_RSC_PLL[8],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 9)
- &CYHAL_CLOCK_RSC_PLL[9],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 10)
- &CYHAL_CLOCK_RSC_PLL[10],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 11)
- &CYHAL_CLOCK_RSC_PLL[11],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 12)
- &CYHAL_CLOCK_RSC_PLL[12],
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 13)
- &CYHAL_CLOCK_RSC_PLL[13],
- #endif
- #elif defined(COMPONENT_CAT1C)
- #if (SRSS_NUM_PLL200M > 0)
- &CYHAL_CLOCK_RSC_PLL200M[0],
- #endif
- #if (SRSS_NUM_PLL200M > 1)
- &CYHAL_CLOCK_RSC_PLL200M[1],
- #endif
- #if (SRSS_NUM_PLL200M > 2)
- &CYHAL_CLOCK_RSC_PLL200M[2],
- #endif
- #if (SRSS_NUM_PLL200M > 3)
- &CYHAL_CLOCK_RSC_PLL200M[3],
- #endif
- #if (SRSS_NUM_PLL200M > 4)
- &CYHAL_CLOCK_RSC_PLL200M[4],
- #endif
- #if (SRSS_NUM_PLL200M > 5)
- &CYHAL_CLOCK_RSC_PLL200M[5],
- #endif
- #if (SRSS_NUM_PLL200M > 6)
- &CYHAL_CLOCK_RSC_PLL200M[6],
- #endif
- #if (SRSS_NUM_PLL200M > 7)
- &CYHAL_CLOCK_RSC_PLL200M[7],
- #endif
- #if (SRSS_NUM_PLL200M > 8)
- &CYHAL_CLOCK_RSC_PLL200M[8],
- #endif
- #if (SRSS_NUM_PLL200M > 9)
- &CYHAL_CLOCK_RSC_PLL200M[9],
- #endif
- #if (SRSS_NUM_PLL200M > 10)
- &CYHAL_CLOCK_RSC_PLL200M[10],
- #endif
- #if (SRSS_NUM_PLL200M > 11)
- &CYHAL_CLOCK_RSC_PLL200M[11],
- #endif
- #if (SRSS_NUM_PLL200M > 12)
- &CYHAL_CLOCK_RSC_PLL200M[12],
- #endif
- #if (SRSS_NUM_PLL200M > 13)
- &CYHAL_CLOCK_RSC_PLL200M[13],
- #endif
- #if (SRSS_NUM_PLL200M > 14)
- &CYHAL_CLOCK_RSC_PLL200M[14],
- #endif
- #if (SRSS_NUM_PLL200M > 15)
- &CYHAL_CLOCK_RSC_PLL200M[15],
- #endif
- #if (SRSS_NUM_PLL400M > 0)
- &CYHAL_CLOCK_RSC_PLL400M[0],
- #endif
- #if (SRSS_NUM_PLL400M > 1)
- &CYHAL_CLOCK_RSC_PLL400M[1],
- #endif
- #if (SRSS_NUM_PLL400M > 2)
- &CYHAL_CLOCK_RSC_PLL400M[2],
- #endif
- #if (SRSS_NUM_PLL400M > 3)
- &CYHAL_CLOCK_RSC_PLL400M[3],
- #endif
- #if (SRSS_NUM_PLL400M > 4)
- &CYHAL_CLOCK_RSC_PLL400M[4],
- #endif
- #if (SRSS_NUM_PLL400M > 5)
- &CYHAL_CLOCK_RSC_PLL400M[5],
- #endif
- #if (SRSS_NUM_PLL400M > 6)
- &CYHAL_CLOCK_RSC_PLL400M[6],
- #endif
- #if (SRSS_NUM_PLL400M > 7)
- &CYHAL_CLOCK_RSC_PLL400M[7],
- #endif
- #if (SRSS_NUM_PLL400M > 8)
- &CYHAL_CLOCK_RSC_PLL400M[8],
- #endif
- #if (SRSS_NUM_PLL400M > 9)
- &CYHAL_CLOCK_RSC_PLL400M[9],
- #endif
- #if (SRSS_NUM_PLL400M > 10)
- &CYHAL_CLOCK_RSC_PLL400M[10],
- #endif
- #if (SRSS_NUM_PLL400M > 11)
- &CYHAL_CLOCK_RSC_PLL400M[11],
- #endif
- #if (SRSS_NUM_PLL400M > 12)
- &CYHAL_CLOCK_RSC_PLL400M[12],
- #endif
- #if (SRSS_NUM_PLL400M > 13)
- &CYHAL_CLOCK_RSC_PLL400M[13],
- #endif
- #if (SRSS_NUM_PLL400M > 14)
- &CYHAL_CLOCK_RSC_PLL400M[14],
- #endif
- #if (SRSS_NUM_PLL400M > 15)
- &CYHAL_CLOCK_RSC_PLL400M[15],
- #endif
- #elif defined(COMPONENT_CAT1D)
- #if (SRSS_NUM_DPLL_LP > 0)
- &CYHAL_CLOCK_RSC_DPLL_LP[0],
- #endif
- #if (SRSS_NUM_DPLL_LP > 1)
- &CYHAL_CLOCK_RSC_DPLL_LP[1],
- #endif
- #if (SRSS_NUM_DPLL_LP > 2)
- &CYHAL_CLOCK_RSC_DPLL_LP[2],
- #endif
- #if (SRSS_NUM_DPLL_LP > 3)
- &CYHAL_CLOCK_RSC_DPLL_LP[3],
- #endif
- #if (SRSS_NUM_DPLL_LP > 4)
- &CYHAL_CLOCK_RSC_DPLL_LP[4],
- #endif
- #if (SRSS_NUM_DPLL_LP > 5)
- &CYHAL_CLOCK_RSC_DPLL_LP[5],
- #endif
- #if (SRSS_NUM_DPLL_LP > 6)
- &CYHAL_CLOCK_RSC_DPLL_LP[6],
- #endif
- #if (SRSS_NUM_DPLL_LP > 7)
- &CYHAL_CLOCK_RSC_DPLL_LP[7],
- #endif
- #if (SRSS_NUM_DPLL_LP > 8)
- &CYHAL_CLOCK_RSC_DPLL_LP[8],
- #endif
- #if (SRSS_NUM_DPLL_LP > 9)
- &CYHAL_CLOCK_RSC_DPLL_LP[9],
- #endif
- #if (SRSS_NUM_DPLL_LP > 10)
- &CYHAL_CLOCK_RSC_DPLL_LP[10],
- #endif
- #if (SRSS_NUM_DPLL_LP > 11)
- &CYHAL_CLOCK_RSC_DPLL_LP[11],
- #endif
- #if (SRSS_NUM_DPLL_LP > 12)
- &CYHAL_CLOCK_RSC_DPLL_LP[12],
- #endif
- #if (SRSS_NUM_DPLL_LP > 13)
- &CYHAL_CLOCK_RSC_DPLL_LP[13],
- #endif
- #if (SRSS_NUM_DPLL_LP > 14)
- &CYHAL_CLOCK_RSC_DPLL_LP[14],
- #endif
- #if (SRSS_NUM_DPLL_LP > 15)
- &CYHAL_CLOCK_RSC_DPLL_LP[15],
- #endif
- #if (SRSS_NUM_DPLL_HP > 0)
- &CYHAL_CLOCK_RSC_DPLL_HP[0],
- #endif
- #if (SRSS_NUM_DPLL_HP > 1)
- &CYHAL_CLOCK_RSC_DPLL_HP[1],
- #endif
- #if (SRSS_NUM_DPLL_HP > 2)
- &CYHAL_CLOCK_RSC_DPLL_HP[2],
- #endif
- #if (SRSS_NUM_DPLL_HP > 3)
- &CYHAL_CLOCK_RSC_DPLL_HP[3],
- #endif
- #if (SRSS_NUM_DPLL_HP > 4)
- &CYHAL_CLOCK_RSC_DPLL_HP[4],
- #endif
- #if (SRSS_NUM_DPLL_HP > 5)
- &CYHAL_CLOCK_RSC_DPLL_HP[5],
- #endif
- #if (SRSS_NUM_DPLL_HP > 6)
- &CYHAL_CLOCK_RSC_DPLL_HP[6],
- #endif
- #if (SRSS_NUM_DPLL_HP > 7)
- &CYHAL_CLOCK_RSC_DPLL_HP[7],
- #endif
- #if (SRSS_NUM_DPLL_HP > 8)
- &CYHAL_CLOCK_RSC_DPLL_HP[8],
- #endif
- #if (SRSS_NUM_DPLL_HP > 9)
- &CYHAL_CLOCK_RSC_DPLL_HP[9],
- #endif
- #if (SRSS_NUM_DPLL_HP > 10)
- &CYHAL_CLOCK_RSC_DPLL_HP[10],
- #endif
- #if (SRSS_NUM_DPLL_HP > 11)
- &CYHAL_CLOCK_RSC_DPLL_HP[11],
- #endif
- #if (SRSS_NUM_DPLL_HP > 12)
- &CYHAL_CLOCK_RSC_DPLL_HP[12],
- #endif
- #if (SRSS_NUM_DPLL_HP > 13)
- &CYHAL_CLOCK_RSC_DPLL_HP[13],
- #endif
- #if (SRSS_NUM_DPLL_HP > 14)
- &CYHAL_CLOCK_RSC_DPLL_HP[14],
- #endif
- #if (SRSS_NUM_DPLL_HP > 15)
- &CYHAL_CLOCK_RSC_DPLL_HP[15],
- #endif
- #endif
- &CYHAL_CLOCK_RSC_PATHMUX[0],
- #if (SRSS_NUM_CLKPATH > 1)
- &CYHAL_CLOCK_RSC_PATHMUX[1],
- #endif
- #if (SRSS_NUM_CLKPATH > 2)
- &CYHAL_CLOCK_RSC_PATHMUX[2],
- #endif
- #if (SRSS_NUM_CLKPATH > 3)
- &CYHAL_CLOCK_RSC_PATHMUX[3],
- #endif
- #if (SRSS_NUM_CLKPATH > 4)
- &CYHAL_CLOCK_RSC_PATHMUX[4],
- #endif
- #if (SRSS_NUM_CLKPATH > 5)
- &CYHAL_CLOCK_RSC_PATHMUX[5],
- #endif
- #if (SRSS_NUM_CLKPATH > 6)
- &CYHAL_CLOCK_RSC_PATHMUX[6],
- #endif
- #if (SRSS_NUM_CLKPATH > 7)
- &CYHAL_CLOCK_RSC_PATHMUX[7],
- #endif
- #if (SRSS_NUM_CLKPATH > 8)
- &CYHAL_CLOCK_RSC_PATHMUX[8],
- #endif
- #if (SRSS_NUM_CLKPATH > 9)
- &CYHAL_CLOCK_RSC_PATHMUX[9],
- #endif
- #if (SRSS_NUM_CLKPATH > 10)
- &CYHAL_CLOCK_RSC_PATHMUX[10],
- #endif
- #if (SRSS_NUM_CLKPATH > 11)
- &CYHAL_CLOCK_RSC_PATHMUX[11],
- #endif
- #if (SRSS_NUM_CLKPATH > 12)
- &CYHAL_CLOCK_RSC_PATHMUX[12],
- #endif
- #if (SRSS_NUM_CLKPATH > 13)
- &CYHAL_CLOCK_RSC_PATHMUX[13],
- #endif
- #if (SRSS_NUM_CLKPATH > 14)
- &CYHAL_CLOCK_RSC_PATHMUX[14],
- #endif
- #if (SRSS_NUM_CLKPATH > 15)
- &CYHAL_CLOCK_RSC_PATHMUX[15],
- #endif
- };
- #if defined (COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- static cy_rslt_t _cyhal_clock_get_sources_peri_peripheral(uint8_t idx, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_PERI[SRSS_NUM_HFROOT] =
- {
- &CYHAL_CLOCK_RSC_HF[0],
- #if (SRSS_NUM_HFROOT > 1)
- &CYHAL_CLOCK_RSC_HF[1],
- #endif
- #if (SRSS_NUM_HFROOT > 2)
- &CYHAL_CLOCK_RSC_HF[2],
- #endif
- #if (SRSS_NUM_HFROOT > 3)
- &CYHAL_CLOCK_RSC_HF[3],
- #endif
- #if (SRSS_NUM_HFROOT > 4)
- &CYHAL_CLOCK_RSC_HF[4],
- #endif
- #if (SRSS_NUM_HFROOT > 5)
- &CYHAL_CLOCK_RSC_HF[5],
- #endif
- #if (SRSS_NUM_HFROOT > 6)
- &CYHAL_CLOCK_RSC_HF[6],
- #endif
- #if (SRSS_NUM_HFROOT > 7)
- &CYHAL_CLOCK_RSC_HF[7],
- #endif
- #if (SRSS_NUM_HFROOT > 8)
- &CYHAL_CLOCK_RSC_HF[8],
- #endif
- #if (SRSS_NUM_HFROOT > 9)
- &CYHAL_CLOCK_RSC_HF[9],
- #endif
- #if (SRSS_NUM_HFROOT > 10)
- &CYHAL_CLOCK_RSC_HF[10],
- #endif
- #if (SRSS_NUM_HFROOT > 11)
- &CYHAL_CLOCK_RSC_HF[11],
- #endif
- #if (SRSS_NUM_HFROOT > 12)
- &CYHAL_CLOCK_RSC_HF[12],
- #endif
- #if (SRSS_NUM_HFROOT > 13)
- &CYHAL_CLOCK_RSC_HF[13],
- #endif
- #if (SRSS_NUM_HFROOT > 14)
- &CYHAL_CLOCK_RSC_HF[14],
- #endif
- #if (SRSS_NUM_HFROOT > 15)
- &CYHAL_CLOCK_RSC_HF[15],
- #endif
- };
- *sources = &(_CYHAL_CLOCK_SOURCE_PERI[idx]);
- *count = 1;
- return CY_RSLT_SUCCESS;
- }
- #endif
- // IMO
- static uint32_t _cyhal_clock_get_frequency_imo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return CY_SYSCLK_IMO_FREQ;
- }
- // ECO
- #if SRSS_ECO_PRESENT
- static bool _cyhal_clock_is_enabled_eco(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return 0u != (SRSS_CLK_ECO_CONFIG & SRSS_CLK_ECO_CONFIG_ECO_EN_Msk);
- }
- static cy_rslt_t _cyhal_clock_set_enabled_eco(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- if (enabled)
- {
- if (0u != (SRSS_CLK_ECO_CONFIG & SRSS_CLK_ECO_CONFIG_ECO_EN_Msk))
- {
- // Already enabled
- if (wait_for_lock)
- {
- for (int t = 0; t < 3 && Cy_SysClk_EcoGetStatus() != CY_SYSCLK_ECOSTAT_STABLE; ++t)
- {
- cyhal_system_delay_us(1000UL);
- }
- return Cy_SysClk_EcoGetStatus() == CY_SYSCLK_ECOSTAT_STABLE
- ? CY_RSLT_SUCCESS
- : CY_SYSCLK_TIMEOUT;
- }
- return CY_RSLT_SUCCESS;
- }
- else
- {
- return Cy_SysClk_EcoEnable(wait_for_lock ? 3000UL : 0UL);
- }
- }
- else
- {
- Cy_SysClk_EcoDisable();
- return CY_RSLT_SUCCESS;
- }
- }
- static uint32_t _cyhal_clock_get_frequency_eco(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_EcoGetFrequency();
- }
- #endif
- // EXT
- static bool _cyhal_clock_is_enabled_ext(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return (Cy_SysClk_ExtClkGetFrequency() > 0);
- }
- static uint32_t _cyhal_clock_get_frequency_ext(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ExtClkGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_frequency_ext(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(tolerance);
- Cy_SysClk_ExtClkSetFrequency(hz);
- return CY_RSLT_SUCCESS;
- }
- // ALTHF
- #if SRSS_ALTHF_PRESENT
- static bool _cyhal_clock_is_enabled_althf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return (Cy_SysClk_AltHfGetFrequency() > 0);
- }
- static uint32_t _cyhal_clock_get_frequency_althf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_AltHfGetFrequency();
- }
- #endif
- // ALTLF
- #if SRSS_ALTLF_PRESENT
- static bool _cyhal_clock_is_enabled_altlf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_AltLfIsEnabled();
- }
- static uint32_t _cyhal_clock_get_frequency_altlf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_AltLfGetFrequency();
- }
- #endif
- // IHO
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- static bool _cyhal_clock_is_enabled_iho(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_IhoIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_iho(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- if (enabled)
- Cy_SysClk_IhoEnable();
- else
- Cy_SysClk_IhoDisable();
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_iho(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return CY_SYSCLK_IHO_FREQ;
- }
- #endif
- // ILO
- static bool _cyhal_clock_is_enabled_ilo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- #if defined(COMPONENT_CAT1C)
- return Cy_SysClk_IloSrcIsEnabled(clock->channel);
- #else
- return Cy_SysClk_IloIsEnabled();
- #endif
- }
- static cy_rslt_t _cyhal_clock_set_enabled_ilo(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- #if defined(COMPONENT_CAT1C)
- if (enabled)
- {
- Cy_SysPm_BgRefCtrl(true);
- Cy_WDT_Unlock();
- Cy_SysClk_IloSrcEnable(clock->channel);
- Cy_WDT_Lock();
- }
- else
- {
- Cy_SysPm_BgRefCtrl(false);
- Cy_WDT_Unlock();
- Cy_SysClk_IloSrcDisable(clock->channel);
- Cy_WDT_Lock();
- }
- #else
- if (enabled)
- Cy_SysClk_IloEnable();
- else
- Cy_SysClk_IloDisable();
- #endif
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_ilo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return CY_SYSCLK_ILO_FREQ;
- }
- // PILO
- #if _CYHAL_SRSS_PILO_PRESENT
- static bool _cyhal_clock_is_enabled_pilo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_PiloIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_pilo(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- if (enabled)
- Cy_SysClk_PiloEnable();
- else
- Cy_SysClk_PiloDisable();
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_pilo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return CY_SYSCLK_PILO_FREQ;
- }
- #endif
- // WCO
- #if SRSS_BACKUP_PRESENT
- static bool _cyhal_clock_is_enabled_wco(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- #if defined(CY_IP_MXS28SRSS)
- return 0u != (BACKUP_CTL & BACKUP_WCO_CTL_WCO_EN_Msk);
- #else
- return 0u != (BACKUP_CTL & BACKUP_CTL_WCO_EN_Msk);
- #endif
- }
- static cy_rslt_t _cyhal_clock_set_enabled_wco(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- if (enabled)
- {
- cy_rslt_t rslt = Cy_SysClk_WcoEnable(wait_for_lock ? 1000000UL : 0UL);
- // Ignore CY_SYSCLK_TIMEOUT unless wait_for_lock is true
- return wait_for_lock ? rslt : CY_RSLT_SUCCESS;
- }
- else
- {
- Cy_SysClk_WcoDisable();
- return CY_RSLT_SUCCESS;
- }
- }
- static uint32_t _cyhal_clock_get_frequency_wco(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return CY_SYSCLK_WCO_FREQ;
- }
- #endif
- // MFO
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- static bool _cyhal_clock_is_enabled_mfo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_MfoIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_mfo(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- if (enabled)
- Cy_SysClk_MfoEnable(true);
- else
- Cy_SysClk_MfoDisable();
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_mfo(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return CY_SYSCLK_MFO_FREQ;
- }
- static cy_rslt_t _cyhal_clock_get_sources_mfo(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_MFO[] =
- {
- &CYHAL_CLOCK_RSC_IMO,
- };
- *sources = _CYHAL_CLOCK_SOURCE_MFO;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_MFO) / sizeof(_CYHAL_CLOCK_SOURCE_MFO[0]);
- return CY_RSLT_SUCCESS;
- }
- #endif
- // PathMux
- static uint32_t _cyhal_clock_get_frequency_pathmux(const cyhal_clock_t *clock)
- {
- return Cy_SysClk_ClkPathMuxGetFrequency(clock->channel);
- }
- static cy_rslt_t _cyhal_clock_get_sources_pathmux(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_PATHMUX[] =
- {
- &CYHAL_CLOCK_RSC_IMO,
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- &CYHAL_CLOCK_RSC_IHO,
- #endif
- #if SRSS_ECO_PRESENT
- &CYHAL_CLOCK_RSC_ECO,
- #endif
- &CYHAL_CLOCK_RSC_EXT,
- #if SRSS_ALTHF_PRESENT
- &CYHAL_CLOCK_RSC_ALTHF,
- #endif
- #if defined(COMPONENT_CAT1C)
- &CYHAL_CLOCK_RSC_ILO[0],
- #if (SRSS_HT_VARIANT > 0)
- &CYHAL_CLOCK_RSC_ILO[1],
- #endif
- /* There are no ILO clock available on CAT1D */
- #elif !defined(COMPONENT_CAT1D)
- &CYHAL_CLOCK_RSC_ILO,
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- &CYHAL_CLOCK_RSC_PILO,
- #endif
- #if SRSS_BACKUP_PRESENT
- &CYHAL_CLOCK_RSC_WCO,
- #endif
- #if SRSS_ALTLF_PRESENT
- &CYHAL_CLOCK_RSC_ALTLF,
- #endif
- };
- *sources = _CYHAL_CLOCK_SOURCE_PATHMUX;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_PATHMUX) / sizeof(_CYHAL_CLOCK_SOURCE_PATHMUX[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_pathmux(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- uint32_t new_freq;
- cy_en_clkpath_in_sources_t clkpath_src;
- switch (source->block)
- {
- case CYHAL_CLOCK_BLOCK_IMO:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_IMO;
- new_freq = CY_SYSCLK_IMO_FREQ;
- break;
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- case CYHAL_CLOCK_BLOCK_IHO:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_IHO;
- new_freq = CY_SYSCLK_IHO_FREQ;
- break;
- #endif
- case CYHAL_CLOCK_BLOCK_EXT:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_EXT;
- new_freq = Cy_SysClk_ExtClkGetFrequency();
- break;
- #if SRSS_ECO_PRESENT
- case CYHAL_CLOCK_BLOCK_ECO:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_ECO;
- new_freq = Cy_SysClk_EcoGetFrequency();
- break;
- #endif
- #if SRSS_ALTHF_PRESENT
- case CYHAL_CLOCK_BLOCK_ALTHF:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_ALTHF;
- new_freq = Cy_SysClk_AltHfGetFrequency();
- break;
- #endif
- case CYHAL_CLOCK_BLOCK_ILO:
- #if defined(COMPONENT_CAT1C)
- if (1 == source->channel)
- {
- clkpath_src = CY_SYSCLK_CLKPATH_IN_ILO1;
- new_freq = CY_SYSCLK_ILO_FREQ;
- }
- else
- #endif
- {
- clkpath_src = CY_SYSCLK_CLKPATH_IN_ILO;
- new_freq = CY_SYSCLK_ILO_FREQ;
- }
- break;
- #if SRSS_BACKUP_PRESENT
- case CYHAL_CLOCK_BLOCK_WCO:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_WCO;
- new_freq = CY_SYSCLK_WCO_FREQ;
- break;
- #endif
- #if SRSS_ALTLF_PRESENT
- case CYHAL_CLOCK_BLOCK_ALTLF:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_ALTLF;
- new_freq = Cy_SysClk_AltLfGetFrequency();
- break;
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- case CYHAL_CLOCK_BLOCK_PILO:
- clkpath_src = CY_SYSCLK_CLKPATH_IN_PILO;
- new_freq = CY_SYSCLK_PILO_FREQ;
- break;
- #endif
- default:
- CY_ASSERT(false); //Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- uint32_t old_hf_freq = Cy_SysClk_ClkHfGetFrequency(0);
- uint32_t new_hf_freq = new_freq >> ((uint8_t)Cy_SysClk_ClkHfGetDivider(0));
- bool is_sysclk_path = (clock->channel == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
- if (is_sysclk_path)
- _cyhal_clock_update_system_state(true, old_hf_freq, new_hf_freq);
- cy_rslt_t rslt = Cy_SysClk_ClkPathSetSource(clock->channel, clkpath_src);
- if (is_sysclk_path)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_hf_freq, new_hf_freq);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_hf_freq, old_hf_freq);
- }
- return rslt;
- }
- // FLL
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- static bool _cyhal_clock_is_enabled_fll(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_FllIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_fll(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- cy_stc_fll_manual_config_t cfg;
- Cy_SysClk_FllGetConfiguration(&cfg);
- uint32_t new_freq, old_freq;
- uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
- uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(0);
- uint32_t fll_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * (uint64_t)cfg.fllMult, (uint32_t)cfg.refDiv * ((cfg.enableOutputDiv) ? 2UL : 1UL));
- if (enabled)
- {
- new_freq = fll_freq >> div;
- old_freq = src_freq >> div;
- }
- else
- {
- new_freq = src_freq >> div;
- old_freq = fll_freq >> div;
- }
- bool fll_sources_hf0 = (0 == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
- if (fll_sources_hf0)
- _cyhal_clock_update_system_state(true, old_freq, new_freq);
- cy_rslt_t rslt = (enabled)
- ? Cy_SysClk_FllEnable(wait_for_lock ? _CYHAL_CLOCK_FLL_LOCK_TIME : 0UL)
- : Cy_SysClk_FllDisable();
- if (fll_sources_hf0)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_freq, new_freq);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_freq, old_freq);
- }
- return rslt;
- }
- static uint32_t _cyhal_clock_get_frequency_fll(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkPathGetFrequency(0);
- }
- static cy_rslt_t _cyhal_clock_set_frequency_fll(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(tolerance);
- cy_rslt_t rslt = CY_RSLT_SUCCESS;
- cy_stc_fll_manual_config_t cfg;
- Cy_SysClk_FllGetConfiguration(&cfg);
- uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(0);
- if (0 == src_freq)
- rslt = CYHAL_CLOCK_RSLT_ERR_SOURCE;
- else
- {
- uint32_t old_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * (uint64_t)cfg.fllMult, (uint32_t)cfg.refDiv * ((cfg.enableOutputDiv) ? 2UL : 1UL));
- uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
- uint32_t old_hf_freq = old_freq >> div;
- uint32_t new_hf_freq = hz /*new_freq*/ >> div;
- bool fll_sources_hf0 = (0 == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
- if (fll_sources_hf0)
- _cyhal_clock_update_system_state(true, old_hf_freq, new_hf_freq);
- bool enabled = Cy_SysClk_FllIsEnabled();
- if (enabled)
- rslt = Cy_SysClk_FllDisable();
- if (CY_RSLT_SUCCESS == rslt)
- {
- rslt = Cy_SysClk_FllConfigure(src_freq, hz/*new_freq*/, CY_SYSCLK_FLLPLL_OUTPUT_AUTO);
- if (enabled)
- {
- cy_rslt_t rslt2 = Cy_SysClk_FllEnable(_CYHAL_CLOCK_FLL_LOCK_TIME);
- if (CY_RSLT_SUCCESS == rslt)
- rslt = rslt2;
- }
- }
- if (fll_sources_hf0)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_hf_freq, new_hf_freq);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_hf_freq, old_hf_freq);
- }
- }
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_get_sources_fll(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- *sources = &(_CYHAL_CLOCK_SOURCE_HF[1 + _CYHAL_SRSS_NUM_PLL]);
- *count = 1;
- return CY_RSLT_SUCCESS;
- }
- #endif
- // PLL
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- static bool _cyhal_clock_is_enabled_pll(const cyhal_clock_t *clock)
- {
- #if defined(COMPONENT_CAT1C)
- if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
- {
- return Cy_SysClk_PllIsEnabled(clock->channel + 1 + SRSS_NUM_PLL400M);
- }
- #endif
- return Cy_SysClk_PllIsEnabled(clock->channel + 1);
- }
- static void _cyhal_clock_extract_pll_params(cyhal_clock_t *clock, cy_stc_pll_manual_config_t *cfg, uint64_t *feedbackDiv,
- uint32_t *referenceDiv, uint32_t *outputDiv)
- {
- #if defined (CY_IP_MXS40SRSS)
- *feedbackDiv = cfg->feedbackDiv;
- *referenceDiv = cfg->referenceDiv;
- *outputDiv = cfg->outputDiv;
- CY_UNUSED_PARAMETER(clock);
- #elif defined (CY_IP_MXS22SRSS)
- if (clock->block == CYHAL_CLOCK_BLOCK_DPLL_LP)
- {
- *feedbackDiv = cfg->lpPllCfg->feedbackDiv;
- *referenceDiv = cfg->lpPllCfg->referenceDiv;
- *outputDiv = cfg->lpPllCfg->outputDiv;
- }
- else if (clock->block == CYHAL_CLOCK_BLOCK_DPLL_HP)
- {
- /* Per IP block documentation, each divider requires +1 for correct output clock calculation */
- *feedbackDiv = cfg->hpPllCfg->nDiv + 1;
- *referenceDiv = cfg->hpPllCfg->pDiv + 1;
- *outputDiv = cfg->hpPllCfg->kDiv + 1;
- }
- #else
- #error "Unhandled SRSS block type"
- #endif /* defined (CY_IP_MXS40SRSS) or defined (CY_IP_MXS22SRSS) or other (error) */
- }
- static cy_rslt_t _cyhal_clock_set_enabled_pll(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- //pll_idx is the path mux index (eg PLL number + 1) as used by PDL APIs
- uint32_t pll_idx = clock->channel + 1;
- #if defined(COMPONENT_CAT1C)
- if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
- {
- pll_idx = pll_idx + SRSS_NUM_PLL400M;
- }
- #endif
- cy_stc_pll_manual_config_t cfg;
- cy_rslt_t rslt = Cy_SysClk_PllGetConfiguration(pll_idx, &cfg);
- if (CY_RSLT_SUCCESS == rslt)
- {
- uint32_t new_freq, old_freq;
- uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
- uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(pll_idx);
- uint64_t feedbackDiv = 0;
- uint32_t referenceDiv = 0;
- uint32_t outputDiv = 0;
- _cyhal_clock_extract_pll_params(clock, &cfg, &feedbackDiv, &referenceDiv, &outputDiv);
- uint32_t pll_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * feedbackDiv, referenceDiv * outputDiv);
- if (enabled)
- {
- new_freq = pll_freq >> div;
- old_freq = src_freq >> div;
- }
- else
- {
- new_freq = src_freq >> div;
- old_freq = pll_freq >> div;
- }
- bool pll_sources_hf0 = (pll_idx == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
- if (pll_sources_hf0)
- _cyhal_clock_update_system_state(true, old_freq, new_freq);
- rslt = (enabled)
- ? Cy_SysClk_PllEnable(pll_idx, wait_for_lock ? _CYHAL_CLOCK_PLL_LOCK_TIME : 0UL)
- : Cy_SysClk_PllDisable(pll_idx);
- if (pll_sources_hf0)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_freq, new_freq);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_freq, old_freq);
- }
- }
- return rslt;
- }
- static uint32_t _cyhal_clock_get_frequency_pll(const cyhal_clock_t *clock)
- {
- #if defined(COMPONENT_CAT1C)
- if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
- {
- return Cy_SysClk_ClkPathGetFrequency(clock->channel + 1 + SRSS_NUM_PLL400M);
- }
- #endif
- return Cy_SysClk_ClkPathGetFrequency(clock->channel + 1);
- }
- static cy_rslt_t _cyhal_clock_set_frequency_pll(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(tolerance);
- cy_stc_pll_manual_config_t cfg;
- uint8_t pll_idx = clock->channel + 1;
- #if defined(COMPONENT_CAT1C)
- if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
- {
- pll_idx = pll_idx + SRSS_NUM_PLL400M;
- }
- #endif
- cy_rslt_t rslt = Cy_SysClk_PllGetConfiguration(pll_idx, &cfg);
- if (CY_RSLT_SUCCESS == rslt)
- {
- bool enabled = Cy_SysClk_PllIsEnabled(pll_idx);
- if (enabled)
- rslt = Cy_SysClk_PllDisable(pll_idx);
- if (CY_RSLT_SUCCESS == rslt)
- {
- uint32_t src_freq = Cy_SysClk_ClkPathMuxGetFrequency(pll_idx);
- uint64_t feedbackDiv = 0;
- uint32_t referenceDiv = 0;
- uint32_t outputDiv = 0;
- _cyhal_clock_extract_pll_params(clock, &cfg, &feedbackDiv, &referenceDiv, &outputDiv);
- uint32_t old_freq = CY_SYSLIB_DIV_ROUND((uint64_t)src_freq * feedbackDiv, referenceDiv * outputDiv);
- uint32_t div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
- uint32_t old_hf_freq = old_freq >> div;
- uint32_t new_hf_freq = hz/*new_freq*/ >> div;
- bool pll_sources_hf0 = (pll_idx == (uint32_t)Cy_SysClk_ClkHfGetSource(0));
- if (pll_sources_hf0)
- _cyhal_clock_update_system_state(true, old_hf_freq, new_hf_freq);
- uint32_t input_hz = Cy_SysClk_ClkPathMuxGetFrequency(pll_idx);
- cy_stc_pll_config_t cfg2 =
- {
- .inputFreq = input_hz,
- .outputFreq = hz/*new_freq*/,
- .lfMode = false,
- .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO,
- };
- rslt = Cy_SysClk_PllConfigure(pll_idx, &cfg2);
- if (enabled)
- {
- cy_rslt_t rslt2 = Cy_SysClk_PllEnable(pll_idx, _CYHAL_CLOCK_PLL_LOCK_TIME);
- if (CY_RSLT_SUCCESS == rslt)
- rslt = rslt2;
- }
- if (pll_sources_hf0)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_hf_freq, new_hf_freq);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_hf_freq, old_hf_freq);
- }
- }
- }
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_get_sources_pll(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- // _CYHAL_CLOCK_SOURCE_HF has entries for FLL, PLL[n], PathMux[m]
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- #if defined(COMPONENT_CAT1C)
- uint8_t channel = clock->channel;
- if (clock->block == CYHAL_CLOCK_BLOCK_PLL200)
- {
- channel = channel + SRSS_NUM_PLL400M;
- }
- *sources = &(_CYHAL_CLOCK_SOURCE_HF[2 + _CYHAL_SRSS_NUM_PLL + channel]);
- #endif
- *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) */
- #else
- *sources = &(_CYHAL_CLOCK_SOURCE_HF[_CYHAL_SRSS_NUM_PLL + clock->channel]); /* PATHMUX[n] entry is after the PLLs (+num) */
- #endif
- *count = 1;
- return CY_RSLT_SUCCESS;
- }
- #endif
- // MF
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- static bool _cyhal_clock_is_enabled_mf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkMfIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_mf(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- if (enabled)
- Cy_SysClk_ClkMfEnable();
- else
- Cy_SysClk_ClkMfDisable();
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_mf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkMfGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_frequency_mf(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- uint32_t div;
- cy_rslt_t rslt = _cyhal_clock_compute_div(CY_SYSCLK_MFO_FREQ, hz, 8, tolerance, &div);
- if(false == CY_SYSCLK_IS_MF_DIVIDER_VALID(div))
- rslt = CYHAL_CLOCK_RSLT_ERR_FREQ;
- if (CY_RSLT_SUCCESS == rslt)
- Cy_SysClk_ClkMfSetDivider(div);
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_set_divider_mf(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- if (divider <= 256)
- {
- Cy_SysClk_ClkMfSetDivider(divider);
- return CY_RSLT_SUCCESS;
- }
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- static cy_rslt_t _cyhal_clock_get_sources_mf(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_MF[] =
- {
- &CYHAL_CLOCK_RSC_MFO,
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D) /* CAT1A only supports driving from the MFO */
- &CYHAL_CLOCK_RSC_ILO,
- #if SRSS_BACKUP_PRESENT
- &CYHAL_CLOCK_RSC_WCO,
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- &CYHAL_CLOCK_RSC_PILO,
- #endif
- #if SRSS_ALTLF_PRESENT
- &CYHAL_CLOCK_RSC_ALTLF,
- #endif
- #if SRSS_ECO_PRESENT
- &CYHAL_CLOCK_RSC_ECO_PRESCALER,
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- &CYHAL_CLOCK_RSC_LPECO_PRESCALER,
- #endif
- #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D) */
- };
- *sources = _CYHAL_CLOCK_SOURCE_MF;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_MF) / sizeof(_CYHAL_CLOCK_SOURCE_MF[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_mf(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- switch(source->block)
- {
- case CYHAL_CLOCK_BLOCK_MFO:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_MFO);
- return CY_RSLT_SUCCESS;
- case CYHAL_CLOCK_BLOCK_ILO:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_ILO);
- return CY_RSLT_SUCCESS;
- #if SRSS_BACKUP_PRESENT
- case CYHAL_CLOCK_BLOCK_WCO:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_WCO);
- return CY_RSLT_SUCCESS;
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- case CYHAL_CLOCK_BLOCK_PILO:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_PILO);
- return CY_RSLT_SUCCESS;
- #endif
- #if SRSS_ALTLF_PRESENT
- case CYHAL_CLOCK_BLOCK_ALTLF:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_ALTLF);
- return CY_RSLT_SUCCESS;
- #endif
- #if SRSS_ECO_PRESENT
- case CYHAL_CLOCK_BLOCK_ECO_PRESCALER:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_ECO_PRESCALER);
- return CY_RSLT_SUCCESS;
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- case CYHAL_CLOCK_BLOCK_LPECO_PRESCALER:
- Cy_SysClk_ClkMfSetSource(CY_SYSCLK_CLKMF_IN_LPECO);
- return CY_RSLT_SUCCESS;
- #endif
- default:
- CY_ASSERT(false); //Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- }
- #endif
- // HF
- static bool _cyhal_clock_is_enabled_hf(const cyhal_clock_t *clock)
- {
- return Cy_SysClk_ClkHfIsEnabled(clock->channel);
- }
- static cy_rslt_t _cyhal_clock_set_enabled_hf(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(wait_for_lock);
- return (enabled)
- ? Cy_SysClk_ClkHfEnable(clock->channel)
- : Cy_SysClk_ClkHfDisable(clock->channel);
- }
- static uint32_t _cyhal_clock_get_frequency_hf(const cyhal_clock_t *clock)
- {
- return Cy_SysClk_ClkHfGetFrequency(clock->channel);
- }
- static cy_rslt_t _cyhal_clock_set_divider_hf(cyhal_clock_t *clock, uint32_t divider)
- {
- cy_en_clkhf_dividers_t new_div;
- switch (divider)
- {
- case 1:
- new_div = CY_SYSCLK_CLKHF_NO_DIVIDE;
- break;
- case 2:
- new_div = CY_SYSCLK_CLKHF_DIVIDE_BY_2;
- break;
- case 4:
- new_div = CY_SYSCLK_CLKHF_DIVIDE_BY_4;
- break;
- case 8:
- new_div = CY_SYSCLK_CLKHF_DIVIDE_BY_8;
- break;
- default:
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- /* Only used if updating HFClk 0 */
- uint32_t old_div = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
- uint32_t src = (uint32_t)Cy_SysClk_ClkHfGetSource(0);
- uint32_t path_freq = Cy_SysClk_ClkPathGetFrequency(src);
- uint32_t old_freq = path_freq >> old_div;
- uint32_t new_freq = path_freq >> ((uint32_t)new_div);
- if (0 == clock->channel)
- _cyhal_clock_update_system_state(true, old_freq, new_freq);
- cy_rslt_t rslt = (cy_rslt_t)Cy_SysClk_ClkHfSetDivider(clock->channel, new_div);
- if (0 == clock->channel)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_freq, new_freq);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_freq, old_freq);
- }
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_get_sources_hf(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- *sources = _CYHAL_CLOCK_SOURCE_HF;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_HF) / sizeof(_CYHAL_CLOCK_SOURCE_HF[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_hf(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- uint32_t new_src;
- if (source->block == CYHAL_CLOCK_BLOCK_PATHMUX || source->block == CYHAL_CLOCK_BLOCK_FLL)
- new_src = source->channel;
- #if defined(COMPONENT_CAT1A)
- else if (source->block == CYHAL_CLOCK_BLOCK_PLL)
- #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
- else if ((source->block == CYHAL_CLOCK_BLOCK_PLL200) || (source->block == CYHAL_CLOCK_BLOCK_PLL400))
- #elif defined(COMPONENT_CAT1D)
- else if ((source->block == CYHAL_CLOCK_BLOCK_DPLL_LP) || (source->block == CYHAL_CLOCK_BLOCK_DPLL_HP))
- #endif
- {
- new_src = source->channel + 1;
- #if defined(SRSS_NUM_PLL400M) && (defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C))
- if (source->block == CYHAL_CLOCK_BLOCK_PLL200)
- {
- /* As PLL200 and PLL400 has their own channels and PLL400 sits on lower PATH_MUX numbers
- * we need to increase calculated source num with respect to number of PLL400's */
- new_src += SRSS_NUM_PLL400M;
- }
- #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) */
- }
- else
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- /* Only used if updating HFClk 0 */
- uint32_t div_hf0 = (uint32_t)Cy_SysClk_ClkHfGetDivider(0);
- uint32_t old_src_hf0 = (uint32_t)Cy_SysClk_ClkHfGetSource(0);
- uint32_t old_freq_hf0 = Cy_SysClk_ClkPathGetFrequency(old_src_hf0) >> div_hf0;
- uint32_t new_freq_hf0 = Cy_SysClk_ClkPathGetFrequency(new_src) >> div_hf0;
- if (0 == clock->channel)
- _cyhal_clock_update_system_state(true, old_freq_hf0, new_freq_hf0);
- cy_rslt_t rslt = Cy_SysClk_ClkHfSetSource(clock->channel, (cy_en_clkhf_in_sources_t)new_src);
- if (0 == clock->channel)
- {
- if (CY_RSLT_SUCCESS == rslt)
- _cyhal_clock_update_system_state(false, old_freq_hf0, new_freq_hf0);
- else // revert the change if there was one
- _cyhal_clock_update_system_state(false, new_freq_hf0, old_freq_hf0);
- }
- return rslt;
- }
- // LF
- static uint32_t _cyhal_clock_get_frequency_lf(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return _cyhal_clock_get_lf_frequency();
- }
- static cy_rslt_t _cyhal_clock_get_sources_lf(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_LF[] =
- {
- #if defined(COMPONENT_CAT1C)
- &CYHAL_CLOCK_RSC_ILO[0],
- #if (SRSS_HT_VARIANT > 0)
- &CYHAL_CLOCK_RSC_ILO[1],
- #endif
- /* There are no ILO clock available on CAT1D */
- #elif !defined(COMPONENT_CAT1D)
- &CYHAL_CLOCK_RSC_ILO,
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- &CYHAL_CLOCK_RSC_PILO,
- #endif
- #if SRSS_BACKUP_PRESENT
- &CYHAL_CLOCK_RSC_WCO,
- #endif
- #if SRSS_ALTLF_PRESENT
- &CYHAL_CLOCK_RSC_ALTLF,
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- #if SRSS_ECO_PRESENT
- &CYHAL_CLOCK_RSC_ECO_PRESCALER,
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- &CYHAL_CLOCK_RSC_LPECO_PRESCALER,
- #endif
- #endif
- };
- *sources = _CYHAL_CLOCK_SOURCE_LF;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_LF) / sizeof(_CYHAL_CLOCK_SOURCE_LF[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_lf(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- cy_rslt_t result = CY_RSLT_SUCCESS;
- #if defined(COMPONENT_CAT1C)
- Cy_WDT_Unlock();
- #endif
- switch (source->block)
- {
- case CYHAL_CLOCK_BLOCK_ILO:
- #if defined(COMPONENT_CAT1C)
- if(1 == source->channel)
- {
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO1);
- }
- else
- #endif
- {
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO);
- }
- break;
- #if SRSS_BACKUP_PRESENT
- case CYHAL_CLOCK_BLOCK_WCO:
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO);
- break;
- #endif
- #if SRSS_ALTLF_PRESENT
- case CYHAL_CLOCK_BLOCK_ALTLF:
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ALTLF);
- break;
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- case CYHAL_CLOCK_BLOCK_PILO:
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_PILO);
- break;
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- #if SRSS_ECO_PRESENT
- case CYHAL_CLOCK_BLOCK_ECO_PRESCALER:
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ECO_PRESCALER);
- break;
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- case CYHAL_CLOCK_BLOCK_LPECO_PRESCALER:
- Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_LPECO_PRESCALER);
- break;
- #endif
- #endif
- default:
- CY_ASSERT(false); //Unhandled clock
- result = CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- #if defined(COMPONENT_CAT1C)
- Cy_WDT_Lock();
- #endif
- return result;
- }
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- // FAST
- static uint32_t _cyhal_clock_get_frequency_fast(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- #if defined(COMPONENT_CAT1A)
- return Cy_SysClk_ClkFastGetFrequency();
- #else
- return Cy_SysClk_ClkFastSrcGetFrequency(clock->channel);
- #endif
- }
- static cy_rslt_t _cyhal_clock_set_frequency_fast(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- uint32_t div;
- cy_rslt_t rslt;
- #if defined(COMPONENT_CAT1A)
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(0);
- rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
- #else
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(1);
- rslt = _cyhal_clock_compute_div(((uint64_t)input_hz) << 5, hz, 13, tolerance, &div);
- #endif
- if (CY_RSLT_SUCCESS == rslt)
- {
- #if defined(COMPONENT_CAT1A)
- Cy_SysClk_ClkFastSetDivider((uint8_t)(div - 1));
- #else
- uint32_t div_int = (div >> 5) - 1;
- uint32_t div_frac = div & 0x1F;
- Cy_SysClk_ClkFastSrcSetDivider(clock->channel, (uint8_t)div_int, (uint8_t)div_frac);
- Cy_SysLib_SetWaitStates(false, 340);
- #endif
- SystemCoreClockUpdate();
- }
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_set_divider_fast(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- if (divider <= 256)
- {
- uint32_t divVal = divider - 1;
- #if defined(COMPONENT_CAT1A)
- Cy_SysClk_ClkFastSetDivider((uint8_t)divVal);
- #else
- Cy_SysClk_ClkFastSrcSetDivider(clock->channel, (uint8_t)divVal, 0);
- #endif
- SystemCoreClockUpdate();
- return CY_RSLT_SUCCESS;
- }
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- static cy_rslt_t _cyhal_clock_get_sources_fast(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_FAST[] =
- {
- #if defined(COMPONENT_CAT1C)
- &CYHAL_CLOCK_RSC_HF[1],
- #else
- &CYHAL_CLOCK_RSC_HF[0],
- #endif
- };
- *sources = _CYHAL_CLOCK_SOURCE_FAST;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_FAST) / sizeof(_CYHAL_CLOCK_SOURCE_FAST[0]);
- return CY_RSLT_SUCCESS;
- }
- // SLOW
- static uint32_t _cyhal_clock_get_frequency_slow(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkSlowGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_frequency_slow(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- uint32_t div;
- uint32_t input_hz = Cy_SysClk_ClkPeriGetFrequency();
- cy_rslt_t rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
- if (CY_RSLT_SUCCESS == rslt)
- {
- Cy_SysClk_ClkSlowSetDivider((uint8_t)(div - 1));
- SystemCoreClockUpdate();
- }
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_set_divider_slow(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- if (divider <= 256)
- {
- uint32_t divVal = divider - 1;
- Cy_SysClk_ClkSlowSetDivider((uint8_t)divVal);
- SystemCoreClockUpdate();
- return CY_RSLT_SUCCESS;
- }
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- static cy_rslt_t _cyhal_clock_get_sources_slow(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_SLOW[] =
- {
- #if defined(COMPONENT_CAT1A)
- &CYHAL_CLOCK_RSC_PERI,
- #else
- &CYHAL_CLOCK_RSC_MEM,
- #endif
- };
- *sources = _CYHAL_CLOCK_SOURCE_SLOW;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_SLOW) / sizeof(_CYHAL_CLOCK_SOURCE_SLOW[0]);
- return CY_RSLT_SUCCESS;
- }
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- #if SRSS_ECO_PRESENT
- // ECO_PRESCALER - NOTE: This clock is not supported on any device yet
- static uint32_t _cyhal_clock_get_frequency_eco_prescaler(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- //return Cy_SysClk_EcoPrescalerGetFrequency();
- return 0;
- }
- static cy_rslt_t _cyhal_clock_set_divider_eco_prescaler(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(divider);
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- static cy_rslt_t _cyhal_clock_get_sources_eco_prescaler(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(sources);
- CY_UNUSED_PARAMETER(count);
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- // LPECO_PRESCALER - NOTE: This clock is not supported on any device yet
- static uint32_t _cyhal_clock_get_frequency_lpeco_prescaler(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_LpEcoPrescalerGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_divider_lpeco_prescaler(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(divider);
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- static cy_rslt_t _cyhal_clock_get_sources_lpeco_prescaler(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(sources);
- CY_UNUSED_PARAMETER(count);
- return CYHAL_CLOCK_RSLT_ERR_NOT_SUPPORTED;
- }
- #endif
- #endif
- // MEM
- #if defined(COMPONENT_CAT1C)
- static cy_rslt_t _cyhal_clock_set_divider_mem(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- if (divider <= 256)
- {
- uint32_t divVal = divider - 1;
- Cy_SysClk_ClkMemSetDivider((uint8_t)divVal);
- SystemCoreClockUpdate();
- return CY_RSLT_SUCCESS;
- }
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- static uint32_t _cyhal_clock_get_frequency_mem(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkMemGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_frequency_mem(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- uint32_t div;
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(0);
- cy_rslt_t rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
- if (CY_RSLT_SUCCESS == rslt)
- {
- Cy_SysClk_ClkMemSetDivider((uint8_t)(div - 1));
- SystemCoreClockUpdate();
- }
- return rslt;
- }
- static cy_rslt_t _cyhal_clock_get_sources_mem(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_MEM[] =
- {
- &CYHAL_CLOCK_RSC_HF[0],
- };
- *sources = _CYHAL_CLOCK_SOURCE_MEM;
- *count = 1;
- return CY_RSLT_SUCCESS;
- }
- #endif
- // PERI
- static uint32_t _cyhal_clock_get_frequency_peri(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- #if defined(COMPONENT_CAT1C)
- if(clock->channel == 0)
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- {
- return Cy_SysClk_ClkPeriGetFrequency();
- }
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(clock->channel);
- #elif defined(COMPONENT_CAT1D)
- uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
- uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
- #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) or defined(COMPONENT_CAT1D) or other */
- return Cy_SysClk_ClkHfGetFrequency(hfclk) / (Cy_SysClk_PeriGroupGetDivider(clock->channel) + 1);
- #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D) */
- }
- static cy_rslt_t _cyhal_clock_set_frequency_peri(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- uint32_t div;
- cy_rslt_t rslt;
- #if defined(COMPONENT_CAT1C)
- if(clock->channel == 0)
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- {
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(0);
- rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
- if (CY_RSLT_SUCCESS == rslt)
- {
- Cy_SysClk_ClkPeriSetDivider((uint8_t)(div - 1));
- SystemCoreClockUpdate();
- }
- return rslt;
- }
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(clock->channel == 1 ? 1 : 0);
- #elif defined(COMPONENT_CAT1D)
- uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
- uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(_cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group)));
- #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) or defined(COMPONENT_CAT1D) */
- rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, 8, tolerance, &div);
- if (CY_RSLT_SUCCESS == rslt)
- {
- uint32_t group_num = clock->channel;
- #if defined(COMPONENT_CAT1D)
- /* I'm not completely confident in line below */
- group_num += _VAL2FLD(PERI_GR_INST_NUM, instance);
- #endif /* defined(COMPONENT_CAT1D) or other */
- Cy_SysClk_PeriGroupSetDivider(group_num, (uint8_t)(div - 1));
- }
- return rslt;
- #endif /* defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D) */
- }
- static cy_rslt_t _cyhal_clock_set_divider_peri(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- if (divider <= 256)
- {
- uint32_t divVal = divider - 1;
- #if defined(COMPONENT_CAT1C)
- if (clock->channel == 0)
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- {
- Cy_SysClk_ClkPeriSetDivider((uint8_t)divVal);
- SystemCoreClockUpdate();
- return CY_RSLT_SUCCESS;
- }
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- Cy_SysClk_PeriGroupSetDivider(clock->channel, (uint8_t)divVal);
- SystemCoreClockUpdate();
- return CY_RSLT_SUCCESS;
- #endif
- }
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- static cy_rslt_t _cyhal_clock_get_sources_peri(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- #if defined(COMPONENT_CAT1A)
- CY_UNUSED_PARAMETER(clock);
- #endif
- #if defined(COMPONENT_CAT1C)
- if (clock->channel == 0)
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- {
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_PERI[] =
- {
- &CYHAL_CLOCK_RSC_HF[0],
- };
- *sources = _CYHAL_CLOCK_SOURCE_PERI;
- *count = 1;
- return CY_RSLT_SUCCESS;
- }
- #endif
- #if defined (COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #if !defined(COMPONENT_CAT1D)
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(clock->channel);
- #else /* defined(COMPONENT_CAT1D) */
- uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
- uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
- #endif /* !defined(COMPONENT_CAT1D) or other */
- return _cyhal_clock_get_sources_peri_peripheral(hfclk, sources, count);
- #endif
- }
- // PUMP (only available on CAT1A and CAT1B devices)
- #if defined (COMPONENT_CAT1A) || defined (COMPONENT_CAT1B)
- static bool _cyhal_clock_is_enabled_pump(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkPumpIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_pump(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- if (enabled)
- Cy_SysClk_ClkPumpEnable();
- else
- Cy_SysClk_ClkPumpDisable();
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_pump(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkPumpGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_divider_pump(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- cy_en_clkpump_divide_t divVal;
- switch (divider)
- {
- case 1:
- divVal = CY_SYSCLK_PUMP_NO_DIV;
- break;
- case 2:
- divVal = CY_SYSCLK_PUMP_DIV_2;
- break;
- case 4:
- divVal = CY_SYSCLK_PUMP_DIV_4;
- break;
- case 8:
- divVal = CY_SYSCLK_PUMP_DIV_8;
- break;
- case 16:
- divVal = CY_SYSCLK_PUMP_DIV_16;
- break;
- default:
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- Cy_SysClk_ClkPumpSetDivider(divVal);
- return CY_RSLT_SUCCESS;
- }
- #define _cyhal_clock_get_sources_pump _cyhal_clock_get_sources_hf
- static cy_rslt_t _cyhal_clock_set_source_pump(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- if (source->block == CYHAL_CLOCK_BLOCK_PATHMUX || source->block == CYHAL_CLOCK_BLOCK_FLL)
- {
- Cy_SysClk_ClkPumpSetSource((cy_en_clkpump_in_sources_t)source->channel);
- return CY_RSLT_SUCCESS;
- }
- #if defined(COMPONENT_CAT1A)
- else if (source->block == CYHAL_CLOCK_BLOCK_PLL)
- #elif defined(COMPONENT_CAT1B)
- else if ((source->block == CYHAL_CLOCK_BLOCK_PLL200) || (source->block == CYHAL_CLOCK_BLOCK_PLL400))
- #endif
- {
- Cy_SysClk_ClkPumpSetSource((cy_en_clkpump_in_sources_t)(source->channel + 1));
- return CY_RSLT_SUCCESS;
- }
- else
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- #endif /* defined (COMPONENT_CAT1A) || defined (COMPONENT_CAT1B) */
- // TIMER
- // TODO: Need to enable timer functionality for CAT1C once PDL team updates clk_timer API's
- #if defined(COMPONENT_CAT1A)
- static bool _cyhal_clock_is_enabled_timer(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkTimerIsEnabled();
- }
- static cy_rslt_t _cyhal_clock_set_enabled_timer(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(wait_for_lock);
- if (enabled)
- Cy_SysClk_ClkTimerEnable();
- else
- Cy_SysClk_ClkTimerDisable();
- return CY_RSLT_SUCCESS;
- }
- static uint32_t _cyhal_clock_get_frequency_timer(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- return Cy_SysClk_ClkTimerGetFrequency();
- }
- static cy_rslt_t _cyhal_clock_set_divider_timer(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- if (divider <= 256)
- {
- uint32_t divVal = divider - 1;
- Cy_SysClk_ClkTimerSetDivider((uint8_t)divVal);
- return CY_RSLT_SUCCESS;
- }
- return CYHAL_CLOCK_RSLT_ERR_FREQ;
- }
- static cy_rslt_t _cyhal_clock_get_sources_timer(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_TIMER[] =
- {
- &CYHAL_CLOCK_RSC_IMO,
- &CYHAL_CLOCK_RSC_HF[0],
- };
- *sources = _CYHAL_CLOCK_SOURCE_TIMER;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_TIMER) / sizeof(_CYHAL_CLOCK_SOURCE_TIMER[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_timer(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- if (source->block == CYHAL_CLOCK_BLOCK_IMO)
- {
- Cy_SysClk_ClkTimerSetSource(CY_SYSCLK_CLKTIMER_IN_IMO);
- return CY_RSLT_SUCCESS;
- }
- else if (source->block == CYHAL_CLOCK_BLOCK_HF && source->channel == 0)
- {
- Cy_SysClk_ClkTimerSetSource(CY_SYSCLK_CLKTIMER_IN_HF0_NODIV);
- return CY_RSLT_SUCCESS;
- }
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- #endif
- // BAK
- static uint32_t _cyhal_clock_get_frequency_bak(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- cy_en_clkbak_in_sources_t src = Cy_SysClk_ClkBakGetSource();
- #if SRSS_BACKUP_PRESENT
- if (src == CY_SYSCLK_BAK_IN_WCO)
- return CY_SYSCLK_WCO_FREQ;
- #else
- (void)src;
- #endif
- return _cyhal_clock_get_lf_frequency();
- }
- static cy_rslt_t _cyhal_clock_get_sources_bak(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_BAK[] =
- {
- &CYHAL_CLOCK_RSC_LF,
- #if SRSS_BACKUP_PRESENT
- &CYHAL_CLOCK_RSC_WCO,
- #endif
- #if defined(COMPONENT_CAT1C)
- &CYHAL_CLOCK_RSC_ILO[0],
- #elif defined(COMPONENT_CAT1B)
- &CYHAL_CLOCK_RSC_ILO,
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- #if _CYHAL_SRSS_PILO_PRESENT
- &CYHAL_CLOCK_RSC_PILO,
- #endif
- #endif
- #if defined(COMPONENT_CAT1B)
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- &CYHAL_CLOCK_RSC_LPECO_PRESCALER,
- #endif
- #endif
- };
- *sources = _CYHAL_CLOCK_SOURCE_BAK;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_BAK) / sizeof(_CYHAL_CLOCK_SOURCE_BAK[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_bak(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- switch (source->block)
- {
- case CYHAL_CLOCK_BLOCK_WCO:
- Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_WCO);
- return CY_RSLT_SUCCESS;
- case CYHAL_CLOCK_BLOCK_LF:
- Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_CLKLF);
- return CY_RSLT_SUCCESS;
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
- case CYHAL_CLOCK_BLOCK_ILO:
- if(1 == source->channel)
- {
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_ILO);
- return CY_RSLT_SUCCESS;
- #if _CYHAL_SRSS_PILO_PRESENT
- case CYHAL_CLOCK_BLOCK_PILO:
- Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_PILO);
- return CY_RSLT_SUCCESS;
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- case CYHAL_CLOCK_BLOCK_LPECO_PRESCALER:
- Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_LPECO_PRESCALER);
- return CY_RSLT_SUCCESS;
- #endif
- #endif
- default:
- CY_ASSERT(false); //Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- }
- // ALT_SYS_TICK
- static uint32_t _cyhal_clock_get_frequency_alt_sys_tick(const cyhal_clock_t *clock)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_ASSERT(false); // This is not supported at this time
- return 0;
- }
- 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)
- {
- CY_UNUSED_PARAMETER(clock);
- static const cyhal_resource_inst_t *_CYHAL_CLOCK_SOURCE_ALT_SYS_TICK[] =
- {
- &CYHAL_CLOCK_RSC_IMO,
- #if SRSS_ECO_PRESENT
- &CYHAL_CLOCK_RSC_ECO,
- #endif
- &CYHAL_CLOCK_RSC_LF,
- #if defined(COMPONENT_CAT1A)
- &CYHAL_CLOCK_RSC_TIMER, /* Technically present on CAT1B and CAT1C, but deprecated */
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- #if defined(COMPONENT_CAT1C)
- &CYHAL_CLOCK_RSC_FAST[0],
- &CYHAL_CLOCK_RSC_FAST[1],
- #else
- &CYHAL_CLOCK_RSC_FAST,
- #endif
- &CYHAL_CLOCK_RSC_SLOW,
- #elif defined(COMPONENT_CAT1B)
- &CYHAL_CLOCK_RSC_HF[0], /* CPU clock */
- #endif
- };
- *sources = _CYHAL_CLOCK_SOURCE_ALT_SYS_TICK;
- *count = sizeof(_CYHAL_CLOCK_SOURCE_ALT_SYS_TICK) / sizeof(_CYHAL_CLOCK_SOURCE_ALT_SYS_TICK[0]);
- return CY_RSLT_SUCCESS;
- }
- static cy_rslt_t _cyhal_clock_set_source_alt_sys_tick(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_UNUSED_PARAMETER(clock);
- switch (source->block)
- {
- case CYHAL_CLOCK_BLOCK_LF:
- Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_LF);
- return CY_RSLT_SUCCESS;
- case CYHAL_CLOCK_BLOCK_IMO:
- Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_IMO);
- return CY_RSLT_SUCCESS;
- #if SRSS_ECO_PRESENT
- case CYHAL_CLOCK_BLOCK_ECO:
- Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_ECO);
- return CY_RSLT_SUCCESS;
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- #if defined(COMPONENT_CAT1A)
- case CYHAL_CLOCK_BLOCK_TIMER:
- Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_TIMER);
- return CY_RSLT_SUCCESS;
- #endif
- case CYHAL_CLOCK_BLOCK_FAST:
- case CYHAL_CLOCK_BLOCK_SLOW:
- Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_CPU);
- return CY_RSLT_SUCCESS;
- #endif
- default:
- CY_ASSERT(false); //Unhandled clock
- return CYHAL_CLOCK_RSLT_ERR_SOURCE;
- }
- }
- // Peripheral
- static bool _cyhal_clock_is_enabled_peripheral(const cyhal_clock_t *clock)
- {
- return _cyhal_utils_peri_pclk_is_divider_enabled(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock);
- }
- static cy_rslt_t _cyhal_clock_set_enabled_peripheral(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_UNUSED_PARAMETER(wait_for_lock);
- return (enabled)
- ? _cyhal_utils_peri_pclk_enable_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock)
- : _cyhal_utils_peri_pclk_disable_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock);
- }
- static uint32_t _cyhal_clock_get_frequency_peripheral(const cyhal_clock_t *clock)
- {
- return _cyhal_utils_peri_pclk_get_frequency(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock);
- }
- static cy_rslt_t _cyhal_clock_set_frequency_peripheral(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_UNUSED_PARAMETER(clock);
- CY_UNUSED_PARAMETER(tolerance);
- // blocks 0b00 & 0b01 are integer, 0b10 & 0b11 are fractional
- uint32_t div;
- #if defined(COMPONENT_CAT1A)
- uint32_t input_hz = Cy_SysClk_ClkPeriGetFrequency();
- #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #if defined(COMPONENT_CAT1D)
- uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
- uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
- #else /* !defined(COMPONENT_CAT1D) */
- uint8_t group = _CYHAL_PERIPHERAL_GROUP_GET_GROUP(clock->block);
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(group);
- #endif /* defined(COMPONENT_CAT1D) or other */
- uint32_t input_hz = Cy_SysClk_ClkHfGetFrequency(hfclk);
- #endif
- if ((clock->block & 0x02) == 0) // Integer (8 or 16)
- {
- uint32_t bits = (clock->block & 0x01) ? 16 : 8;
- cy_rslt_t rslt = _cyhal_clock_compute_div((uint64_t)input_hz, hz, bits, tolerance, &div);
- return (CY_RSLT_SUCCESS == rslt)
- ? _cyhal_utils_peri_pclk_set_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, (div - 1))
- : rslt;
- }
- else //Fractional (16.5 or 24.5)
- {
- // Multiply input by 32 so we can treat the 5 fractional bits as though they are extentions of the integer divider
- // Leave the the desired frequency alone, so we can just strip out the integer & fractional bits at the end.
- uint32_t bits = (clock->block & 0x01) ? 29 : 21; // Integer bits + 5
- cy_rslt_t rslt = _cyhal_clock_compute_div(((uint64_t)input_hz) << 5, hz, bits, tolerance, &div);
- if (CY_RSLT_SUCCESS == rslt)
- {
- uint32_t div_int = (div >> 5) - 1;
- uint32_t div_frac = div & 0x1F;
- return _cyhal_utils_peri_pclk_set_frac_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, div_int, div_frac);
- }
- else
- return rslt;
- }
- }
- static cy_rslt_t _cyhal_clock_set_divider_peripheral(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_UNUSED_PARAMETER(clock);
- // blocks 0b00 & 0b01 are integer, 0b10 & 0b11 are fractional
- return ((clock->block & 0x02) == 0)
- ? _cyhal_utils_peri_pclk_set_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, divider - 1)
- : _cyhal_utils_peri_pclk_set_frac_divider(_CYHAL_CLOCK_GET_PCLK_GR_NUM(clock->block), clock, divider - 1, 0);
- }
- static cy_rslt_t _cyhal_clock_get_sources_peripheral(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- #if defined(COMPONENT_CAT1A)
- return _cyhal_clock_get_sources_slow(clock, sources, count);
- #elif defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
- #if defined(COMPONENT_CAT1D)
- uint8_t instance = _CYHAL_PERIPHERAL_CLOCK_GET_INSTANCE(clock->block);
- uint8_t group = _CYHAL_PERIPHERAL_CLOCK_GET_GROUP(clock->block);
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(_CYHAL_UTILS_PACK_INSTANCE_GROUP(instance, group));
- #else /* !defined(COMPONENT_CAT1D) */
- uint8_t group = _CYHAL_PERIPHERAL_GROUP_GET_GROUP(clock->block);
- uint8_t hfclk = _cyhal_utils_get_hfclk_for_peri_group(group);
- #endif /* defined(COMPONENT_CAT1D) or other */
- return _cyhal_clock_get_sources_peri_peripheral(hfclk, sources, count);
- #endif
- }
- /******************************************************************************
- ******************************* Clock Structs ********************************
- *****************************************************************************/
- /* Use a structure with function pointers to allow the driver to optimize out entire clocks if they
- * are not used. We make two exceptions to this. HF and peripheral clocks are called directly by
- * the public functions. This allows those clocks to be optimized based on what the user actually
- * calls. This distinction is done based on what the user is most likely to do with the HAL driver.
- * HF & peripheral clocks are likely to be configured at runtime based on setting up different
- * peripherals. Other system clocks are likely to be be set once at startup and never modified.
- * Based on this, we design the code so the compiler can optimize out the unused items most
- * efficiently.
- */
- typedef struct
- {
- bool (*is_enabled)(const cyhal_clock_t *clock);
- cy_rslt_t (*set_enabled)(cyhal_clock_t *clock, bool enabled, bool wait_for_lock);
- uint32_t (*get_frequency)(const cyhal_clock_t *clock);
- cy_rslt_t (*set_frequency)(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance);
- cy_rslt_t (*set_divider)(cyhal_clock_t *clock, uint32_t divider);
- cy_rslt_t (*get_sources)(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count);
- cy_rslt_t (*set_source)(cyhal_clock_t *clock, const cyhal_clock_t *source);
- cyhal_clock_feature_t features;
- } cyhal_clock_funcs_t;
- static const cyhal_clock_funcs_t FUNCS_IMO =
- {
- .features = CYHAL_CLOCK_FEATURE_NONE,
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_imo,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- static const cyhal_clock_funcs_t FUNCS_IHO =
- {
- .features = CYHAL_CLOCK_FEATURE_ENABLE,
- .is_enabled = _cyhal_clock_is_enabled_iho,
- .set_enabled = _cyhal_clock_set_enabled_iho,
- .get_frequency = _cyhal_clock_get_frequency_iho,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if defined(COMPONENT_CAT1C)
- static const cyhal_clock_funcs_t FUNCS_MEM =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_mem,
- .set_frequency = _cyhal_clock_set_frequency_mem,
- .set_divider = _cyhal_clock_set_divider_mem,
- .get_sources = _cyhal_clock_get_sources_mem,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if SRSS_ECO_PRESENT
- static const cyhal_clock_funcs_t FUNCS_ECO =
- {
- .features = CYHAL_CLOCK_FEATURE_ENABLE,
- .is_enabled = _cyhal_clock_is_enabled_eco,
- .set_enabled = _cyhal_clock_set_enabled_eco,
- .get_frequency = _cyhal_clock_get_frequency_eco,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- static const cyhal_clock_funcs_t FUNCS_EXT =
- {
- .features = CYHAL_CLOCK_FEATURE_FREQUENCY,
- .is_enabled = _cyhal_clock_is_enabled_ext,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_ext,
- .set_frequency = _cyhal_clock_set_frequency_ext,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #if SRSS_ALTHF_PRESENT
- static const cyhal_clock_funcs_t FUNCS_ALTHF =
- {
- .features = CYHAL_CLOCK_FEATURE_NONE,
- .is_enabled = _cyhal_clock_is_enabled_althf,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_althf,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if SRSS_ALTLF_PRESENT
- static const cyhal_clock_funcs_t FUNCS_ALTLF =
- {
- .features = CYHAL_CLOCK_FEATURE_NONE,
- .is_enabled = _cyhal_clock_is_enabled_altlf,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_altlf,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- static const cyhal_clock_funcs_t FUNCS_ILO =
- {
- .features = CYHAL_CLOCK_FEATURE_ENABLE,
- .is_enabled = _cyhal_clock_is_enabled_ilo,
- .set_enabled = _cyhal_clock_set_enabled_ilo,
- .get_frequency = _cyhal_clock_get_frequency_ilo,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #if _CYHAL_SRSS_PILO_PRESENT
- static const cyhal_clock_funcs_t FUNCS_PILO =
- {
- .features = CYHAL_CLOCK_FEATURE_ENABLE,
- .is_enabled = _cyhal_clock_is_enabled_pilo,
- .set_enabled = _cyhal_clock_set_enabled_pilo,
- .get_frequency = _cyhal_clock_get_frequency_pilo,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if SRSS_BACKUP_PRESENT
- static const cyhal_clock_funcs_t FUNCS_WCO =
- {
- .features = CYHAL_CLOCK_FEATURE_ENABLE,
- .is_enabled = _cyhal_clock_is_enabled_wco,
- .set_enabled = _cyhal_clock_set_enabled_wco,
- .get_frequency = _cyhal_clock_get_frequency_wco,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_none,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- static const cyhal_clock_funcs_t FUNCS_MFO =
- {
- .features = CYHAL_CLOCK_FEATURE_ENABLE,
- .is_enabled = _cyhal_clock_is_enabled_mfo,
- .set_enabled = _cyhal_clock_set_enabled_mfo,
- .get_frequency = _cyhal_clock_get_frequency_mfo,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_mfo,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- static const cyhal_clock_funcs_t FUNCS_PATHMUX =
- {
- .features = CYHAL_CLOCK_FEATURE_SOURCE,
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_pathmux,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_pathmux,
- .set_source = _cyhal_clock_set_source_pathmux,
- };
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- static const cyhal_clock_funcs_t FUNCS_FLL =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_fll,
- .set_enabled = _cyhal_clock_set_enabled_fll,
- .get_frequency = _cyhal_clock_get_frequency_fll,
- .set_frequency = _cyhal_clock_set_frequency_fll,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_fll,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- static const cyhal_clock_funcs_t FUNCS_PLL =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_pll,
- .set_enabled = _cyhal_clock_set_enabled_pll,
- .get_frequency = _cyhal_clock_get_frequency_pll,
- .set_frequency = _cyhal_clock_set_frequency_pll,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_pll,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if defined(COMPONENT_CAT1C)
- #if (SRSS_NUM_PLL > 0)
- #define FUNCS_PLL200 FUNCS_PLL
- #endif
- #if (SRSS_NUM_PLL400M > 0)
- #define FUNCS_PLL400 FUNCS_PLL
- #endif
- #endif /* defined(COMPONENT_CAT1C) */
- #if defined(COMPONENT_CAT1D)
- #if (SRSS_NUM_DPLL_LP > 0)
- #define FUNCS_DPLL_LP FUNCS_PLL
- #endif
- #if (SRSS_NUM_DPLL_HP > 0)
- #define FUNCS_DPLL_HP FUNCS_PLL
- #endif
- #endif /* defined(COMPONENT_CAT1D) */
- static const cyhal_clock_funcs_t FUNCS_LF =
- {
- .features = CYHAL_CLOCK_FEATURE_SOURCE,
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_lf,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_lf,
- .set_source = _cyhal_clock_set_source_lf,
- };
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- static const cyhal_clock_funcs_t FUNCS_MF =
- {
- #if defined(COMPONENT_CAT1A) /* CAT1A only supports driving clk_mf from the MFO */
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
- #else
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY | CYHAL_CLOCK_FEATURE_SOURCE),
- #endif
- .is_enabled = _cyhal_clock_is_enabled_mf,
- .set_enabled = _cyhal_clock_set_enabled_mf,
- .get_frequency = _cyhal_clock_get_frequency_mf,
- .set_frequency = _cyhal_clock_set_frequency_mf,
- .set_divider = _cyhal_clock_set_divider_mf,
- .get_sources = _cyhal_clock_get_sources_mf,
- .set_source = _cyhal_clock_set_source_mf,
- };
- #endif
- static const cyhal_clock_funcs_t FUNCS_HF =
- {
- // NOTE: HF0 cannot be disabled, it would stop the MCUs. Ideally HF0 would not support
- // CYHAL_CLOCK_FEATURE_ENABLE, but this struct is never actually used in practice so it doesn't
- // matter.
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER),
- .is_enabled = _cyhal_clock_is_enabled_hf,
- .set_enabled = _cyhal_clock_set_enabled_hf,
- .get_frequency = _cyhal_clock_get_frequency_hf,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_hf,
- .get_sources = _cyhal_clock_get_sources_hf,
- .set_source = _cyhal_clock_set_source_hf,
- };
- // PUMP clock is only available on CAT1A and CAT1B devices
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
- static const cyhal_clock_funcs_t FUNCS_PUMP =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER),
- .is_enabled = _cyhal_clock_is_enabled_pump,
- .set_enabled = _cyhal_clock_set_enabled_pump,
- .get_frequency = _cyhal_clock_get_frequency_pump,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_pump,
- .get_sources = _cyhal_clock_get_sources_pump,
- .set_source = _cyhal_clock_set_source_pump,
- };
- #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
- #if defined(COMPONENT_CAT1A)
- static const cyhal_clock_funcs_t FUNCS_TIMER =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER),
- .is_enabled = _cyhal_clock_is_enabled_timer,
- .set_enabled = _cyhal_clock_set_enabled_timer,
- .get_frequency = _cyhal_clock_get_frequency_timer,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_timer,
- .get_sources = _cyhal_clock_get_sources_timer,
- .set_source = _cyhal_clock_set_source_timer,
- };
- #endif
- static const cyhal_clock_funcs_t FUNCS_BAK =
- {
- .features = CYHAL_CLOCK_FEATURE_SOURCE,
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_bak,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_bak,
- .set_source = _cyhal_clock_set_source_bak,
- };
- static const cyhal_clock_funcs_t FUNCS_ALT_SYS_TICK =
- {
- .features = CYHAL_CLOCK_FEATURE_SOURCE,
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_alt_sys_tick,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_unsupported,
- .get_sources = _cyhal_clock_get_sources_alt_sys_tick,
- .set_source = _cyhal_clock_set_source_alt_sys_tick,
- };
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- static const cyhal_clock_funcs_t FUNCS_FAST =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_fast,
- .set_frequency = _cyhal_clock_set_frequency_fast,
- .set_divider = _cyhal_clock_set_divider_fast,
- .get_sources = _cyhal_clock_get_sources_fast,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- static const cyhal_clock_funcs_t FUNCS_SLOW =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_slow,
- .set_frequency = _cyhal_clock_set_frequency_slow,
- .set_divider = _cyhal_clock_set_divider_slow,
- .get_sources = _cyhal_clock_get_sources_slow,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- #if SRSS_ECO_PRESENT
- static const cyhal_clock_funcs_t FUNCS_ECO_PRESCALER =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER),
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_eco_prescaler,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_eco_prescaler,
- .get_sources = _cyhal_clock_get_sources_eco_prescaler,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- static const cyhal_clock_funcs_t FUNCS_LPECO_PRESCALER =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER),
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_lpeco_prescaler,
- .set_frequency = _cyhal_clock_set_frequency_unsupported,
- .set_divider = _cyhal_clock_set_divider_lpeco_prescaler,
- .get_sources = _cyhal_clock_get_sources_lpeco_prescaler,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- #endif
- #endif
- static const cyhal_clock_funcs_t FUNCS_PERI =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_true,
- .set_enabled = _cyhal_clock_set_enabled_unsupported,
- .get_frequency = _cyhal_clock_get_frequency_peri,
- .set_frequency = _cyhal_clock_set_frequency_peri,
- .set_divider = _cyhal_clock_set_divider_peri,
- .get_sources = _cyhal_clock_get_sources_peri,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- static const cyhal_clock_funcs_t FUNCS_PERIPHERAL =
- {
- .features = (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY),
- .is_enabled = _cyhal_clock_is_enabled_peripheral,
- .set_enabled = _cyhal_clock_set_enabled_peripheral,
- .get_frequency = _cyhal_clock_get_frequency_peripheral,
- .set_frequency = _cyhal_clock_set_frequency_peripheral,
- .set_divider = _cyhal_clock_set_divider_peripheral,
- .get_sources = _cyhal_clock_get_sources_peripheral,
- .set_source = _cyhal_clock_set_source_unsupported,
- };
- static const cyhal_clock_funcs_t FUNCS_EMPTY =
- {
- .features = CYHAL_CLOCK_FEATURE_NONE,
- .is_enabled = NULL,
- .set_enabled = NULL,
- .get_frequency = NULL,
- .set_frequency = NULL,
- .set_divider = NULL,
- .get_sources = NULL,
- .set_source = NULL,
- };
- const void* _cyhal_clock_get_funcs_pathmux(void) { return &FUNCS_PATHMUX; }
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- const void* _cyhal_clock_get_funcs_pll(void) { return &FUNCS_PLL; }
- #endif
- // HF and peripheral functions are called directly from the public APIs and do not go through
- // the struct lookup. This allows them to get optimized out based on what the user calls. We
- // return FUNCS_EMPTY here so as to avoid unnecessarily pulling in all functions for those clocks.
- const void* _cyhal_clock_get_funcs_hf(void) { return &FUNCS_EMPTY/*FUNCS_HF*/; }
- const void* _cyhal_clock_get_funcs_peripheral(void) { return &FUNCS_EMPTY/*FUNCS_PERIPHERAL*/; }
- static const cyhal_clock_funcs_t* _cyhal_clock_get_funcs_all(cyhal_clock_block_t block)
- {
- switch (block)
- {
- case CYHAL_CLOCK_BLOCK_IMO:
- return &FUNCS_IMO;
- #if SRSS_ECO_PRESENT
- case CYHAL_CLOCK_BLOCK_ECO:
- return &FUNCS_ECO;
- #endif
- case CYHAL_CLOCK_BLOCK_EXT:
- return &FUNCS_EXT;
- #if SRSS_ALTHF_PRESENT
- case CYHAL_CLOCK_BLOCK_ALTHF:
- return &FUNCS_ALTHF;
- #endif
- #if SRSS_ALTLF_PRESENT
- case CYHAL_CLOCK_BLOCK_ALTLF:
- return &FUNCS_ALTLF;
- #endif
- case CYHAL_CLOCK_BLOCK_ILO:
- return &FUNCS_ILO;
- #if _CYHAL_SRSS_PILO_PRESENT
- case CYHAL_CLOCK_BLOCK_PILO:
- return &FUNCS_PILO;
- #endif
- #if SRSS_BACKUP_PRESENT
- case CYHAL_CLOCK_BLOCK_WCO:
- return &FUNCS_WCO;
- #endif
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- case CYHAL_CLOCK_BLOCK_MFO:
- return &FUNCS_MFO;
- #endif
- case CYHAL_CLOCK_BLOCK_PATHMUX:
- return &FUNCS_PATHMUX;
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- case CYHAL_CLOCK_BLOCK_FLL:
- return &FUNCS_FLL;
- #endif
- case CYHAL_CLOCK_BLOCK_LF:
- return &FUNCS_LF;
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- case CYHAL_CLOCK_BLOCK_MF:
- return &FUNCS_MF;
- #endif
- case CYHAL_CLOCK_BLOCK_HF:
- return &FUNCS_HF;
- // PUMP clock is only available on CAT1A and CAT1B devices
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
- case CYHAL_CLOCK_BLOCK_PUMP:
- return &FUNCS_PUMP;
- #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
- case CYHAL_CLOCK_BLOCK_BAK:
- return &FUNCS_BAK;
- case CYHAL_CLOCK_BLOCK_ALT_SYS_TICK:
- return &FUNCS_ALT_SYS_TICK;
- case CYHAL_CLOCK_BLOCK_PERI:
- return &FUNCS_PERI;
- #if defined(COMPONENT_CAT1A)
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- case CYHAL_CLOCK_BLOCK_PLL:
- return &FUNCS_PLL;
- #endif
- #endif
- #if defined(COMPONENT_CAT1C)
- case CYHAL_CLOCK_BLOCK_MEM:
- return &FUNCS_MEM;
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- #if defined(COMPONENT_CAT1A)
- case CYHAL_CLOCK_BLOCK_TIMER:
- return &FUNCS_TIMER;
- #endif
- case CYHAL_CLOCK_BLOCK_FAST:
- return &FUNCS_FAST;
- case CYHAL_CLOCK_BLOCK_SLOW:
- return &FUNCS_SLOW;
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- case CYHAL_CLOCK_BLOCK_PLL200:
- return &FUNCS_PLL200;
- case CYHAL_CLOCK_BLOCK_PLL400:
- return &FUNCS_PLL400;
- #endif
- #endif
- #if defined(COMPONENT_CAT1D)
- #if (_CYHAL_SRSS_NUM_PLL > 0)
- case CYHAL_CLOCK_BLOCK_DPLL_LP:
- return &FUNCS_DPLL_LP;
- case CYHAL_CLOCK_BLOCK_DPLL_HP:
- return &FUNCS_DPLL_HP;
- #endif
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1D)
- case CYHAL_CLOCK_BLOCK_IHO:
- return &FUNCS_IHO;
- #if SRSS_ECO_PRESENT
- case CYHAL_CLOCK_BLOCK_ECO_PRESCALER:
- return &FUNCS_ECO_PRESCALER;
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- case CY_SYSCLK_CLKLF_IN_LPECO_PRESCALER:
- return &FUNCS_LPECO_PRESCALER;
- #endif
- #endif
- default:
- return &FUNCS_PERIPHERAL;
- }
- }
- #define _CYHAL_CLOCK_CREATE(x,y) { .block = (CYHAL_CLOCK_BLOCK_##x), .channel = (y), .reserved = false, .funcs = &(FUNCS_##x) }
- const cyhal_clock_t CYHAL_CLOCK_IMO = _CYHAL_CLOCK_CREATE(IMO, 0);
- const cyhal_clock_t CYHAL_CLOCK_EXT = _CYHAL_CLOCK_CREATE(EXT, 0);
- #if defined(COMPONENT_CAT1C)
- const cyhal_clock_t CYHAL_CLOCK_ILO[_CYHAL_SRSS_NUM_ILO] =
- {
- _CYHAL_CLOCK_CREATE(ILO, 0),
- #if (SRSS_HT_VARIANT > 0)
- _CYHAL_CLOCK_CREATE(ILO, 1),
- #endif
- };
- #else
- const cyhal_clock_t CYHAL_CLOCK_ILO = _CYHAL_CLOCK_CREATE(ILO, 0);
- #endif
- const cyhal_clock_t CYHAL_CLOCK_LF = _CYHAL_CLOCK_CREATE(LF, 0);
- // PUMP clock is only available on CAT1A and CAT1B devices
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B)
- const cyhal_clock_t CYHAL_CLOCK_PUMP = _CYHAL_CLOCK_CREATE(PUMP, 0);
- #endif /* defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) */
- const cyhal_clock_t CYHAL_CLOCK_BAK = _CYHAL_CLOCK_CREATE(BAK, 0);
- const cyhal_clock_t CYHAL_CLOCK_ALT_SYS_TICK = _CYHAL_CLOCK_CREATE(ALT_SYS_TICK, 0);
- const cyhal_clock_t CYHAL_CLOCK_PATHMUX[SRSS_NUM_CLKPATH] =
- {
- _CYHAL_CLOCK_CREATE(PATHMUX, 0),
- #if (SRSS_NUM_CLKPATH > 1)
- _CYHAL_CLOCK_CREATE(PATHMUX, 1),
- #endif
- #if (SRSS_NUM_CLKPATH > 2)
- _CYHAL_CLOCK_CREATE(PATHMUX, 2),
- #endif
- #if (SRSS_NUM_CLKPATH > 3)
- _CYHAL_CLOCK_CREATE(PATHMUX, 3),
- #endif
- #if (SRSS_NUM_CLKPATH > 4)
- _CYHAL_CLOCK_CREATE(PATHMUX, 4),
- #endif
- #if (SRSS_NUM_CLKPATH > 5)
- _CYHAL_CLOCK_CREATE(PATHMUX, 5),
- #endif
- #if (SRSS_NUM_CLKPATH > 6)
- _CYHAL_CLOCK_CREATE(PATHMUX, 6),
- #endif
- #if (SRSS_NUM_CLKPATH > 7)
- _CYHAL_CLOCK_CREATE(PATHMUX, 7),
- #endif
- #if (SRSS_NUM_CLKPATH > 8)
- _CYHAL_CLOCK_CREATE(PATHMUX, 8),
- #endif
- #if (SRSS_NUM_CLKPATH > 9)
- _CYHAL_CLOCK_CREATE(PATHMUX, 9),
- #endif
- #if (SRSS_NUM_CLKPATH > 10)
- _CYHAL_CLOCK_CREATE(PATHMUX, 10),
- #endif
- #if (SRSS_NUM_CLKPATH > 11)
- _CYHAL_CLOCK_CREATE(PATHMUX, 11),
- #endif
- #if (SRSS_NUM_CLKPATH > 12)
- _CYHAL_CLOCK_CREATE(PATHMUX, 12),
- #endif
- #if (SRSS_NUM_CLKPATH > 13)
- _CYHAL_CLOCK_CREATE(PATHMUX, 13),
- #endif
- #if (SRSS_NUM_CLKPATH > 14)
- _CYHAL_CLOCK_CREATE(PATHMUX, 14),
- #endif
- #if (SRSS_NUM_CLKPATH > 15)
- _CYHAL_CLOCK_CREATE(PATHMUX, 15),
- #endif
- };
- const cyhal_clock_t CYHAL_CLOCK_HF[SRSS_NUM_HFROOT] =
- {
- _CYHAL_CLOCK_CREATE(HF, 0),
- #if (SRSS_NUM_HFROOT > 1)
- _CYHAL_CLOCK_CREATE(HF, 1),
- #endif
- #if (SRSS_NUM_HFROOT > 2)
- _CYHAL_CLOCK_CREATE(HF, 2),
- #endif
- #if (SRSS_NUM_HFROOT > 3)
- _CYHAL_CLOCK_CREATE(HF, 3),
- #endif
- #if (SRSS_NUM_HFROOT > 4)
- _CYHAL_CLOCK_CREATE(HF, 4),
- #endif
- #if (SRSS_NUM_HFROOT > 5)
- _CYHAL_CLOCK_CREATE(HF, 5),
- #endif
- #if (SRSS_NUM_HFROOT > 6)
- _CYHAL_CLOCK_CREATE(HF, 6),
- #endif
- #if (SRSS_NUM_HFROOT > 7)
- _CYHAL_CLOCK_CREATE(HF, 7),
- #endif
- #if (SRSS_NUM_HFROOT > 8)
- _CYHAL_CLOCK_CREATE(HF, 8),
- #endif
- #if (SRSS_NUM_HFROOT > 9)
- _CYHAL_CLOCK_CREATE(HF, 9),
- #endif
- #if (SRSS_NUM_HFROOT > 10)
- _CYHAL_CLOCK_CREATE(HF, 10),
- #endif
- #if (SRSS_NUM_HFROOT > 11)
- _CYHAL_CLOCK_CREATE(HF, 11),
- #endif
- #if (SRSS_NUM_HFROOT > 12)
- _CYHAL_CLOCK_CREATE(HF, 12),
- #endif
- #if (SRSS_NUM_HFROOT > 13)
- _CYHAL_CLOCK_CREATE(HF, 13),
- #endif
- #if (SRSS_NUM_HFROOT > 14)
- _CYHAL_CLOCK_CREATE(HF, 14),
- #endif
- #if (SRSS_NUM_HFROOT > 15)
- _CYHAL_CLOCK_CREATE(HF, 15),
- #endif
- };
- #if SRSS_ECO_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_ECO = _CYHAL_CLOCK_CREATE(ECO, 0);
- #endif
- #if SRSS_ALTHF_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_ALTHF = _CYHAL_CLOCK_CREATE(ALTHF, 0);
- #endif
- #if SRSS_ALTLF_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_ALTLF = _CYHAL_CLOCK_CREATE(ALTLF, 0);
- #endif
- #if _CYHAL_SRSS_PILO_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_PILO = _CYHAL_CLOCK_CREATE(PILO, 0);
- #endif
- #if SRSS_BACKUP_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_WCO = _CYHAL_CLOCK_CREATE(WCO, 0);
- #endif
- #if defined(COMPONENT_CAT1B) || (SRSS_MFO_PRESENT)
- const cyhal_clock_t CYHAL_CLOCK_MFO = _CYHAL_CLOCK_CREATE(MFO, 0);
- const cyhal_clock_t CYHAL_CLOCK_MF = _CYHAL_CLOCK_CREATE(MF, 0);
- #endif
- #if defined(COMPONENT_CAT1C)
- const cyhal_clock_t CYHAL_CLOCK_MEM = _CYHAL_CLOCK_CREATE(MEM, 0);
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C) || (SRSS_FLL_PRESENT)
- const cyhal_clock_t CYHAL_CLOCK_FLL = _CYHAL_CLOCK_CREATE(FLL, 0);
- #endif
- #if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1C)
- #if defined(COMPONENT_CAT1C)
- const cyhal_clock_t CYHAL_CLOCK_FAST[2] =
- {
- _CYHAL_CLOCK_CREATE(FAST, 0),
- _CYHAL_CLOCK_CREATE(FAST, 1),
- };
- #else
- const cyhal_clock_t CYHAL_CLOCK_FAST = _CYHAL_CLOCK_CREATE(FAST, 0);
- #endif
- const cyhal_clock_t CYHAL_CLOCK_SLOW = _CYHAL_CLOCK_CREATE(SLOW, 0);
- #if defined(COMPONENT_CAT1A)
- const cyhal_clock_t CYHAL_CLOCK_PERI = _CYHAL_CLOCK_CREATE(PERI, 0);
- const cyhal_clock_t CYHAL_CLOCK_TIMER = _CYHAL_CLOCK_CREATE(TIMER, 0);
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 0) && defined(COMPONENT_CAT1A)
- const cyhal_clock_t CYHAL_CLOCK_PLL[_CYHAL_SRSS_NUM_PLL] =
- {
- _CYHAL_CLOCK_CREATE(PLL, 0),
- #if (_CYHAL_SRSS_NUM_PLL > 1)
- _CYHAL_CLOCK_CREATE(PLL, 1),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 2)
- _CYHAL_CLOCK_CREATE(PLL, 2),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 3)
- _CYHAL_CLOCK_CREATE(PLL, 3),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 4)
- _CYHAL_CLOCK_CREATE(PLL, 4),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 5)
- _CYHAL_CLOCK_CREATE(PLL, 5),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 6)
- _CYHAL_CLOCK_CREATE(PLL, 6),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 7)
- _CYHAL_CLOCK_CREATE(PLL, 7),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 8)
- _CYHAL_CLOCK_CREATE(PLL, 8),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 9)
- _CYHAL_CLOCK_CREATE(PLL, 9),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 10)
- _CYHAL_CLOCK_CREATE(PLL, 10),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 11)
- _CYHAL_CLOCK_CREATE(PLL, 11),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 12)
- _CYHAL_CLOCK_CREATE(PLL, 12),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 13)
- _CYHAL_CLOCK_CREATE(PLL, 13),
- #endif
- #if (_CYHAL_SRSS_NUM_PLL > 14)
- _CYHAL_CLOCK_CREATE(PLL, 14),
- #endif
- };
- #endif
- #endif
- #if defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C)
- #if defined(COMPONENT_CAT1B)
- const cyhal_clock_t CYHAL_CLOCK_IHO = _CYHAL_CLOCK_CREATE(IHO, 0);
- #if SRSS_ECO_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_ECO_PRESCALER = _CYHAL_CLOCK_CREATE(ECO_PRESCALER, 0);
- #endif
- #if SRSS_BACKUP_S40E_LPECO_PRESENT
- const cyhal_clock_t CYHAL_CLOCK_LPECO_PRESCALER = _CYHAL_CLOCK_CREATE(LPECO_PRESCALER, 0);
- #endif
- #endif
- const cyhal_clock_t CYHAL_CLOCK_PERI[CY_PERI_GROUP_NR] =
- {
- _CYHAL_CLOCK_CREATE(PERI, 0),
- #if (CY_PERI_GROUP_NR > 1)
- _CYHAL_CLOCK_CREATE(PERI, 1),
- #endif
- #if (CY_PERI_GROUP_NR > 2)
- _CYHAL_CLOCK_CREATE(PERI, 2),
- #endif
- #if (CY_PERI_GROUP_NR > 3)
- _CYHAL_CLOCK_CREATE(PERI, 3),
- #endif
- #if (CY_PERI_GROUP_NR > 4)
- _CYHAL_CLOCK_CREATE(PERI, 4),
- #endif
- #if (CY_PERI_GROUP_NR > 5)
- _CYHAL_CLOCK_CREATE(PERI, 5),
- #endif
- #if (CY_PERI_GROUP_NR > 6)
- _CYHAL_CLOCK_CREATE(PERI, 6),
- #endif
- #if (CY_PERI_GROUP_NR > 7)
- _CYHAL_CLOCK_CREATE(PERI, 7),
- #endif
- #if (CY_PERI_GROUP_NR > 8)
- _CYHAL_CLOCK_CREATE(PERI, 8),
- #endif
- #if (CY_PERI_GROUP_NR > 9)
- _CYHAL_CLOCK_CREATE(PERI, 9),
- #endif
- #if (CY_PERI_GROUP_NR > 10)
- _CYHAL_CLOCK_CREATE(PERI, 10),
- #endif
- #if (CY_PERI_GROUP_NR > 11)
- _CYHAL_CLOCK_CREATE(PERI, 11),
- #endif
- #if (CY_PERI_GROUP_NR > 12)
- _CYHAL_CLOCK_CREATE(PERI, 12),
- #endif
- #if (CY_PERI_GROUP_NR > 13)
- _CYHAL_CLOCK_CREATE(PERI, 13),
- #endif
- #if (CY_PERI_GROUP_NR > 14)
- _CYHAL_CLOCK_CREATE(PERI, 14),
- #endif
- #if (CY_PERI_GROUP_NR > 15)
- _CYHAL_CLOCK_CREATE(PERI, 15),
- #endif
- };
- #if (SRSS_NUM_PLL200M > 0)
- #if defined(COMPONENT_CAT1B)
- const cyhal_clock_t CYHAL_CLOCK_PLL[SRSS_NUM_PLL200M] =
- {
- #else
- const cyhal_clock_t CYHAL_CLOCK_PLL200[SRSS_NUM_PLL200M] =
- {
- #endif
- _CYHAL_CLOCK_CREATE(PLL200, 0),
- #if (SRSS_NUM_PLL200M > 1)
- _CYHAL_CLOCK_CREATE(PLL200, 1),
- #endif
- #if (SRSS_NUM_PLL200M > 2)
- _CYHAL_CLOCK_CREATE(PLL200, 2),
- #endif
- #if (SRSS_NUM_PLL200M > 3)
- _CYHAL_CLOCK_CREATE(PLL200, 3),
- #endif
- #if (SRSS_NUM_PLL200M > 4)
- _CYHAL_CLOCK_CREATE(PLL200, 4),
- #endif
- #if (SRSS_NUM_PLL200M > 5)
- _CYHAL_CLOCK_CREATE(PLL200, 5),
- #endif
- #if (SRSS_NUM_PLL200M > 6)
- _CYHAL_CLOCK_CREATE(PLL200, 6),
- #endif
- #if (SRSS_NUM_PLL200M > 7)
- _CYHAL_CLOCK_CREATE(PLL200, 7),
- #endif
- #if (SRSS_NUM_PLL200M > 8)
- _CYHAL_CLOCK_CREATE(PLL200, 8),
- #endif
- #if (SRSS_NUM_PLL200M > 9)
- _CYHAL_CLOCK_CREATE(PLL200, 9),
- #endif
- #if (SRSS_NUM_PLL200M > 10)
- _CYHAL_CLOCK_CREATE(PLL200, 10),
- #endif
- #if (SRSS_NUM_PLL200M > 11)
- _CYHAL_CLOCK_CREATE(PLL200, 11),
- #endif
- #if (SRSS_NUM_PLL200M > 12)
- _CYHAL_CLOCK_CREATE(PLL200, 12),
- #endif
- #if (SRSS_NUM_PLL200M > 13)
- _CYHAL_CLOCK_CREATE(PLL200, 13),
- #endif
- #if (SRSS_NUM_PLL200M > 14)
- _CYHAL_CLOCK_CREATE(PLL200, 14),
- #endif
- };
- #endif
- #if (SRSS_NUM_PLL400M > 0)
- #if defined(COMPONENT_CAT1B)
- const cyhal_clock_t CYHAL_CLOCK_PLL[SRSS_NUM_PLL400M] =
- {
- #else
- const cyhal_clock_t CYHAL_CLOCK_PLL400[SRSS_NUM_PLL400M] =
- {
- #endif
- _CYHAL_CLOCK_CREATE(PLL400, 0),
- #if (SRSS_NUM_PLL400M > 1)
- _CYHAL_CLOCK_CREATE(PLL400, 1),
- #endif
- #if (SRSS_NUM_PLL400M > 2)
- _CYHAL_CLOCK_CREATE(PLL400, 2),
- #endif
- #if (SRSS_NUM_PLL400M > 3)
- _CYHAL_CLOCK_CREATE(PLL400, 3),
- #endif
- #if (SRSS_NUM_PLL400M > 4)
- _CYHAL_CLOCK_CREATE(PLL400, 4),
- #endif
- #if (SRSS_NUM_PLL400M > 5)
- _CYHAL_CLOCK_CREATE(PLL400, 5),
- #endif
- #if (SRSS_NUM_PLL400M > 6)
- _CYHAL_CLOCK_CREATE(PLL400, 6),
- #endif
- #if (SRSS_NUM_PLL400M > 7)
- _CYHAL_CLOCK_CREATE(PLL400, 7),
- #endif
- #if (SRSS_NUM_PLL400M > 8)
- _CYHAL_CLOCK_CREATE(PLL400, 8),
- #endif
- #if (SRSS_NUM_PLL400M > 9)
- _CYHAL_CLOCK_CREATE(PLL400, 9),
- #endif
- #if (SRSS_NUM_PLL400M > 10)
- _CYHAL_CLOCK_CREATE(PLL400, 10),
- #endif
- #if (SRSS_NUM_PLL400M > 11)
- _CYHAL_CLOCK_CREATE(PLL400, 11),
- #endif
- #if (SRSS_NUM_PLL400M > 12)
- _CYHAL_CLOCK_CREATE(PLL400, 12),
- #endif
- #if (SRSS_NUM_PLL400M > 13)
- _CYHAL_CLOCK_CREATE(PLL400, 13),
- #endif
- #if (SRSS_NUM_PLL400M > 14)
- _CYHAL_CLOCK_CREATE(PLL400, 14),
- #endif
- };
- #endif
- #endif
- #if defined(COMPONENT_CAT1D)
- const cyhal_clock_t CYHAL_CLOCK_DPLL_LP[SRSS_NUM_DPLL_LP] =
- {
- #if (SRSS_NUM_DPLL_LP > 0)
- _CYHAL_CLOCK_CREATE(DPLL_LP, 0),
- #endif
- #if (SRSS_NUM_DPLL_LP > 1)
- _CYHAL_CLOCK_CREATE(DPLL_LP, 1),
- #endif
- #if (SRSS_NUM_DPLL_LP > 2)
- _CYHAL_CLOCK_CREATE(DPLL_LP, 2),
- #endif
- #if (SRSS_NUM_DPLL_LP > 3)
- _CYHAL_CLOCK_CREATE(DPLL_LP, 4),
- #endif
- #if (SRSS_NUM_DPLL_LP > 4)
- _CYHAL_CLOCK_CREATE(DPLL_LP, 4),
- #endif
- };
- const cyhal_clock_t CYHAL_CLOCK_DPLL_HP[SRSS_NUM_DPLL_HP] =
- {
- #if (SRSS_NUM_DPLL_HP > 0)
- _CYHAL_CLOCK_CREATE(DPLL_HP, 0),
- #endif
- #if (SRSS_NUM_DPLL_HP > 1)
- _CYHAL_CLOCK_CREATE(DPLL_HP, 1),
- #endif
- #if (SRSS_NUM_DPLL_HP > 2)
- _CYHAL_CLOCK_CREATE(DPLL_HP, 2),
- #endif
- #if (SRSS_NUM_DPLL_HP > 3)
- _CYHAL_CLOCK_CREATE(DPLL_HP, 4),
- #endif
- #if (SRSS_NUM_DPLL_HP > 4)
- _CYHAL_CLOCK_CREATE(DPLL_HP, 4),
- #endif
- };
- #endif /* defined(COMPONENT_CAT1D) */
- /******************************************************************************
- **************************** Public API (clocks) *****************************
- *****************************************************************************/
- cy_rslt_t _cyhal_clock_allocate_channel(cyhal_clock_t *clock, cyhal_clock_block_t block, const void* funcs)
- {
- uint8_t maxChannels = (uint8_t)_cyhal_utils_get_clock_count(block);
- for (uint8_t i = 0; i < maxChannels; i++)
- {
- cyhal_resource_inst_t clock_resource = { CYHAL_RSC_CLOCK, block, i };
- if (CY_RSLT_SUCCESS == cyhal_hwmgr_reserve(&clock_resource))
- {
- clock->block = block;
- clock->channel = i;
- clock->reserved = true;
- clock->funcs = funcs;
- return CY_RSLT_SUCCESS;
- }
- }
- return CYHAL_HWMGR_RSLT_ERR_NONE_FREE;
- }
- cy_rslt_t cyhal_clock_get(cyhal_clock_t *clock, const cyhal_resource_inst_t *resource)
- {
- CY_ASSERT(NULL != clock);
- CY_ASSERT(NULL != resource);
- CY_ASSERT(CYHAL_RSC_CLOCK == resource->type);
- clock->block = (cyhal_clock_block_t)resource->block_num;
- clock->channel = resource->channel_num;
- clock->reserved = false;
- clock->funcs = _cyhal_clock_get_funcs_all((cyhal_clock_block_t)resource->block_num);
- return CY_RSLT_SUCCESS;
- }
- cy_rslt_t cyhal_clock_reserve(cyhal_clock_t *clock, const cyhal_clock_t *clock_)
- {
- CY_ASSERT(NULL != clock);
- CY_ASSERT(NULL != clock_);
- cyhal_resource_inst_t clock_resource = { CYHAL_RSC_CLOCK, clock_->block, clock_->channel };
- cy_rslt_t rslt = cyhal_hwmgr_reserve(&clock_resource);
- if (CY_RSLT_SUCCESS == rslt)
- {
- memcpy(clock, clock_, sizeof(cyhal_clock_t));
- clock->reserved = true;
- }
- return rslt;
- }
- cyhal_clock_feature_t cyhal_clock_get_features(const cyhal_clock_t *clock)
- {
- CY_ASSERT(NULL != clock);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- {
- return (clock->channel == 0) // HF0 cannot be disabled
- ? (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER)
- : (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_SOURCE | CYHAL_CLOCK_FEATURE_DIVIDER);
- }
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return (cyhal_clock_feature_t)(CYHAL_CLOCK_FEATURE_ENABLE | CYHAL_CLOCK_FEATURE_DIVIDER | CYHAL_CLOCK_FEATURE_FREQUENCY);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->features;
- }
- bool cyhal_clock_is_enabled(const cyhal_clock_t *clock)
- {
- CY_ASSERT(NULL != clock);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_is_enabled_hf(clock);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_is_enabled_peripheral(clock);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->is_enabled(clock);
- }
- cy_rslt_t cyhal_clock_set_enabled(cyhal_clock_t *clock, bool enabled, bool wait_for_lock)
- {
- CY_ASSERT(NULL != clock);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_set_enabled_hf(clock, enabled, wait_for_lock);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_set_enabled_peripheral(clock, enabled, wait_for_lock);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->set_enabled(clock, enabled, wait_for_lock);
- }
- uint32_t cyhal_clock_get_frequency(const cyhal_clock_t *clock)
- {
- CY_ASSERT(NULL != clock);
- if (cyhal_clock_is_enabled(clock))
- {
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_get_frequency_hf(clock);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_get_frequency_peripheral(clock);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->get_frequency(clock);
- }
- return 0;
- }
- cy_rslt_t cyhal_clock_set_frequency(cyhal_clock_t *clock, uint32_t hz, const cyhal_clock_tolerance_t *tolerance)
- {
- CY_ASSERT(NULL != clock);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_set_frequency_unsupported(clock, hz, tolerance);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_set_frequency_peripheral(clock, hz, tolerance);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->set_frequency(clock, hz, tolerance);
- }
- cy_rslt_t cyhal_clock_set_divider(cyhal_clock_t *clock, uint32_t divider)
- {
- CY_ASSERT(NULL != clock);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_set_divider_hf(clock, divider);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_set_divider_peripheral(clock, divider);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->set_divider(clock, divider);
- }
- cy_rslt_t cyhal_clock_get_sources(const cyhal_clock_t *clock, const cyhal_resource_inst_t **sources[], uint32_t *count)
- {
- CY_ASSERT(NULL != clock);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_get_sources_hf(clock, sources, count);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_get_sources_peripheral(clock, sources, count);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->get_sources(clock, sources, count);
- }
- cy_rslt_t cyhal_clock_set_source(cyhal_clock_t *clock, const cyhal_clock_t *source)
- {
- CY_ASSERT(NULL != clock && NULL != source);
- if (clock->block == CYHAL_CLOCK_BLOCK_HF)
- return _cyhal_clock_set_source_hf(clock, source);
- else if (clock->block < 4 * _CYHAL_CLOCK_PERI_GROUPS)
- return _cyhal_clock_set_source_unsupported(clock, source);
- else
- return ((cyhal_clock_funcs_t*)clock->funcs)->set_source(clock, source);
- }
- void cyhal_clock_free(cyhal_clock_t *clock)
- {
- CY_ASSERT(NULL != clock);
- CY_ASSERT(clock->reserved);
- cyhal_resource_inst_t rsc = { CYHAL_RSC_CLOCK, clock->block, clock->channel };
- cyhal_hwmgr_free(&rsc);
- clock->reserved = false;
- }
- #if defined(__cplusplus)
- }
- #endif
- #endif // CYHAL_DRIVER_AVAILABLE_CLOCK
|