lsm6dso_reg.c 323 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139
  1. /**
  2. ******************************************************************************
  3. * @file lsm6dso_reg.c
  4. * @author Sensors Software Solution Team
  5. * @brief LSM6DSO driver file
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. #include "lsm6dso_reg.h"
  19. #include <stddef.h>
  20. /**
  21. * @defgroup LSM6DSO
  22. * @brief This file provides a set of functions needed to drive the
  23. * lsm6dso enhanced inertial module.
  24. * @{
  25. *
  26. */
  27. /**
  28. * @defgroup LSM6DSO_Interfaces_Functions
  29. * @brief This section provide a set of functions used to read and
  30. * write a generic register of the device.
  31. * MANDATORY: return 0 -> no Error.
  32. * @{
  33. *
  34. */
  35. /**
  36. * @brief Read generic device register
  37. *
  38. * @param ctx read / write interface definitions(ptr)
  39. * @param reg register to read
  40. * @param data pointer to buffer that store the data read(ptr)
  41. * @param len number of consecutive register to read
  42. * @retval interface status (MANDATORY: return 0 -> no Error)
  43. *
  44. */
  45. int32_t __weak lsm6dso_read_reg(stmdev_ctx_t *ctx, uint8_t reg,
  46. uint8_t *data,
  47. uint16_t len)
  48. {
  49. int32_t ret;
  50. ret = ctx->read_reg(ctx->handle, reg, data, len);
  51. return ret;
  52. }
  53. /**
  54. * @brief Write generic device register
  55. *
  56. * @param ctx read / write interface definitions(ptr)
  57. * @param reg register to write
  58. * @param data pointer to data to write in register reg(ptr)
  59. * @param len number of consecutive register to write
  60. * @retval interface status (MANDATORY: return 0 -> no Error)
  61. *
  62. */
  63. int32_t __weak lsm6dso_write_reg(stmdev_ctx_t *ctx, uint8_t reg,
  64. uint8_t *data,
  65. uint16_t len)
  66. {
  67. int32_t ret;
  68. ret = ctx->write_reg(ctx->handle, reg, data, len);
  69. return ret;
  70. }
  71. /**
  72. * @}
  73. *
  74. */
  75. /**
  76. * @defgroup LSM6DSOX_Private_functions
  77. * @brief Section collect all the utility functions needed by APIs.
  78. * @{
  79. *
  80. */
  81. static void bytecpy(uint8_t *target, uint8_t *source)
  82. {
  83. if ((target != NULL) && (source != NULL))
  84. {
  85. *target = *source;
  86. }
  87. }
  88. /**
  89. * @defgroup LSM6DSO_Sensitivity
  90. * @brief These functions convert raw-data into engineering units.
  91. * @{
  92. *
  93. */
  94. float_t lsm6dso_from_fs2_to_mg(int16_t lsb)
  95. {
  96. return ((float_t)lsb) * 0.061f;
  97. }
  98. float_t lsm6dso_from_fs4_to_mg(int16_t lsb)
  99. {
  100. return ((float_t)lsb) * 0.122f;
  101. }
  102. float_t lsm6dso_from_fs8_to_mg(int16_t lsb)
  103. {
  104. return ((float_t)lsb) * 0.244f;
  105. }
  106. float_t lsm6dso_from_fs16_to_mg(int16_t lsb)
  107. {
  108. return ((float_t)lsb) * 0.488f;
  109. }
  110. float_t lsm6dso_from_fs125_to_mdps(int16_t lsb)
  111. {
  112. return ((float_t)lsb) * 4.375f;
  113. }
  114. float_t lsm6dso_from_fs500_to_mdps(int16_t lsb)
  115. {
  116. return ((float_t)lsb) * 17.50f;
  117. }
  118. float_t lsm6dso_from_fs250_to_mdps(int16_t lsb)
  119. {
  120. return ((float_t)lsb) * 8.750f;
  121. }
  122. float_t lsm6dso_from_fs1000_to_mdps(int16_t lsb)
  123. {
  124. return ((float_t)lsb) * 35.0f;
  125. }
  126. float_t lsm6dso_from_fs2000_to_mdps(int16_t lsb)
  127. {
  128. return ((float_t)lsb) * 70.0f;
  129. }
  130. float_t lsm6dso_from_lsb_to_celsius(int16_t lsb)
  131. {
  132. return (((float_t)lsb / 256.0f) + 25.0f);
  133. }
  134. float_t lsm6dso_from_lsb_to_nsec(int16_t lsb)
  135. {
  136. return ((float_t)lsb * 25000.0f);
  137. }
  138. /**
  139. * @}
  140. *
  141. */
  142. /**
  143. * @defgroup LSM6DSO_Data_Generation
  144. * @brief This section groups all the functions concerning
  145. * data generation.
  146. *
  147. */
  148. /**
  149. * @brief Accelerometer full-scale selection.[set]
  150. *
  151. * @param ctx read / write interface definitions
  152. * @param val change the values of fs_xl in reg CTRL1_XL
  153. * @retval interface status (MANDATORY: return 0 -> no Error)
  154. *
  155. */
  156. int32_t lsm6dso_xl_full_scale_set(stmdev_ctx_t *ctx,
  157. lsm6dso_fs_xl_t val)
  158. {
  159. lsm6dso_ctrl1_xl_t reg;
  160. int32_t ret;
  161. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  162. if (ret == 0)
  163. {
  164. reg.fs_xl = (uint8_t) val;
  165. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  166. }
  167. return ret;
  168. }
  169. /**
  170. * @brief Accelerometer full-scale selection.[get]
  171. *
  172. * @param ctx read / write interface definitions
  173. * @param val Get the values of fs_xl in reg CTRL1_XL
  174. * @retval interface status (MANDATORY: return 0 -> no Error)
  175. *
  176. */
  177. int32_t lsm6dso_xl_full_scale_get(stmdev_ctx_t *ctx,
  178. lsm6dso_fs_xl_t *val)
  179. {
  180. lsm6dso_ctrl1_xl_t reg;
  181. int32_t ret;
  182. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  183. switch (reg.fs_xl)
  184. {
  185. case LSM6DSO_2g:
  186. *val = LSM6DSO_2g;
  187. break;
  188. case LSM6DSO_16g:
  189. *val = LSM6DSO_16g;
  190. break;
  191. case LSM6DSO_4g:
  192. *val = LSM6DSO_4g;
  193. break;
  194. case LSM6DSO_8g:
  195. *val = LSM6DSO_8g;
  196. break;
  197. default:
  198. *val = LSM6DSO_2g;
  199. break;
  200. }
  201. return ret;
  202. }
  203. /**
  204. * @brief Accelerometer UI data rate selection.[set]
  205. *
  206. * @param ctx read / write interface definitions
  207. * @param val change the values of odr_xl in reg CTRL1_XL
  208. * @retval interface status (MANDATORY: return 0 -> no Error)
  209. *
  210. */
  211. int32_t lsm6dso_xl_data_rate_set(stmdev_ctx_t *ctx,
  212. lsm6dso_odr_xl_t val)
  213. {
  214. lsm6dso_odr_xl_t odr_xl = val;
  215. lsm6dso_emb_fsm_enable_t fsm_enable;
  216. lsm6dso_fsm_odr_t fsm_odr;
  217. lsm6dso_ctrl1_xl_t reg;
  218. int32_t ret;
  219. /* Check the Finite State Machine data rate constraints */
  220. ret = lsm6dso_fsm_enable_get(ctx, &fsm_enable);
  221. if (ret == 0)
  222. {
  223. if ((fsm_enable.fsm_enable_a.fsm1_en |
  224. fsm_enable.fsm_enable_a.fsm2_en |
  225. fsm_enable.fsm_enable_a.fsm3_en |
  226. fsm_enable.fsm_enable_a.fsm4_en |
  227. fsm_enable.fsm_enable_a.fsm5_en |
  228. fsm_enable.fsm_enable_a.fsm6_en |
  229. fsm_enable.fsm_enable_a.fsm7_en |
  230. fsm_enable.fsm_enable_a.fsm8_en |
  231. fsm_enable.fsm_enable_b.fsm9_en |
  232. fsm_enable.fsm_enable_b.fsm10_en |
  233. fsm_enable.fsm_enable_b.fsm11_en |
  234. fsm_enable.fsm_enable_b.fsm12_en |
  235. fsm_enable.fsm_enable_b.fsm13_en |
  236. fsm_enable.fsm_enable_b.fsm14_en |
  237. fsm_enable.fsm_enable_b.fsm15_en |
  238. fsm_enable.fsm_enable_b.fsm16_en) == PROPERTY_ENABLE)
  239. {
  240. ret = lsm6dso_fsm_data_rate_get(ctx, &fsm_odr);
  241. if (ret == 0)
  242. {
  243. switch (fsm_odr)
  244. {
  245. case LSM6DSO_ODR_FSM_12Hz5:
  246. if (val == LSM6DSO_XL_ODR_OFF)
  247. {
  248. odr_xl = LSM6DSO_XL_ODR_12Hz5;
  249. }
  250. else
  251. {
  252. odr_xl = val;
  253. }
  254. break;
  255. case LSM6DSO_ODR_FSM_26Hz:
  256. if (val == LSM6DSO_XL_ODR_OFF)
  257. {
  258. odr_xl = LSM6DSO_XL_ODR_26Hz;
  259. }
  260. else if (val == LSM6DSO_XL_ODR_12Hz5)
  261. {
  262. odr_xl = LSM6DSO_XL_ODR_26Hz;
  263. }
  264. else
  265. {
  266. odr_xl = val;
  267. }
  268. break;
  269. case LSM6DSO_ODR_FSM_52Hz:
  270. if (val == LSM6DSO_XL_ODR_OFF)
  271. {
  272. odr_xl = LSM6DSO_XL_ODR_52Hz;
  273. }
  274. else if (val == LSM6DSO_XL_ODR_12Hz5)
  275. {
  276. odr_xl = LSM6DSO_XL_ODR_52Hz;
  277. }
  278. else if (val == LSM6DSO_XL_ODR_26Hz)
  279. {
  280. odr_xl = LSM6DSO_XL_ODR_52Hz;
  281. }
  282. else
  283. {
  284. odr_xl = val;
  285. }
  286. break;
  287. case LSM6DSO_ODR_FSM_104Hz:
  288. if (val == LSM6DSO_XL_ODR_OFF)
  289. {
  290. odr_xl = LSM6DSO_XL_ODR_104Hz;
  291. }
  292. else if (val == LSM6DSO_XL_ODR_12Hz5)
  293. {
  294. odr_xl = LSM6DSO_XL_ODR_104Hz;
  295. }
  296. else if (val == LSM6DSO_XL_ODR_26Hz)
  297. {
  298. odr_xl = LSM6DSO_XL_ODR_104Hz;
  299. }
  300. else if (val == LSM6DSO_XL_ODR_52Hz)
  301. {
  302. odr_xl = LSM6DSO_XL_ODR_104Hz;
  303. }
  304. else
  305. {
  306. odr_xl = val;
  307. }
  308. break;
  309. default:
  310. odr_xl = val;
  311. break;
  312. }
  313. }
  314. }
  315. }
  316. if (ret == 0)
  317. {
  318. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  319. }
  320. if (ret == 0)
  321. {
  322. reg.odr_xl = (uint8_t) odr_xl;
  323. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  324. }
  325. return ret;
  326. }
  327. /**
  328. * @brief Accelerometer UI data rate selection.[get]
  329. *
  330. * @param ctx read / write interface definitions
  331. * @param val Get the values of odr_xl in reg CTRL1_XL
  332. * @retval interface status (MANDATORY: return 0 -> no Error)
  333. *
  334. */
  335. int32_t lsm6dso_xl_data_rate_get(stmdev_ctx_t *ctx,
  336. lsm6dso_odr_xl_t *val)
  337. {
  338. lsm6dso_ctrl1_xl_t reg;
  339. int32_t ret;
  340. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  341. switch (reg.odr_xl)
  342. {
  343. case LSM6DSO_XL_ODR_OFF:
  344. *val = LSM6DSO_XL_ODR_OFF;
  345. break;
  346. case LSM6DSO_XL_ODR_12Hz5:
  347. *val = LSM6DSO_XL_ODR_12Hz5;
  348. break;
  349. case LSM6DSO_XL_ODR_26Hz:
  350. *val = LSM6DSO_XL_ODR_26Hz;
  351. break;
  352. case LSM6DSO_XL_ODR_52Hz:
  353. *val = LSM6DSO_XL_ODR_52Hz;
  354. break;
  355. case LSM6DSO_XL_ODR_104Hz:
  356. *val = LSM6DSO_XL_ODR_104Hz;
  357. break;
  358. case LSM6DSO_XL_ODR_208Hz:
  359. *val = LSM6DSO_XL_ODR_208Hz;
  360. break;
  361. case LSM6DSO_XL_ODR_417Hz:
  362. *val = LSM6DSO_XL_ODR_417Hz;
  363. break;
  364. case LSM6DSO_XL_ODR_833Hz:
  365. *val = LSM6DSO_XL_ODR_833Hz;
  366. break;
  367. case LSM6DSO_XL_ODR_1667Hz:
  368. *val = LSM6DSO_XL_ODR_1667Hz;
  369. break;
  370. case LSM6DSO_XL_ODR_3333Hz:
  371. *val = LSM6DSO_XL_ODR_3333Hz;
  372. break;
  373. case LSM6DSO_XL_ODR_6667Hz:
  374. *val = LSM6DSO_XL_ODR_6667Hz;
  375. break;
  376. case LSM6DSO_XL_ODR_1Hz6:
  377. *val = LSM6DSO_XL_ODR_1Hz6;
  378. break;
  379. default:
  380. *val = LSM6DSO_XL_ODR_OFF;
  381. break;
  382. }
  383. return ret;
  384. }
  385. /**
  386. * @brief Gyroscope UI chain full-scale selection.[set]
  387. *
  388. * @param ctx read / write interface definitions
  389. * @param val change the values of fs_g in reg CTRL2_G
  390. * @retval interface status (MANDATORY: return 0 -> no Error)
  391. *
  392. */
  393. int32_t lsm6dso_gy_full_scale_set(stmdev_ctx_t *ctx,
  394. lsm6dso_fs_g_t val)
  395. {
  396. lsm6dso_ctrl2_g_t reg;
  397. int32_t ret;
  398. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t *)&reg, 1);
  399. if (ret == 0)
  400. {
  401. reg.fs_g = (uint8_t) val;
  402. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t *)&reg, 1);
  403. }
  404. return ret;
  405. }
  406. /**
  407. * @brief Gyroscope UI chain full-scale selection.[get]
  408. *
  409. * @param ctx read / write interface definitions
  410. * @param val Get the values of fs_g in reg CTRL2_G
  411. * @retval interface status (MANDATORY: return 0 -> no Error)
  412. *
  413. */
  414. int32_t lsm6dso_gy_full_scale_get(stmdev_ctx_t *ctx,
  415. lsm6dso_fs_g_t *val)
  416. {
  417. lsm6dso_ctrl2_g_t reg;
  418. int32_t ret;
  419. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t *)&reg, 1);
  420. switch (reg.fs_g)
  421. {
  422. case LSM6DSO_250dps:
  423. *val = LSM6DSO_250dps;
  424. break;
  425. case LSM6DSO_125dps:
  426. *val = LSM6DSO_125dps;
  427. break;
  428. case LSM6DSO_500dps:
  429. *val = LSM6DSO_500dps;
  430. break;
  431. case LSM6DSO_1000dps:
  432. *val = LSM6DSO_1000dps;
  433. break;
  434. case LSM6DSO_2000dps:
  435. *val = LSM6DSO_2000dps;
  436. break;
  437. default:
  438. *val = LSM6DSO_250dps;
  439. break;
  440. }
  441. return ret;
  442. }
  443. /**
  444. * @brief Gyroscope UI data rate selection.[set]
  445. *
  446. * @param ctx read / write interface definitions
  447. * @param val change the values of odr_g in reg CTRL2_G
  448. * @retval interface status (MANDATORY: return 0 -> no Error)
  449. *
  450. */
  451. int32_t lsm6dso_gy_data_rate_set(stmdev_ctx_t *ctx,
  452. lsm6dso_odr_g_t val)
  453. {
  454. lsm6dso_odr_g_t odr_gy = val;
  455. lsm6dso_emb_fsm_enable_t fsm_enable;
  456. lsm6dso_fsm_odr_t fsm_odr;
  457. lsm6dso_ctrl2_g_t reg;
  458. int32_t ret;
  459. /* Check the Finite State Machine data rate constraints */
  460. ret = lsm6dso_fsm_enable_get(ctx, &fsm_enable);
  461. if (ret == 0)
  462. {
  463. if ((fsm_enable.fsm_enable_a.fsm1_en |
  464. fsm_enable.fsm_enable_a.fsm2_en |
  465. fsm_enable.fsm_enable_a.fsm3_en |
  466. fsm_enable.fsm_enable_a.fsm4_en |
  467. fsm_enable.fsm_enable_a.fsm5_en |
  468. fsm_enable.fsm_enable_a.fsm6_en |
  469. fsm_enable.fsm_enable_a.fsm7_en |
  470. fsm_enable.fsm_enable_a.fsm8_en |
  471. fsm_enable.fsm_enable_b.fsm9_en |
  472. fsm_enable.fsm_enable_b.fsm10_en |
  473. fsm_enable.fsm_enable_b.fsm11_en |
  474. fsm_enable.fsm_enable_b.fsm12_en |
  475. fsm_enable.fsm_enable_b.fsm13_en |
  476. fsm_enable.fsm_enable_b.fsm14_en |
  477. fsm_enable.fsm_enable_b.fsm15_en |
  478. fsm_enable.fsm_enable_b.fsm16_en) == PROPERTY_ENABLE)
  479. {
  480. ret = lsm6dso_fsm_data_rate_get(ctx, &fsm_odr);
  481. if (ret == 0)
  482. {
  483. switch (fsm_odr)
  484. {
  485. case LSM6DSO_ODR_FSM_12Hz5:
  486. if (val == LSM6DSO_GY_ODR_OFF)
  487. {
  488. odr_gy = LSM6DSO_GY_ODR_12Hz5;
  489. }
  490. else
  491. {
  492. odr_gy = val;
  493. }
  494. break;
  495. case LSM6DSO_ODR_FSM_26Hz:
  496. if (val == LSM6DSO_GY_ODR_OFF)
  497. {
  498. odr_gy = LSM6DSO_GY_ODR_26Hz;
  499. }
  500. else if (val == LSM6DSO_GY_ODR_12Hz5)
  501. {
  502. odr_gy = LSM6DSO_GY_ODR_26Hz;
  503. }
  504. else
  505. {
  506. odr_gy = val;
  507. }
  508. break;
  509. case LSM6DSO_ODR_FSM_52Hz:
  510. if (val == LSM6DSO_GY_ODR_OFF)
  511. {
  512. odr_gy = LSM6DSO_GY_ODR_52Hz;
  513. }
  514. else if (val == LSM6DSO_GY_ODR_12Hz5)
  515. {
  516. odr_gy = LSM6DSO_GY_ODR_52Hz;
  517. }
  518. else if (val == LSM6DSO_GY_ODR_26Hz)
  519. {
  520. odr_gy = LSM6DSO_GY_ODR_52Hz;
  521. }
  522. else
  523. {
  524. odr_gy = val;
  525. }
  526. break;
  527. case LSM6DSO_ODR_FSM_104Hz:
  528. if (val == LSM6DSO_GY_ODR_OFF)
  529. {
  530. odr_gy = LSM6DSO_GY_ODR_104Hz;
  531. }
  532. else if (val == LSM6DSO_GY_ODR_12Hz5)
  533. {
  534. odr_gy = LSM6DSO_GY_ODR_104Hz;
  535. }
  536. else if (val == LSM6DSO_GY_ODR_26Hz)
  537. {
  538. odr_gy = LSM6DSO_GY_ODR_104Hz;
  539. }
  540. else if (val == LSM6DSO_GY_ODR_52Hz)
  541. {
  542. odr_gy = LSM6DSO_GY_ODR_104Hz;
  543. }
  544. else
  545. {
  546. odr_gy = val;
  547. }
  548. break;
  549. default:
  550. odr_gy = val;
  551. break;
  552. }
  553. }
  554. }
  555. }
  556. if (ret == 0)
  557. {
  558. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t *)&reg, 1);
  559. }
  560. if (ret == 0)
  561. {
  562. reg.odr_g = (uint8_t) odr_gy;
  563. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t *)&reg, 1);
  564. }
  565. return ret;
  566. }
  567. /**
  568. * @brief Gyroscope UI data rate selection.[get]
  569. *
  570. * @param ctx read / write interface definitions
  571. * @param val Get the values of odr_g in reg CTRL2_G
  572. * @retval interface status (MANDATORY: return 0 -> no Error)
  573. *
  574. */
  575. int32_t lsm6dso_gy_data_rate_get(stmdev_ctx_t *ctx,
  576. lsm6dso_odr_g_t *val)
  577. {
  578. lsm6dso_ctrl2_g_t reg;
  579. int32_t ret;
  580. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t *)&reg, 1);
  581. switch (reg.odr_g)
  582. {
  583. case LSM6DSO_GY_ODR_OFF:
  584. *val = LSM6DSO_GY_ODR_OFF;
  585. break;
  586. case LSM6DSO_GY_ODR_12Hz5:
  587. *val = LSM6DSO_GY_ODR_12Hz5;
  588. break;
  589. case LSM6DSO_GY_ODR_26Hz:
  590. *val = LSM6DSO_GY_ODR_26Hz;
  591. break;
  592. case LSM6DSO_GY_ODR_52Hz:
  593. *val = LSM6DSO_GY_ODR_52Hz;
  594. break;
  595. case LSM6DSO_GY_ODR_104Hz:
  596. *val = LSM6DSO_GY_ODR_104Hz;
  597. break;
  598. case LSM6DSO_GY_ODR_208Hz:
  599. *val = LSM6DSO_GY_ODR_208Hz;
  600. break;
  601. case LSM6DSO_GY_ODR_417Hz:
  602. *val = LSM6DSO_GY_ODR_417Hz;
  603. break;
  604. case LSM6DSO_GY_ODR_833Hz:
  605. *val = LSM6DSO_GY_ODR_833Hz;
  606. break;
  607. case LSM6DSO_GY_ODR_1667Hz:
  608. *val = LSM6DSO_GY_ODR_1667Hz;
  609. break;
  610. case LSM6DSO_GY_ODR_3333Hz:
  611. *val = LSM6DSO_GY_ODR_3333Hz;
  612. break;
  613. case LSM6DSO_GY_ODR_6667Hz:
  614. *val = LSM6DSO_GY_ODR_6667Hz;
  615. break;
  616. default:
  617. *val = LSM6DSO_GY_ODR_OFF;
  618. break;
  619. }
  620. return ret;
  621. }
  622. /**
  623. * @brief Block data update.[set]
  624. *
  625. * @param ctx read / write interface definitions
  626. * @param val change the values of bdu in reg CTRL3_C
  627. * @retval interface status (MANDATORY: return 0 -> no Error)
  628. *
  629. */
  630. int32_t lsm6dso_block_data_update_set(stmdev_ctx_t *ctx, uint8_t val)
  631. {
  632. lsm6dso_ctrl3_c_t reg;
  633. int32_t ret;
  634. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  635. if (ret == 0)
  636. {
  637. reg.bdu = val;
  638. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  639. }
  640. return ret;
  641. }
  642. /**
  643. * @brief Block data update.[get]
  644. *
  645. * @param ctx read / write interface definitions
  646. * @param val change the values of bdu in reg CTRL3_C
  647. * @retval interface status (MANDATORY: return 0 -> no Error)
  648. *
  649. */
  650. int32_t lsm6dso_block_data_update_get(stmdev_ctx_t *ctx, uint8_t *val)
  651. {
  652. lsm6dso_ctrl3_c_t reg;
  653. int32_t ret;
  654. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  655. *val = reg.bdu;
  656. return ret;
  657. }
  658. /**
  659. * @brief Weight of XL user offset bits of registers X_OFS_USR (73h),
  660. * Y_OFS_USR (74h), Z_OFS_USR (75h).[set]
  661. *
  662. * @param ctx read / write interface definitions
  663. * @param val change the values of usr_off_w in reg CTRL6_C
  664. * @retval interface status (MANDATORY: return 0 -> no Error)
  665. *
  666. */
  667. int32_t lsm6dso_xl_offset_weight_set(stmdev_ctx_t *ctx,
  668. lsm6dso_usr_off_w_t val)
  669. {
  670. lsm6dso_ctrl6_c_t reg;
  671. int32_t ret;
  672. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  673. if (ret == 0)
  674. {
  675. reg.usr_off_w = (uint8_t)val;
  676. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  677. }
  678. return ret;
  679. }
  680. /**
  681. * @brief Weight of XL user offset bits of registers X_OFS_USR (73h),
  682. * Y_OFS_USR (74h), Z_OFS_USR (75h).[get]
  683. *
  684. * @param ctx read / write interface definitions
  685. * @param val Get the values of usr_off_w in reg CTRL6_C
  686. * @retval interface status (MANDATORY: return 0 -> no Error)
  687. *
  688. */
  689. int32_t lsm6dso_xl_offset_weight_get(stmdev_ctx_t *ctx,
  690. lsm6dso_usr_off_w_t *val)
  691. {
  692. lsm6dso_ctrl6_c_t reg;
  693. int32_t ret;
  694. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  695. switch (reg.usr_off_w)
  696. {
  697. case LSM6DSO_LSb_1mg:
  698. *val = LSM6DSO_LSb_1mg;
  699. break;
  700. case LSM6DSO_LSb_16mg:
  701. *val = LSM6DSO_LSb_16mg;
  702. break;
  703. default:
  704. *val = LSM6DSO_LSb_1mg;
  705. break;
  706. }
  707. return ret;
  708. }
  709. /**
  710. * @brief Accelerometer power mode.[set]
  711. *
  712. * @param ctx read / write interface definitions
  713. * @param val change the values of xl_hm_mode in
  714. * reg CTRL6_C
  715. * @retval interface status (MANDATORY: return 0 -> no Error)
  716. *
  717. */
  718. int32_t lsm6dso_xl_power_mode_set(stmdev_ctx_t *ctx,
  719. lsm6dso_xl_hm_mode_t val)
  720. {
  721. lsm6dso_ctrl5_c_t ctrl5_c;
  722. lsm6dso_ctrl6_c_t ctrl6_c;
  723. int32_t ret;
  724. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *) &ctrl5_c, 1);
  725. if (ret == 0)
  726. {
  727. ctrl5_c.xl_ulp_en = ((uint8_t)val & 0x02U) >> 1;
  728. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *) &ctrl5_c, 1);
  729. }
  730. if (ret == 0)
  731. {
  732. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *) &ctrl6_c, 1);
  733. }
  734. if (ret == 0)
  735. {
  736. ctrl6_c.xl_hm_mode = (uint8_t)val & 0x01U;
  737. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *) &ctrl6_c, 1);
  738. }
  739. return ret;
  740. }
  741. /**
  742. * @brief Accelerometer power mode.[get]
  743. *
  744. * @param ctx read / write interface definitions
  745. * @param val Get the values of xl_hm_mode in reg CTRL6_C
  746. * @retval interface status (MANDATORY: return 0 -> no Error)
  747. *
  748. */
  749. int32_t lsm6dso_xl_power_mode_get(stmdev_ctx_t *ctx,
  750. lsm6dso_xl_hm_mode_t *val)
  751. {
  752. lsm6dso_ctrl5_c_t ctrl5_c;
  753. lsm6dso_ctrl6_c_t ctrl6_c;
  754. int32_t ret;
  755. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *) &ctrl5_c, 1);
  756. if (ret == 0)
  757. {
  758. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *) &ctrl6_c, 1);
  759. switch ((ctrl5_c.xl_ulp_en << 1) | ctrl6_c.xl_hm_mode)
  760. {
  761. case LSM6DSO_HIGH_PERFORMANCE_MD:
  762. *val = LSM6DSO_HIGH_PERFORMANCE_MD;
  763. break;
  764. case LSM6DSO_LOW_NORMAL_POWER_MD:
  765. *val = LSM6DSO_LOW_NORMAL_POWER_MD;
  766. break;
  767. case LSM6DSO_ULTRA_LOW_POWER_MD:
  768. *val = LSM6DSO_ULTRA_LOW_POWER_MD;
  769. break;
  770. default:
  771. *val = LSM6DSO_HIGH_PERFORMANCE_MD;
  772. break;
  773. }
  774. }
  775. return ret;
  776. }
  777. /**
  778. * @brief Operating mode for gyroscope.[set]
  779. *
  780. * @param ctx read / write interface definitions
  781. * @param val change the values of g_hm_mode in reg CTRL7_G
  782. * @retval interface status (MANDATORY: return 0 -> no Error)
  783. *
  784. */
  785. int32_t lsm6dso_gy_power_mode_set(stmdev_ctx_t *ctx,
  786. lsm6dso_g_hm_mode_t val)
  787. {
  788. lsm6dso_ctrl7_g_t reg;
  789. int32_t ret;
  790. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  791. if (ret == 0)
  792. {
  793. reg.g_hm_mode = (uint8_t)val;
  794. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  795. }
  796. return ret;
  797. }
  798. /**
  799. * @brief Operating mode for gyroscope.[get]
  800. *
  801. * @param ctx read / write interface definitions
  802. * @param val Get the values of g_hm_mode in reg CTRL7_G
  803. * @retval interface status (MANDATORY: return 0 -> no Error)
  804. *
  805. */
  806. int32_t lsm6dso_gy_power_mode_get(stmdev_ctx_t *ctx,
  807. lsm6dso_g_hm_mode_t *val)
  808. {
  809. lsm6dso_ctrl7_g_t reg;
  810. int32_t ret;
  811. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  812. switch (reg.g_hm_mode)
  813. {
  814. case LSM6DSO_GY_HIGH_PERFORMANCE:
  815. *val = LSM6DSO_GY_HIGH_PERFORMANCE;
  816. break;
  817. case LSM6DSO_GY_NORMAL:
  818. *val = LSM6DSO_GY_NORMAL;
  819. break;
  820. default:
  821. *val = LSM6DSO_GY_HIGH_PERFORMANCE;
  822. break;
  823. }
  824. return ret;
  825. }
  826. /**
  827. * @brief The STATUS_REG register is read by the primary interface.[get]
  828. *
  829. * @param ctx read / write interface definitions
  830. * @param val register STATUS_REG
  831. * @retval interface status (MANDATORY: return 0 -> no Error)
  832. *
  833. */
  834. int32_t lsm6dso_status_reg_get(stmdev_ctx_t *ctx,
  835. lsm6dso_status_reg_t *val)
  836. {
  837. int32_t ret;
  838. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t *) val, 1);
  839. return ret;
  840. }
  841. /**
  842. * @brief Accelerometer new data available.[get]
  843. *
  844. * @param ctx read / write interface definitions
  845. * @param val change the values of xlda in reg STATUS_REG
  846. * @retval interface status (MANDATORY: return 0 -> no Error)
  847. *
  848. */
  849. int32_t lsm6dso_xl_flag_data_ready_get(stmdev_ctx_t *ctx,
  850. uint8_t *val)
  851. {
  852. lsm6dso_status_reg_t reg;
  853. int32_t ret;
  854. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t *)&reg, 1);
  855. *val = reg.xlda;
  856. return ret;
  857. }
  858. /**
  859. * @brief Gyroscope new data available.[get]
  860. *
  861. * @param ctx read / write interface definitions
  862. * @param val change the values of gda in reg STATUS_REG
  863. * @retval interface status (MANDATORY: return 0 -> no Error)
  864. *
  865. */
  866. int32_t lsm6dso_gy_flag_data_ready_get(stmdev_ctx_t *ctx,
  867. uint8_t *val)
  868. {
  869. lsm6dso_status_reg_t reg;
  870. int32_t ret;
  871. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t *)&reg, 1);
  872. *val = reg.gda;
  873. return ret;
  874. }
  875. /**
  876. * @brief Temperature new data available.[get]
  877. *
  878. * @param ctx read / write interface definitions
  879. * @param val change the values of tda in reg STATUS_REG
  880. * @retval interface status (MANDATORY: return 0 -> no Error)
  881. *
  882. */
  883. int32_t lsm6dso_temp_flag_data_ready_get(stmdev_ctx_t *ctx,
  884. uint8_t *val)
  885. {
  886. lsm6dso_status_reg_t reg;
  887. int32_t ret;
  888. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t *)&reg, 1);
  889. *val = reg.tda;
  890. return ret;
  891. }
  892. /**
  893. * @brief Accelerometer X-axis user offset correction expressed in
  894. * two's complement, weight depends on USR_OFF_W in CTRL6_C (15h).
  895. * The value must be in the range [-127 127].[set]
  896. *
  897. * @param ctx read / write interface definitions
  898. * @param buff buffer that contains data to write
  899. * @retval interface status (MANDATORY: return 0 -> no Error)
  900. *
  901. */
  902. int32_t lsm6dso_xl_usr_offset_x_set(stmdev_ctx_t *ctx, uint8_t *buff)
  903. {
  904. int32_t ret;
  905. ret = lsm6dso_write_reg(ctx, LSM6DSO_X_OFS_USR, buff, 1);
  906. return ret;
  907. }
  908. /**
  909. * @brief Accelerometer X-axis user offset correction expressed in two's
  910. * complement, weight depends on USR_OFF_W in CTRL6_C (15h).
  911. * The value must be in the range [-127 127].[get]
  912. *
  913. * @param ctx read / write interface definitions
  914. * @param buff buffer that stores data read
  915. * @retval interface status (MANDATORY: return 0 -> no Error)
  916. *
  917. */
  918. int32_t lsm6dso_xl_usr_offset_x_get(stmdev_ctx_t *ctx, uint8_t *buff)
  919. {
  920. int32_t ret;
  921. ret = lsm6dso_read_reg(ctx, LSM6DSO_X_OFS_USR, buff, 1);
  922. return ret;
  923. }
  924. /**
  925. * @brief Accelerometer Y-axis user offset correction expressed in two's
  926. * complement, weight depends on USR_OFF_W in CTRL6_C (15h).
  927. * The value must be in the range [-127 127].[set]
  928. *
  929. * @param ctx read / write interface definitions
  930. * @param buff buffer that contains data to write
  931. * @retval interface status (MANDATORY: return 0 -> no Error)
  932. *
  933. */
  934. int32_t lsm6dso_xl_usr_offset_y_set(stmdev_ctx_t *ctx, uint8_t *buff)
  935. {
  936. int32_t ret;
  937. ret = lsm6dso_write_reg(ctx, LSM6DSO_Y_OFS_USR, buff, 1);
  938. return ret;
  939. }
  940. /**
  941. * @brief Accelerometer Y-axis user offset correction expressed in two's
  942. * complement, weight depends on USR_OFF_W in CTRL6_C (15h).
  943. * The value must be in the range [-127 127].[get]
  944. *
  945. * @param ctx read / write interface definitions
  946. * @param buff buffer that stores data read
  947. * @retval interface status (MANDATORY: return 0 -> no Error)
  948. *
  949. */
  950. int32_t lsm6dso_xl_usr_offset_y_get(stmdev_ctx_t *ctx, uint8_t *buff)
  951. {
  952. int32_t ret;
  953. ret = lsm6dso_read_reg(ctx, LSM6DSO_Y_OFS_USR, buff, 1);
  954. return ret;
  955. }
  956. /**
  957. * @brief Accelerometer Z-axis user offset correction expressed in two's
  958. * complement, weight depends on USR_OFF_W in CTRL6_C (15h).
  959. * The value must be in the range [-127 127].[set]
  960. *
  961. * @param ctx read / write interface definitions
  962. * @param buff buffer that contains data to write
  963. * @retval interface status (MANDATORY: return 0 -> no Error)
  964. *
  965. */
  966. int32_t lsm6dso_xl_usr_offset_z_set(stmdev_ctx_t *ctx, uint8_t *buff)
  967. {
  968. int32_t ret;
  969. ret = lsm6dso_write_reg(ctx, LSM6DSO_Z_OFS_USR, buff, 1);
  970. return ret;
  971. }
  972. /**
  973. * @brief Accelerometer Z-axis user offset correction expressed in two's
  974. * complement, weight depends on USR_OFF_W in CTRL6_C (15h).
  975. * The value must be in the range [-127 127].[get]
  976. *
  977. * @param ctx read / write interface definitions
  978. * @param buff buffer that stores data read
  979. * @retval interface status (MANDATORY: return 0 -> no Error)
  980. *
  981. */
  982. int32_t lsm6dso_xl_usr_offset_z_get(stmdev_ctx_t *ctx, uint8_t *buff)
  983. {
  984. int32_t ret;
  985. ret = lsm6dso_read_reg(ctx, LSM6DSO_Z_OFS_USR, buff, 1);
  986. return ret;
  987. }
  988. /**
  989. * @brief Enables user offset on out.[set]
  990. *
  991. * @param ctx read / write interface definitions
  992. * @param val change the values of usr_off_on_out in reg CTRL7_G
  993. * @retval interface status (MANDATORY: return 0 -> no Error)
  994. *
  995. */
  996. int32_t lsm6dso_xl_usr_offset_set(stmdev_ctx_t *ctx, uint8_t val)
  997. {
  998. lsm6dso_ctrl7_g_t reg;
  999. int32_t ret;
  1000. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  1001. if (ret == 0)
  1002. {
  1003. reg.usr_off_on_out = val;
  1004. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  1005. }
  1006. return ret;
  1007. }
  1008. /**
  1009. * @brief User offset on out flag.[get]
  1010. *
  1011. * @param ctx read / write interface definitions
  1012. * @param val values of usr_off_on_out in reg CTRL7_G
  1013. * @retval interface status (MANDATORY: return 0 -> no Error)
  1014. *
  1015. */
  1016. int32_t lsm6dso_xl_usr_offset_get(stmdev_ctx_t *ctx, uint8_t *val)
  1017. {
  1018. lsm6dso_ctrl7_g_t reg;
  1019. int32_t ret;
  1020. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  1021. *val = reg.usr_off_on_out;
  1022. return ret;
  1023. }
  1024. /**
  1025. * @}
  1026. *
  1027. */
  1028. /**
  1029. * @defgroup LSM6DSO_Timestamp
  1030. * @brief This section groups all the functions that manage the
  1031. * timestamp generation.
  1032. * @{
  1033. *
  1034. */
  1035. /**
  1036. * @brief Reset timestamp counter.[set]
  1037. *
  1038. * @param ctx Read / write interface definitions.(ptr)
  1039. * @retval Interface status (MANDATORY: return 0 -> no Error)
  1040. *
  1041. */
  1042. int32_t lsm6dso_timestamp_rst(stmdev_ctx_t *ctx)
  1043. {
  1044. uint8_t rst_val = 0xAA;
  1045. return lsm6dso_write_reg(ctx, LSM6DSO_TIMESTAMP2, &rst_val, 1);
  1046. }
  1047. /**
  1048. * @brief Enables timestamp counter.[set]
  1049. *
  1050. * @param ctx read / write interface definitions
  1051. * @param val change the values of timestamp_en in reg CTRL10_C
  1052. * @retval interface status (MANDATORY: return 0 -> no Error)
  1053. *
  1054. */
  1055. int32_t lsm6dso_timestamp_set(stmdev_ctx_t *ctx, uint8_t val)
  1056. {
  1057. lsm6dso_ctrl10_c_t reg;
  1058. int32_t ret;
  1059. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL10_C, (uint8_t *)&reg, 1);
  1060. if (ret == 0)
  1061. {
  1062. reg.timestamp_en = val;
  1063. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL10_C, (uint8_t *)&reg, 1);
  1064. }
  1065. return ret;
  1066. }
  1067. /**
  1068. * @brief Enables timestamp counter.[get]
  1069. *
  1070. * @param ctx read / write interface definitions
  1071. * @param val change the values of timestamp_en in reg CTRL10_C
  1072. * @retval interface status (MANDATORY: return 0 -> no Error)
  1073. *
  1074. */
  1075. int32_t lsm6dso_timestamp_get(stmdev_ctx_t *ctx, uint8_t *val)
  1076. {
  1077. lsm6dso_ctrl10_c_t reg;
  1078. int32_t ret;
  1079. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL10_C, (uint8_t *)&reg, 1);
  1080. *val = reg.timestamp_en;
  1081. return ret;
  1082. }
  1083. /**
  1084. * @brief Timestamp first data output register (r).
  1085. * The value is expressed as a 32-bit word and the bit
  1086. * resolution is 25 us.[get]
  1087. *
  1088. * @param ctx read / write interface definitions
  1089. * @param buff buffer that stores data read
  1090. * @retval interface status (MANDATORY: return 0 -> no Error)
  1091. *
  1092. */
  1093. int32_t lsm6dso_timestamp_raw_get(stmdev_ctx_t *ctx, uint32_t *val)
  1094. {
  1095. uint8_t buff[4];
  1096. int32_t ret;
  1097. ret = lsm6dso_read_reg(ctx, LSM6DSO_TIMESTAMP0, buff, 4);
  1098. *val = buff[3];
  1099. *val = (*val * 256U) + buff[2];
  1100. *val = (*val * 256U) + buff[1];
  1101. *val = (*val * 256U) + buff[0];
  1102. return ret;
  1103. }
  1104. /**
  1105. * @}
  1106. *
  1107. */
  1108. /**
  1109. * @defgroup LSM6DSO_Data output
  1110. * @brief This section groups all the data output functions.
  1111. * @{
  1112. *
  1113. */
  1114. /**
  1115. * @brief Circular burst-mode (rounding) read of the output
  1116. * registers.[set]
  1117. *
  1118. * @param ctx read / write interface definitions
  1119. * @param val change the values of rounding in reg CTRL5_C
  1120. * @retval interface status (MANDATORY: return 0 -> no Error)
  1121. *
  1122. */
  1123. int32_t lsm6dso_rounding_mode_set(stmdev_ctx_t *ctx,
  1124. lsm6dso_rounding_t val)
  1125. {
  1126. lsm6dso_ctrl5_c_t reg;
  1127. int32_t ret;
  1128. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1129. if (ret == 0)
  1130. {
  1131. reg.rounding = (uint8_t)val;
  1132. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1133. }
  1134. return ret;
  1135. }
  1136. /**
  1137. * @brief Gyroscope UI chain full-scale selection.[get]
  1138. *
  1139. * @param ctx read / write interface definitions
  1140. * @param val Get the values of rounding in reg CTRL5_C
  1141. * @retval interface status (MANDATORY: return 0 -> no Error)
  1142. *
  1143. */
  1144. int32_t lsm6dso_rounding_mode_get(stmdev_ctx_t *ctx,
  1145. lsm6dso_rounding_t *val)
  1146. {
  1147. lsm6dso_ctrl5_c_t reg;
  1148. int32_t ret;
  1149. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1150. switch (reg.rounding)
  1151. {
  1152. case LSM6DSO_NO_ROUND:
  1153. *val = LSM6DSO_NO_ROUND;
  1154. break;
  1155. case LSM6DSO_ROUND_XL:
  1156. *val = LSM6DSO_ROUND_XL;
  1157. break;
  1158. case LSM6DSO_ROUND_GY:
  1159. *val = LSM6DSO_ROUND_GY;
  1160. break;
  1161. case LSM6DSO_ROUND_GY_XL:
  1162. *val = LSM6DSO_ROUND_GY_XL;
  1163. break;
  1164. default:
  1165. *val = LSM6DSO_NO_ROUND;
  1166. break;
  1167. }
  1168. return ret;
  1169. }
  1170. /**
  1171. * @brief Temperature data output register (r).
  1172. * L and H registers together express a 16-bit word in two's
  1173. * complement.[get]
  1174. *
  1175. * @param ctx read / write interface definitions
  1176. * @param buff buffer that stores data read
  1177. * @retval interface status (MANDATORY: return 0 -> no Error)
  1178. *
  1179. */
  1180. int32_t lsm6dso_temperature_raw_get(stmdev_ctx_t *ctx, int16_t *val)
  1181. {
  1182. uint8_t buff[2];
  1183. int32_t ret;
  1184. ret = lsm6dso_read_reg(ctx, LSM6DSO_OUT_TEMP_L, buff, 2);
  1185. val[0] = (int16_t)buff[1];
  1186. val[0] = (val[0] * 256) + (int16_t)buff[0];
  1187. return ret;
  1188. }
  1189. /**
  1190. * @brief Angular rate sensor. The value is expressed as a 16-bit
  1191. * word in two's complement.[get]
  1192. *
  1193. * @param ctx read / write interface definitions
  1194. * @param buff buffer that stores data read
  1195. * @retval interface status (MANDATORY: return 0 -> no Error)
  1196. *
  1197. */
  1198. int32_t lsm6dso_angular_rate_raw_get(stmdev_ctx_t *ctx, int16_t *val)
  1199. {
  1200. uint8_t buff[6];
  1201. int32_t ret;
  1202. ret = lsm6dso_read_reg(ctx, LSM6DSO_OUTX_L_G, buff, 6);
  1203. val[0] = (int16_t)buff[1];
  1204. val[0] = (val[0] * 256) + (int16_t)buff[0];
  1205. val[1] = (int16_t)buff[3];
  1206. val[1] = (val[1] * 256) + (int16_t)buff[2];
  1207. val[2] = (int16_t)buff[5];
  1208. val[2] = (val[2] * 256) + (int16_t)buff[4];
  1209. return ret;
  1210. }
  1211. /**
  1212. * @brief Linear acceleration output register.
  1213. * The value is expressed as a 16-bit word in two's complement.[get]
  1214. *
  1215. * @param ctx read / write interface definitions
  1216. * @param buff buffer that stores data read
  1217. * @retval interface status (MANDATORY: return 0 -> no Error)
  1218. *
  1219. */
  1220. int32_t lsm6dso_acceleration_raw_get(stmdev_ctx_t *ctx, int16_t *val)
  1221. {
  1222. uint8_t buff[6];
  1223. int32_t ret;
  1224. ret = lsm6dso_read_reg(ctx, LSM6DSO_OUTX_L_A, buff, 6);
  1225. val[0] = (int16_t)buff[1];
  1226. val[0] = (val[0] * 256) + (int16_t)buff[0];
  1227. val[1] = (int16_t)buff[3];
  1228. val[1] = (val[1] * 256) + (int16_t)buff[2];
  1229. val[2] = (int16_t)buff[5];
  1230. val[2] = (val[2] * 256) + (int16_t)buff[4];
  1231. return ret;
  1232. }
  1233. /**
  1234. * @brief FIFO data output [get]
  1235. *
  1236. * @param ctx read / write interface definitions
  1237. * @param buff buffer that stores data read
  1238. * @retval interface status (MANDATORY: return 0 -> no Error)
  1239. *
  1240. */
  1241. int32_t lsm6dso_fifo_out_raw_get(stmdev_ctx_t *ctx, uint8_t *buff)
  1242. {
  1243. int32_t ret;
  1244. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_DATA_OUT_X_L, buff, 6);
  1245. return ret;
  1246. }
  1247. /**
  1248. * @brief Step counter output register.[get]
  1249. *
  1250. * @param ctx read / write interface definitions
  1251. * @param buff buffer that stores data read
  1252. * @retval interface status (MANDATORY: return 0 -> no Error)
  1253. *
  1254. */
  1255. int32_t lsm6dso_number_of_steps_get(stmdev_ctx_t *ctx, uint16_t *val)
  1256. {
  1257. uint8_t buff[2];
  1258. int32_t ret;
  1259. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  1260. if (ret == 0)
  1261. {
  1262. ret = lsm6dso_read_reg(ctx, LSM6DSO_STEP_COUNTER_L, buff, 2);
  1263. }
  1264. if (ret == 0)
  1265. {
  1266. *val = buff[1];
  1267. *val = (*val * 256U) + buff[0];
  1268. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  1269. }
  1270. return ret;
  1271. }
  1272. /**
  1273. * @brief Reset step counter register.[get]
  1274. *
  1275. * @param ctx read / write interface definitions
  1276. * @retval interface status (MANDATORY: return 0 -> no Error)
  1277. *
  1278. */
  1279. int32_t lsm6dso_steps_reset(stmdev_ctx_t *ctx)
  1280. {
  1281. lsm6dso_emb_func_src_t reg;
  1282. int32_t ret;
  1283. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  1284. if (ret == 0)
  1285. {
  1286. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_SRC, (uint8_t *)&reg, 1);
  1287. }
  1288. if (ret == 0)
  1289. {
  1290. reg.pedo_rst_step = PROPERTY_ENABLE;
  1291. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_SRC, (uint8_t *)&reg, 1);
  1292. }
  1293. if (ret == 0)
  1294. {
  1295. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  1296. }
  1297. return ret;
  1298. }
  1299. /**
  1300. * @}
  1301. *
  1302. */
  1303. /**
  1304. * @defgroup LSM6DSO_common
  1305. * @brief This section groups common useful functions.
  1306. * @{
  1307. *
  1308. */
  1309. /**
  1310. * @brief Difference in percentage of the effective ODR(and timestamp rate)
  1311. * with respect to the typical.
  1312. * Step: 0.15%. 8-bit format, 2's complement.[set]
  1313. *
  1314. * @param ctx read / write interface definitions
  1315. * @param val change the values of freq_fine in reg
  1316. * INTERNAL_FREQ_FINE
  1317. * @retval interface status (MANDATORY: return 0 -> no Error)
  1318. *
  1319. */
  1320. int32_t lsm6dso_odr_cal_reg_set(stmdev_ctx_t *ctx, uint8_t val)
  1321. {
  1322. lsm6dso_internal_freq_fine_t reg;
  1323. int32_t ret;
  1324. ret = lsm6dso_read_reg(ctx, LSM6DSO_INTERNAL_FREQ_FINE,
  1325. (uint8_t *)&reg, 1);
  1326. if (ret == 0)
  1327. {
  1328. reg.freq_fine = val;
  1329. ret = lsm6dso_write_reg(ctx, LSM6DSO_INTERNAL_FREQ_FINE,
  1330. (uint8_t *)&reg, 1);
  1331. }
  1332. return ret;
  1333. }
  1334. /**
  1335. * @brief Difference in percentage of the effective ODR(and timestamp rate)
  1336. * with respect to the typical.
  1337. * Step: 0.15%. 8-bit format, 2's complement.[get]
  1338. *
  1339. * @param ctx read / write interface definitions
  1340. * @param val change the values of freq_fine in reg INTERNAL_FREQ_FINE
  1341. * @retval interface status (MANDATORY: return 0 -> no Error)
  1342. *
  1343. */
  1344. int32_t lsm6dso_odr_cal_reg_get(stmdev_ctx_t *ctx, uint8_t *val)
  1345. {
  1346. lsm6dso_internal_freq_fine_t reg;
  1347. int32_t ret;
  1348. ret = lsm6dso_read_reg(ctx, LSM6DSO_INTERNAL_FREQ_FINE,
  1349. (uint8_t *)&reg, 1);
  1350. *val = reg.freq_fine;
  1351. return ret;
  1352. }
  1353. /**
  1354. * @brief Enable access to the embedded functions/sensor
  1355. * hub configuration registers.[set]
  1356. *
  1357. * @param ctx read / write interface definitions
  1358. * @param val change the values of reg_access in
  1359. * reg FUNC_CFG_ACCESS
  1360. * @retval interface status (MANDATORY: return 0 -> no Error)
  1361. *
  1362. */
  1363. int32_t lsm6dso_mem_bank_set(stmdev_ctx_t *ctx,
  1364. lsm6dso_reg_access_t val)
  1365. {
  1366. lsm6dso_func_cfg_access_t reg;
  1367. int32_t ret;
  1368. ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS, (uint8_t *)&reg, 1);
  1369. if (ret == 0)
  1370. {
  1371. reg.reg_access = (uint8_t)val;
  1372. ret = lsm6dso_write_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS, (uint8_t *)&reg, 1);
  1373. }
  1374. return ret;
  1375. }
  1376. /**
  1377. * @brief Enable access to the embedded functions/sensor
  1378. * hub configuration registers.[get]
  1379. *
  1380. * @param ctx read / write interface definitions
  1381. * @param val Get the values of reg_access in
  1382. * reg FUNC_CFG_ACCESS
  1383. * @retval interface status (MANDATORY: return 0 -> no Error)
  1384. *
  1385. */
  1386. int32_t lsm6dso_mem_bank_get(stmdev_ctx_t *ctx,
  1387. lsm6dso_reg_access_t *val)
  1388. {
  1389. lsm6dso_func_cfg_access_t reg;
  1390. int32_t ret;
  1391. ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS, (uint8_t *)&reg, 1);
  1392. switch (reg.reg_access)
  1393. {
  1394. case LSM6DSO_USER_BANK:
  1395. *val = LSM6DSO_USER_BANK;
  1396. break;
  1397. case LSM6DSO_SENSOR_HUB_BANK:
  1398. *val = LSM6DSO_SENSOR_HUB_BANK;
  1399. break;
  1400. case LSM6DSO_EMBEDDED_FUNC_BANK:
  1401. *val = LSM6DSO_EMBEDDED_FUNC_BANK;
  1402. break;
  1403. default:
  1404. *val = LSM6DSO_USER_BANK;
  1405. break;
  1406. }
  1407. return ret;
  1408. }
  1409. /**
  1410. * @brief Write a line(byte) in a page.[set]
  1411. *
  1412. * @param ctx read / write interface definitions
  1413. * @param uint8_t address: page line address
  1414. * @param val value to write
  1415. * @retval interface status (MANDATORY: return 0 -> no Error)
  1416. *
  1417. */
  1418. int32_t lsm6dso_ln_pg_write_byte(stmdev_ctx_t *ctx, uint16_t address,
  1419. uint8_t *val)
  1420. {
  1421. lsm6dso_page_rw_t page_rw;
  1422. lsm6dso_page_sel_t page_sel;
  1423. lsm6dso_page_address_t page_address;
  1424. int32_t ret;
  1425. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  1426. if (ret == 0)
  1427. {
  1428. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1429. }
  1430. if (ret == 0)
  1431. {
  1432. page_rw.page_rw = 0x02; /* page_write enable */
  1433. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1434. }
  1435. if (ret == 0)
  1436. {
  1437. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1438. }
  1439. if (ret == 0)
  1440. {
  1441. page_sel.page_sel = ((uint8_t)(address >> 8) & 0x0FU);
  1442. page_sel.not_used_01 = 1;
  1443. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1444. }
  1445. if (ret == 0)
  1446. {
  1447. page_address.page_addr = (uint8_t)address & 0xFFU;
  1448. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
  1449. (uint8_t *)&page_address, 1);
  1450. }
  1451. if (ret == 0)
  1452. {
  1453. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_VALUE, val, 1);
  1454. }
  1455. if (ret == 0)
  1456. {
  1457. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1458. }
  1459. if (ret == 0)
  1460. {
  1461. page_rw.page_rw = 0x00; /* page_write disable */
  1462. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1463. }
  1464. if (ret == 0)
  1465. {
  1466. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  1467. }
  1468. return ret;
  1469. }
  1470. /**
  1471. * @brief Write buffer in a page.[set]
  1472. *
  1473. * @param ctx read / write interface definitions
  1474. * @param uint8_t address: page line address
  1475. * @param uint8_t *buf: buffer to write
  1476. * @param uint8_t len: buffer len
  1477. * @retval interface status (MANDATORY: return 0 -> no Error)
  1478. *
  1479. */
  1480. int32_t lsm6dso_ln_pg_write(stmdev_ctx_t *ctx, uint16_t address,
  1481. uint8_t *buf, uint8_t len)
  1482. {
  1483. lsm6dso_page_rw_t page_rw;
  1484. lsm6dso_page_sel_t page_sel;
  1485. lsm6dso_page_address_t page_address;
  1486. uint16_t addr_pointed;
  1487. int32_t ret;
  1488. uint8_t i ;
  1489. addr_pointed = address;
  1490. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  1491. if (ret == 0)
  1492. {
  1493. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1494. }
  1495. if (ret == 0)
  1496. {
  1497. page_rw.page_rw = 0x02; /* page_write enable*/
  1498. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1499. }
  1500. if (ret == 0)
  1501. {
  1502. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1503. }
  1504. if (ret == 0)
  1505. {
  1506. page_sel.page_sel = ((uint8_t)(addr_pointed >> 8) & 0x0FU);
  1507. page_sel.not_used_01 = 1;
  1508. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1509. }
  1510. if (ret == 0)
  1511. {
  1512. page_address.page_addr = (uint8_t)(addr_pointed & 0x00FFU);
  1513. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
  1514. (uint8_t *)&page_address, 1);
  1515. }
  1516. if (ret == 0)
  1517. {
  1518. for (i = 0; ((i < len) && (ret == 0)); i++)
  1519. {
  1520. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_VALUE, &buf[i], 1);
  1521. addr_pointed++;
  1522. /* Check if page wrap */
  1523. if (((addr_pointed % 0x0100U) == 0x00U) && (ret == 0))
  1524. {
  1525. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *)&page_sel, 1);
  1526. if (ret == 0)
  1527. {
  1528. page_sel.page_sel = ((uint8_t)(addr_pointed >> 8) & 0x0FU);
  1529. page_sel.not_used_01 = 1;
  1530. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL,
  1531. (uint8_t *)&page_sel, 1);
  1532. }
  1533. }
  1534. }
  1535. page_sel.page_sel = 0;
  1536. page_sel.not_used_01 = 1;
  1537. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1538. }
  1539. if (ret == 0)
  1540. {
  1541. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1542. }
  1543. if (ret == 0)
  1544. {
  1545. page_rw.page_rw = 0x00; /* page_write disable */
  1546. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1547. }
  1548. if (ret == 0)
  1549. {
  1550. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  1551. }
  1552. return ret;
  1553. }
  1554. /**
  1555. * @brief Read a line(byte) in a page.[get]
  1556. *
  1557. * @param ctx read / write interface definitions
  1558. * @param uint8_t address: page line address
  1559. * @param val read value
  1560. * @retval interface status (MANDATORY: return 0 -> no Error)
  1561. *
  1562. */
  1563. int32_t lsm6dso_ln_pg_read_byte(stmdev_ctx_t *ctx, uint16_t address,
  1564. uint8_t *val)
  1565. {
  1566. lsm6dso_page_rw_t page_rw;
  1567. lsm6dso_page_sel_t page_sel;
  1568. lsm6dso_page_address_t page_address;
  1569. int32_t ret;
  1570. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  1571. if (ret == 0)
  1572. {
  1573. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1574. }
  1575. if (ret == 0)
  1576. {
  1577. page_rw.page_rw = 0x01; /* page_read enable*/
  1578. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1579. }
  1580. if (ret == 0)
  1581. {
  1582. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1583. }
  1584. if (ret == 0)
  1585. {
  1586. page_sel.page_sel = ((uint8_t)(address >> 8) & 0x0FU);
  1587. page_sel.not_used_01 = 1;
  1588. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t *) &page_sel, 1);
  1589. }
  1590. if (ret == 0)
  1591. {
  1592. page_address.page_addr = (uint8_t)address & 0x00FFU;
  1593. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
  1594. (uint8_t *)&page_address, 1);
  1595. }
  1596. if (ret == 0)
  1597. {
  1598. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_VALUE, val, 1);
  1599. }
  1600. if (ret == 0)
  1601. {
  1602. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1603. }
  1604. if (ret == 0)
  1605. {
  1606. page_rw.page_rw = 0x00; /* page_read disable */
  1607. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  1608. }
  1609. if (ret == 0)
  1610. {
  1611. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  1612. }
  1613. return ret;
  1614. }
  1615. /**
  1616. * @brief Data-ready pulsed / letched mode.[set]
  1617. *
  1618. * @param ctx read / write interface definitions
  1619. * @param val change the values of
  1620. * dataready_pulsed in
  1621. * reg COUNTER_BDR_REG1
  1622. * @retval interface status (MANDATORY: return 0 -> no Error)
  1623. *
  1624. */
  1625. int32_t lsm6dso_data_ready_mode_set(stmdev_ctx_t *ctx,
  1626. lsm6dso_dataready_pulsed_t val)
  1627. {
  1628. lsm6dso_counter_bdr_reg1_t reg;
  1629. int32_t ret;
  1630. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t *)&reg, 1);
  1631. if (ret == 0)
  1632. {
  1633. reg.dataready_pulsed = (uint8_t)val;
  1634. ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
  1635. (uint8_t *)&reg, 1);
  1636. }
  1637. return ret;
  1638. }
  1639. /**
  1640. * @brief Data-ready pulsed / letched mode.[get]
  1641. *
  1642. * @param ctx read / write interface definitions
  1643. * @param val Get the values of
  1644. * dataready_pulsed in
  1645. * reg COUNTER_BDR_REG1
  1646. * @retval interface status (MANDATORY: return 0 -> no Error)
  1647. *
  1648. */
  1649. int32_t lsm6dso_data_ready_mode_get(stmdev_ctx_t *ctx,
  1650. lsm6dso_dataready_pulsed_t *val)
  1651. {
  1652. lsm6dso_counter_bdr_reg1_t reg;
  1653. int32_t ret;
  1654. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t *)&reg, 1);
  1655. switch (reg.dataready_pulsed)
  1656. {
  1657. case LSM6DSO_DRDY_LATCHED:
  1658. *val = LSM6DSO_DRDY_LATCHED;
  1659. break;
  1660. case LSM6DSO_DRDY_PULSED:
  1661. *val = LSM6DSO_DRDY_PULSED;
  1662. break;
  1663. default:
  1664. *val = LSM6DSO_DRDY_LATCHED;
  1665. break;
  1666. }
  1667. return ret;
  1668. }
  1669. /**
  1670. * @brief Device "Who am I".[get]
  1671. *
  1672. * @param ctx read / write interface definitions
  1673. * @param buff buffer that stores data read
  1674. * @retval interface status (MANDATORY: return 0 -> no Error)
  1675. *
  1676. */
  1677. int32_t lsm6dso_device_id_get(stmdev_ctx_t *ctx, uint8_t *buff)
  1678. {
  1679. int32_t ret;
  1680. ret = lsm6dso_read_reg(ctx, LSM6DSO_WHO_AM_I, buff, 1);
  1681. return ret;
  1682. }
  1683. /**
  1684. * @brief Software reset. Restore the default values
  1685. * in user registers[set]
  1686. *
  1687. * @param ctx read / write interface definitions
  1688. * @param val change the values of sw_reset in reg CTRL3_C
  1689. * @retval interface status (MANDATORY: return 0 -> no Error)
  1690. *
  1691. */
  1692. int32_t lsm6dso_reset_set(stmdev_ctx_t *ctx, uint8_t val)
  1693. {
  1694. lsm6dso_ctrl3_c_t reg;
  1695. int32_t ret;
  1696. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1697. if (ret == 0)
  1698. {
  1699. reg.sw_reset = val;
  1700. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1701. }
  1702. return ret;
  1703. }
  1704. /**
  1705. * @brief Software reset. Restore the default values in user registers.[get]
  1706. *
  1707. * @param ctx read / write interface definitions
  1708. * @param val change the values of sw_reset in reg CTRL3_C
  1709. * @retval interface status (MANDATORY: return 0 -> no Error)
  1710. *
  1711. */
  1712. int32_t lsm6dso_reset_get(stmdev_ctx_t *ctx, uint8_t *val)
  1713. {
  1714. lsm6dso_ctrl3_c_t reg;
  1715. int32_t ret;
  1716. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1717. *val = reg.sw_reset;
  1718. return ret;
  1719. }
  1720. /**
  1721. * @brief Register address automatically incremented during a multiple byte
  1722. * access with a serial interface.[set]
  1723. *
  1724. * @param ctx read / write interface definitions
  1725. * @param val change the values of if_inc in reg CTRL3_C
  1726. * @retval interface status (MANDATORY: return 0 -> no Error)
  1727. *
  1728. */
  1729. int32_t lsm6dso_auto_increment_set(stmdev_ctx_t *ctx, uint8_t val)
  1730. {
  1731. lsm6dso_ctrl3_c_t reg;
  1732. int32_t ret;
  1733. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1734. if (ret == 0)
  1735. {
  1736. reg.if_inc = val;
  1737. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1738. }
  1739. return ret;
  1740. }
  1741. /**
  1742. * @brief Register address automatically incremented during a multiple byte
  1743. * access with a serial interface.[get]
  1744. *
  1745. * @param ctx read / write interface definitions
  1746. * @param val change the values of if_inc in reg CTRL3_C
  1747. * @retval interface status (MANDATORY: return 0 -> no Error)
  1748. *
  1749. */
  1750. int32_t lsm6dso_auto_increment_get(stmdev_ctx_t *ctx, uint8_t *val)
  1751. {
  1752. lsm6dso_ctrl3_c_t reg;
  1753. int32_t ret;
  1754. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1755. *val = reg.if_inc;
  1756. return ret;
  1757. }
  1758. /**
  1759. * @brief Reboot memory content. Reload the calibration parameters.[set]
  1760. *
  1761. * @param ctx read / write interface definitions
  1762. * @param val change the values of boot in reg CTRL3_C
  1763. * @retval interface status (MANDATORY: return 0 -> no Error)
  1764. *
  1765. */
  1766. int32_t lsm6dso_boot_set(stmdev_ctx_t *ctx, uint8_t val)
  1767. {
  1768. lsm6dso_ctrl3_c_t reg;
  1769. int32_t ret;
  1770. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1771. if (ret == 0)
  1772. {
  1773. reg.boot = val;
  1774. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1775. }
  1776. return ret;
  1777. }
  1778. /**
  1779. * @brief Reboot memory content. Reload the calibration parameters.[get]
  1780. *
  1781. * @param ctx read / write interface definitions
  1782. * @param val change the values of boot in reg CTRL3_C
  1783. * @retval interface status (MANDATORY: return 0 -> no Error)
  1784. *
  1785. */
  1786. int32_t lsm6dso_boot_get(stmdev_ctx_t *ctx, uint8_t *val)
  1787. {
  1788. lsm6dso_ctrl3_c_t reg;
  1789. int32_t ret;
  1790. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  1791. *val = reg.boot;
  1792. return ret;
  1793. }
  1794. /**
  1795. * @brief Linear acceleration sensor self-test enable.[set]
  1796. *
  1797. * @param ctx read / write interface definitions
  1798. * @param val change the values of st_xl in reg CTRL5_C
  1799. * @retval interface status (MANDATORY: return 0 -> no Error)
  1800. *
  1801. */
  1802. int32_t lsm6dso_xl_self_test_set(stmdev_ctx_t *ctx,
  1803. lsm6dso_st_xl_t val)
  1804. {
  1805. lsm6dso_ctrl5_c_t reg;
  1806. int32_t ret;
  1807. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1808. if (ret == 0)
  1809. {
  1810. reg.st_xl = (uint8_t)val;
  1811. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1812. }
  1813. return ret;
  1814. }
  1815. /**
  1816. * @brief Linear acceleration sensor self-test enable.[get]
  1817. *
  1818. * @param ctx read / write interface definitions
  1819. * @param val Get the values of st_xl in reg CTRL5_C
  1820. * @retval interface status (MANDATORY: return 0 -> no Error)
  1821. *
  1822. */
  1823. int32_t lsm6dso_xl_self_test_get(stmdev_ctx_t *ctx,
  1824. lsm6dso_st_xl_t *val)
  1825. {
  1826. lsm6dso_ctrl5_c_t reg;
  1827. int32_t ret;
  1828. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1829. switch (reg.st_xl)
  1830. {
  1831. case LSM6DSO_XL_ST_DISABLE:
  1832. *val = LSM6DSO_XL_ST_DISABLE;
  1833. break;
  1834. case LSM6DSO_XL_ST_POSITIVE:
  1835. *val = LSM6DSO_XL_ST_POSITIVE;
  1836. break;
  1837. case LSM6DSO_XL_ST_NEGATIVE:
  1838. *val = LSM6DSO_XL_ST_NEGATIVE;
  1839. break;
  1840. default:
  1841. *val = LSM6DSO_XL_ST_DISABLE;
  1842. break;
  1843. }
  1844. return ret;
  1845. }
  1846. /**
  1847. * @brief Angular rate sensor self-test enable.[set]
  1848. *
  1849. * @param ctx read / write interface definitions
  1850. * @param val change the values of st_g in reg CTRL5_C
  1851. * @retval interface status (MANDATORY: return 0 -> no Error)
  1852. *
  1853. */
  1854. int32_t lsm6dso_gy_self_test_set(stmdev_ctx_t *ctx,
  1855. lsm6dso_st_g_t val)
  1856. {
  1857. lsm6dso_ctrl5_c_t reg;
  1858. int32_t ret;
  1859. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1860. if (ret == 0)
  1861. {
  1862. reg.st_g = (uint8_t)val;
  1863. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1864. }
  1865. return ret;
  1866. }
  1867. /**
  1868. * @brief Angular rate sensor self-test enable.[get]
  1869. *
  1870. * @param ctx read / write interface definitions
  1871. * @param val Get the values of st_g in reg CTRL5_C
  1872. * @retval interface status (MANDATORY: return 0 -> no Error)
  1873. *
  1874. */
  1875. int32_t lsm6dso_gy_self_test_get(stmdev_ctx_t *ctx,
  1876. lsm6dso_st_g_t *val)
  1877. {
  1878. lsm6dso_ctrl5_c_t reg;
  1879. int32_t ret;
  1880. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t *)&reg, 1);
  1881. switch (reg.st_g)
  1882. {
  1883. case LSM6DSO_GY_ST_DISABLE:
  1884. *val = LSM6DSO_GY_ST_DISABLE;
  1885. break;
  1886. case LSM6DSO_GY_ST_POSITIVE:
  1887. *val = LSM6DSO_GY_ST_POSITIVE;
  1888. break;
  1889. case LSM6DSO_GY_ST_NEGATIVE:
  1890. *val = LSM6DSO_GY_ST_NEGATIVE;
  1891. break;
  1892. default:
  1893. *val = LSM6DSO_GY_ST_DISABLE;
  1894. break;
  1895. }
  1896. return ret;
  1897. }
  1898. /**
  1899. * @}
  1900. *
  1901. */
  1902. /**
  1903. * @defgroup LSM6DSO_filters
  1904. * @brief This section group all the functions concerning the
  1905. * filters configuration
  1906. * @{
  1907. *
  1908. */
  1909. /**
  1910. * @brief Accelerometer output from LPF2 filtering stage selection.[set]
  1911. *
  1912. * @param ctx read / write interface definitions
  1913. * @param val change the values of lpf2_xl_en in reg CTRL1_XL
  1914. * @retval interface status (MANDATORY: return 0 -> no Error)
  1915. *
  1916. */
  1917. int32_t lsm6dso_xl_filter_lp2_set(stmdev_ctx_t *ctx, uint8_t val)
  1918. {
  1919. lsm6dso_ctrl1_xl_t reg;
  1920. int32_t ret;
  1921. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  1922. if (ret == 0)
  1923. {
  1924. reg.lpf2_xl_en = val;
  1925. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  1926. }
  1927. return ret;
  1928. }
  1929. /**
  1930. * @brief Accelerometer output from LPF2 filtering stage selection.[get]
  1931. *
  1932. * @param ctx read / write interface definitions
  1933. * @param val change the values of lpf2_xl_en in reg CTRL1_XL
  1934. * @retval interface status (MANDATORY: return 0 -> no Error)
  1935. *
  1936. */
  1937. int32_t lsm6dso_xl_filter_lp2_get(stmdev_ctx_t *ctx, uint8_t *val)
  1938. {
  1939. lsm6dso_ctrl1_xl_t reg;
  1940. int32_t ret;
  1941. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 1);
  1942. *val = reg.lpf2_xl_en;
  1943. return ret;
  1944. }
  1945. /**
  1946. * @brief Enables gyroscope digital LPF1 if auxiliary SPI is disabled;
  1947. * the bandwidth can be selected through FTYPE [2:0]
  1948. * in CTRL6_C (15h).[set]
  1949. *
  1950. * @param ctx read / write interface definitions
  1951. * @param val change the values of lpf1_sel_g in reg CTRL4_C
  1952. * @retval interface status (MANDATORY: return 0 -> no Error)
  1953. *
  1954. */
  1955. int32_t lsm6dso_gy_filter_lp1_set(stmdev_ctx_t *ctx, uint8_t val)
  1956. {
  1957. lsm6dso_ctrl4_c_t reg;
  1958. int32_t ret;
  1959. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  1960. if (ret == 0)
  1961. {
  1962. reg.lpf1_sel_g = val;
  1963. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  1964. }
  1965. return ret;
  1966. }
  1967. /**
  1968. * @brief Enables gyroscope digital LPF1 if auxiliary SPI is disabled;
  1969. * the bandwidth can be selected through FTYPE [2:0]
  1970. * in CTRL6_C (15h).[get]
  1971. *
  1972. * @param ctx read / write interface definitions
  1973. * @param val change the values of lpf1_sel_g in reg CTRL4_C
  1974. * @retval interface status (MANDATORY: return 0 -> no Error)
  1975. *
  1976. */
  1977. int32_t lsm6dso_gy_filter_lp1_get(stmdev_ctx_t *ctx, uint8_t *val)
  1978. {
  1979. lsm6dso_ctrl4_c_t reg;
  1980. int32_t ret;
  1981. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  1982. *val = reg.lpf1_sel_g;
  1983. return ret;
  1984. }
  1985. /**
  1986. * @brief Mask DRDY on pin (both XL & Gyro) until filter settling ends
  1987. * (XL and Gyro independently masked).[set]
  1988. *
  1989. * @param ctx read / write interface definitions
  1990. * @param val change the values of drdy_mask in reg CTRL4_C
  1991. * @retval interface status (MANDATORY: return 0 -> no Error)
  1992. *
  1993. */
  1994. int32_t lsm6dso_filter_settling_mask_set(stmdev_ctx_t *ctx,
  1995. uint8_t val)
  1996. {
  1997. lsm6dso_ctrl4_c_t reg;
  1998. int32_t ret;
  1999. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  2000. if (ret == 0)
  2001. {
  2002. reg.drdy_mask = val;
  2003. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  2004. }
  2005. return ret;
  2006. }
  2007. /**
  2008. * @brief Mask DRDY on pin (both XL & Gyro) until filter settling ends
  2009. * (XL and Gyro independently masked).[get]
  2010. *
  2011. * @param ctx read / write interface definitions
  2012. * @param val change the values of drdy_mask in reg CTRL4_C
  2013. * @retval interface status (MANDATORY: return 0 -> no Error)
  2014. *
  2015. */
  2016. int32_t lsm6dso_filter_settling_mask_get(stmdev_ctx_t *ctx,
  2017. uint8_t *val)
  2018. {
  2019. lsm6dso_ctrl4_c_t reg;
  2020. int32_t ret;
  2021. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  2022. *val = reg.drdy_mask;
  2023. return ret;
  2024. }
  2025. /**
  2026. * @brief Gyroscope lp1 bandwidth.[set]
  2027. *
  2028. * @param ctx read / write interface definitions
  2029. * @param val change the values of ftype in reg CTRL6_C
  2030. * @retval interface status (MANDATORY: return 0 -> no Error)
  2031. *
  2032. */
  2033. int32_t lsm6dso_gy_lp1_bandwidth_set(stmdev_ctx_t *ctx,
  2034. lsm6dso_ftype_t val)
  2035. {
  2036. lsm6dso_ctrl6_c_t reg;
  2037. int32_t ret;
  2038. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  2039. if (ret == 0)
  2040. {
  2041. reg.ftype = (uint8_t)val;
  2042. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  2043. }
  2044. return ret;
  2045. }
  2046. /**
  2047. * @brief Gyroscope lp1 bandwidth.[get]
  2048. *
  2049. * @param ctx read / write interface definitions
  2050. * @param val Get the values of ftype in reg CTRL6_C
  2051. * @retval interface status (MANDATORY: return 0 -> no Error)
  2052. *
  2053. */
  2054. int32_t lsm6dso_gy_lp1_bandwidth_get(stmdev_ctx_t *ctx,
  2055. lsm6dso_ftype_t *val)
  2056. {
  2057. lsm6dso_ctrl6_c_t reg;
  2058. int32_t ret;
  2059. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  2060. switch (reg.ftype)
  2061. {
  2062. case LSM6DSO_ULTRA_LIGHT:
  2063. *val = LSM6DSO_ULTRA_LIGHT;
  2064. break;
  2065. case LSM6DSO_VERY_LIGHT:
  2066. *val = LSM6DSO_VERY_LIGHT;
  2067. break;
  2068. case LSM6DSO_LIGHT:
  2069. *val = LSM6DSO_LIGHT;
  2070. break;
  2071. case LSM6DSO_MEDIUM:
  2072. *val = LSM6DSO_MEDIUM;
  2073. break;
  2074. case LSM6DSO_STRONG:
  2075. *val = LSM6DSO_STRONG;
  2076. break;
  2077. case LSM6DSO_VERY_STRONG:
  2078. *val = LSM6DSO_VERY_STRONG;
  2079. break;
  2080. case LSM6DSO_AGGRESSIVE:
  2081. *val = LSM6DSO_AGGRESSIVE;
  2082. break;
  2083. case LSM6DSO_XTREME:
  2084. *val = LSM6DSO_XTREME;
  2085. break;
  2086. default:
  2087. *val = LSM6DSO_ULTRA_LIGHT;
  2088. break;
  2089. }
  2090. return ret;
  2091. }
  2092. /**
  2093. * @brief Low pass filter 2 on 6D function selection.[set]
  2094. *
  2095. * @param ctx read / write interface definitions
  2096. * @param val change the values of low_pass_on_6d in reg CTRL8_XL
  2097. * @retval interface status (MANDATORY: return 0 -> no Error)
  2098. *
  2099. */
  2100. int32_t lsm6dso_xl_lp2_on_6d_set(stmdev_ctx_t *ctx, uint8_t val)
  2101. {
  2102. lsm6dso_ctrl8_xl_t reg;
  2103. int32_t ret;
  2104. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2105. if (ret == 0)
  2106. {
  2107. reg.low_pass_on_6d = val;
  2108. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2109. }
  2110. return ret;
  2111. }
  2112. /**
  2113. * @brief Low pass filter 2 on 6D function selection.[get]
  2114. *
  2115. * @param ctx read / write interface definitions
  2116. * @param val change the values of low_pass_on_6d in reg CTRL8_XL
  2117. * @retval interface status (MANDATORY: return 0 -> no Error)
  2118. *
  2119. */
  2120. int32_t lsm6dso_xl_lp2_on_6d_get(stmdev_ctx_t *ctx, uint8_t *val)
  2121. {
  2122. lsm6dso_ctrl8_xl_t reg;
  2123. int32_t ret;
  2124. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2125. *val = reg.low_pass_on_6d;
  2126. return ret;
  2127. }
  2128. /**
  2129. * @brief Accelerometer slope filter / high-pass filter selection
  2130. * on output.[set]
  2131. *
  2132. * @param ctx read / write interface definitions
  2133. * @param val change the values of hp_slope_xl_en
  2134. * in reg CTRL8_XL
  2135. * @retval interface status (MANDATORY: return 0 -> no Error)
  2136. *
  2137. */
  2138. int32_t lsm6dso_xl_hp_path_on_out_set(stmdev_ctx_t *ctx,
  2139. lsm6dso_hp_slope_xl_en_t val)
  2140. {
  2141. lsm6dso_ctrl8_xl_t reg;
  2142. int32_t ret;
  2143. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2144. if (ret == 0)
  2145. {
  2146. reg.hp_slope_xl_en = ((uint8_t)val & 0x10U) >> 4;
  2147. reg.hp_ref_mode_xl = ((uint8_t)val & 0x20U) >> 5;
  2148. reg.hpcf_xl = (uint8_t)val & 0x07U;
  2149. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2150. }
  2151. return ret;
  2152. }
  2153. /**
  2154. * @brief Accelerometer slope filter / high-pass filter selection
  2155. * on output.[get]
  2156. *
  2157. * @param ctx read / write interface definitions
  2158. * @param val Get the values of hp_slope_xl_en
  2159. * in reg CTRL8_XL
  2160. * @retval interface status (MANDATORY: return 0 -> no Error)
  2161. *
  2162. */
  2163. int32_t lsm6dso_xl_hp_path_on_out_get(stmdev_ctx_t *ctx,
  2164. lsm6dso_hp_slope_xl_en_t *val)
  2165. {
  2166. lsm6dso_ctrl8_xl_t reg;
  2167. int32_t ret;
  2168. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2169. switch ((reg.hp_ref_mode_xl << 5) | (reg.hp_slope_xl_en << 4) |
  2170. reg.hpcf_xl)
  2171. {
  2172. case LSM6DSO_HP_PATH_DISABLE_ON_OUT:
  2173. *val = LSM6DSO_HP_PATH_DISABLE_ON_OUT;
  2174. break;
  2175. case LSM6DSO_SLOPE_ODR_DIV_4:
  2176. *val = LSM6DSO_SLOPE_ODR_DIV_4;
  2177. break;
  2178. case LSM6DSO_HP_ODR_DIV_10:
  2179. *val = LSM6DSO_HP_ODR_DIV_10;
  2180. break;
  2181. case LSM6DSO_HP_ODR_DIV_20:
  2182. *val = LSM6DSO_HP_ODR_DIV_20;
  2183. break;
  2184. case LSM6DSO_HP_ODR_DIV_45:
  2185. *val = LSM6DSO_HP_ODR_DIV_45;
  2186. break;
  2187. case LSM6DSO_HP_ODR_DIV_100:
  2188. *val = LSM6DSO_HP_ODR_DIV_100;
  2189. break;
  2190. case LSM6DSO_HP_ODR_DIV_200:
  2191. *val = LSM6DSO_HP_ODR_DIV_200;
  2192. break;
  2193. case LSM6DSO_HP_ODR_DIV_400:
  2194. *val = LSM6DSO_HP_ODR_DIV_400;
  2195. break;
  2196. case LSM6DSO_HP_ODR_DIV_800:
  2197. *val = LSM6DSO_HP_ODR_DIV_800;
  2198. break;
  2199. case LSM6DSO_HP_REF_MD_ODR_DIV_10:
  2200. *val = LSM6DSO_HP_REF_MD_ODR_DIV_10;
  2201. break;
  2202. case LSM6DSO_HP_REF_MD_ODR_DIV_20:
  2203. *val = LSM6DSO_HP_REF_MD_ODR_DIV_20;
  2204. break;
  2205. case LSM6DSO_HP_REF_MD_ODR_DIV_45:
  2206. *val = LSM6DSO_HP_REF_MD_ODR_DIV_45;
  2207. break;
  2208. case LSM6DSO_HP_REF_MD_ODR_DIV_100:
  2209. *val = LSM6DSO_HP_REF_MD_ODR_DIV_100;
  2210. break;
  2211. case LSM6DSO_HP_REF_MD_ODR_DIV_200:
  2212. *val = LSM6DSO_HP_REF_MD_ODR_DIV_200;
  2213. break;
  2214. case LSM6DSO_HP_REF_MD_ODR_DIV_400:
  2215. *val = LSM6DSO_HP_REF_MD_ODR_DIV_400;
  2216. break;
  2217. case LSM6DSO_HP_REF_MD_ODR_DIV_800:
  2218. *val = LSM6DSO_HP_REF_MD_ODR_DIV_800;
  2219. break;
  2220. case LSM6DSO_LP_ODR_DIV_10:
  2221. *val = LSM6DSO_LP_ODR_DIV_10;
  2222. break;
  2223. case LSM6DSO_LP_ODR_DIV_20:
  2224. *val = LSM6DSO_LP_ODR_DIV_20;
  2225. break;
  2226. case LSM6DSO_LP_ODR_DIV_45:
  2227. *val = LSM6DSO_LP_ODR_DIV_45;
  2228. break;
  2229. case LSM6DSO_LP_ODR_DIV_100:
  2230. *val = LSM6DSO_LP_ODR_DIV_100;
  2231. break;
  2232. case LSM6DSO_LP_ODR_DIV_200:
  2233. *val = LSM6DSO_LP_ODR_DIV_200;
  2234. break;
  2235. case LSM6DSO_LP_ODR_DIV_400:
  2236. *val = LSM6DSO_LP_ODR_DIV_400;
  2237. break;
  2238. case LSM6DSO_LP_ODR_DIV_800:
  2239. *val = LSM6DSO_LP_ODR_DIV_800;
  2240. break;
  2241. default:
  2242. *val = LSM6DSO_HP_PATH_DISABLE_ON_OUT;
  2243. break;
  2244. }
  2245. return ret;
  2246. }
  2247. /**
  2248. * @brief Enables accelerometer LPF2 and HPF fast-settling mode.
  2249. * The filter sets the second samples after writing this bit.
  2250. * Active only during device exit from power-down mode.[set]
  2251. *
  2252. * @param ctx read / write interface definitions
  2253. * @param val change the values of fastsettl_mode_xl in
  2254. * reg CTRL8_XL
  2255. * @retval interface status (MANDATORY: return 0 -> no Error)
  2256. *
  2257. */
  2258. int32_t lsm6dso_xl_fast_settling_set(stmdev_ctx_t *ctx, uint8_t val)
  2259. {
  2260. lsm6dso_ctrl8_xl_t reg;
  2261. int32_t ret;
  2262. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2263. if (ret == 0)
  2264. {
  2265. reg.fastsettl_mode_xl = val;
  2266. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2267. }
  2268. return ret;
  2269. }
  2270. /**
  2271. * @brief Enables accelerometer LPF2 and HPF fast-settling mode.
  2272. * The filter sets the second samples after writing this bit.
  2273. * Active only during device exit from power-down mode.[get]
  2274. *
  2275. * @param ctx read / write interface definitions
  2276. * @param val change the values of fastsettl_mode_xl in reg CTRL8_XL
  2277. * @retval interface status (MANDATORY: return 0 -> no Error)
  2278. *
  2279. */
  2280. int32_t lsm6dso_xl_fast_settling_get(stmdev_ctx_t *ctx, uint8_t *val)
  2281. {
  2282. lsm6dso_ctrl8_xl_t reg;
  2283. int32_t ret;
  2284. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2285. *val = reg.fastsettl_mode_xl;
  2286. return ret;
  2287. }
  2288. /**
  2289. * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity
  2290. * functions.[set]
  2291. *
  2292. * @param ctx read / write interface definitions
  2293. * @param val change the values of slope_fds in reg TAP_CFG0
  2294. * @retval interface status (MANDATORY: return 0 -> no Error)
  2295. *
  2296. */
  2297. int32_t lsm6dso_xl_hp_path_internal_set(stmdev_ctx_t *ctx,
  2298. lsm6dso_slope_fds_t val)
  2299. {
  2300. lsm6dso_tap_cfg0_t reg;
  2301. int32_t ret;
  2302. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  2303. if (ret == 0)
  2304. {
  2305. reg.slope_fds = (uint8_t)val;
  2306. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  2307. }
  2308. return ret;
  2309. }
  2310. /**
  2311. * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity
  2312. * functions.[get]
  2313. *
  2314. * @param ctx read / write interface definitions
  2315. * @param val Get the values of slope_fds in reg TAP_CFG0
  2316. * @retval interface status (MANDATORY: return 0 -> no Error)
  2317. *
  2318. */
  2319. int32_t lsm6dso_xl_hp_path_internal_get(stmdev_ctx_t *ctx,
  2320. lsm6dso_slope_fds_t *val)
  2321. {
  2322. lsm6dso_tap_cfg0_t reg;
  2323. int32_t ret;
  2324. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  2325. switch (reg.slope_fds)
  2326. {
  2327. case LSM6DSO_USE_SLOPE:
  2328. *val = LSM6DSO_USE_SLOPE;
  2329. break;
  2330. case LSM6DSO_USE_HPF:
  2331. *val = LSM6DSO_USE_HPF;
  2332. break;
  2333. default:
  2334. *val = LSM6DSO_USE_SLOPE;
  2335. break;
  2336. }
  2337. return ret;
  2338. }
  2339. /**
  2340. * @brief Enables gyroscope digital high-pass filter. The filter is
  2341. * enabled only if the gyro is in HP mode.[set]
  2342. *
  2343. * @param ctx read / write interface definitions
  2344. * @param val Get the values of hp_en_g and hp_en_g
  2345. * in reg CTRL7_G
  2346. * @retval interface status (MANDATORY: return 0 -> no Error)
  2347. *
  2348. */
  2349. int32_t lsm6dso_gy_hp_path_internal_set(stmdev_ctx_t *ctx,
  2350. lsm6dso_hpm_g_t val)
  2351. {
  2352. lsm6dso_ctrl7_g_t reg;
  2353. int32_t ret;
  2354. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  2355. if (ret == 0)
  2356. {
  2357. reg.hp_en_g = ((uint8_t)val & 0x80U) >> 7;
  2358. reg.hpm_g = (uint8_t)val & 0x03U;
  2359. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  2360. }
  2361. return ret;
  2362. }
  2363. /**
  2364. * @brief Enables gyroscope digital high-pass filter. The filter is
  2365. * enabled only if the gyro is in HP mode.[get]
  2366. *
  2367. * @param ctx read / write interface definitions
  2368. * @param val Get the values of hp_en_g and hp_en_g
  2369. * in reg CTRL7_G
  2370. * @retval interface status (MANDATORY: return 0 -> no Error)
  2371. *
  2372. */
  2373. int32_t lsm6dso_gy_hp_path_internal_get(stmdev_ctx_t *ctx,
  2374. lsm6dso_hpm_g_t *val)
  2375. {
  2376. lsm6dso_ctrl7_g_t reg;
  2377. int32_t ret;
  2378. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  2379. switch ((reg.hp_en_g << 7) + reg.hpm_g)
  2380. {
  2381. case LSM6DSO_HP_FILTER_NONE:
  2382. *val = LSM6DSO_HP_FILTER_NONE;
  2383. break;
  2384. case LSM6DSO_HP_FILTER_16mHz:
  2385. *val = LSM6DSO_HP_FILTER_16mHz;
  2386. break;
  2387. case LSM6DSO_HP_FILTER_65mHz:
  2388. *val = LSM6DSO_HP_FILTER_65mHz;
  2389. break;
  2390. case LSM6DSO_HP_FILTER_260mHz:
  2391. *val = LSM6DSO_HP_FILTER_260mHz;
  2392. break;
  2393. case LSM6DSO_HP_FILTER_1Hz04:
  2394. *val = LSM6DSO_HP_FILTER_1Hz04;
  2395. break;
  2396. default:
  2397. *val = LSM6DSO_HP_FILTER_NONE;
  2398. break;
  2399. }
  2400. return ret;
  2401. }
  2402. /**
  2403. * @}
  2404. *
  2405. */
  2406. /**
  2407. * @defgroup LSM6DSO_ Auxiliary_interface
  2408. * @brief This section groups all the functions concerning
  2409. * auxiliary interface.
  2410. * @{
  2411. *
  2412. */
  2413. /**
  2414. * @brief aOn auxiliary interface connect/disconnect SDO and OCS
  2415. * internal pull-up.[set]
  2416. *
  2417. * @param ctx read / write interface definitions
  2418. * @param val change the values of ois_pu_dis in
  2419. * reg PIN_CTRL
  2420. * @retval interface status (MANDATORY: return 0 -> no Error)
  2421. *
  2422. */
  2423. int32_t lsm6dso_aux_sdo_ocs_mode_set(stmdev_ctx_t *ctx,
  2424. lsm6dso_ois_pu_dis_t val)
  2425. {
  2426. lsm6dso_pin_ctrl_t reg;
  2427. int32_t ret;
  2428. ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&reg, 1);
  2429. if (ret == 0)
  2430. {
  2431. reg.ois_pu_dis = (uint8_t)val;
  2432. ret = lsm6dso_write_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&reg, 1);
  2433. }
  2434. return ret;
  2435. }
  2436. /**
  2437. * @brief On auxiliary interface connect/disconnect SDO and OCS
  2438. * internal pull-up.[get]
  2439. *
  2440. * @param ctx read / write interface definitions
  2441. * @param val Get the values of ois_pu_dis in reg PIN_CTRL
  2442. * @retval interface status (MANDATORY: return 0 -> no Error)
  2443. *
  2444. */
  2445. int32_t lsm6dso_aux_sdo_ocs_mode_get(stmdev_ctx_t *ctx,
  2446. lsm6dso_ois_pu_dis_t *val)
  2447. {
  2448. lsm6dso_pin_ctrl_t reg;
  2449. int32_t ret;
  2450. ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&reg, 1);
  2451. switch (reg.ois_pu_dis)
  2452. {
  2453. case LSM6DSO_AUX_PULL_UP_DISC:
  2454. *val = LSM6DSO_AUX_PULL_UP_DISC;
  2455. break;
  2456. case LSM6DSO_AUX_PULL_UP_CONNECT:
  2457. *val = LSM6DSO_AUX_PULL_UP_CONNECT;
  2458. break;
  2459. default:
  2460. *val = LSM6DSO_AUX_PULL_UP_DISC;
  2461. break;
  2462. }
  2463. return ret;
  2464. }
  2465. /**
  2466. * @brief OIS chain on aux interface power on mode.[set]
  2467. *
  2468. * @param ctx read / write interface definitions
  2469. * @param val change the values of ois_on in reg CTRL7_G
  2470. * @retval interface status (MANDATORY: return 0 -> no Error)
  2471. *
  2472. */
  2473. int32_t lsm6dso_aux_pw_on_ctrl_set(stmdev_ctx_t *ctx,
  2474. lsm6dso_ois_on_t val)
  2475. {
  2476. lsm6dso_ctrl7_g_t reg;
  2477. int32_t ret;
  2478. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  2479. if (ret == 0)
  2480. {
  2481. reg.ois_on_en = (uint8_t)val & 0x01U;
  2482. reg.ois_on = (uint8_t)val & 0x01U;
  2483. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  2484. }
  2485. return ret;
  2486. }
  2487. /**
  2488. * @brief aux_pw_on_ctrl: [get] OIS chain on aux interface power on mode
  2489. *
  2490. * @param ctx read / write interface definitions
  2491. * @param val Get the values of ois_on in reg CTRL7_G
  2492. * @retval interface status (MANDATORY: return 0 -> no Error)
  2493. *
  2494. */
  2495. int32_t lsm6dso_aux_pw_on_ctrl_get(stmdev_ctx_t *ctx,
  2496. lsm6dso_ois_on_t *val)
  2497. {
  2498. lsm6dso_ctrl7_g_t reg;
  2499. int32_t ret;
  2500. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t *)&reg, 1);
  2501. switch (reg.ois_on)
  2502. {
  2503. case LSM6DSO_AUX_ON:
  2504. *val = LSM6DSO_AUX_ON;
  2505. break;
  2506. case LSM6DSO_AUX_ON_BY_AUX_INTERFACE:
  2507. *val = LSM6DSO_AUX_ON_BY_AUX_INTERFACE;
  2508. break;
  2509. default:
  2510. *val = LSM6DSO_AUX_ON;
  2511. break;
  2512. }
  2513. return ret;
  2514. }
  2515. /**
  2516. * @brief Accelerometer full-scale management between UI chain and
  2517. * OIS chain. When XL UI is on, the full scale is the same
  2518. * between UI/OIS and is chosen by the UI CTRL registers;
  2519. * when XL UI is in PD, the OIS can choose the FS.
  2520. * Full scales are independent between the UI/OIS chain
  2521. * but both bound to 8 g.[set]
  2522. *
  2523. * @param ctx read / write interface definitions
  2524. * @param val change the values of xl_fs_mode in
  2525. * reg CTRL8_XL
  2526. * @retval interface status (MANDATORY: return 0 -> no Error)
  2527. *
  2528. */
  2529. int32_t lsm6dso_aux_xl_fs_mode_set(stmdev_ctx_t *ctx,
  2530. lsm6dso_xl_fs_mode_t val)
  2531. {
  2532. lsm6dso_ctrl8_xl_t reg;
  2533. int32_t ret;
  2534. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2535. if (ret == 0)
  2536. {
  2537. reg.xl_fs_mode = (uint8_t)val;
  2538. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2539. }
  2540. return ret;
  2541. }
  2542. /**
  2543. * @brief Accelerometer full-scale management between UI chain and
  2544. * OIS chain. When XL UI is on, the full scale is the same
  2545. * between UI/OIS and is chosen by the UI CTRL registers;
  2546. * when XL UI is in PD, the OIS can choose the FS.
  2547. * Full scales are independent between the UI/OIS chain
  2548. * but both bound to 8 g.[get]
  2549. *
  2550. * @param ctx read / write interface definitions
  2551. * @param val Get the values of xl_fs_mode in reg CTRL8_XL
  2552. * @retval interface status (MANDATORY: return 0 -> no Error)
  2553. *
  2554. */
  2555. int32_t lsm6dso_aux_xl_fs_mode_get(stmdev_ctx_t *ctx,
  2556. lsm6dso_xl_fs_mode_t *val)
  2557. {
  2558. lsm6dso_ctrl8_xl_t reg;
  2559. int32_t ret;
  2560. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t *)&reg, 1);
  2561. switch (reg.xl_fs_mode)
  2562. {
  2563. case LSM6DSO_USE_SAME_XL_FS:
  2564. *val = LSM6DSO_USE_SAME_XL_FS;
  2565. break;
  2566. case LSM6DSO_USE_DIFFERENT_XL_FS:
  2567. *val = LSM6DSO_USE_DIFFERENT_XL_FS;
  2568. break;
  2569. default:
  2570. *val = LSM6DSO_USE_SAME_XL_FS;
  2571. break;
  2572. }
  2573. return ret;
  2574. }
  2575. /**
  2576. * @brief The STATUS_SPIAux register is read by the auxiliary SPI.[get]
  2577. *
  2578. * @param ctx read / write interface definitions
  2579. * @param lsm6dso_status_spiaux_t: registers STATUS_SPIAUX
  2580. * @retval interface status (MANDATORY: return 0 -> no Error)
  2581. *
  2582. */
  2583. int32_t lsm6dso_aux_status_reg_get(stmdev_ctx_t *ctx,
  2584. lsm6dso_status_spiaux_t *val)
  2585. {
  2586. int32_t ret;
  2587. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t *) val, 1);
  2588. return ret;
  2589. }
  2590. /**
  2591. * @brief aux_xl_flag_data_ready: [get] AUX accelerometer data available
  2592. *
  2593. * @param ctx read / write interface definitions
  2594. * @param val change the values of xlda in reg STATUS_SPIAUX
  2595. * @retval interface status (MANDATORY: return 0 -> no Error)
  2596. *
  2597. */
  2598. int32_t lsm6dso_aux_xl_flag_data_ready_get(stmdev_ctx_t *ctx,
  2599. uint8_t *val)
  2600. {
  2601. lsm6dso_status_spiaux_t reg;
  2602. int32_t ret;
  2603. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t *)&reg, 1);
  2604. *val = reg.xlda;
  2605. return ret;
  2606. }
  2607. /**
  2608. * @brief aux_gy_flag_data_ready: [get] AUX gyroscope data available.
  2609. *
  2610. * @param ctx read / write interface definitions
  2611. * @param val change the values of gda in reg STATUS_SPIAUX
  2612. * @retval interface status (MANDATORY: return 0 -> no Error)
  2613. *
  2614. */
  2615. int32_t lsm6dso_aux_gy_flag_data_ready_get(stmdev_ctx_t *ctx,
  2616. uint8_t *val)
  2617. {
  2618. lsm6dso_status_spiaux_t reg;
  2619. int32_t ret;
  2620. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t *)&reg, 1);
  2621. *val = reg.gda;
  2622. return ret;
  2623. }
  2624. /**
  2625. * @brief High when the gyroscope output is in the settling phase.[get]
  2626. *
  2627. * @param ctx read / write interface definitions
  2628. * @param val change the values of gyro_settling in reg STATUS_SPIAUX
  2629. * @retval interface status (MANDATORY: return 0 -> no Error)
  2630. *
  2631. */
  2632. int32_t lsm6dso_aux_gy_flag_settling_get(stmdev_ctx_t *ctx,
  2633. uint8_t *val)
  2634. {
  2635. lsm6dso_status_spiaux_t reg;
  2636. int32_t ret;
  2637. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t *)&reg, 1);
  2638. *val = reg.gyro_settling;
  2639. return ret;
  2640. }
  2641. /**
  2642. * @brief Selects accelerometer self-test. Effective only if XL OIS
  2643. * chain is enabled.[set]
  2644. *
  2645. * @param ctx read / write interface definitions
  2646. * @param val change the values of st_xl_ois in reg INT_OIS
  2647. * @retval interface status (MANDATORY: return 0 -> no Error)
  2648. *
  2649. */
  2650. int32_t lsm6dso_aux_xl_self_test_set(stmdev_ctx_t *ctx,
  2651. lsm6dso_st_xl_ois_t val)
  2652. {
  2653. lsm6dso_int_ois_t reg;
  2654. int32_t ret;
  2655. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2656. if (ret == 0)
  2657. {
  2658. reg.st_xl_ois = (uint8_t)val;
  2659. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2660. }
  2661. return ret;
  2662. }
  2663. /**
  2664. * @brief Selects accelerometer self-test. Effective only if XL OIS
  2665. * chain is enabled.[get]
  2666. *
  2667. * @param ctx read / write interface definitions
  2668. * @param val Get the values of st_xl_ois in reg INT_OIS
  2669. * @retval interface status (MANDATORY: return 0 -> no Error)
  2670. *
  2671. */
  2672. int32_t lsm6dso_aux_xl_self_test_get(stmdev_ctx_t *ctx,
  2673. lsm6dso_st_xl_ois_t *val)
  2674. {
  2675. lsm6dso_int_ois_t reg;
  2676. int32_t ret;
  2677. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2678. switch (reg.st_xl_ois)
  2679. {
  2680. case LSM6DSO_AUX_XL_DISABLE:
  2681. *val = LSM6DSO_AUX_XL_DISABLE;
  2682. break;
  2683. case LSM6DSO_AUX_XL_POS:
  2684. *val = LSM6DSO_AUX_XL_POS;
  2685. break;
  2686. case LSM6DSO_AUX_XL_NEG:
  2687. *val = LSM6DSO_AUX_XL_NEG;
  2688. break;
  2689. default:
  2690. *val = LSM6DSO_AUX_XL_DISABLE;
  2691. break;
  2692. }
  2693. return ret;
  2694. }
  2695. /**
  2696. * @brief Indicates polarity of DEN signal on OIS chain.[set]
  2697. *
  2698. * @param ctx read / write interface definitions
  2699. * @param val change the values of den_lh_ois in
  2700. * reg INT_OIS
  2701. * @retval interface status (MANDATORY: return 0 -> no Error)
  2702. *
  2703. */
  2704. int32_t lsm6dso_aux_den_polarity_set(stmdev_ctx_t *ctx,
  2705. lsm6dso_den_lh_ois_t val)
  2706. {
  2707. lsm6dso_int_ois_t reg;
  2708. int32_t ret;
  2709. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2710. if (ret == 0)
  2711. {
  2712. reg.den_lh_ois = (uint8_t)val;
  2713. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2714. }
  2715. return ret;
  2716. }
  2717. /**
  2718. * @brief Indicates polarity of DEN signal on OIS chain.[get]
  2719. *
  2720. * @param ctx read / write interface definitions
  2721. * @param val Get the values of den_lh_ois in reg INT_OIS
  2722. * @retval interface status (MANDATORY: return 0 -> no Error)
  2723. *
  2724. */
  2725. int32_t lsm6dso_aux_den_polarity_get(stmdev_ctx_t *ctx,
  2726. lsm6dso_den_lh_ois_t *val)
  2727. {
  2728. lsm6dso_int_ois_t reg;
  2729. int32_t ret;
  2730. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2731. switch (reg.den_lh_ois)
  2732. {
  2733. case LSM6DSO_AUX_DEN_ACTIVE_LOW:
  2734. *val = LSM6DSO_AUX_DEN_ACTIVE_LOW;
  2735. break;
  2736. case LSM6DSO_AUX_DEN_ACTIVE_HIGH:
  2737. *val = LSM6DSO_AUX_DEN_ACTIVE_HIGH;
  2738. break;
  2739. default:
  2740. *val = LSM6DSO_AUX_DEN_ACTIVE_LOW;
  2741. break;
  2742. }
  2743. return ret;
  2744. }
  2745. /**
  2746. * @brief Configure DEN mode on the OIS chain.[set]
  2747. *
  2748. * @param ctx read / write interface definitions
  2749. * @param val change the values of lvl2_ois in reg INT_OIS
  2750. * @retval interface status (MANDATORY: return 0 -> no Error)
  2751. *
  2752. */
  2753. int32_t lsm6dso_aux_den_mode_set(stmdev_ctx_t *ctx,
  2754. lsm6dso_lvl2_ois_t val)
  2755. {
  2756. lsm6dso_ctrl1_ois_t ctrl1_ois;
  2757. lsm6dso_int_ois_t int_ois;
  2758. int32_t ret;
  2759. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *) &int_ois, 1);
  2760. if (ret == 0)
  2761. {
  2762. int_ois.lvl2_ois = (uint8_t)val & 0x01U;
  2763. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *) &int_ois, 1);
  2764. }
  2765. if (ret == 0)
  2766. {
  2767. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *) &ctrl1_ois, 1);
  2768. }
  2769. if (ret == 0)
  2770. {
  2771. ctrl1_ois.lvl1_ois = ((uint8_t)val & 0x02U) >> 1;
  2772. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS,
  2773. (uint8_t *) &ctrl1_ois, 1);
  2774. }
  2775. return ret;
  2776. }
  2777. /**
  2778. * @brief Configure DEN mode on the OIS chain.[get]
  2779. *
  2780. * @param ctx read / write interface definitions
  2781. * @param val Get the values of lvl2_ois in reg INT_OIS
  2782. * @retval interface status (MANDATORY: return 0 -> no Error)
  2783. *
  2784. */
  2785. int32_t lsm6dso_aux_den_mode_get(stmdev_ctx_t *ctx,
  2786. lsm6dso_lvl2_ois_t *val)
  2787. {
  2788. lsm6dso_ctrl1_ois_t ctrl1_ois;
  2789. lsm6dso_int_ois_t int_ois;
  2790. int32_t ret;
  2791. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *) &int_ois, 1);
  2792. if (ret == 0)
  2793. {
  2794. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *) &ctrl1_ois, 1);
  2795. switch ((ctrl1_ois.lvl1_ois << 1) + int_ois.lvl2_ois)
  2796. {
  2797. case LSM6DSO_AUX_DEN_DISABLE:
  2798. *val = LSM6DSO_AUX_DEN_DISABLE;
  2799. break;
  2800. case LSM6DSO_AUX_DEN_LEVEL_LATCH:
  2801. *val = LSM6DSO_AUX_DEN_LEVEL_LATCH;
  2802. break;
  2803. case LSM6DSO_AUX_DEN_LEVEL_TRIG:
  2804. *val = LSM6DSO_AUX_DEN_LEVEL_TRIG;
  2805. break;
  2806. default:
  2807. *val = LSM6DSO_AUX_DEN_DISABLE;
  2808. break;
  2809. }
  2810. }
  2811. return ret;
  2812. }
  2813. /**
  2814. * @brief Enables/Disable OIS chain DRDY on INT2 pin.
  2815. * This setting has priority over all other INT2 settings.[set]
  2816. *
  2817. * @param ctx read / write interface definitions
  2818. * @param val change the values of int2_drdy_ois in reg INT_OIS
  2819. * @retval interface status (MANDATORY: return 0 -> no Error)
  2820. *
  2821. */
  2822. int32_t lsm6dso_aux_drdy_on_int2_set(stmdev_ctx_t *ctx, uint8_t val)
  2823. {
  2824. lsm6dso_int_ois_t reg;
  2825. int32_t ret;
  2826. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2827. if (ret == 0)
  2828. {
  2829. reg.int2_drdy_ois = val;
  2830. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2831. }
  2832. return ret;
  2833. }
  2834. /**
  2835. * @brief Enables/Disable OIS chain DRDY on INT2 pin.
  2836. * This setting has priority over all other INT2 settings.[get]
  2837. *
  2838. * @param ctx read / write interface definitions
  2839. * @param val change the values of int2_drdy_ois in reg INT_OIS
  2840. * @retval interface status (MANDATORY: return 0 -> no Error)
  2841. *
  2842. */
  2843. int32_t lsm6dso_aux_drdy_on_int2_get(stmdev_ctx_t *ctx, uint8_t *val)
  2844. {
  2845. lsm6dso_int_ois_t reg;
  2846. int32_t ret;
  2847. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t *)&reg, 1);
  2848. *val = reg.int2_drdy_ois;
  2849. return ret;
  2850. }
  2851. /**
  2852. * @brief Enables OIS chain data processing for gyro in Mode 3 and Mode 4
  2853. * (mode4_en = 1) and accelerometer data in and Mode 4 (mode4_en = 1).
  2854. * When the OIS chain is enabled, the OIS outputs are available
  2855. * through the SPI2 in registers OUTX_L_G (22h) through
  2856. * OUTZ_H_G (27h) and STATUS_REG (1Eh) / STATUS_SPIAux, and
  2857. * LPF1 is dedicated to this chain.[set]
  2858. *
  2859. * @param ctx read / write interface definitions
  2860. * @param val change the values of ois_en_spi2 in
  2861. * reg CTRL1_OIS
  2862. * @retval interface status (MANDATORY: return 0 -> no Error)
  2863. *
  2864. */
  2865. int32_t lsm6dso_aux_mode_set(stmdev_ctx_t *ctx,
  2866. lsm6dso_ois_en_spi2_t val)
  2867. {
  2868. lsm6dso_ctrl1_ois_t reg;
  2869. int32_t ret;
  2870. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2871. if (ret == 0)
  2872. {
  2873. reg.ois_en_spi2 = (uint8_t)val & 0x01U;
  2874. reg.mode4_en = ((uint8_t)val & 0x02U) >> 1;
  2875. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2876. }
  2877. return ret;
  2878. }
  2879. /**
  2880. * @brief Enables OIS chain data processing for gyro in Mode 3 and Mode 4
  2881. * (mode4_en = 1) and accelerometer data in and Mode 4 (mode4_en = 1).
  2882. * When the OIS chain is enabled, the OIS outputs are available
  2883. * through the SPI2 in registers OUTX_L_G (22h) through
  2884. * OUTZ_H_G (27h) and STATUS_REG (1Eh) / STATUS_SPIAux, and
  2885. * LPF1 is dedicated to this chain.[get]
  2886. *
  2887. * @param ctx read / write interface definitions
  2888. * @param val Get the values of ois_en_spi2 in
  2889. * reg CTRL1_OIS
  2890. * @retval interface status (MANDATORY: return 0 -> no Error)
  2891. *
  2892. */
  2893. int32_t lsm6dso_aux_mode_get(stmdev_ctx_t *ctx,
  2894. lsm6dso_ois_en_spi2_t *val)
  2895. {
  2896. lsm6dso_ctrl1_ois_t reg;
  2897. int32_t ret;
  2898. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2899. switch ((reg.mode4_en << 1) | reg.ois_en_spi2)
  2900. {
  2901. case LSM6DSO_AUX_DISABLE:
  2902. *val = LSM6DSO_AUX_DISABLE;
  2903. break;
  2904. case LSM6DSO_MODE_3_GY:
  2905. *val = LSM6DSO_MODE_3_GY;
  2906. break;
  2907. case LSM6DSO_MODE_4_GY_XL:
  2908. *val = LSM6DSO_MODE_4_GY_XL;
  2909. break;
  2910. default:
  2911. *val = LSM6DSO_AUX_DISABLE;
  2912. break;
  2913. }
  2914. return ret;
  2915. }
  2916. /**
  2917. * @brief Selects gyroscope OIS chain full-scale.[set]
  2918. *
  2919. * @param ctx read / write interface definitions
  2920. * @param val change the values of fs_g_ois in reg CTRL1_OIS
  2921. * @retval interface status (MANDATORY: return 0 -> no Error)
  2922. *
  2923. */
  2924. int32_t lsm6dso_aux_gy_full_scale_set(stmdev_ctx_t *ctx,
  2925. lsm6dso_fs_g_ois_t val)
  2926. {
  2927. lsm6dso_ctrl1_ois_t reg;
  2928. int32_t ret;
  2929. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2930. if (ret == 0)
  2931. {
  2932. reg.fs_g_ois = (uint8_t)val;
  2933. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2934. }
  2935. return ret;
  2936. }
  2937. /**
  2938. * @brief Selects gyroscope OIS chain full-scale.[get]
  2939. *
  2940. * @param ctx read / write interface definitions
  2941. * @param val Get the values of fs_g_ois in reg CTRL1_OIS
  2942. * @retval interface status (MANDATORY: return 0 -> no Error)
  2943. *
  2944. */
  2945. int32_t lsm6dso_aux_gy_full_scale_get(stmdev_ctx_t *ctx,
  2946. lsm6dso_fs_g_ois_t *val)
  2947. {
  2948. lsm6dso_ctrl1_ois_t reg;
  2949. int32_t ret;
  2950. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2951. switch (reg.fs_g_ois)
  2952. {
  2953. case LSM6DSO_250dps_AUX:
  2954. *val = LSM6DSO_250dps_AUX;
  2955. break;
  2956. case LSM6DSO_125dps_AUX:
  2957. *val = LSM6DSO_125dps_AUX;
  2958. break;
  2959. case LSM6DSO_500dps_AUX:
  2960. *val = LSM6DSO_500dps_AUX;
  2961. break;
  2962. case LSM6DSO_1000dps_AUX:
  2963. *val = LSM6DSO_1000dps_AUX;
  2964. break;
  2965. case LSM6DSO_2000dps_AUX:
  2966. *val = LSM6DSO_2000dps_AUX;
  2967. break;
  2968. default:
  2969. *val = LSM6DSO_250dps_AUX;
  2970. break;
  2971. }
  2972. return ret;
  2973. }
  2974. /**
  2975. * @brief SPI2 3- or 4-wire interface.[set]
  2976. *
  2977. * @param ctx read / write interface definitions
  2978. * @param val change the values of sim_ois in reg CTRL1_OIS
  2979. * @retval interface status (MANDATORY: return 0 -> no Error)
  2980. *
  2981. */
  2982. int32_t lsm6dso_aux_spi_mode_set(stmdev_ctx_t *ctx,
  2983. lsm6dso_sim_ois_t val)
  2984. {
  2985. lsm6dso_ctrl1_ois_t reg;
  2986. int32_t ret;
  2987. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2988. if (ret == 0)
  2989. {
  2990. reg.sim_ois = (uint8_t)val;
  2991. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  2992. }
  2993. return ret;
  2994. }
  2995. /**
  2996. * @brief SPI2 3- or 4-wire interface.[get]
  2997. *
  2998. * @param ctx read / write interface definitions
  2999. * @param val Get the values of sim_ois in reg CTRL1_OIS
  3000. * @retval interface status (MANDATORY: return 0 -> no Error)
  3001. *
  3002. */
  3003. int32_t lsm6dso_aux_spi_mode_get(stmdev_ctx_t *ctx,
  3004. lsm6dso_sim_ois_t *val)
  3005. {
  3006. lsm6dso_ctrl1_ois_t reg;
  3007. int32_t ret;
  3008. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t *)&reg, 1);
  3009. switch (reg.sim_ois)
  3010. {
  3011. case LSM6DSO_AUX_SPI_4_WIRE:
  3012. *val = LSM6DSO_AUX_SPI_4_WIRE;
  3013. break;
  3014. case LSM6DSO_AUX_SPI_3_WIRE:
  3015. *val = LSM6DSO_AUX_SPI_3_WIRE;
  3016. break;
  3017. default:
  3018. *val = LSM6DSO_AUX_SPI_4_WIRE;
  3019. break;
  3020. }
  3021. return ret;
  3022. }
  3023. /**
  3024. * @brief Selects gyroscope digital LPF1 filter bandwidth.[set]
  3025. *
  3026. * @param ctx read / write interface definitions
  3027. * @param val change the values of ftype_ois in
  3028. * reg CTRL2_OIS
  3029. * @retval interface status (MANDATORY: return 0 -> no Error)
  3030. *
  3031. */
  3032. int32_t lsm6dso_aux_gy_lp1_bandwidth_set(stmdev_ctx_t *ctx,
  3033. lsm6dso_ftype_ois_t val)
  3034. {
  3035. lsm6dso_ctrl2_ois_t reg;
  3036. int32_t ret;
  3037. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t *)&reg, 1);
  3038. if (ret == 0)
  3039. {
  3040. reg.ftype_ois = (uint8_t)val;
  3041. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t *)&reg, 1);
  3042. }
  3043. return ret;
  3044. }
  3045. /**
  3046. * @brief Selects gyroscope digital LPF1 filter bandwidth.[get]
  3047. *
  3048. * @param ctx read / write interface definitions
  3049. * @param val Get the values of ftype_ois in reg CTRL2_OIS
  3050. * @retval interface status (MANDATORY: return 0 -> no Error)
  3051. *
  3052. */
  3053. int32_t lsm6dso_aux_gy_lp1_bandwidth_get(stmdev_ctx_t *ctx,
  3054. lsm6dso_ftype_ois_t *val)
  3055. {
  3056. lsm6dso_ctrl2_ois_t reg;
  3057. int32_t ret;
  3058. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t *)&reg, 1);
  3059. switch (reg.ftype_ois)
  3060. {
  3061. case LSM6DSO_351Hz39:
  3062. *val = LSM6DSO_351Hz39;
  3063. break;
  3064. case LSM6DSO_236Hz63:
  3065. *val = LSM6DSO_236Hz63;
  3066. break;
  3067. case LSM6DSO_172Hz70:
  3068. *val = LSM6DSO_172Hz70;
  3069. break;
  3070. case LSM6DSO_937Hz91:
  3071. *val = LSM6DSO_937Hz91;
  3072. break;
  3073. default:
  3074. *val = LSM6DSO_351Hz39;
  3075. break;
  3076. }
  3077. return ret;
  3078. }
  3079. /**
  3080. * @brief Selects gyroscope OIS chain digital high-pass filter cutoff.[set]
  3081. *
  3082. * @param ctx read / write interface definitions
  3083. * @param val change the values of hpm_ois in reg CTRL2_OIS
  3084. * @retval interface status (MANDATORY: return 0 -> no Error)
  3085. *
  3086. */
  3087. int32_t lsm6dso_aux_gy_hp_bandwidth_set(stmdev_ctx_t *ctx,
  3088. lsm6dso_hpm_ois_t val)
  3089. {
  3090. lsm6dso_ctrl2_ois_t reg;
  3091. int32_t ret;
  3092. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t *)&reg, 1);
  3093. if (ret == 0)
  3094. {
  3095. reg.hpm_ois = (uint8_t)val & 0x03U;
  3096. reg.hp_en_ois = ((uint8_t)val & 0x10U) >> 4;
  3097. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t *)&reg, 1);
  3098. }
  3099. return ret;
  3100. }
  3101. /**
  3102. * @brief Selects gyroscope OIS chain digital high-pass filter cutoff.[get]
  3103. *
  3104. * @param ctx read / write interface definitions
  3105. * @param val Get the values of hpm_ois in reg CTRL2_OIS
  3106. * @retval interface status (MANDATORY: return 0 -> no Error)
  3107. *
  3108. */
  3109. int32_t lsm6dso_aux_gy_hp_bandwidth_get(stmdev_ctx_t *ctx,
  3110. lsm6dso_hpm_ois_t *val)
  3111. {
  3112. lsm6dso_ctrl2_ois_t reg;
  3113. int32_t ret;
  3114. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t *)&reg, 1);
  3115. switch ((reg.hp_en_ois << 4) | reg.hpm_ois)
  3116. {
  3117. case LSM6DSO_AUX_HP_DISABLE:
  3118. *val = LSM6DSO_AUX_HP_DISABLE;
  3119. break;
  3120. case LSM6DSO_AUX_HP_Hz016:
  3121. *val = LSM6DSO_AUX_HP_Hz016;
  3122. break;
  3123. case LSM6DSO_AUX_HP_Hz065:
  3124. *val = LSM6DSO_AUX_HP_Hz065;
  3125. break;
  3126. case LSM6DSO_AUX_HP_Hz260:
  3127. *val = LSM6DSO_AUX_HP_Hz260;
  3128. break;
  3129. case LSM6DSO_AUX_HP_1Hz040:
  3130. *val = LSM6DSO_AUX_HP_1Hz040;
  3131. break;
  3132. default:
  3133. *val = LSM6DSO_AUX_HP_DISABLE;
  3134. break;
  3135. }
  3136. return ret;
  3137. }
  3138. /**
  3139. * @brief Enable / Disables OIS chain clamp.
  3140. * Enable: All OIS chain outputs = 8000h
  3141. * during self-test; Disable: OIS chain self-test
  3142. * outputs dependent from the aux gyro full
  3143. * scale selected.[set]
  3144. *
  3145. * @param ctx read / write interface definitions
  3146. * @param val change the values of st_ois_clampdis in
  3147. * reg CTRL3_OIS
  3148. * @retval interface status (MANDATORY: return 0 -> no Error)
  3149. *
  3150. */
  3151. int32_t lsm6dso_aux_gy_clamp_set(stmdev_ctx_t *ctx,
  3152. lsm6dso_st_ois_clampdis_t val)
  3153. {
  3154. lsm6dso_ctrl3_ois_t reg;
  3155. int32_t ret;
  3156. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3157. if (ret == 0)
  3158. {
  3159. reg.st_ois_clampdis = (uint8_t)val;
  3160. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3161. }
  3162. return ret;
  3163. }
  3164. /**
  3165. * @brief Enable / Disables OIS chain clamp.
  3166. * Enable: All OIS chain outputs = 8000h
  3167. * during self-test; Disable: OIS chain self-test
  3168. * outputs dependent from the aux gyro full
  3169. * scale selected.[set]
  3170. *
  3171. * @param ctx read / write interface definitions
  3172. * @param val Get the values of st_ois_clampdis in
  3173. * reg CTRL3_OIS
  3174. * @retval interface status (MANDATORY: return 0 -> no Error)
  3175. *
  3176. */
  3177. int32_t lsm6dso_aux_gy_clamp_get(stmdev_ctx_t *ctx,
  3178. lsm6dso_st_ois_clampdis_t *val)
  3179. {
  3180. lsm6dso_ctrl3_ois_t reg;
  3181. int32_t ret;
  3182. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3183. switch (reg.st_ois_clampdis)
  3184. {
  3185. case LSM6DSO_ENABLE_CLAMP:
  3186. *val = LSM6DSO_ENABLE_CLAMP;
  3187. break;
  3188. case LSM6DSO_DISABLE_CLAMP:
  3189. *val = LSM6DSO_DISABLE_CLAMP;
  3190. break;
  3191. default:
  3192. *val = LSM6DSO_ENABLE_CLAMP;
  3193. break;
  3194. }
  3195. return ret;
  3196. }
  3197. /**
  3198. * @brief Selects gyroscope OIS chain self-test.[set]
  3199. *
  3200. * @param ctx read / write interface definitions
  3201. * @param val change the values of st_ois in reg CTRL3_OIS
  3202. * @retval interface status (MANDATORY: return 0 -> no Error)
  3203. *
  3204. */
  3205. int32_t lsm6dso_aux_gy_self_test_set(stmdev_ctx_t *ctx,
  3206. lsm6dso_st_ois_t val)
  3207. {
  3208. lsm6dso_ctrl3_ois_t reg;
  3209. int32_t ret;
  3210. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3211. if (ret == 0)
  3212. {
  3213. reg.st_ois = (uint8_t)val;
  3214. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3215. }
  3216. return ret;
  3217. }
  3218. /**
  3219. * @brief Selects gyroscope OIS chain self-test.[get]
  3220. *
  3221. * @param ctx read / write interface definitions
  3222. * @param val Get the values of st_ois in reg CTRL3_OIS
  3223. * @retval interface status (MANDATORY: return 0 -> no Error)
  3224. *
  3225. */
  3226. int32_t lsm6dso_aux_gy_self_test_get(stmdev_ctx_t *ctx,
  3227. lsm6dso_st_ois_t *val)
  3228. {
  3229. lsm6dso_ctrl3_ois_t reg;
  3230. int32_t ret;
  3231. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3232. switch (reg.st_ois)
  3233. {
  3234. case LSM6DSO_AUX_GY_DISABLE:
  3235. *val = LSM6DSO_AUX_GY_DISABLE;
  3236. break;
  3237. case LSM6DSO_AUX_GY_POS:
  3238. *val = LSM6DSO_AUX_GY_POS;
  3239. break;
  3240. case LSM6DSO_AUX_GY_NEG:
  3241. *val = LSM6DSO_AUX_GY_NEG;
  3242. break;
  3243. default:
  3244. *val = LSM6DSO_AUX_GY_DISABLE;
  3245. break;
  3246. }
  3247. return ret;
  3248. }
  3249. /**
  3250. * @brief Selects accelerometer OIS channel bandwidth.[set]
  3251. *
  3252. * @param ctx read / write interface definitions
  3253. * @param val change the values of
  3254. * filter_xl_conf_ois in reg CTRL3_OIS
  3255. * @retval interface status (MANDATORY: return 0 -> no Error)
  3256. *
  3257. */
  3258. int32_t lsm6dso_aux_xl_bandwidth_set(stmdev_ctx_t *ctx,
  3259. lsm6dso_filter_xl_conf_ois_t val)
  3260. {
  3261. lsm6dso_ctrl3_ois_t reg;
  3262. int32_t ret;
  3263. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3264. if (ret == 0)
  3265. {
  3266. reg.filter_xl_conf_ois = (uint8_t)val;
  3267. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3268. }
  3269. return ret;
  3270. }
  3271. /**
  3272. * @brief Selects accelerometer OIS channel bandwidth.[get]
  3273. *
  3274. * @param ctx read / write interface definitions
  3275. * @param val Get the values of
  3276. * filter_xl_conf_ois in reg CTRL3_OIS
  3277. * @retval interface status (MANDATORY: return 0 -> no Error)
  3278. *
  3279. */
  3280. int32_t lsm6dso_aux_xl_bandwidth_get(stmdev_ctx_t *ctx,
  3281. lsm6dso_filter_xl_conf_ois_t *val)
  3282. {
  3283. lsm6dso_ctrl3_ois_t reg;
  3284. int32_t ret;
  3285. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3286. switch (reg.filter_xl_conf_ois)
  3287. {
  3288. case LSM6DSO_289Hz:
  3289. *val = LSM6DSO_289Hz;
  3290. break;
  3291. case LSM6DSO_258Hz:
  3292. *val = LSM6DSO_258Hz;
  3293. break;
  3294. case LSM6DSO_120Hz:
  3295. *val = LSM6DSO_120Hz;
  3296. break;
  3297. case LSM6DSO_65Hz2:
  3298. *val = LSM6DSO_65Hz2;
  3299. break;
  3300. case LSM6DSO_33Hz2:
  3301. *val = LSM6DSO_33Hz2;
  3302. break;
  3303. case LSM6DSO_16Hz6:
  3304. *val = LSM6DSO_16Hz6;
  3305. break;
  3306. case LSM6DSO_8Hz30:
  3307. *val = LSM6DSO_8Hz30;
  3308. break;
  3309. case LSM6DSO_4Hz15:
  3310. *val = LSM6DSO_4Hz15;
  3311. break;
  3312. default:
  3313. *val = LSM6DSO_289Hz;
  3314. break;
  3315. }
  3316. return ret;
  3317. }
  3318. /**
  3319. * @brief Selects accelerometer OIS channel full-scale.[set]
  3320. *
  3321. * @param ctx read / write interface definitions
  3322. * @param val change the values of fs_xl_ois in
  3323. * reg CTRL3_OIS
  3324. * @retval interface status (MANDATORY: return 0 -> no Error)
  3325. *
  3326. */
  3327. int32_t lsm6dso_aux_xl_full_scale_set(stmdev_ctx_t *ctx,
  3328. lsm6dso_fs_xl_ois_t val)
  3329. {
  3330. lsm6dso_ctrl3_ois_t reg;
  3331. int32_t ret;
  3332. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3333. if (ret == 0)
  3334. {
  3335. reg.fs_xl_ois = (uint8_t)val;
  3336. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3337. }
  3338. return ret;
  3339. }
  3340. /**
  3341. * @brief Selects accelerometer OIS channel full-scale.[get]
  3342. *
  3343. * @param ctx read / write interface definitions
  3344. * @param val Get the values of fs_xl_ois in reg CTRL3_OIS
  3345. * @retval interface status (MANDATORY: return 0 -> no Error)
  3346. *
  3347. */
  3348. int32_t lsm6dso_aux_xl_full_scale_get(stmdev_ctx_t *ctx,
  3349. lsm6dso_fs_xl_ois_t *val)
  3350. {
  3351. lsm6dso_ctrl3_ois_t reg;
  3352. int32_t ret;
  3353. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t *)&reg, 1);
  3354. switch (reg.fs_xl_ois)
  3355. {
  3356. case LSM6DSO_AUX_2g:
  3357. *val = LSM6DSO_AUX_2g;
  3358. break;
  3359. case LSM6DSO_AUX_16g:
  3360. *val = LSM6DSO_AUX_16g;
  3361. break;
  3362. case LSM6DSO_AUX_4g:
  3363. *val = LSM6DSO_AUX_4g;
  3364. break;
  3365. case LSM6DSO_AUX_8g:
  3366. *val = LSM6DSO_AUX_8g;
  3367. break;
  3368. default:
  3369. *val = LSM6DSO_AUX_2g;
  3370. break;
  3371. }
  3372. return ret;
  3373. }
  3374. /**
  3375. * @}
  3376. *
  3377. */
  3378. /**
  3379. * @defgroup LSM6DSO_ main_serial_interface
  3380. * @brief This section groups all the functions concerning main
  3381. * serial interface management (not auxiliary)
  3382. * @{
  3383. *
  3384. */
  3385. /**
  3386. * @brief Connect/Disconnect SDO/SA0 internal pull-up.[set]
  3387. *
  3388. * @param ctx read / write interface definitions
  3389. * @param val change the values of sdo_pu_en in
  3390. * reg PIN_CTRL
  3391. * @retval interface status (MANDATORY: return 0 -> no Error)
  3392. *
  3393. */
  3394. int32_t lsm6dso_sdo_sa0_mode_set(stmdev_ctx_t *ctx,
  3395. lsm6dso_sdo_pu_en_t val)
  3396. {
  3397. lsm6dso_pin_ctrl_t reg;
  3398. int32_t ret;
  3399. ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&reg, 1);
  3400. if (ret == 0)
  3401. {
  3402. reg.sdo_pu_en = (uint8_t)val;
  3403. ret = lsm6dso_write_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&reg, 1);
  3404. }
  3405. return ret;
  3406. }
  3407. /**
  3408. * @brief Connect/Disconnect SDO/SA0 internal pull-up.[get]
  3409. *
  3410. * @param ctx read / write interface definitions
  3411. * @param val Get the values of sdo_pu_en in reg PIN_CTRL
  3412. * @retval interface status (MANDATORY: return 0 -> no Error)
  3413. *
  3414. */
  3415. int32_t lsm6dso_sdo_sa0_mode_get(stmdev_ctx_t *ctx,
  3416. lsm6dso_sdo_pu_en_t *val)
  3417. {
  3418. lsm6dso_pin_ctrl_t reg;
  3419. int32_t ret;
  3420. ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&reg, 1);
  3421. switch (reg.sdo_pu_en)
  3422. {
  3423. case LSM6DSO_PULL_UP_DISC:
  3424. *val = LSM6DSO_PULL_UP_DISC;
  3425. break;
  3426. case LSM6DSO_PULL_UP_CONNECT:
  3427. *val = LSM6DSO_PULL_UP_CONNECT;
  3428. break;
  3429. default:
  3430. *val = LSM6DSO_PULL_UP_DISC;
  3431. break;
  3432. }
  3433. return ret;
  3434. }
  3435. /**
  3436. * @brief SPI Serial Interface Mode selection.[set]
  3437. *
  3438. * @param ctx read / write interface definitions
  3439. * @param val change the values of sim in reg CTRL3_C
  3440. * @retval interface status (MANDATORY: return 0 -> no Error)
  3441. *
  3442. */
  3443. int32_t lsm6dso_spi_mode_set(stmdev_ctx_t *ctx, lsm6dso_sim_t val)
  3444. {
  3445. lsm6dso_ctrl3_c_t reg;
  3446. int32_t ret;
  3447. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3448. if (ret == 0)
  3449. {
  3450. reg.sim = (uint8_t)val;
  3451. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3452. }
  3453. return ret;
  3454. }
  3455. /**
  3456. * @brief SPI Serial Interface Mode selection.[get]
  3457. *
  3458. * @param ctx read / write interface definitions
  3459. * @param val Get the values of sim in reg CTRL3_C
  3460. * @retval interface status (MANDATORY: return 0 -> no Error)
  3461. *
  3462. */
  3463. int32_t lsm6dso_spi_mode_get(stmdev_ctx_t *ctx, lsm6dso_sim_t *val)
  3464. {
  3465. lsm6dso_ctrl3_c_t reg;
  3466. int32_t ret;
  3467. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3468. switch (reg.sim)
  3469. {
  3470. case LSM6DSO_SPI_4_WIRE:
  3471. *val = LSM6DSO_SPI_4_WIRE;
  3472. break;
  3473. case LSM6DSO_SPI_3_WIRE:
  3474. *val = LSM6DSO_SPI_3_WIRE;
  3475. break;
  3476. default:
  3477. *val = LSM6DSO_SPI_4_WIRE;
  3478. break;
  3479. }
  3480. return ret;
  3481. }
  3482. /**
  3483. * @brief Disable / Enable I2C interface.[set]
  3484. *
  3485. * @param ctx read / write interface definitions
  3486. * @param val change the values of i2c_disable in
  3487. * reg CTRL4_C
  3488. * @retval interface status (MANDATORY: return 0 -> no Error)
  3489. *
  3490. */
  3491. int32_t lsm6dso_i2c_interface_set(stmdev_ctx_t *ctx,
  3492. lsm6dso_i2c_disable_t val)
  3493. {
  3494. lsm6dso_ctrl4_c_t reg;
  3495. int32_t ret;
  3496. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  3497. if (ret == 0)
  3498. {
  3499. reg.i2c_disable = (uint8_t)val;
  3500. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  3501. }
  3502. return ret;
  3503. }
  3504. /**
  3505. * @brief Disable / Enable I2C interface.[get]
  3506. *
  3507. * @param ctx read / write interface definitions
  3508. * @param val Get the values of i2c_disable in
  3509. * reg CTRL4_C
  3510. * @retval interface status (MANDATORY: return 0 -> no Error)
  3511. *
  3512. */
  3513. int32_t lsm6dso_i2c_interface_get(stmdev_ctx_t *ctx,
  3514. lsm6dso_i2c_disable_t *val)
  3515. {
  3516. lsm6dso_ctrl4_c_t reg;
  3517. int32_t ret;
  3518. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  3519. switch (reg.i2c_disable)
  3520. {
  3521. case LSM6DSO_I2C_ENABLE:
  3522. *val = LSM6DSO_I2C_ENABLE;
  3523. break;
  3524. case LSM6DSO_I2C_DISABLE:
  3525. *val = LSM6DSO_I2C_DISABLE;
  3526. break;
  3527. default:
  3528. *val = LSM6DSO_I2C_ENABLE;
  3529. break;
  3530. }
  3531. return ret;
  3532. }
  3533. /**
  3534. * @brief I3C Enable/Disable communication protocol[.set]
  3535. *
  3536. * @param ctx read / write interface definitions
  3537. * @param val change the values of i3c_disable
  3538. * in reg CTRL9_XL
  3539. * @retval interface status (MANDATORY: return 0 -> no Error)
  3540. *
  3541. */
  3542. int32_t lsm6dso_i3c_disable_set(stmdev_ctx_t *ctx,
  3543. lsm6dso_i3c_disable_t val)
  3544. {
  3545. lsm6dso_i3c_bus_avb_t i3c_bus_avb;
  3546. lsm6dso_ctrl9_xl_t ctrl9_xl;
  3547. int32_t ret;
  3548. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
  3549. if (ret == 0)
  3550. {
  3551. ctrl9_xl.i3c_disable = ((uint8_t)val & 0x80U) >> 7;
  3552. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
  3553. }
  3554. if (ret == 0)
  3555. {
  3556. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  3557. (uint8_t *)&i3c_bus_avb, 1);
  3558. }
  3559. if (ret == 0)
  3560. {
  3561. i3c_bus_avb.i3c_bus_avb_sel = (uint8_t)val & 0x03U;
  3562. ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  3563. (uint8_t *)&i3c_bus_avb, 1);
  3564. }
  3565. return ret;
  3566. }
  3567. /**
  3568. * @brief I3C Enable/Disable communication protocol.[get]
  3569. *
  3570. * @param ctx read / write interface definitions
  3571. * @param val change the values of i3c_disable in
  3572. * reg CTRL9_XL
  3573. * @retval interface status (MANDATORY: return 0 -> no Error)
  3574. *
  3575. */
  3576. int32_t lsm6dso_i3c_disable_get(stmdev_ctx_t *ctx,
  3577. lsm6dso_i3c_disable_t *val)
  3578. {
  3579. lsm6dso_ctrl9_xl_t ctrl9_xl;
  3580. lsm6dso_i3c_bus_avb_t i3c_bus_avb;
  3581. int32_t ret;
  3582. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
  3583. if (ret == 0)
  3584. {
  3585. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  3586. (uint8_t *)&i3c_bus_avb, 1);
  3587. switch ((ctrl9_xl.i3c_disable << 7) | i3c_bus_avb.i3c_bus_avb_sel)
  3588. {
  3589. case LSM6DSO_I3C_DISABLE:
  3590. *val = LSM6DSO_I3C_DISABLE;
  3591. break;
  3592. case LSM6DSO_I3C_ENABLE_T_50us:
  3593. *val = LSM6DSO_I3C_ENABLE_T_50us;
  3594. break;
  3595. case LSM6DSO_I3C_ENABLE_T_2us:
  3596. *val = LSM6DSO_I3C_ENABLE_T_2us;
  3597. break;
  3598. case LSM6DSO_I3C_ENABLE_T_1ms:
  3599. *val = LSM6DSO_I3C_ENABLE_T_1ms;
  3600. break;
  3601. case LSM6DSO_I3C_ENABLE_T_25ms:
  3602. *val = LSM6DSO_I3C_ENABLE_T_25ms;
  3603. break;
  3604. default:
  3605. *val = LSM6DSO_I3C_DISABLE;
  3606. break;
  3607. }
  3608. }
  3609. return ret;
  3610. }
  3611. /**
  3612. * @}
  3613. *
  3614. */
  3615. /**
  3616. * @defgroup LSM6DSO_interrupt_pins
  3617. * @brief This section groups all the functions that manage interrupt pins
  3618. * @{
  3619. *
  3620. */
  3621. /**
  3622. * @brief Connect/Disconnect INT1 internal pull-down.[set]
  3623. *
  3624. * @param ctx read / write interface definitions
  3625. * @param val change the values of pd_dis_int1 in reg I3C_BUS_AVB
  3626. * @retval interface status (MANDATORY: return 0 -> no Error)
  3627. *
  3628. */
  3629. int32_t lsm6dso_int1_mode_set(stmdev_ctx_t *ctx,
  3630. lsm6dso_int1_pd_en_t val)
  3631. {
  3632. lsm6dso_i3c_bus_avb_t reg;
  3633. int32_t ret;
  3634. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB, (uint8_t *)&reg, 1);
  3635. if (ret == 0)
  3636. {
  3637. reg.pd_dis_int1 = (uint8_t)val;
  3638. ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB, (uint8_t *)&reg, 1);
  3639. }
  3640. return ret;
  3641. }
  3642. /**
  3643. * @brief Connect/Disconnect INT1 internal pull-down.[get]
  3644. *
  3645. * @param ctx read / write interface definitions
  3646. * @param val Get the values of pd_dis_int1 in reg I3C_BUS_AVB
  3647. * @retval interface status (MANDATORY: return 0 -> no Error)
  3648. *
  3649. */
  3650. int32_t lsm6dso_int1_mode_get(stmdev_ctx_t *ctx,
  3651. lsm6dso_int1_pd_en_t *val)
  3652. {
  3653. lsm6dso_i3c_bus_avb_t reg;
  3654. int32_t ret;
  3655. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB, (uint8_t *)&reg, 1);
  3656. switch (reg.pd_dis_int1)
  3657. {
  3658. case LSM6DSO_PULL_DOWN_DISC:
  3659. *val = LSM6DSO_PULL_DOWN_DISC;
  3660. break;
  3661. case LSM6DSO_PULL_DOWN_CONNECT:
  3662. *val = LSM6DSO_PULL_DOWN_CONNECT;
  3663. break;
  3664. default:
  3665. *val = LSM6DSO_PULL_DOWN_DISC;
  3666. break;
  3667. }
  3668. return ret;
  3669. }
  3670. /**
  3671. * @brief Push-pull/open drain selection on interrupt pads.[set]
  3672. *
  3673. * @param ctx read / write interface definitions
  3674. * @param val change the values of pp_od in reg CTRL3_C
  3675. * @retval interface status (MANDATORY: return 0 -> no Error)
  3676. *
  3677. */
  3678. int32_t lsm6dso_pin_mode_set(stmdev_ctx_t *ctx, lsm6dso_pp_od_t val)
  3679. {
  3680. lsm6dso_ctrl3_c_t reg;
  3681. int32_t ret;
  3682. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3683. if (ret == 0)
  3684. {
  3685. reg.pp_od = (uint8_t)val;
  3686. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3687. }
  3688. return ret;
  3689. }
  3690. /**
  3691. * @brief Push-pull/open drain selection on interrupt pads.[get]
  3692. *
  3693. * @param ctx read / write interface definitions
  3694. * @param val Get the values of pp_od in reg CTRL3_C
  3695. * @retval interface status (MANDATORY: return 0 -> no Error)
  3696. *
  3697. */
  3698. int32_t lsm6dso_pin_mode_get(stmdev_ctx_t *ctx, lsm6dso_pp_od_t *val)
  3699. {
  3700. lsm6dso_ctrl3_c_t reg;
  3701. int32_t ret;
  3702. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3703. switch (reg.pp_od)
  3704. {
  3705. case LSM6DSO_PUSH_PULL:
  3706. *val = LSM6DSO_PUSH_PULL;
  3707. break;
  3708. case LSM6DSO_OPEN_DRAIN:
  3709. *val = LSM6DSO_OPEN_DRAIN;
  3710. break;
  3711. default:
  3712. *val = LSM6DSO_PUSH_PULL;
  3713. break;
  3714. }
  3715. return ret;
  3716. }
  3717. /**
  3718. * @brief Interrupt active-high/low.[set]
  3719. *
  3720. * @param ctx read / write interface definitions
  3721. * @param val change the values of h_lactive in reg CTRL3_C
  3722. * @retval interface status (MANDATORY: return 0 -> no Error)
  3723. *
  3724. */
  3725. int32_t lsm6dso_pin_polarity_set(stmdev_ctx_t *ctx,
  3726. lsm6dso_h_lactive_t val)
  3727. {
  3728. lsm6dso_ctrl3_c_t reg;
  3729. int32_t ret;
  3730. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3731. if (ret == 0)
  3732. {
  3733. reg.h_lactive = (uint8_t)val;
  3734. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3735. }
  3736. return ret;
  3737. }
  3738. /**
  3739. * @brief Interrupt active-high/low.[get]
  3740. *
  3741. * @param ctx read / write interface definitions
  3742. * @param val Get the values of h_lactive in reg CTRL3_C
  3743. * @retval interface status (MANDATORY: return 0 -> no Error)
  3744. *
  3745. */
  3746. int32_t lsm6dso_pin_polarity_get(stmdev_ctx_t *ctx,
  3747. lsm6dso_h_lactive_t *val)
  3748. {
  3749. lsm6dso_ctrl3_c_t reg;
  3750. int32_t ret;
  3751. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&reg, 1);
  3752. switch (reg.h_lactive)
  3753. {
  3754. case LSM6DSO_ACTIVE_HIGH:
  3755. *val = LSM6DSO_ACTIVE_HIGH;
  3756. break;
  3757. case LSM6DSO_ACTIVE_LOW:
  3758. *val = LSM6DSO_ACTIVE_LOW;
  3759. break;
  3760. default:
  3761. *val = LSM6DSO_ACTIVE_HIGH;
  3762. break;
  3763. }
  3764. return ret;
  3765. }
  3766. /**
  3767. * @brief All interrupt signals become available on INT1 pin.[set]
  3768. *
  3769. * @param ctx read / write interface definitions
  3770. * @param val change the values of int2_on_int1 in reg CTRL4_C
  3771. * @retval interface status (MANDATORY: return 0 -> no Error)
  3772. *
  3773. */
  3774. int32_t lsm6dso_all_on_int1_set(stmdev_ctx_t *ctx, uint8_t val)
  3775. {
  3776. lsm6dso_ctrl4_c_t reg;
  3777. int32_t ret;
  3778. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  3779. if (ret == 0)
  3780. {
  3781. reg.int2_on_int1 = val;
  3782. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  3783. }
  3784. return ret;
  3785. }
  3786. /**
  3787. * @brief All interrupt signals become available on INT1 pin.[get]
  3788. *
  3789. * @param ctx read / write interface definitions
  3790. * @param val change the values of int2_on_int1 in reg CTRL4_C
  3791. * @retval interface status (MANDATORY: return 0 -> no Error)
  3792. *
  3793. */
  3794. int32_t lsm6dso_all_on_int1_get(stmdev_ctx_t *ctx, uint8_t *val)
  3795. {
  3796. lsm6dso_ctrl4_c_t reg;
  3797. int32_t ret;
  3798. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  3799. *val = reg.int2_on_int1;
  3800. return ret;
  3801. }
  3802. /**
  3803. * @brief Interrupt notification mode.[set]
  3804. *
  3805. * @param ctx read / write interface definitions
  3806. * @param val change the values of lir in reg TAP_CFG0
  3807. * @retval interface status (MANDATORY: return 0 -> no Error)
  3808. *
  3809. */
  3810. int32_t lsm6dso_int_notification_set(stmdev_ctx_t *ctx,
  3811. lsm6dso_lir_t val)
  3812. {
  3813. lsm6dso_tap_cfg0_t tap_cfg0;
  3814. lsm6dso_page_rw_t page_rw;
  3815. int32_t ret;
  3816. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *) &tap_cfg0, 1);
  3817. if (ret == 0)
  3818. {
  3819. tap_cfg0.lir = (uint8_t)val & 0x01U;
  3820. tap_cfg0.int_clr_on_read = (uint8_t)val & 0x01U;
  3821. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *) &tap_cfg0, 1);
  3822. }
  3823. if (ret == 0)
  3824. {
  3825. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  3826. }
  3827. if (ret == 0)
  3828. {
  3829. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  3830. }
  3831. if (ret == 0)
  3832. {
  3833. page_rw.emb_func_lir = ((uint8_t)val & 0x02U) >> 1;
  3834. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  3835. }
  3836. if (ret == 0)
  3837. {
  3838. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  3839. }
  3840. return ret;
  3841. }
  3842. /**
  3843. * @brief Interrupt notification mode.[get]
  3844. *
  3845. * @param ctx read / write interface definitions
  3846. * @param val Get the values of lir in reg TAP_CFG0
  3847. * @retval interface status (MANDATORY: return 0 -> no Error)
  3848. *
  3849. */
  3850. int32_t lsm6dso_int_notification_get(stmdev_ctx_t *ctx,
  3851. lsm6dso_lir_t *val)
  3852. {
  3853. lsm6dso_tap_cfg0_t tap_cfg0;
  3854. lsm6dso_page_rw_t page_rw;
  3855. int32_t ret;
  3856. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *) &tap_cfg0, 1);
  3857. if (ret == 0)
  3858. {
  3859. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  3860. }
  3861. if (ret == 0)
  3862. {
  3863. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  3864. }
  3865. if (ret == 0)
  3866. {
  3867. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  3868. }
  3869. if (ret == 0)
  3870. {
  3871. switch ((page_rw.emb_func_lir << 1) | tap_cfg0.lir)
  3872. {
  3873. case LSM6DSO_ALL_INT_PULSED:
  3874. *val = LSM6DSO_ALL_INT_PULSED;
  3875. break;
  3876. case LSM6DSO_BASE_LATCHED_EMB_PULSED:
  3877. *val = LSM6DSO_BASE_LATCHED_EMB_PULSED;
  3878. break;
  3879. case LSM6DSO_BASE_PULSED_EMB_LATCHED:
  3880. *val = LSM6DSO_BASE_PULSED_EMB_LATCHED;
  3881. break;
  3882. case LSM6DSO_ALL_INT_LATCHED:
  3883. *val = LSM6DSO_ALL_INT_LATCHED;
  3884. break;
  3885. default:
  3886. *val = LSM6DSO_ALL_INT_PULSED;
  3887. break;
  3888. }
  3889. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  3890. }
  3891. if (ret == 0)
  3892. {
  3893. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  3894. }
  3895. if (ret == 0)
  3896. {
  3897. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  3898. }
  3899. return ret;
  3900. }
  3901. /**
  3902. * @}
  3903. *
  3904. */
  3905. /**
  3906. * @defgroup LSM6DSO_Wake_Up_event
  3907. * @brief This section groups all the functions that manage the Wake Up
  3908. * event generation.
  3909. * @{
  3910. *
  3911. */
  3912. /**
  3913. * @brief Weight of 1 LSB of wakeup threshold.[set]
  3914. * 0: 1 LSB =FS_XL / 64
  3915. * 1: 1 LSB = FS_XL / 256
  3916. *
  3917. * @param ctx read / write interface definitions
  3918. * @param val change the values of wake_ths_w in
  3919. * reg WAKE_UP_DUR
  3920. * @retval interface status (MANDATORY: return 0 -> no Error)
  3921. *
  3922. */
  3923. int32_t lsm6dso_wkup_ths_weight_set(stmdev_ctx_t *ctx,
  3924. lsm6dso_wake_ths_w_t val)
  3925. {
  3926. lsm6dso_wake_up_dur_t reg;
  3927. int32_t ret;
  3928. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  3929. if (ret == 0)
  3930. {
  3931. reg.wake_ths_w = (uint8_t)val;
  3932. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  3933. }
  3934. return ret;
  3935. }
  3936. /**
  3937. * @brief Weight of 1 LSB of wakeup threshold.[get]
  3938. * 0: 1 LSB =FS_XL / 64
  3939. * 1: 1 LSB = FS_XL / 256
  3940. *
  3941. * @param ctx read / write interface definitions
  3942. * @param val Get the values of wake_ths_w in
  3943. * reg WAKE_UP_DUR
  3944. * @retval interface status (MANDATORY: return 0 -> no Error)
  3945. *
  3946. */
  3947. int32_t lsm6dso_wkup_ths_weight_get(stmdev_ctx_t *ctx,
  3948. lsm6dso_wake_ths_w_t *val)
  3949. {
  3950. lsm6dso_wake_up_dur_t reg;
  3951. int32_t ret;
  3952. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  3953. switch (reg.wake_ths_w)
  3954. {
  3955. case LSM6DSO_LSb_FS_DIV_64:
  3956. *val = LSM6DSO_LSb_FS_DIV_64;
  3957. break;
  3958. case LSM6DSO_LSb_FS_DIV_256:
  3959. *val = LSM6DSO_LSb_FS_DIV_256;
  3960. break;
  3961. default:
  3962. *val = LSM6DSO_LSb_FS_DIV_64;
  3963. break;
  3964. }
  3965. return ret;
  3966. }
  3967. /**
  3968. * @brief Threshold for wakeup: 1 LSB weight depends on WAKE_THS_W in
  3969. * WAKE_UP_DUR.[set]
  3970. *
  3971. * @param ctx read / write interface definitions
  3972. * @param val change the values of wk_ths in reg WAKE_UP_THS
  3973. * @retval interface status (MANDATORY: return 0 -> no Error)
  3974. *
  3975. */
  3976. int32_t lsm6dso_wkup_threshold_set(stmdev_ctx_t *ctx, uint8_t val)
  3977. {
  3978. lsm6dso_wake_up_ths_t reg;
  3979. int32_t ret;
  3980. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  3981. if (ret == 0)
  3982. {
  3983. reg.wk_ths = val;
  3984. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  3985. }
  3986. return ret;
  3987. }
  3988. /**
  3989. * @brief Threshold for wakeup: 1 LSB weight depends on WAKE_THS_W in
  3990. * WAKE_UP_DUR.[get]
  3991. *
  3992. * @param ctx read / write interface definitions
  3993. * @param val change the values of wk_ths in reg WAKE_UP_THS
  3994. * @retval interface status (MANDATORY: return 0 -> no Error)
  3995. *
  3996. */
  3997. int32_t lsm6dso_wkup_threshold_get(stmdev_ctx_t *ctx, uint8_t *val)
  3998. {
  3999. lsm6dso_wake_up_ths_t reg;
  4000. int32_t ret;
  4001. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4002. *val = reg.wk_ths;
  4003. return ret;
  4004. }
  4005. /**
  4006. * @brief Wake up duration event.[set]
  4007. * 1LSb = 1 / ODR
  4008. *
  4009. * @param ctx read / write interface definitions
  4010. * @param val change the values of usr_off_on_wu in reg WAKE_UP_THS
  4011. * @retval interface status (MANDATORY: return 0 -> no Error)
  4012. *
  4013. */
  4014. int32_t lsm6dso_xl_usr_offset_on_wkup_set(stmdev_ctx_t *ctx,
  4015. uint8_t val)
  4016. {
  4017. lsm6dso_wake_up_ths_t reg;
  4018. int32_t ret;
  4019. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4020. if (ret == 0)
  4021. {
  4022. reg.usr_off_on_wu = val;
  4023. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4024. }
  4025. return ret;
  4026. }
  4027. /**
  4028. * @brief Wake up duration event.[get]
  4029. * 1LSb = 1 / ODR
  4030. *
  4031. * @param ctx read / write interface definitions
  4032. * @param val change the values of usr_off_on_wu in reg WAKE_UP_THS
  4033. * @retval interface status (MANDATORY: return 0 -> no Error)
  4034. *
  4035. */
  4036. int32_t lsm6dso_xl_usr_offset_on_wkup_get(stmdev_ctx_t *ctx,
  4037. uint8_t *val)
  4038. {
  4039. lsm6dso_wake_up_ths_t reg;
  4040. int32_t ret;
  4041. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4042. *val = reg.usr_off_on_wu;
  4043. return ret;
  4044. }
  4045. /**
  4046. * @brief Wake up duration event.[set]
  4047. * 1LSb = 1 / ODR
  4048. *
  4049. * @param ctx read / write interface definitions
  4050. * @param val change the values of wake_dur in reg WAKE_UP_DUR
  4051. * @retval interface status (MANDATORY: return 0 -> no Error)
  4052. *
  4053. */
  4054. int32_t lsm6dso_wkup_dur_set(stmdev_ctx_t *ctx, uint8_t val)
  4055. {
  4056. lsm6dso_wake_up_dur_t reg;
  4057. int32_t ret;
  4058. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  4059. if (ret == 0)
  4060. {
  4061. reg.wake_dur = val;
  4062. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  4063. }
  4064. return ret;
  4065. }
  4066. /**
  4067. * @brief Wake up duration event.[get]
  4068. * 1LSb = 1 / ODR
  4069. *
  4070. * @param ctx read / write interface definitions
  4071. * @param val change the values of wake_dur in reg WAKE_UP_DUR
  4072. * @retval interface status (MANDATORY: return 0 -> no Error)
  4073. *
  4074. */
  4075. int32_t lsm6dso_wkup_dur_get(stmdev_ctx_t *ctx, uint8_t *val)
  4076. {
  4077. lsm6dso_wake_up_dur_t reg;
  4078. int32_t ret;
  4079. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  4080. *val = reg.wake_dur;
  4081. return ret;
  4082. }
  4083. /**
  4084. * @}
  4085. *
  4086. */
  4087. /**
  4088. * @defgroup LSM6DSO_ Activity/Inactivity_detection
  4089. * @brief This section groups all the functions concerning
  4090. * activity/inactivity detection.
  4091. * @{
  4092. *
  4093. */
  4094. /**
  4095. * @brief Enables gyroscope Sleep mode.[set]
  4096. *
  4097. * @param ctx read / write interface definitions
  4098. * @param val change the values of sleep_g in reg CTRL4_C
  4099. * @retval interface status (MANDATORY: return 0 -> no Error)
  4100. *
  4101. */
  4102. int32_t lsm6dso_gy_sleep_mode_set(stmdev_ctx_t *ctx, uint8_t val)
  4103. {
  4104. lsm6dso_ctrl4_c_t reg;
  4105. int32_t ret;
  4106. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  4107. if (ret == 0)
  4108. {
  4109. reg.sleep_g = val;
  4110. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  4111. }
  4112. return ret;
  4113. }
  4114. /**
  4115. * @brief Enables gyroscope Sleep mode.[get]
  4116. *
  4117. * @param ctx read / write interface definitions
  4118. * @param val change the values of sleep_g in reg CTRL4_C
  4119. * @retval interface status (MANDATORY: return 0 -> no Error)
  4120. *
  4121. */
  4122. int32_t lsm6dso_gy_sleep_mode_get(stmdev_ctx_t *ctx, uint8_t *val)
  4123. {
  4124. lsm6dso_ctrl4_c_t reg;
  4125. int32_t ret;
  4126. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&reg, 1);
  4127. *val = reg.sleep_g;
  4128. return ret;
  4129. }
  4130. /**
  4131. * @brief Drives the sleep status instead of
  4132. * sleep change on INT pins
  4133. * (only if INT1_SLEEP_CHANGE or
  4134. * INT2_SLEEP_CHANGE bits are enabled).[set]
  4135. *
  4136. * @param ctx read / write interface definitions
  4137. * @param val change the values of sleep_status_on_int in reg TAP_CFG0
  4138. * @retval interface status (MANDATORY: return 0 -> no Error)
  4139. *
  4140. */
  4141. int32_t lsm6dso_act_pin_notification_set(stmdev_ctx_t *ctx,
  4142. lsm6dso_sleep_status_on_int_t val)
  4143. {
  4144. lsm6dso_tap_cfg0_t reg;
  4145. int32_t ret;
  4146. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4147. if (ret == 0)
  4148. {
  4149. reg.sleep_status_on_int = (uint8_t)val;
  4150. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4151. }
  4152. return ret;
  4153. }
  4154. /**
  4155. * @brief Drives the sleep status instead of
  4156. * sleep change on INT pins (only if
  4157. * INT1_SLEEP_CHANGE or
  4158. * INT2_SLEEP_CHANGE bits are enabled).[get]
  4159. *
  4160. * @param ctx read / write interface definitions
  4161. * @param val Get the values of sleep_status_on_int in reg TAP_CFG0
  4162. * @retval interface status (MANDATORY: return 0 -> no Error)
  4163. *
  4164. */
  4165. int32_t lsm6dso_act_pin_notification_get(stmdev_ctx_t *ctx,
  4166. lsm6dso_sleep_status_on_int_t *val)
  4167. {
  4168. lsm6dso_tap_cfg0_t reg;
  4169. int32_t ret;
  4170. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4171. switch (reg.sleep_status_on_int)
  4172. {
  4173. case LSM6DSO_DRIVE_SLEEP_CHG_EVENT:
  4174. *val = LSM6DSO_DRIVE_SLEEP_CHG_EVENT;
  4175. break;
  4176. case LSM6DSO_DRIVE_SLEEP_STATUS:
  4177. *val = LSM6DSO_DRIVE_SLEEP_STATUS;
  4178. break;
  4179. default:
  4180. *val = LSM6DSO_DRIVE_SLEEP_CHG_EVENT;
  4181. break;
  4182. }
  4183. return ret;
  4184. }
  4185. /**
  4186. * @brief Enable inactivity function.[set]
  4187. *
  4188. * @param ctx read / write interface definitions
  4189. * @param val change the values of inact_en in reg TAP_CFG2
  4190. * @retval interface status (MANDATORY: return 0 -> no Error)
  4191. *
  4192. */
  4193. int32_t lsm6dso_act_mode_set(stmdev_ctx_t *ctx,
  4194. lsm6dso_inact_en_t val)
  4195. {
  4196. lsm6dso_tap_cfg2_t reg;
  4197. int32_t ret;
  4198. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *)&reg, 1);
  4199. if (ret == 0)
  4200. {
  4201. reg.inact_en = (uint8_t)val;
  4202. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *)&reg, 1);
  4203. }
  4204. return ret;
  4205. }
  4206. /**
  4207. * @brief Enable inactivity function.[get]
  4208. *
  4209. * @param ctx read / write interface definitions
  4210. * @param val Get the values of inact_en in reg TAP_CFG2
  4211. * @retval interface status (MANDATORY: return 0 -> no Error)
  4212. *
  4213. */
  4214. int32_t lsm6dso_act_mode_get(stmdev_ctx_t *ctx,
  4215. lsm6dso_inact_en_t *val)
  4216. {
  4217. lsm6dso_tap_cfg2_t reg;
  4218. int32_t ret;
  4219. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *)&reg, 1);
  4220. switch (reg.inact_en)
  4221. {
  4222. case LSM6DSO_XL_AND_GY_NOT_AFFECTED:
  4223. *val = LSM6DSO_XL_AND_GY_NOT_AFFECTED;
  4224. break;
  4225. case LSM6DSO_XL_12Hz5_GY_NOT_AFFECTED:
  4226. *val = LSM6DSO_XL_12Hz5_GY_NOT_AFFECTED;
  4227. break;
  4228. case LSM6DSO_XL_12Hz5_GY_SLEEP:
  4229. *val = LSM6DSO_XL_12Hz5_GY_SLEEP;
  4230. break;
  4231. case LSM6DSO_XL_12Hz5_GY_PD:
  4232. *val = LSM6DSO_XL_12Hz5_GY_PD;
  4233. break;
  4234. default:
  4235. *val = LSM6DSO_XL_AND_GY_NOT_AFFECTED;
  4236. break;
  4237. }
  4238. return ret;
  4239. }
  4240. /**
  4241. * @brief Duration to go in sleep mode.[set]
  4242. * 1 LSb = 512 / ODR
  4243. *
  4244. * @param ctx read / write interface definitions
  4245. * @param val change the values of sleep_dur in reg WAKE_UP_DUR
  4246. * @retval interface status (MANDATORY: return 0 -> no Error)
  4247. *
  4248. */
  4249. int32_t lsm6dso_act_sleep_dur_set(stmdev_ctx_t *ctx, uint8_t val)
  4250. {
  4251. lsm6dso_wake_up_dur_t reg;
  4252. int32_t ret;
  4253. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  4254. if (ret == 0)
  4255. {
  4256. reg.sleep_dur = val;
  4257. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  4258. }
  4259. return ret;
  4260. }
  4261. /**
  4262. * @brief Duration to go in sleep mode.[get]
  4263. * 1 LSb = 512 / ODR
  4264. *
  4265. * @param ctx read / write interface definitions
  4266. * @param val change the values of sleep_dur in reg WAKE_UP_DUR
  4267. * @retval interface status (MANDATORY: return 0 -> no Error)
  4268. *
  4269. */
  4270. int32_t lsm6dso_act_sleep_dur_get(stmdev_ctx_t *ctx, uint8_t *val)
  4271. {
  4272. lsm6dso_wake_up_dur_t reg;
  4273. int32_t ret;
  4274. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t *)&reg, 1);
  4275. *val = reg.sleep_dur;
  4276. return ret;
  4277. }
  4278. /**
  4279. * @}
  4280. *
  4281. */
  4282. /**
  4283. * @defgroup LSM6DSO_tap_generator
  4284. * @brief This section groups all the functions that manage the
  4285. * tap and double tap event generation.
  4286. * @{
  4287. *
  4288. */
  4289. /**
  4290. * @brief Enable Z direction in tap recognition.[set]
  4291. *
  4292. * @param ctx read / write interface definitions
  4293. * @param val change the values of tap_z_en in reg TAP_CFG0
  4294. * @retval interface status (MANDATORY: return 0 -> no Error)
  4295. *
  4296. */
  4297. int32_t lsm6dso_tap_detection_on_z_set(stmdev_ctx_t *ctx, uint8_t val)
  4298. {
  4299. lsm6dso_tap_cfg0_t reg;
  4300. int32_t ret;
  4301. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4302. if (ret == 0)
  4303. {
  4304. reg.tap_z_en = val;
  4305. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4306. }
  4307. return ret;
  4308. }
  4309. /**
  4310. * @brief Enable Z direction in tap recognition.[get]
  4311. *
  4312. * @param ctx read / write interface definitions
  4313. * @param val change the values of tap_z_en in reg TAP_CFG0
  4314. * @retval interface status (MANDATORY: return 0 -> no Error)
  4315. *
  4316. */
  4317. int32_t lsm6dso_tap_detection_on_z_get(stmdev_ctx_t *ctx,
  4318. uint8_t *val)
  4319. {
  4320. lsm6dso_tap_cfg0_t reg;
  4321. int32_t ret;
  4322. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4323. *val = reg.tap_z_en;
  4324. return ret;
  4325. }
  4326. /**
  4327. * @brief Enable Y direction in tap recognition.[set]
  4328. *
  4329. * @param ctx read / write interface definitions
  4330. * @param val change the values of tap_y_en in reg TAP_CFG0
  4331. * @retval interface status (MANDATORY: return 0 -> no Error)
  4332. *
  4333. */
  4334. int32_t lsm6dso_tap_detection_on_y_set(stmdev_ctx_t *ctx, uint8_t val)
  4335. {
  4336. lsm6dso_tap_cfg0_t reg;
  4337. int32_t ret;
  4338. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4339. if (ret == 0)
  4340. {
  4341. reg.tap_y_en = val;
  4342. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4343. }
  4344. return ret;
  4345. }
  4346. /**
  4347. * @brief Enable Y direction in tap recognition.[get]
  4348. *
  4349. * @param ctx read / write interface definitions
  4350. * @param val change the values of tap_y_en in reg TAP_CFG0
  4351. * @retval interface status (MANDATORY: return 0 -> no Error)
  4352. *
  4353. */
  4354. int32_t lsm6dso_tap_detection_on_y_get(stmdev_ctx_t *ctx,
  4355. uint8_t *val)
  4356. {
  4357. lsm6dso_tap_cfg0_t reg;
  4358. int32_t ret;
  4359. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4360. *val = reg.tap_y_en;
  4361. return ret;
  4362. }
  4363. /**
  4364. * @brief Enable X direction in tap recognition.[set]
  4365. *
  4366. * @param ctx read / write interface definitions
  4367. * @param val change the values of tap_x_en in reg TAP_CFG0
  4368. * @retval interface status (MANDATORY: return 0 -> no Error)
  4369. *
  4370. */
  4371. int32_t lsm6dso_tap_detection_on_x_set(stmdev_ctx_t *ctx, uint8_t val)
  4372. {
  4373. lsm6dso_tap_cfg0_t reg;
  4374. int32_t ret;
  4375. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4376. if (ret == 0)
  4377. {
  4378. reg.tap_x_en = val;
  4379. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4380. }
  4381. return ret;
  4382. }
  4383. /**
  4384. * @brief Enable X direction in tap recognition.[get]
  4385. *
  4386. * @param ctx read / write interface definitions
  4387. * @param val change the values of tap_x_en in reg TAP_CFG0
  4388. * @retval interface status (MANDATORY: return 0 -> no Error)
  4389. *
  4390. */
  4391. int32_t lsm6dso_tap_detection_on_x_get(stmdev_ctx_t *ctx,
  4392. uint8_t *val)
  4393. {
  4394. lsm6dso_tap_cfg0_t reg;
  4395. int32_t ret;
  4396. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *)&reg, 1);
  4397. *val = reg.tap_x_en;
  4398. return ret;
  4399. }
  4400. /**
  4401. * @brief X-axis tap recognition threshold.[set]
  4402. *
  4403. * @param ctx read / write interface definitions
  4404. * @param val change the values of tap_ths_x in reg TAP_CFG1
  4405. * @retval interface status (MANDATORY: return 0 -> no Error)
  4406. *
  4407. */
  4408. int32_t lsm6dso_tap_threshold_x_set(stmdev_ctx_t *ctx, uint8_t val)
  4409. {
  4410. lsm6dso_tap_cfg1_t reg;
  4411. int32_t ret;
  4412. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t *)&reg, 1);
  4413. if (ret == 0)
  4414. {
  4415. reg.tap_ths_x = val;
  4416. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t *)&reg, 1);
  4417. }
  4418. return ret;
  4419. }
  4420. /**
  4421. * @brief X-axis tap recognition threshold.[get]
  4422. *
  4423. * @param ctx read / write interface definitions
  4424. * @param val change the values of tap_ths_x in reg TAP_CFG1
  4425. * @retval interface status (MANDATORY: return 0 -> no Error)
  4426. *
  4427. */
  4428. int32_t lsm6dso_tap_threshold_x_get(stmdev_ctx_t *ctx, uint8_t *val)
  4429. {
  4430. lsm6dso_tap_cfg1_t reg;
  4431. int32_t ret;
  4432. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t *)&reg, 1);
  4433. *val = reg.tap_ths_x;
  4434. return ret;
  4435. }
  4436. /**
  4437. * @brief Selection of axis priority for TAP detection.[set]
  4438. *
  4439. * @param ctx read / write interface definitions
  4440. * @param val change the values of tap_priority in
  4441. * reg TAP_CFG1
  4442. * @retval interface status (MANDATORY: return 0 -> no Error)
  4443. *
  4444. */
  4445. int32_t lsm6dso_tap_axis_priority_set(stmdev_ctx_t *ctx,
  4446. lsm6dso_tap_priority_t val)
  4447. {
  4448. lsm6dso_tap_cfg1_t reg;
  4449. int32_t ret;
  4450. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t *)&reg, 1);
  4451. if (ret == 0)
  4452. {
  4453. reg.tap_priority = (uint8_t)val;
  4454. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t *)&reg, 1);
  4455. }
  4456. return ret;
  4457. }
  4458. /**
  4459. * @brief Selection of axis priority for TAP detection.[get]
  4460. *
  4461. * @param ctx read / write interface definitions
  4462. * @param val Get the values of tap_priority in
  4463. * reg TAP_CFG1
  4464. * @retval interface status (MANDATORY: return 0 -> no Error)
  4465. *
  4466. */
  4467. int32_t lsm6dso_tap_axis_priority_get(stmdev_ctx_t *ctx,
  4468. lsm6dso_tap_priority_t *val)
  4469. {
  4470. lsm6dso_tap_cfg1_t reg;
  4471. int32_t ret;
  4472. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t *)&reg, 1);
  4473. switch (reg.tap_priority)
  4474. {
  4475. case LSM6DSO_XYZ:
  4476. *val = LSM6DSO_XYZ;
  4477. break;
  4478. case LSM6DSO_YXZ:
  4479. *val = LSM6DSO_YXZ;
  4480. break;
  4481. case LSM6DSO_XZY:
  4482. *val = LSM6DSO_XZY;
  4483. break;
  4484. case LSM6DSO_ZYX:
  4485. *val = LSM6DSO_ZYX;
  4486. break;
  4487. case LSM6DSO_YZX:
  4488. *val = LSM6DSO_YZX;
  4489. break;
  4490. case LSM6DSO_ZXY:
  4491. *val = LSM6DSO_ZXY;
  4492. break;
  4493. default:
  4494. *val = LSM6DSO_XYZ;
  4495. break;
  4496. }
  4497. return ret;
  4498. }
  4499. /**
  4500. * @brief Y-axis tap recognition threshold.[set]
  4501. *
  4502. * @param ctx read / write interface definitions
  4503. * @param val change the values of tap_ths_y in reg TAP_CFG2
  4504. * @retval interface status (MANDATORY: return 0 -> no Error)
  4505. *
  4506. */
  4507. int32_t lsm6dso_tap_threshold_y_set(stmdev_ctx_t *ctx, uint8_t val)
  4508. {
  4509. lsm6dso_tap_cfg2_t reg;
  4510. int32_t ret;
  4511. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *)&reg, 1);
  4512. if (ret == 0)
  4513. {
  4514. reg.tap_ths_y = val;
  4515. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *)&reg, 1);
  4516. }
  4517. return ret;
  4518. }
  4519. /**
  4520. * @brief Y-axis tap recognition threshold.[get]
  4521. *
  4522. * @param ctx read / write interface definitions
  4523. * @param val change the values of tap_ths_y in reg TAP_CFG2
  4524. * @retval interface status (MANDATORY: return 0 -> no Error)
  4525. *
  4526. */
  4527. int32_t lsm6dso_tap_threshold_y_get(stmdev_ctx_t *ctx, uint8_t *val)
  4528. {
  4529. lsm6dso_tap_cfg2_t reg;
  4530. int32_t ret;
  4531. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *)&reg, 1);
  4532. *val = reg.tap_ths_y;
  4533. return ret;
  4534. }
  4535. /**
  4536. * @brief Z-axis recognition threshold.[set]
  4537. *
  4538. * @param ctx read / write interface definitions
  4539. * @param val change the values of tap_ths_z in reg TAP_THS_6D
  4540. * @retval interface status (MANDATORY: return 0 -> no Error)
  4541. *
  4542. */
  4543. int32_t lsm6dso_tap_threshold_z_set(stmdev_ctx_t *ctx, uint8_t val)
  4544. {
  4545. lsm6dso_tap_ths_6d_t reg;
  4546. int32_t ret;
  4547. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4548. if (ret == 0)
  4549. {
  4550. reg.tap_ths_z = val;
  4551. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4552. }
  4553. return ret;
  4554. }
  4555. /**
  4556. * @brief Z-axis recognition threshold.[get]
  4557. *
  4558. * @param ctx read / write interface definitions
  4559. * @param val change the values of tap_ths_z in reg TAP_THS_6D
  4560. * @retval interface status (MANDATORY: return 0 -> no Error)
  4561. *
  4562. */
  4563. int32_t lsm6dso_tap_threshold_z_get(stmdev_ctx_t *ctx, uint8_t *val)
  4564. {
  4565. lsm6dso_tap_ths_6d_t reg;
  4566. int32_t ret;
  4567. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4568. *val = reg.tap_ths_z;
  4569. return ret;
  4570. }
  4571. /**
  4572. * @brief Maximum duration is the maximum time of an
  4573. * over threshold signal detection to be recognized
  4574. * as a tap event. The default value of these bits
  4575. * is 00b which corresponds to 4*ODR_XL time.
  4576. * If the SHOCK[1:0] bits are set to a different
  4577. * value, 1LSB corresponds to 8*ODR_XL time.[set]
  4578. *
  4579. * @param ctx read / write interface definitions
  4580. * @param val change the values of shock in reg INT_DUR2
  4581. * @retval interface status (MANDATORY: return 0 -> no Error)
  4582. *
  4583. */
  4584. int32_t lsm6dso_tap_shock_set(stmdev_ctx_t *ctx, uint8_t val)
  4585. {
  4586. lsm6dso_int_dur2_t reg;
  4587. int32_t ret;
  4588. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4589. if (ret == 0)
  4590. {
  4591. reg.shock = val;
  4592. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4593. }
  4594. return ret;
  4595. }
  4596. /**
  4597. * @brief Maximum duration is the maximum time of an
  4598. * over threshold signal detection to be recognized
  4599. * as a tap event. The default value of these bits
  4600. * is 00b which corresponds to 4*ODR_XL time.
  4601. * If the SHOCK[1:0] bits are set to a different
  4602. * value, 1LSB corresponds to 8*ODR_XL time.[get]
  4603. *
  4604. * @param ctx read / write interface definitions
  4605. * @param val change the values of shock in reg INT_DUR2
  4606. * @retval interface status (MANDATORY: return 0 -> no Error)
  4607. *
  4608. */
  4609. int32_t lsm6dso_tap_shock_get(stmdev_ctx_t *ctx, uint8_t *val)
  4610. {
  4611. lsm6dso_int_dur2_t reg;
  4612. int32_t ret;
  4613. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4614. *val = reg.shock;
  4615. return ret;
  4616. }
  4617. /**
  4618. * @brief Quiet time is the time after the first detected
  4619. * tap in which there must not be any over threshold
  4620. * event.
  4621. * The default value of these bits is 00b which
  4622. * corresponds to 2*ODR_XL time. If the QUIET[1:0]
  4623. * bits are set to a different value,
  4624. * 1LSB corresponds to 4*ODR_XL time.[set]
  4625. *
  4626. * @param ctx read / write interface definitions
  4627. * @param val change the values of quiet in reg INT_DUR2
  4628. * @retval interface status (MANDATORY: return 0 -> no Error)
  4629. *
  4630. */
  4631. int32_t lsm6dso_tap_quiet_set(stmdev_ctx_t *ctx, uint8_t val)
  4632. {
  4633. lsm6dso_int_dur2_t reg;
  4634. int32_t ret;
  4635. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4636. if (ret == 0)
  4637. {
  4638. reg.quiet = val;
  4639. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4640. }
  4641. return ret;
  4642. }
  4643. /**
  4644. * @brief Quiet time is the time after the first detected
  4645. * tap in which there must not be any over threshold
  4646. * event.
  4647. * The default value of these bits is 00b which
  4648. * corresponds to 2*ODR_XL time.
  4649. * If the QUIET[1:0] bits are set to a different
  4650. * value, 1LSB corresponds to 4*ODR_XL time.[get]
  4651. *
  4652. * @param ctx read / write interface definitions
  4653. * @param val change the values of quiet in reg INT_DUR2
  4654. * @retval interface status (MANDATORY: return 0 -> no Error)
  4655. *
  4656. */
  4657. int32_t lsm6dso_tap_quiet_get(stmdev_ctx_t *ctx, uint8_t *val)
  4658. {
  4659. lsm6dso_int_dur2_t reg;
  4660. int32_t ret;
  4661. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4662. *val = reg.quiet;
  4663. return ret;
  4664. }
  4665. /**
  4666. * @brief When double tap recognition is enabled,
  4667. * this register expresses the maximum time
  4668. * between two consecutive detected taps to
  4669. * determine a double tap event.
  4670. * The default value of these bits is 0000b which
  4671. * corresponds to 16*ODR_XL time.
  4672. * If the DUR[3:0] bits are set to a different value,
  4673. * 1LSB corresponds to 32*ODR_XL time.[set]
  4674. *
  4675. * @param ctx read / write interface definitions
  4676. * @param val change the values of dur in reg INT_DUR2
  4677. * @retval interface status (MANDATORY: return 0 -> no Error)
  4678. *
  4679. */
  4680. int32_t lsm6dso_tap_dur_set(stmdev_ctx_t *ctx, uint8_t val)
  4681. {
  4682. lsm6dso_int_dur2_t reg;
  4683. int32_t ret;
  4684. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4685. if (ret == 0)
  4686. {
  4687. reg.dur = val;
  4688. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4689. }
  4690. return ret;
  4691. }
  4692. /**
  4693. * @brief When double tap recognition is enabled,
  4694. * this register expresses the maximum time
  4695. * between two consecutive detected taps to
  4696. * determine a double tap event.
  4697. * The default value of these bits is 0000b which
  4698. * corresponds to 16*ODR_XL time. If the DUR[3:0]
  4699. * bits are set to a different value,
  4700. * 1LSB corresponds to 32*ODR_XL time.[get]
  4701. *
  4702. * @param ctx read / write interface definitions
  4703. * @param val change the values of dur in reg INT_DUR2
  4704. * @retval interface status (MANDATORY: return 0 -> no Error)
  4705. *
  4706. */
  4707. int32_t lsm6dso_tap_dur_get(stmdev_ctx_t *ctx, uint8_t *val)
  4708. {
  4709. lsm6dso_int_dur2_t reg;
  4710. int32_t ret;
  4711. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t *)&reg, 1);
  4712. *val = reg.dur;
  4713. return ret;
  4714. }
  4715. /**
  4716. * @brief Single/double-tap event enable.[set]
  4717. *
  4718. * @param ctx read / write interface definitions
  4719. * @param val change the values of single_double_tap in reg WAKE_UP_THS
  4720. * @retval interface status (MANDATORY: return 0 -> no Error)
  4721. *
  4722. */
  4723. int32_t lsm6dso_tap_mode_set(stmdev_ctx_t *ctx,
  4724. lsm6dso_single_double_tap_t val)
  4725. {
  4726. lsm6dso_wake_up_ths_t reg;
  4727. int32_t ret;
  4728. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4729. if (ret == 0)
  4730. {
  4731. reg.single_double_tap = (uint8_t)val;
  4732. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4733. }
  4734. return ret;
  4735. }
  4736. /**
  4737. * @brief Single/double-tap event enable.[get]
  4738. *
  4739. * @param ctx read / write interface definitions
  4740. * @param val Get the values of single_double_tap in reg WAKE_UP_THS
  4741. * @retval interface status (MANDATORY: return 0 -> no Error)
  4742. *
  4743. */
  4744. int32_t lsm6dso_tap_mode_get(stmdev_ctx_t *ctx,
  4745. lsm6dso_single_double_tap_t *val)
  4746. {
  4747. lsm6dso_wake_up_ths_t reg;
  4748. int32_t ret;
  4749. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t *)&reg, 1);
  4750. switch (reg.single_double_tap)
  4751. {
  4752. case LSM6DSO_ONLY_SINGLE:
  4753. *val = LSM6DSO_ONLY_SINGLE;
  4754. break;
  4755. case LSM6DSO_BOTH_SINGLE_DOUBLE:
  4756. *val = LSM6DSO_BOTH_SINGLE_DOUBLE;
  4757. break;
  4758. default:
  4759. *val = LSM6DSO_ONLY_SINGLE;
  4760. break;
  4761. }
  4762. return ret;
  4763. }
  4764. /**
  4765. * @}
  4766. *
  4767. */
  4768. /**
  4769. * @defgroup LSM6DSO_ Six_position_detection(6D/4D)
  4770. * @brief This section groups all the functions concerning six position
  4771. * detection (6D).
  4772. * @{
  4773. *
  4774. */
  4775. /**
  4776. * @brief Threshold for 4D/6D function.[set]
  4777. *
  4778. * @param ctx read / write interface definitions
  4779. * @param val change the values of sixd_ths in reg TAP_THS_6D
  4780. * @retval interface status (MANDATORY: return 0 -> no Error)
  4781. *
  4782. */
  4783. int32_t lsm6dso_6d_threshold_set(stmdev_ctx_t *ctx,
  4784. lsm6dso_sixd_ths_t val)
  4785. {
  4786. lsm6dso_tap_ths_6d_t reg;
  4787. int32_t ret;
  4788. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4789. if (ret == 0)
  4790. {
  4791. reg.sixd_ths = (uint8_t)val;
  4792. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4793. }
  4794. return ret;
  4795. }
  4796. /**
  4797. * @brief Threshold for 4D/6D function.[get]
  4798. *
  4799. * @param ctx read / write interface definitions
  4800. * @param val Get the values of sixd_ths in reg TAP_THS_6D
  4801. * @retval interface status (MANDATORY: return 0 -> no Error)
  4802. *
  4803. */
  4804. int32_t lsm6dso_6d_threshold_get(stmdev_ctx_t *ctx,
  4805. lsm6dso_sixd_ths_t *val)
  4806. {
  4807. lsm6dso_tap_ths_6d_t reg;
  4808. int32_t ret;
  4809. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4810. switch (reg.sixd_ths)
  4811. {
  4812. case LSM6DSO_DEG_80:
  4813. *val = LSM6DSO_DEG_80;
  4814. break;
  4815. case LSM6DSO_DEG_70:
  4816. *val = LSM6DSO_DEG_70;
  4817. break;
  4818. case LSM6DSO_DEG_60:
  4819. *val = LSM6DSO_DEG_60;
  4820. break;
  4821. case LSM6DSO_DEG_50:
  4822. *val = LSM6DSO_DEG_50;
  4823. break;
  4824. default:
  4825. *val = LSM6DSO_DEG_80;
  4826. break;
  4827. }
  4828. return ret;
  4829. }
  4830. /**
  4831. * @brief 4D orientation detection enable.[set]
  4832. *
  4833. * @param ctx read / write interface definitions
  4834. * @param val change the values of d4d_en in reg TAP_THS_6D
  4835. * @retval interface status (MANDATORY: return 0 -> no Error)
  4836. *
  4837. */
  4838. int32_t lsm6dso_4d_mode_set(stmdev_ctx_t *ctx, uint8_t val)
  4839. {
  4840. lsm6dso_tap_ths_6d_t reg;
  4841. int32_t ret;
  4842. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4843. if (ret == 0)
  4844. {
  4845. reg.d4d_en = val;
  4846. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4847. }
  4848. return ret;
  4849. }
  4850. /**
  4851. * @brief 4D orientation detection enable.[get]
  4852. *
  4853. * @param ctx read / write interface definitions
  4854. * @param val change the values of d4d_en in reg TAP_THS_6D
  4855. * @retval interface status (MANDATORY: return 0 -> no Error)
  4856. *
  4857. */
  4858. int32_t lsm6dso_4d_mode_get(stmdev_ctx_t *ctx, uint8_t *val)
  4859. {
  4860. lsm6dso_tap_ths_6d_t reg;
  4861. int32_t ret;
  4862. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t *)&reg, 1);
  4863. *val = reg.d4d_en;
  4864. return ret;
  4865. }
  4866. /**
  4867. * @}
  4868. *
  4869. */
  4870. /**
  4871. * @defgroup LSM6DSO_free_fall
  4872. * @brief This section group all the functions concerning the free
  4873. * fall detection.
  4874. * @{
  4875. *
  4876. */
  4877. /**
  4878. * @brief Free fall threshold setting.[set]
  4879. *
  4880. * @param ctx read / write interface definitions
  4881. * @param val change the values of ff_ths in reg FREE_FALL
  4882. * @retval interface status (MANDATORY: return 0 -> no Error)
  4883. *
  4884. */
  4885. int32_t lsm6dso_ff_threshold_set(stmdev_ctx_t *ctx,
  4886. lsm6dso_ff_ths_t val)
  4887. {
  4888. lsm6dso_free_fall_t reg;
  4889. int32_t ret;
  4890. ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t *)&reg, 1);
  4891. if (ret == 0)
  4892. {
  4893. reg.ff_ths = (uint8_t)val;
  4894. ret = lsm6dso_write_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t *)&reg, 1);
  4895. }
  4896. return ret;
  4897. }
  4898. /**
  4899. * @brief Free fall threshold setting.[get]
  4900. *
  4901. * @param ctx read / write interface definitions
  4902. * @param val Get the values of ff_ths in reg FREE_FALL
  4903. * @retval interface status (MANDATORY: return 0 -> no Error)
  4904. *
  4905. */
  4906. int32_t lsm6dso_ff_threshold_get(stmdev_ctx_t *ctx,
  4907. lsm6dso_ff_ths_t *val)
  4908. {
  4909. lsm6dso_free_fall_t reg;
  4910. int32_t ret;
  4911. ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t *)&reg, 1);
  4912. switch (reg.ff_ths)
  4913. {
  4914. case LSM6DSO_FF_TSH_156mg:
  4915. *val = LSM6DSO_FF_TSH_156mg;
  4916. break;
  4917. case LSM6DSO_FF_TSH_219mg:
  4918. *val = LSM6DSO_FF_TSH_219mg;
  4919. break;
  4920. case LSM6DSO_FF_TSH_250mg:
  4921. *val = LSM6DSO_FF_TSH_250mg;
  4922. break;
  4923. case LSM6DSO_FF_TSH_312mg:
  4924. *val = LSM6DSO_FF_TSH_312mg;
  4925. break;
  4926. case LSM6DSO_FF_TSH_344mg:
  4927. *val = LSM6DSO_FF_TSH_344mg;
  4928. break;
  4929. case LSM6DSO_FF_TSH_406mg:
  4930. *val = LSM6DSO_FF_TSH_406mg;
  4931. break;
  4932. case LSM6DSO_FF_TSH_469mg:
  4933. *val = LSM6DSO_FF_TSH_469mg;
  4934. break;
  4935. case LSM6DSO_FF_TSH_500mg:
  4936. *val = LSM6DSO_FF_TSH_500mg;
  4937. break;
  4938. default:
  4939. *val = LSM6DSO_FF_TSH_156mg;
  4940. break;
  4941. }
  4942. return ret;
  4943. }
  4944. /**
  4945. * @brief Free-fall duration event.[set]
  4946. * 1LSb = 1 / ODR
  4947. *
  4948. * @param ctx read / write interface definitions
  4949. * @param val change the values of ff_dur in reg FREE_FALL
  4950. * @retval interface status (MANDATORY: return 0 -> no Error)
  4951. *
  4952. */
  4953. int32_t lsm6dso_ff_dur_set(stmdev_ctx_t *ctx, uint8_t val)
  4954. {
  4955. lsm6dso_wake_up_dur_t wake_up_dur;
  4956. lsm6dso_free_fall_t free_fall;
  4957. int32_t ret;
  4958. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR,
  4959. (uint8_t *)&wake_up_dur, 1);
  4960. if (ret == 0)
  4961. {
  4962. ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t *)&free_fall, 1);
  4963. }
  4964. if (ret == 0)
  4965. {
  4966. wake_up_dur.ff_dur = ((uint8_t)val & 0x20U) >> 5;
  4967. free_fall.ff_dur = (uint8_t)val & 0x1FU;
  4968. ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR,
  4969. (uint8_t *)&wake_up_dur, 1);
  4970. }
  4971. if (ret == 0)
  4972. {
  4973. ret = lsm6dso_write_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t *)&free_fall, 1);
  4974. }
  4975. return ret;
  4976. }
  4977. /**
  4978. * @brief Free-fall duration event.[get]
  4979. * 1LSb = 1 / ODR
  4980. *
  4981. * @param ctx read / write interface definitions
  4982. * @param val change the values of ff_dur in reg FREE_FALL
  4983. * @retval interface status (MANDATORY: return 0 -> no Error)
  4984. *
  4985. */
  4986. int32_t lsm6dso_ff_dur_get(stmdev_ctx_t *ctx, uint8_t *val)
  4987. {
  4988. lsm6dso_wake_up_dur_t wake_up_dur;
  4989. lsm6dso_free_fall_t free_fall;
  4990. int32_t ret;
  4991. ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR,
  4992. (uint8_t *)&wake_up_dur, 1);
  4993. if (ret == 0)
  4994. {
  4995. ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t *)&free_fall, 1);
  4996. *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
  4997. }
  4998. return ret;
  4999. }
  5000. /**
  5001. * @}
  5002. *
  5003. */
  5004. /**
  5005. * @defgroup LSM6DSO_fifo
  5006. * @brief This section group all the functions concerning the fifo usage
  5007. * @{
  5008. *
  5009. */
  5010. /**
  5011. * @brief FIFO watermark level selection.[set]
  5012. *
  5013. * @param ctx read / write interface definitions
  5014. * @param val change the values of wtm in reg FIFO_CTRL1
  5015. * @retval interface status (MANDATORY: return 0 -> no Error)
  5016. *
  5017. */
  5018. int32_t lsm6dso_fifo_watermark_set(stmdev_ctx_t *ctx, uint16_t val)
  5019. {
  5020. lsm6dso_fifo_ctrl1_t fifo_ctrl1;
  5021. lsm6dso_fifo_ctrl2_t fifo_ctrl2;
  5022. int32_t ret;
  5023. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2,
  5024. (uint8_t *)&fifo_ctrl2, 1);
  5025. if (ret == 0)
  5026. {
  5027. fifo_ctrl1.wtm = 0x00FFU & (uint8_t)val;
  5028. fifo_ctrl2.wtm = (uint8_t)((0x0100U & val) >> 8);
  5029. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL1,
  5030. (uint8_t *)&fifo_ctrl1, 1);
  5031. }
  5032. if (ret == 0)
  5033. {
  5034. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2,
  5035. (uint8_t *)&fifo_ctrl2, 1);
  5036. }
  5037. return ret;
  5038. }
  5039. /**
  5040. * @brief FIFO watermark level selection.[get]
  5041. *
  5042. * @param ctx read / write interface definitions
  5043. * @param val change the values of wtm in reg FIFO_CTRL1
  5044. * @retval interface status (MANDATORY: return 0 -> no Error)
  5045. *
  5046. */
  5047. int32_t lsm6dso_fifo_watermark_get(stmdev_ctx_t *ctx, uint16_t *val)
  5048. {
  5049. lsm6dso_fifo_ctrl1_t fifo_ctrl1;
  5050. lsm6dso_fifo_ctrl2_t fifo_ctrl2;
  5051. int32_t ret;
  5052. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL1,
  5053. (uint8_t *)&fifo_ctrl1, 1);
  5054. if (ret == 0)
  5055. {
  5056. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2,
  5057. (uint8_t *)&fifo_ctrl2, 1);
  5058. *val = ((uint16_t)fifo_ctrl2.wtm << 8) + (uint16_t)fifo_ctrl1.wtm;
  5059. }
  5060. return ret;
  5061. }
  5062. /**
  5063. * @brief FIFO compression feature initialization request [set].
  5064. *
  5065. * @param ctx read / write interface definitions
  5066. * @param val change the values of FIFO_COMPR_INIT in
  5067. * reg EMB_FUNC_INIT_B
  5068. * @retval interface status (MANDATORY: return 0 -> no Error)
  5069. *
  5070. */
  5071. int32_t lsm6dso_compression_algo_init_set(stmdev_ctx_t *ctx,
  5072. uint8_t val)
  5073. {
  5074. lsm6dso_emb_func_init_b_t reg;
  5075. int32_t ret;
  5076. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  5077. if (ret == 0)
  5078. {
  5079. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t *)&reg, 1);
  5080. }
  5081. if (ret == 0)
  5082. {
  5083. reg.fifo_compr_init = val;
  5084. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t *)&reg, 1);
  5085. }
  5086. if (ret == 0)
  5087. {
  5088. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  5089. }
  5090. return ret;
  5091. }
  5092. /**
  5093. * @brief FIFO compression feature initialization request [get].
  5094. *
  5095. * @param ctx read / write interface definitions
  5096. * @param val change the values of FIFO_COMPR_INIT in
  5097. * reg EMB_FUNC_INIT_B
  5098. * @retval interface status (MANDATORY: return 0 -> no Error)
  5099. *
  5100. */
  5101. int32_t lsm6dso_compression_algo_init_get(stmdev_ctx_t *ctx,
  5102. uint8_t *val)
  5103. {
  5104. lsm6dso_emb_func_init_b_t reg;
  5105. int32_t ret;
  5106. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  5107. if (ret == 0)
  5108. {
  5109. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t *)&reg, 1);
  5110. }
  5111. if (ret == 0)
  5112. {
  5113. *val = reg.fifo_compr_init;
  5114. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  5115. }
  5116. return ret;
  5117. }
  5118. /**
  5119. * @brief Enable and configure compression algo.[set]
  5120. *
  5121. * @param ctx read / write interface definitions
  5122. * @param val change the values of uncoptr_rate in
  5123. * reg FIFO_CTRL2
  5124. * @retval interface status (MANDATORY: return 0 -> no Error)
  5125. *
  5126. */
  5127. int32_t lsm6dso_compression_algo_set(stmdev_ctx_t *ctx,
  5128. lsm6dso_uncoptr_rate_t val)
  5129. {
  5130. lsm6dso_fifo_ctrl2_t fifo_ctrl2;
  5131. int32_t ret;
  5132. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2,
  5133. (uint8_t *)&fifo_ctrl2, 1);
  5134. if (ret == 0)
  5135. {
  5136. fifo_ctrl2.fifo_compr_rt_en = ((uint8_t)val & 0x04U) >> 2;
  5137. fifo_ctrl2.uncoptr_rate = (uint8_t)val & 0x03U;
  5138. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2,
  5139. (uint8_t *)&fifo_ctrl2, 1);
  5140. }
  5141. return ret;
  5142. }
  5143. /**
  5144. * @brief Enable and configure compression algo.[get]
  5145. *
  5146. * @param ctx read / write interface definitions
  5147. * @param val Get the values of uncoptr_rate in
  5148. * reg FIFO_CTRL2
  5149. * @retval interface status (MANDATORY: return 0 -> no Error)
  5150. *
  5151. */
  5152. int32_t lsm6dso_compression_algo_get(stmdev_ctx_t *ctx,
  5153. lsm6dso_uncoptr_rate_t *val)
  5154. {
  5155. lsm6dso_fifo_ctrl2_t reg;
  5156. int32_t ret;
  5157. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5158. switch ((reg.fifo_compr_rt_en << 2) | reg.uncoptr_rate)
  5159. {
  5160. case LSM6DSO_CMP_DISABLE:
  5161. *val = LSM6DSO_CMP_DISABLE;
  5162. break;
  5163. case LSM6DSO_CMP_ALWAYS:
  5164. *val = LSM6DSO_CMP_ALWAYS;
  5165. break;
  5166. case LSM6DSO_CMP_8_TO_1:
  5167. *val = LSM6DSO_CMP_8_TO_1;
  5168. break;
  5169. case LSM6DSO_CMP_16_TO_1:
  5170. *val = LSM6DSO_CMP_16_TO_1;
  5171. break;
  5172. case LSM6DSO_CMP_32_TO_1:
  5173. *val = LSM6DSO_CMP_32_TO_1;
  5174. break;
  5175. default:
  5176. *val = LSM6DSO_CMP_DISABLE;
  5177. break;
  5178. }
  5179. return ret;
  5180. }
  5181. /**
  5182. * @brief Enables ODR CHANGE virtual sensor to be batched in FIFO.[set]
  5183. *
  5184. * @param ctx read / write interface definitions
  5185. * @param val change the values of odrchg_en in reg FIFO_CTRL2
  5186. * @retval interface status (MANDATORY: return 0 -> no Error)
  5187. *
  5188. */
  5189. int32_t lsm6dso_fifo_virtual_sens_odr_chg_set(stmdev_ctx_t *ctx,
  5190. uint8_t val)
  5191. {
  5192. lsm6dso_fifo_ctrl2_t reg;
  5193. int32_t ret;
  5194. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5195. if (ret == 0)
  5196. {
  5197. reg.odrchg_en = val;
  5198. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5199. }
  5200. return ret;
  5201. }
  5202. /**
  5203. * @brief Enables ODR CHANGE virtual sensor to be batched in FIFO.[get]
  5204. *
  5205. * @param ctx read / write interface definitions
  5206. * @param val change the values of odrchg_en in reg FIFO_CTRL2
  5207. * @retval interface status (MANDATORY: return 0 -> no Error)
  5208. *
  5209. */
  5210. int32_t lsm6dso_fifo_virtual_sens_odr_chg_get(stmdev_ctx_t *ctx,
  5211. uint8_t *val)
  5212. {
  5213. lsm6dso_fifo_ctrl2_t reg;
  5214. int32_t ret;
  5215. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5216. *val = reg.odrchg_en;
  5217. return ret;
  5218. }
  5219. /**
  5220. * @brief Enables/Disables compression algorithm runtime.[set]
  5221. *
  5222. * @param ctx read / write interface definitions
  5223. * @param val change the values of fifo_compr_rt_en in
  5224. * reg FIFO_CTRL2
  5225. * @retval interface status (MANDATORY: return 0 -> no Error)
  5226. *
  5227. */
  5228. int32_t lsm6dso_compression_algo_real_time_set(stmdev_ctx_t *ctx,
  5229. uint8_t val)
  5230. {
  5231. lsm6dso_fifo_ctrl2_t reg;
  5232. int32_t ret;
  5233. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5234. if (ret == 0)
  5235. {
  5236. reg.fifo_compr_rt_en = val;
  5237. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5238. }
  5239. return ret;
  5240. }
  5241. /**
  5242. * @brief Enables/Disables compression algorithm runtime. [get]
  5243. *
  5244. * @param ctx read / write interface definitions
  5245. * @param val change the values of fifo_compr_rt_en in reg FIFO_CTRL2
  5246. * @retval interface status (MANDATORY: return 0 -> no Error)
  5247. *
  5248. */
  5249. int32_t lsm6dso_compression_algo_real_time_get(stmdev_ctx_t *ctx,
  5250. uint8_t *val)
  5251. {
  5252. lsm6dso_fifo_ctrl2_t reg;
  5253. int32_t ret;
  5254. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5255. *val = reg.fifo_compr_rt_en;
  5256. return ret;
  5257. }
  5258. /**
  5259. * @brief Sensing chain FIFO stop values memorization at
  5260. * threshold level.[set]
  5261. *
  5262. * @param ctx read / write interface definitions
  5263. * @param val change the values of stop_on_wtm in reg FIFO_CTRL2
  5264. * @retval interface status (MANDATORY: return 0 -> no Error)
  5265. *
  5266. */
  5267. int32_t lsm6dso_fifo_stop_on_wtm_set(stmdev_ctx_t *ctx, uint8_t val)
  5268. {
  5269. lsm6dso_fifo_ctrl2_t reg;
  5270. int32_t ret;
  5271. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5272. if (ret == 0)
  5273. {
  5274. reg.stop_on_wtm = val;
  5275. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5276. }
  5277. return ret;
  5278. }
  5279. /**
  5280. * @brief Sensing chain FIFO stop values memorization at
  5281. * threshold level.[get]
  5282. *
  5283. * @param ctx read / write interface definitions
  5284. * @param val change the values of stop_on_wtm in reg FIFO_CTRL2
  5285. * @retval interface status (MANDATORY: return 0 -> no Error)
  5286. *
  5287. */
  5288. int32_t lsm6dso_fifo_stop_on_wtm_get(stmdev_ctx_t *ctx, uint8_t *val)
  5289. {
  5290. lsm6dso_fifo_ctrl2_t reg;
  5291. int32_t ret;
  5292. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t *)&reg, 1);
  5293. *val = reg.stop_on_wtm;
  5294. return ret;
  5295. }
  5296. /**
  5297. * @brief Selects Batching Data Rate (writing frequency in FIFO)
  5298. * for accelerometer data.[set]
  5299. *
  5300. * @param ctx read / write interface definitions
  5301. * @param val change the values of bdr_xl in reg FIFO_CTRL3
  5302. * @retval interface status (MANDATORY: return 0 -> no Error)
  5303. *
  5304. */
  5305. int32_t lsm6dso_fifo_xl_batch_set(stmdev_ctx_t *ctx,
  5306. lsm6dso_bdr_xl_t val)
  5307. {
  5308. lsm6dso_fifo_ctrl3_t reg;
  5309. int32_t ret;
  5310. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t *)&reg, 1);
  5311. if (ret == 0)
  5312. {
  5313. reg.bdr_xl = (uint8_t)val;
  5314. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t *)&reg, 1);
  5315. }
  5316. return ret;
  5317. }
  5318. /**
  5319. * @brief Selects Batching Data Rate (writing frequency in FIFO)
  5320. * for accelerometer data.[get]
  5321. *
  5322. * @param ctx read / write interface definitions
  5323. * @param val Get the values of bdr_xl in reg FIFO_CTRL3
  5324. * @retval interface status (MANDATORY: return 0 -> no Error)
  5325. *
  5326. */
  5327. int32_t lsm6dso_fifo_xl_batch_get(stmdev_ctx_t *ctx,
  5328. lsm6dso_bdr_xl_t *val)
  5329. {
  5330. lsm6dso_fifo_ctrl3_t reg;
  5331. int32_t ret;
  5332. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t *)&reg, 1);
  5333. switch (reg.bdr_xl)
  5334. {
  5335. case LSM6DSO_XL_NOT_BATCHED:
  5336. *val = LSM6DSO_XL_NOT_BATCHED;
  5337. break;
  5338. case LSM6DSO_XL_BATCHED_AT_12Hz5:
  5339. *val = LSM6DSO_XL_BATCHED_AT_12Hz5;
  5340. break;
  5341. case LSM6DSO_XL_BATCHED_AT_26Hz:
  5342. *val = LSM6DSO_XL_BATCHED_AT_26Hz;
  5343. break;
  5344. case LSM6DSO_XL_BATCHED_AT_52Hz:
  5345. *val = LSM6DSO_XL_BATCHED_AT_52Hz;
  5346. break;
  5347. case LSM6DSO_XL_BATCHED_AT_104Hz:
  5348. *val = LSM6DSO_XL_BATCHED_AT_104Hz;
  5349. break;
  5350. case LSM6DSO_XL_BATCHED_AT_208Hz:
  5351. *val = LSM6DSO_XL_BATCHED_AT_208Hz;
  5352. break;
  5353. case LSM6DSO_XL_BATCHED_AT_417Hz:
  5354. *val = LSM6DSO_XL_BATCHED_AT_417Hz;
  5355. break;
  5356. case LSM6DSO_XL_BATCHED_AT_833Hz:
  5357. *val = LSM6DSO_XL_BATCHED_AT_833Hz;
  5358. break;
  5359. case LSM6DSO_XL_BATCHED_AT_1667Hz:
  5360. *val = LSM6DSO_XL_BATCHED_AT_1667Hz;
  5361. break;
  5362. case LSM6DSO_XL_BATCHED_AT_3333Hz:
  5363. *val = LSM6DSO_XL_BATCHED_AT_3333Hz;
  5364. break;
  5365. case LSM6DSO_XL_BATCHED_AT_6667Hz:
  5366. *val = LSM6DSO_XL_BATCHED_AT_6667Hz;
  5367. break;
  5368. case LSM6DSO_XL_BATCHED_AT_6Hz5:
  5369. *val = LSM6DSO_XL_BATCHED_AT_6Hz5;
  5370. break;
  5371. default:
  5372. *val = LSM6DSO_XL_NOT_BATCHED;
  5373. break;
  5374. }
  5375. return ret;
  5376. }
  5377. /**
  5378. * @brief Selects Batching Data Rate (writing frequency in FIFO)
  5379. * for gyroscope data.[set]
  5380. *
  5381. * @param ctx read / write interface definitions
  5382. * @param val change the values of bdr_gy in reg FIFO_CTRL3
  5383. * @retval interface status (MANDATORY: return 0 -> no Error)
  5384. *
  5385. */
  5386. int32_t lsm6dso_fifo_gy_batch_set(stmdev_ctx_t *ctx,
  5387. lsm6dso_bdr_gy_t val)
  5388. {
  5389. lsm6dso_fifo_ctrl3_t reg;
  5390. int32_t ret;
  5391. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t *)&reg, 1);
  5392. if (ret == 0)
  5393. {
  5394. reg.bdr_gy = (uint8_t)val;
  5395. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t *)&reg, 1);
  5396. }
  5397. return ret;
  5398. }
  5399. /**
  5400. * @brief Selects Batching Data Rate (writing frequency in FIFO)
  5401. * for gyroscope data.[get]
  5402. *
  5403. * @param ctx read / write interface definitions
  5404. * @param val Get the values of bdr_gy in reg FIFO_CTRL3
  5405. * @retval interface status (MANDATORY: return 0 -> no Error)
  5406. *
  5407. */
  5408. int32_t lsm6dso_fifo_gy_batch_get(stmdev_ctx_t *ctx,
  5409. lsm6dso_bdr_gy_t *val)
  5410. {
  5411. lsm6dso_fifo_ctrl3_t reg;
  5412. int32_t ret;
  5413. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t *)&reg, 1);
  5414. switch (reg.bdr_gy)
  5415. {
  5416. case LSM6DSO_GY_NOT_BATCHED:
  5417. *val = LSM6DSO_GY_NOT_BATCHED;
  5418. break;
  5419. case LSM6DSO_GY_BATCHED_AT_12Hz5:
  5420. *val = LSM6DSO_GY_BATCHED_AT_12Hz5;
  5421. break;
  5422. case LSM6DSO_GY_BATCHED_AT_26Hz:
  5423. *val = LSM6DSO_GY_BATCHED_AT_26Hz;
  5424. break;
  5425. case LSM6DSO_GY_BATCHED_AT_52Hz:
  5426. *val = LSM6DSO_GY_BATCHED_AT_52Hz;
  5427. break;
  5428. case LSM6DSO_GY_BATCHED_AT_104Hz:
  5429. *val = LSM6DSO_GY_BATCHED_AT_104Hz;
  5430. break;
  5431. case LSM6DSO_GY_BATCHED_AT_208Hz:
  5432. *val = LSM6DSO_GY_BATCHED_AT_208Hz;
  5433. break;
  5434. case LSM6DSO_GY_BATCHED_AT_417Hz:
  5435. *val = LSM6DSO_GY_BATCHED_AT_417Hz;
  5436. break;
  5437. case LSM6DSO_GY_BATCHED_AT_833Hz:
  5438. *val = LSM6DSO_GY_BATCHED_AT_833Hz;
  5439. break;
  5440. case LSM6DSO_GY_BATCHED_AT_1667Hz:
  5441. *val = LSM6DSO_GY_BATCHED_AT_1667Hz;
  5442. break;
  5443. case LSM6DSO_GY_BATCHED_AT_3333Hz:
  5444. *val = LSM6DSO_GY_BATCHED_AT_3333Hz;
  5445. break;
  5446. case LSM6DSO_GY_BATCHED_AT_6667Hz:
  5447. *val = LSM6DSO_GY_BATCHED_AT_6667Hz;
  5448. break;
  5449. case LSM6DSO_GY_BATCHED_AT_6Hz5:
  5450. *val = LSM6DSO_GY_BATCHED_AT_6Hz5;
  5451. break;
  5452. default:
  5453. *val = LSM6DSO_GY_NOT_BATCHED;
  5454. break;
  5455. }
  5456. return ret;
  5457. }
  5458. /**
  5459. * @brief FIFO mode selection.[set]
  5460. *
  5461. * @param ctx read / write interface definitions
  5462. * @param val change the values of fifo_mode in reg FIFO_CTRL4
  5463. * @retval interface status (MANDATORY: return 0 -> no Error)
  5464. *
  5465. */
  5466. int32_t lsm6dso_fifo_mode_set(stmdev_ctx_t *ctx,
  5467. lsm6dso_fifo_mode_t val)
  5468. {
  5469. lsm6dso_fifo_ctrl4_t reg;
  5470. int32_t ret;
  5471. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5472. if (ret == 0)
  5473. {
  5474. reg.fifo_mode = (uint8_t)val;
  5475. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5476. }
  5477. return ret;
  5478. }
  5479. /**
  5480. * @brief FIFO mode selection.[get]
  5481. *
  5482. * @param ctx read / write interface definitions
  5483. * @param val Get the values of fifo_mode in reg FIFO_CTRL4
  5484. * @retval interface status (MANDATORY: return 0 -> no Error)
  5485. *
  5486. */
  5487. int32_t lsm6dso_fifo_mode_get(stmdev_ctx_t *ctx,
  5488. lsm6dso_fifo_mode_t *val)
  5489. {
  5490. lsm6dso_fifo_ctrl4_t reg;
  5491. int32_t ret;
  5492. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5493. switch (reg.fifo_mode)
  5494. {
  5495. case LSM6DSO_BYPASS_MODE:
  5496. *val = LSM6DSO_BYPASS_MODE;
  5497. break;
  5498. case LSM6DSO_FIFO_MODE:
  5499. *val = LSM6DSO_FIFO_MODE;
  5500. break;
  5501. case LSM6DSO_STREAM_TO_FIFO_MODE:
  5502. *val = LSM6DSO_STREAM_TO_FIFO_MODE;
  5503. break;
  5504. case LSM6DSO_BYPASS_TO_STREAM_MODE:
  5505. *val = LSM6DSO_BYPASS_TO_STREAM_MODE;
  5506. break;
  5507. case LSM6DSO_STREAM_MODE:
  5508. *val = LSM6DSO_STREAM_MODE;
  5509. break;
  5510. case LSM6DSO_BYPASS_TO_FIFO_MODE:
  5511. *val = LSM6DSO_BYPASS_TO_FIFO_MODE;
  5512. break;
  5513. default:
  5514. *val = LSM6DSO_BYPASS_MODE;
  5515. break;
  5516. }
  5517. return ret;
  5518. }
  5519. /**
  5520. * @brief Selects Batching Data Rate (writing frequency in FIFO)
  5521. * for temperature data.[set]
  5522. *
  5523. * @param ctx read / write interface definitions
  5524. * @param val change the values of odr_t_batch in reg FIFO_CTRL4
  5525. * @retval interface status (MANDATORY: return 0 -> no Error)
  5526. *
  5527. */
  5528. int32_t lsm6dso_fifo_temp_batch_set(stmdev_ctx_t *ctx,
  5529. lsm6dso_odr_t_batch_t val)
  5530. {
  5531. lsm6dso_fifo_ctrl4_t reg;
  5532. int32_t ret;
  5533. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5534. if (ret == 0)
  5535. {
  5536. reg.odr_t_batch = (uint8_t)val;
  5537. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5538. }
  5539. return ret;
  5540. }
  5541. /**
  5542. * @brief Selects Batching Data Rate (writing frequency in FIFO)
  5543. * for temperature data.[get]
  5544. *
  5545. * @param ctx read / write interface definitions
  5546. * @param val Get the values of odr_t_batch in reg FIFO_CTRL4
  5547. * @retval interface status (MANDATORY: return 0 -> no Error)
  5548. *
  5549. */
  5550. int32_t lsm6dso_fifo_temp_batch_get(stmdev_ctx_t *ctx,
  5551. lsm6dso_odr_t_batch_t *val)
  5552. {
  5553. lsm6dso_fifo_ctrl4_t reg;
  5554. int32_t ret;
  5555. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5556. switch (reg.odr_t_batch)
  5557. {
  5558. case LSM6DSO_TEMP_NOT_BATCHED:
  5559. *val = LSM6DSO_TEMP_NOT_BATCHED;
  5560. break;
  5561. case LSM6DSO_TEMP_BATCHED_AT_1Hz6:
  5562. *val = LSM6DSO_TEMP_BATCHED_AT_1Hz6;
  5563. break;
  5564. case LSM6DSO_TEMP_BATCHED_AT_12Hz5:
  5565. *val = LSM6DSO_TEMP_BATCHED_AT_12Hz5;
  5566. break;
  5567. case LSM6DSO_TEMP_BATCHED_AT_52Hz:
  5568. *val = LSM6DSO_TEMP_BATCHED_AT_52Hz;
  5569. break;
  5570. default:
  5571. *val = LSM6DSO_TEMP_NOT_BATCHED;
  5572. break;
  5573. }
  5574. return ret;
  5575. }
  5576. /**
  5577. * @brief Selects decimation for timestamp batching in FIFO.
  5578. * Writing rate will be the maximum rate between XL and
  5579. * GYRO BDR divided by decimation decoder.[set]
  5580. *
  5581. * @param ctx read / write interface definitions
  5582. * @param val change the values of odr_ts_batch in reg FIFO_CTRL4
  5583. * @retval interface status (MANDATORY: return 0 -> no Error)
  5584. *
  5585. */
  5586. int32_t lsm6dso_fifo_timestamp_decimation_set(stmdev_ctx_t *ctx,
  5587. lsm6dso_odr_ts_batch_t val)
  5588. {
  5589. lsm6dso_fifo_ctrl4_t reg;
  5590. int32_t ret;
  5591. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5592. if (ret == 0)
  5593. {
  5594. reg.odr_ts_batch = (uint8_t)val;
  5595. ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5596. }
  5597. return ret;
  5598. }
  5599. /**
  5600. * @brief Selects decimation for timestamp batching in FIFO.
  5601. * Writing rate will be the maximum rate between XL and
  5602. * GYRO BDR divided by decimation decoder.[get]
  5603. *
  5604. * @param ctx read / write interface definitions
  5605. * @param val Get the values of odr_ts_batch in reg FIFO_CTRL4
  5606. * @retval interface status (MANDATORY: return 0 -> no Error)
  5607. *
  5608. */
  5609. int32_t lsm6dso_fifo_timestamp_decimation_get(stmdev_ctx_t *ctx,
  5610. lsm6dso_odr_ts_batch_t *val)
  5611. {
  5612. lsm6dso_fifo_ctrl4_t reg;
  5613. int32_t ret;
  5614. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t *)&reg, 1);
  5615. switch (reg.odr_ts_batch)
  5616. {
  5617. case LSM6DSO_NO_DECIMATION:
  5618. *val = LSM6DSO_NO_DECIMATION;
  5619. break;
  5620. case LSM6DSO_DEC_1:
  5621. *val = LSM6DSO_DEC_1;
  5622. break;
  5623. case LSM6DSO_DEC_8:
  5624. *val = LSM6DSO_DEC_8;
  5625. break;
  5626. case LSM6DSO_DEC_32:
  5627. *val = LSM6DSO_DEC_32;
  5628. break;
  5629. default:
  5630. *val = LSM6DSO_NO_DECIMATION;
  5631. break;
  5632. }
  5633. return ret;
  5634. }
  5635. /**
  5636. * @brief Selects the trigger for the internal counter of batching events
  5637. * between XL and gyro.[set]
  5638. *
  5639. * @param ctx read / write interface definitions
  5640. * @param val change the values of trig_counter_bdr
  5641. * in reg COUNTER_BDR_REG1
  5642. * @retval interface status (MANDATORY: return 0 -> no Error)
  5643. *
  5644. */
  5645. int32_t lsm6dso_fifo_cnt_event_batch_set(stmdev_ctx_t *ctx,
  5646. lsm6dso_trig_counter_bdr_t val)
  5647. {
  5648. lsm6dso_counter_bdr_reg1_t reg;
  5649. int32_t ret;
  5650. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t *)&reg, 1);
  5651. if (ret == 0)
  5652. {
  5653. reg.trig_counter_bdr = (uint8_t)val;
  5654. ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
  5655. (uint8_t *)&reg, 1);
  5656. }
  5657. return ret;
  5658. }
  5659. /**
  5660. * @brief Selects the trigger for the internal counter of batching events
  5661. * between XL and gyro.[get]
  5662. *
  5663. * @param ctx read / write interface definitions
  5664. * @param val Get the values of trig_counter_bdr
  5665. * in reg COUNTER_BDR_REG1
  5666. * @retval interface status (MANDATORY: return 0 -> no Error)
  5667. *
  5668. */
  5669. int32_t lsm6dso_fifo_cnt_event_batch_get(stmdev_ctx_t *ctx,
  5670. lsm6dso_trig_counter_bdr_t *val)
  5671. {
  5672. lsm6dso_counter_bdr_reg1_t reg;
  5673. int32_t ret;
  5674. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t *)&reg, 1);
  5675. switch (reg.trig_counter_bdr)
  5676. {
  5677. case LSM6DSO_XL_BATCH_EVENT:
  5678. *val = LSM6DSO_XL_BATCH_EVENT;
  5679. break;
  5680. case LSM6DSO_GYRO_BATCH_EVENT:
  5681. *val = LSM6DSO_GYRO_BATCH_EVENT;
  5682. break;
  5683. default:
  5684. *val = LSM6DSO_XL_BATCH_EVENT;
  5685. break;
  5686. }
  5687. return ret;
  5688. }
  5689. /**
  5690. * @brief Resets the internal counter of batching vents for a single sensor.
  5691. * This bit is automatically reset to zero if it was set to '1'.[set]
  5692. *
  5693. * @param ctx read / write interface definitions
  5694. * @param val change the values of rst_counter_bdr in
  5695. * reg COUNTER_BDR_REG1
  5696. * @retval interface status (MANDATORY: return 0 -> no Error)
  5697. *
  5698. */
  5699. int32_t lsm6dso_rst_batch_counter_set(stmdev_ctx_t *ctx, uint8_t val)
  5700. {
  5701. lsm6dso_counter_bdr_reg1_t reg;
  5702. int32_t ret;
  5703. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t *)&reg, 1);
  5704. if (ret == 0)
  5705. {
  5706. reg.rst_counter_bdr = val;
  5707. ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
  5708. (uint8_t *)&reg, 1);
  5709. }
  5710. return ret;
  5711. }
  5712. /**
  5713. * @brief Resets the internal counter of batching events for a single sensor.
  5714. * This bit is automatically reset to zero if it was set to '1'.[get]
  5715. *
  5716. * @param ctx read / write interface definitions
  5717. * @param val change the values of rst_counter_bdr in
  5718. * reg COUNTER_BDR_REG1
  5719. * @retval interface status (MANDATORY: return 0 -> no Error)
  5720. *
  5721. */
  5722. int32_t lsm6dso_rst_batch_counter_get(stmdev_ctx_t *ctx, uint8_t *val)
  5723. {
  5724. lsm6dso_counter_bdr_reg1_t reg;
  5725. int32_t ret;
  5726. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t *)&reg, 1);
  5727. *val = reg.rst_counter_bdr;
  5728. return ret;
  5729. }
  5730. /**
  5731. * @brief Batch data rate counter.[set]
  5732. *
  5733. * @param ctx read / write interface definitions
  5734. * @param val change the values of cnt_bdr_th in
  5735. * reg COUNTER_BDR_REG2 and COUNTER_BDR_REG1.
  5736. * @retval interface status (MANDATORY: return 0 -> no Error)
  5737. *
  5738. */
  5739. int32_t lsm6dso_batch_counter_threshold_set(stmdev_ctx_t *ctx,
  5740. uint16_t val)
  5741. {
  5742. lsm6dso_counter_bdr_reg1_t counter_bdr_reg1;
  5743. lsm6dso_counter_bdr_reg2_t counter_bdr_reg2;
  5744. int32_t ret;
  5745. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
  5746. (uint8_t *)&counter_bdr_reg1, 1);
  5747. if (ret == 0)
  5748. {
  5749. counter_bdr_reg2.cnt_bdr_th = 0x00FFU & (uint8_t)val;
  5750. counter_bdr_reg1.cnt_bdr_th = (uint8_t)(0x0700U & val) >> 8;
  5751. ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
  5752. (uint8_t *)&counter_bdr_reg1, 1);
  5753. }
  5754. if (ret == 0)
  5755. {
  5756. ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG2,
  5757. (uint8_t *)&counter_bdr_reg2, 1);
  5758. }
  5759. return ret;
  5760. }
  5761. /**
  5762. * @brief Batch data rate counter.[get]
  5763. *
  5764. * @param ctx read / write interface definitions
  5765. * @param val change the values of cnt_bdr_th in
  5766. * reg COUNTER_BDR_REG2 and COUNTER_BDR_REG1.
  5767. * @retval interface status (MANDATORY: return 0 -> no Error)
  5768. *
  5769. */
  5770. int32_t lsm6dso_batch_counter_threshold_get(stmdev_ctx_t *ctx,
  5771. uint16_t *val)
  5772. {
  5773. lsm6dso_counter_bdr_reg1_t counter_bdr_reg1;
  5774. lsm6dso_counter_bdr_reg2_t counter_bdr_reg2;
  5775. int32_t ret;
  5776. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
  5777. (uint8_t *)&counter_bdr_reg1, 1);
  5778. if (ret == 0)
  5779. {
  5780. ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG2,
  5781. (uint8_t *)&counter_bdr_reg2, 1);
  5782. *val = ((uint16_t)counter_bdr_reg1.cnt_bdr_th << 8)
  5783. + (uint16_t)counter_bdr_reg2.cnt_bdr_th;
  5784. }
  5785. return ret;
  5786. }
  5787. /**
  5788. * @brief Number of unread sensor data(TAG + 6 bytes) stored in FIFO.[get]
  5789. *
  5790. * @param ctx read / write interface definitions
  5791. * @param val change the values of diff_fifo in reg FIFO_STATUS1
  5792. * @retval interface status (MANDATORY: return 0 -> no Error)
  5793. *
  5794. */
  5795. int32_t lsm6dso_fifo_data_level_get(stmdev_ctx_t *ctx, uint16_t *val)
  5796. {
  5797. lsm6dso_fifo_status1_t fifo_status1;
  5798. lsm6dso_fifo_status2_t fifo_status2;
  5799. int32_t ret;
  5800. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS1,
  5801. (uint8_t *)&fifo_status1, 1);
  5802. if (ret == 0)
  5803. {
  5804. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2,
  5805. (uint8_t *)&fifo_status2, 1);
  5806. *val = ((uint16_t)fifo_status2.diff_fifo << 8) +
  5807. (uint16_t)fifo_status1.diff_fifo;
  5808. }
  5809. return ret;
  5810. }
  5811. /**
  5812. * @brief FIFO status.[get]
  5813. *
  5814. * @param ctx read / write interface definitions
  5815. * @param val registers FIFO_STATUS2
  5816. * @retval interface status (MANDATORY: return 0 -> no Error)
  5817. *
  5818. */
  5819. int32_t lsm6dso_fifo_status_get(stmdev_ctx_t *ctx,
  5820. lsm6dso_fifo_status2_t *val)
  5821. {
  5822. int32_t ret;
  5823. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t *) val, 1);
  5824. return ret;
  5825. }
  5826. /**
  5827. * @brief Smart FIFO full status.[get]
  5828. *
  5829. * @param ctx read / write interface definitions
  5830. * @param val change the values of fifo_full_ia in reg FIFO_STATUS2
  5831. * @retval interface status (MANDATORY: return 0 -> no Error)
  5832. *
  5833. */
  5834. int32_t lsm6dso_fifo_full_flag_get(stmdev_ctx_t *ctx, uint8_t *val)
  5835. {
  5836. lsm6dso_fifo_status2_t reg;
  5837. int32_t ret;
  5838. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t *)&reg, 1);
  5839. *val = reg.fifo_full_ia;
  5840. return ret;
  5841. }
  5842. /**
  5843. * @brief FIFO overrun status.[get]
  5844. *
  5845. * @param ctx read / write interface definitions
  5846. * @param val change the values of fifo_over_run_latched in
  5847. * reg FIFO_STATUS2
  5848. * @retval interface status (MANDATORY: return 0 -> no Error)
  5849. *
  5850. */
  5851. int32_t lsm6dso_fifo_ovr_flag_get(stmdev_ctx_t *ctx, uint8_t *val)
  5852. {
  5853. lsm6dso_fifo_status2_t reg;
  5854. int32_t ret;
  5855. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t *)&reg, 1);
  5856. *val = reg.fifo_ovr_ia;
  5857. return ret;
  5858. }
  5859. /**
  5860. * @brief FIFO watermark status.[get]
  5861. *
  5862. * @param ctx read / write interface definitions
  5863. * @param val change the values of fifo_wtm_ia in reg FIFO_STATUS2
  5864. * @retval interface status (MANDATORY: return 0 -> no Error)
  5865. *
  5866. */
  5867. int32_t lsm6dso_fifo_wtm_flag_get(stmdev_ctx_t *ctx, uint8_t *val)
  5868. {
  5869. lsm6dso_fifo_status2_t reg;
  5870. int32_t ret;
  5871. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t *)&reg, 1);
  5872. *val = reg.fifo_wtm_ia;
  5873. return ret;
  5874. }
  5875. /**
  5876. * @brief Identifies the sensor in FIFO_DATA_OUT.[get]
  5877. *
  5878. * @param ctx read / write interface definitions
  5879. * @param val change the values of tag_sensor in reg FIFO_DATA_OUT_TAG
  5880. * @retval interface status (MANDATORY: return 0 -> no Error)
  5881. *
  5882. */
  5883. int32_t lsm6dso_fifo_sensor_tag_get(stmdev_ctx_t *ctx,
  5884. lsm6dso_fifo_tag_t *val)
  5885. {
  5886. lsm6dso_fifo_data_out_tag_t reg;
  5887. int32_t ret;
  5888. ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_DATA_OUT_TAG,
  5889. (uint8_t *)&reg, 1);
  5890. switch (reg.tag_sensor)
  5891. {
  5892. case LSM6DSO_GYRO_NC_TAG:
  5893. *val = LSM6DSO_GYRO_NC_TAG;
  5894. break;
  5895. case LSM6DSO_XL_NC_TAG:
  5896. *val = LSM6DSO_XL_NC_TAG;
  5897. break;
  5898. case LSM6DSO_TEMPERATURE_TAG:
  5899. *val = LSM6DSO_TEMPERATURE_TAG;
  5900. break;
  5901. case LSM6DSO_CFG_CHANGE_TAG:
  5902. *val = LSM6DSO_CFG_CHANGE_TAG;
  5903. break;
  5904. case LSM6DSO_XL_NC_T_2_TAG:
  5905. *val = LSM6DSO_XL_NC_T_2_TAG;
  5906. break;
  5907. case LSM6DSO_XL_NC_T_1_TAG:
  5908. *val = LSM6DSO_XL_NC_T_1_TAG;
  5909. break;
  5910. case LSM6DSO_XL_2XC_TAG:
  5911. *val = LSM6DSO_XL_2XC_TAG;
  5912. break;
  5913. case LSM6DSO_XL_3XC_TAG:
  5914. *val = LSM6DSO_XL_3XC_TAG;
  5915. break;
  5916. case LSM6DSO_GYRO_NC_T_2_TAG:
  5917. *val = LSM6DSO_GYRO_NC_T_2_TAG;
  5918. break;
  5919. case LSM6DSO_GYRO_NC_T_1_TAG:
  5920. *val = LSM6DSO_GYRO_NC_T_1_TAG;
  5921. break;
  5922. case LSM6DSO_GYRO_2XC_TAG:
  5923. *val = LSM6DSO_GYRO_2XC_TAG;
  5924. break;
  5925. case LSM6DSO_GYRO_3XC_TAG:
  5926. *val = LSM6DSO_GYRO_3XC_TAG;
  5927. break;
  5928. case LSM6DSO_SENSORHUB_SLAVE0_TAG:
  5929. *val = LSM6DSO_SENSORHUB_SLAVE0_TAG;
  5930. break;
  5931. case LSM6DSO_SENSORHUB_SLAVE1_TAG:
  5932. *val = LSM6DSO_SENSORHUB_SLAVE1_TAG;
  5933. break;
  5934. case LSM6DSO_SENSORHUB_SLAVE2_TAG:
  5935. *val = LSM6DSO_SENSORHUB_SLAVE2_TAG;
  5936. break;
  5937. case LSM6DSO_SENSORHUB_SLAVE3_TAG:
  5938. *val = LSM6DSO_SENSORHUB_SLAVE3_TAG;
  5939. break;
  5940. case LSM6DSO_STEP_CPUNTER_TAG:
  5941. *val = LSM6DSO_STEP_CPUNTER_TAG;
  5942. break;
  5943. case LSM6DSO_GAME_ROTATION_TAG:
  5944. *val = LSM6DSO_GAME_ROTATION_TAG;
  5945. break;
  5946. case LSM6DSO_GEOMAG_ROTATION_TAG:
  5947. *val = LSM6DSO_GEOMAG_ROTATION_TAG;
  5948. break;
  5949. case LSM6DSO_ROTATION_TAG:
  5950. *val = LSM6DSO_ROTATION_TAG;
  5951. break;
  5952. case LSM6DSO_SENSORHUB_NACK_TAG:
  5953. *val = LSM6DSO_SENSORHUB_NACK_TAG;
  5954. break;
  5955. default:
  5956. *val = LSM6DSO_GYRO_NC_TAG;
  5957. break;
  5958. }
  5959. return ret;
  5960. }
  5961. /**
  5962. * @brief : Enable FIFO batching of pedometer embedded
  5963. * function values.[set]
  5964. *
  5965. * @param ctx read / write interface definitions
  5966. * @param val change the values of gbias_fifo_en in
  5967. * reg LSM6DSO_EMB_FUNC_FIFO_CFG
  5968. * @retval interface status (MANDATORY: return 0 -> no Error)
  5969. *
  5970. */
  5971. int32_t lsm6dso_fifo_pedo_batch_set(stmdev_ctx_t *ctx, uint8_t val)
  5972. {
  5973. lsm6dso_emb_func_fifo_cfg_t reg;
  5974. int32_t ret;
  5975. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  5976. if (ret == 0)
  5977. {
  5978. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_FIFO_CFG,
  5979. (uint8_t *)&reg, 1);
  5980. }
  5981. if (ret == 0)
  5982. {
  5983. reg.pedo_fifo_en = val;
  5984. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_FIFO_CFG,
  5985. (uint8_t *)&reg, 1);
  5986. }
  5987. if (ret == 0)
  5988. {
  5989. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  5990. }
  5991. return ret;
  5992. }
  5993. /**
  5994. * @brief Enable FIFO batching of pedometer embedded function values.[get]
  5995. *
  5996. * @param ctx read / write interface definitions
  5997. * @param val change the values of pedo_fifo_en in
  5998. * reg LSM6DSO_EMB_FUNC_FIFO_CFG
  5999. * @retval interface status (MANDATORY: return 0 -> no Error)
  6000. *
  6001. */
  6002. int32_t lsm6dso_fifo_pedo_batch_get(stmdev_ctx_t *ctx, uint8_t *val)
  6003. {
  6004. lsm6dso_emb_func_fifo_cfg_t reg;
  6005. int32_t ret;
  6006. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  6007. if (ret == 0)
  6008. {
  6009. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_FIFO_CFG,
  6010. (uint8_t *)&reg, 1);
  6011. }
  6012. if (ret == 0)
  6013. {
  6014. *val = reg.pedo_fifo_en;
  6015. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6016. }
  6017. return ret;
  6018. }
  6019. /**
  6020. * @brief Enable FIFO batching data of first slave.[set]
  6021. *
  6022. * @param ctx read / write interface definitions
  6023. * @param val change the values of batch_ext_sens_0_en in
  6024. * reg SLV0_CONFIG
  6025. * @retval interface status (MANDATORY: return 0 -> no Error)
  6026. *
  6027. */
  6028. int32_t lsm6dso_sh_batch_slave_0_set(stmdev_ctx_t *ctx, uint8_t val)
  6029. {
  6030. lsm6dso_slv0_config_t reg;
  6031. int32_t ret;
  6032. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6033. if (ret == 0)
  6034. {
  6035. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t *)&reg, 1);
  6036. }
  6037. if (ret == 0)
  6038. {
  6039. reg.batch_ext_sens_0_en = val;
  6040. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t *)&reg, 1);
  6041. }
  6042. if (ret == 0)
  6043. {
  6044. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6045. }
  6046. return ret;
  6047. }
  6048. /**
  6049. * @brief Enable FIFO batching data of first slave.[get]
  6050. *
  6051. * @param ctx read / write interface definitions
  6052. * @param val change the values of batch_ext_sens_0_en in
  6053. * reg SLV0_CONFIG
  6054. * @retval interface status (MANDATORY: return 0 -> no Error)
  6055. *
  6056. */
  6057. int32_t lsm6dso_sh_batch_slave_0_get(stmdev_ctx_t *ctx, uint8_t *val)
  6058. {
  6059. lsm6dso_slv0_config_t reg;
  6060. int32_t ret;
  6061. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6062. if (ret == 0)
  6063. {
  6064. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t *)&reg, 1);
  6065. }
  6066. if (ret == 0)
  6067. {
  6068. *val = reg.batch_ext_sens_0_en;
  6069. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6070. }
  6071. return ret;
  6072. }
  6073. /**
  6074. * @brief Enable FIFO batching data of second slave.[set]
  6075. *
  6076. * @param ctx read / write interface definitions
  6077. * @param val change the values of batch_ext_sens_1_en in
  6078. * reg SLV1_CONFIG
  6079. * @retval interface status (MANDATORY: return 0 -> no Error)
  6080. *
  6081. */
  6082. int32_t lsm6dso_sh_batch_slave_1_set(stmdev_ctx_t *ctx, uint8_t val)
  6083. {
  6084. lsm6dso_slv1_config_t reg;
  6085. int32_t ret;
  6086. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6087. if (ret == 0)
  6088. {
  6089. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t *)&reg, 1);
  6090. }
  6091. if (ret == 0)
  6092. {
  6093. reg.batch_ext_sens_1_en = val;
  6094. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t *)&reg, 1);
  6095. }
  6096. if (ret == 0)
  6097. {
  6098. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6099. }
  6100. return ret;
  6101. }
  6102. /**
  6103. * @brief Enable FIFO batching data of second slave.[get]
  6104. *
  6105. * @param ctx read / write interface definitions
  6106. * @param val change the values of batch_ext_sens_1_en in
  6107. * reg SLV1_CONFIG
  6108. * @retval interface status (MANDATORY: return 0 -> no Error)
  6109. *
  6110. */
  6111. int32_t lsm6dso_sh_batch_slave_1_get(stmdev_ctx_t *ctx, uint8_t *val)
  6112. {
  6113. lsm6dso_slv1_config_t reg;
  6114. int32_t ret;
  6115. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6116. if (ret == 0)
  6117. {
  6118. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t *)&reg, 1);
  6119. *val = reg.batch_ext_sens_1_en;
  6120. }
  6121. if (ret == 0)
  6122. {
  6123. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6124. }
  6125. return ret;
  6126. }
  6127. /**
  6128. * @brief Enable FIFO batching data of third slave.[set]
  6129. *
  6130. * @param ctx read / write interface definitions
  6131. * @param val change the values of batch_ext_sens_2_en in
  6132. * reg SLV2_CONFIG
  6133. * @retval interface status (MANDATORY: return 0 -> no Error)
  6134. *
  6135. */
  6136. int32_t lsm6dso_sh_batch_slave_2_set(stmdev_ctx_t *ctx, uint8_t val)
  6137. {
  6138. lsm6dso_slv2_config_t reg;
  6139. int32_t ret;
  6140. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6141. if (ret == 0)
  6142. {
  6143. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV2_CONFIG, (uint8_t *)&reg, 1);
  6144. }
  6145. if (ret == 0)
  6146. {
  6147. reg.batch_ext_sens_2_en = val;
  6148. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_CONFIG, (uint8_t *)&reg, 1);
  6149. }
  6150. if (ret == 0)
  6151. {
  6152. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6153. }
  6154. return ret;
  6155. }
  6156. /**
  6157. * @brief Enable FIFO batching data of third slave.[get]
  6158. *
  6159. * @param ctx read / write interface definitions
  6160. * @param val change the values of batch_ext_sens_2_en in
  6161. * reg SLV2_CONFIG
  6162. * @retval interface status (MANDATORY: return 0 -> no Error)
  6163. *
  6164. */
  6165. int32_t lsm6dso_sh_batch_slave_2_get(stmdev_ctx_t *ctx, uint8_t *val)
  6166. {
  6167. lsm6dso_slv2_config_t reg;
  6168. int32_t ret;
  6169. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6170. if (ret == 0)
  6171. {
  6172. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV2_CONFIG, (uint8_t *)&reg, 1);
  6173. }
  6174. if (ret == 0)
  6175. {
  6176. *val = reg.batch_ext_sens_2_en;
  6177. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6178. }
  6179. return ret;
  6180. }
  6181. /**
  6182. * @brief Enable FIFO batching data of fourth slave.[set]
  6183. *
  6184. * @param ctx read / write interface definitions
  6185. * @param val change the values of batch_ext_sens_3_en
  6186. * in reg SLV3_CONFIG
  6187. * @retval interface status (MANDATORY: return 0 -> no Error)
  6188. *
  6189. */
  6190. int32_t lsm6dso_sh_batch_slave_3_set(stmdev_ctx_t *ctx, uint8_t val)
  6191. {
  6192. lsm6dso_slv3_config_t reg;
  6193. int32_t ret;
  6194. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6195. if (ret == 0)
  6196. {
  6197. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV3_CONFIG, (uint8_t *)&reg, 1);
  6198. }
  6199. if (ret == 0)
  6200. {
  6201. reg.batch_ext_sens_3_en = val;
  6202. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_CONFIG, (uint8_t *)&reg, 1);
  6203. }
  6204. if (ret == 0)
  6205. {
  6206. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6207. }
  6208. return ret;
  6209. }
  6210. /**
  6211. * @brief Enable FIFO batching data of fourth slave.[get]
  6212. *
  6213. * @param ctx read / write interface definitions
  6214. * @param val change the values of batch_ext_sens_3_en in
  6215. * reg SLV3_CONFIG
  6216. * @retval interface status (MANDATORY: return 0 -> no Error)
  6217. *
  6218. */
  6219. int32_t lsm6dso_sh_batch_slave_3_get(stmdev_ctx_t *ctx, uint8_t *val)
  6220. {
  6221. lsm6dso_slv3_config_t reg;
  6222. int32_t ret;
  6223. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  6224. if (ret == 0)
  6225. {
  6226. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV3_CONFIG, (uint8_t *)&reg, 1);
  6227. }
  6228. if (ret == 0)
  6229. {
  6230. *val = reg.batch_ext_sens_3_en;
  6231. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6232. }
  6233. return ret;
  6234. }
  6235. /**
  6236. * @}
  6237. *
  6238. */
  6239. /**
  6240. * @defgroup LSM6DSO_DEN_functionality
  6241. * @brief This section groups all the functions concerning
  6242. * DEN functionality.
  6243. * @{
  6244. *
  6245. */
  6246. /**
  6247. * @brief DEN functionality marking mode.[set]
  6248. *
  6249. * @param ctx read / write interface definitions
  6250. * @param val change the values of den_mode in reg CTRL6_C
  6251. * @retval interface status (MANDATORY: return 0 -> no Error)
  6252. *
  6253. */
  6254. int32_t lsm6dso_den_mode_set(stmdev_ctx_t *ctx,
  6255. lsm6dso_den_mode_t val)
  6256. {
  6257. lsm6dso_ctrl6_c_t reg;
  6258. int32_t ret;
  6259. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  6260. if (ret == 0)
  6261. {
  6262. reg.den_mode = (uint8_t)val;
  6263. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  6264. }
  6265. return ret;
  6266. }
  6267. /**
  6268. * @brief DEN functionality marking mode.[get]
  6269. *
  6270. * @param ctx read / write interface definitions
  6271. * @param val Get the values of den_mode in reg CTRL6_C
  6272. * @retval interface status (MANDATORY: return 0 -> no Error)
  6273. *
  6274. */
  6275. int32_t lsm6dso_den_mode_get(stmdev_ctx_t *ctx,
  6276. lsm6dso_den_mode_t *val)
  6277. {
  6278. lsm6dso_ctrl6_c_t reg;
  6279. int32_t ret;
  6280. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t *)&reg, 1);
  6281. switch (reg.den_mode)
  6282. {
  6283. case LSM6DSO_DEN_DISABLE:
  6284. *val = LSM6DSO_DEN_DISABLE;
  6285. break;
  6286. case LSM6DSO_LEVEL_FIFO:
  6287. *val = LSM6DSO_LEVEL_FIFO;
  6288. break;
  6289. case LSM6DSO_LEVEL_LETCHED:
  6290. *val = LSM6DSO_LEVEL_LETCHED;
  6291. break;
  6292. case LSM6DSO_LEVEL_TRIGGER:
  6293. *val = LSM6DSO_LEVEL_TRIGGER;
  6294. break;
  6295. case LSM6DSO_EDGE_TRIGGER:
  6296. *val = LSM6DSO_EDGE_TRIGGER;
  6297. break;
  6298. default:
  6299. *val = LSM6DSO_DEN_DISABLE;
  6300. break;
  6301. }
  6302. return ret;
  6303. }
  6304. /**
  6305. * @brief DEN active level configuration.[set]
  6306. *
  6307. * @param ctx read / write interface definitions
  6308. * @param val change the values of den_lh in reg CTRL9_XL
  6309. * @retval interface status (MANDATORY: return 0 -> no Error)
  6310. *
  6311. */
  6312. int32_t lsm6dso_den_polarity_set(stmdev_ctx_t *ctx,
  6313. lsm6dso_den_lh_t val)
  6314. {
  6315. lsm6dso_ctrl9_xl_t reg;
  6316. int32_t ret;
  6317. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6318. if (ret == 0)
  6319. {
  6320. reg.den_lh = (uint8_t)val;
  6321. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6322. }
  6323. return ret;
  6324. }
  6325. /**
  6326. * @brief DEN active level configuration.[get]
  6327. *
  6328. * @param ctx read / write interface definitions
  6329. * @param val Get the values of den_lh in reg CTRL9_XL
  6330. * @retval interface status (MANDATORY: return 0 -> no Error)
  6331. *
  6332. */
  6333. int32_t lsm6dso_den_polarity_get(stmdev_ctx_t *ctx,
  6334. lsm6dso_den_lh_t *val)
  6335. {
  6336. lsm6dso_ctrl9_xl_t reg;
  6337. int32_t ret;
  6338. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6339. switch (reg.den_lh)
  6340. {
  6341. case LSM6DSO_DEN_ACT_LOW:
  6342. *val = LSM6DSO_DEN_ACT_LOW;
  6343. break;
  6344. case LSM6DSO_DEN_ACT_HIGH:
  6345. *val = LSM6DSO_DEN_ACT_HIGH;
  6346. break;
  6347. default:
  6348. *val = LSM6DSO_DEN_ACT_LOW;
  6349. break;
  6350. }
  6351. return ret;
  6352. }
  6353. /**
  6354. * @brief DEN enable.[set]
  6355. *
  6356. * @param ctx read / write interface definitions
  6357. * @param val change the values of den_xl_g in reg CTRL9_XL
  6358. * @retval interface status (MANDATORY: return 0 -> no Error)
  6359. *
  6360. */
  6361. int32_t lsm6dso_den_enable_set(stmdev_ctx_t *ctx,
  6362. lsm6dso_den_xl_g_t val)
  6363. {
  6364. lsm6dso_ctrl9_xl_t reg;
  6365. int32_t ret;
  6366. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6367. if (ret == 0)
  6368. {
  6369. reg.den_xl_g = (uint8_t)val;
  6370. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6371. }
  6372. return ret;
  6373. }
  6374. /**
  6375. * @brief DEN enable.[get]
  6376. *
  6377. * @param ctx read / write interface definitions
  6378. * @param val Get the values of den_xl_g in reg CTRL9_XL
  6379. * @retval interface status (MANDATORY: return 0 -> no Error)
  6380. *
  6381. */
  6382. int32_t lsm6dso_den_enable_get(stmdev_ctx_t *ctx,
  6383. lsm6dso_den_xl_g_t *val)
  6384. {
  6385. lsm6dso_ctrl9_xl_t reg;
  6386. int32_t ret;
  6387. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6388. switch (reg.den_xl_g)
  6389. {
  6390. case LSM6DSO_STAMP_IN_GY_DATA:
  6391. *val = LSM6DSO_STAMP_IN_GY_DATA;
  6392. break;
  6393. case LSM6DSO_STAMP_IN_XL_DATA:
  6394. *val = LSM6DSO_STAMP_IN_XL_DATA;
  6395. break;
  6396. case LSM6DSO_STAMP_IN_GY_XL_DATA:
  6397. *val = LSM6DSO_STAMP_IN_GY_XL_DATA;
  6398. break;
  6399. default:
  6400. *val = LSM6DSO_STAMP_IN_GY_DATA;
  6401. break;
  6402. }
  6403. return ret;
  6404. }
  6405. /**
  6406. * @brief DEN value stored in LSB of X-axis.[set]
  6407. *
  6408. * @param ctx read / write interface definitions
  6409. * @param val change the values of den_z in reg CTRL9_XL
  6410. * @retval interface status (MANDATORY: return 0 -> no Error)
  6411. *
  6412. */
  6413. int32_t lsm6dso_den_mark_axis_x_set(stmdev_ctx_t *ctx, uint8_t val)
  6414. {
  6415. lsm6dso_ctrl9_xl_t reg;
  6416. int32_t ret;
  6417. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6418. if (ret == 0)
  6419. {
  6420. reg.den_z = val;
  6421. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6422. }
  6423. return ret;
  6424. }
  6425. /**
  6426. * @brief DEN value stored in LSB of X-axis.[get]
  6427. *
  6428. * @param ctx read / write interface definitions
  6429. * @param val change the values of den_z in reg CTRL9_XL
  6430. * @retval interface status (MANDATORY: return 0 -> no Error)
  6431. *
  6432. */
  6433. int32_t lsm6dso_den_mark_axis_x_get(stmdev_ctx_t *ctx, uint8_t *val)
  6434. {
  6435. lsm6dso_ctrl9_xl_t reg;
  6436. int32_t ret;
  6437. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6438. *val = reg.den_z;
  6439. return ret;
  6440. }
  6441. /**
  6442. * @brief DEN value stored in LSB of Y-axis.[set]
  6443. *
  6444. * @param ctx read / write interface definitions
  6445. * @param val change the values of den_y in reg CTRL9_XL
  6446. * @retval interface status (MANDATORY: return 0 -> no Error)
  6447. *
  6448. */
  6449. int32_t lsm6dso_den_mark_axis_y_set(stmdev_ctx_t *ctx, uint8_t val)
  6450. {
  6451. lsm6dso_ctrl9_xl_t reg;
  6452. int32_t ret;
  6453. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6454. if (ret == 0)
  6455. {
  6456. reg.den_y = val;
  6457. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6458. }
  6459. return ret;
  6460. }
  6461. /**
  6462. * @brief DEN value stored in LSB of Y-axis.[get]
  6463. *
  6464. * @param ctx read / write interface definitions
  6465. * @param val change the values of den_y in reg CTRL9_XL
  6466. * @retval interface status (MANDATORY: return 0 -> no Error)
  6467. *
  6468. */
  6469. int32_t lsm6dso_den_mark_axis_y_get(stmdev_ctx_t *ctx, uint8_t *val)
  6470. {
  6471. lsm6dso_ctrl9_xl_t reg;
  6472. int32_t ret;
  6473. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6474. *val = reg.den_y;
  6475. return ret;
  6476. }
  6477. /**
  6478. * @brief DEN value stored in LSB of Z-axis.[set]
  6479. *
  6480. * @param ctx read / write interface definitions
  6481. * @param val change the values of den_x in reg CTRL9_XL
  6482. * @retval interface status (MANDATORY: return 0 -> no Error)
  6483. *
  6484. */
  6485. int32_t lsm6dso_den_mark_axis_z_set(stmdev_ctx_t *ctx, uint8_t val)
  6486. {
  6487. lsm6dso_ctrl9_xl_t reg;
  6488. int32_t ret;
  6489. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6490. if (ret == 0)
  6491. {
  6492. reg.den_x = val;
  6493. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6494. }
  6495. return ret;
  6496. }
  6497. /**
  6498. * @brief DEN value stored in LSB of Z-axis.[get]
  6499. *
  6500. * @param ctx read / write interface definitions
  6501. * @param val change the values of den_x in reg CTRL9_XL
  6502. * @retval interface status (MANDATORY: return 0 -> no Error)
  6503. *
  6504. */
  6505. int32_t lsm6dso_den_mark_axis_z_get(stmdev_ctx_t *ctx, uint8_t *val)
  6506. {
  6507. lsm6dso_ctrl9_xl_t reg;
  6508. int32_t ret;
  6509. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t *)&reg, 1);
  6510. *val = reg.den_x;
  6511. return ret;
  6512. }
  6513. /**
  6514. * @}
  6515. *
  6516. */
  6517. /**
  6518. * @defgroup LSM6DSO_Pedometer
  6519. * @brief This section groups all the functions that manage pedometer.
  6520. * @{
  6521. *
  6522. */
  6523. /**
  6524. * @brief Enable pedometer algorithm.[set]
  6525. *
  6526. * @param ctx read / write interface definitions
  6527. * @param val turn on and configure pedometer
  6528. * @retval interface status (MANDATORY: return 0 -> no Error)
  6529. *
  6530. */
  6531. int32_t lsm6dso_pedo_sens_set(stmdev_ctx_t *ctx,
  6532. lsm6dso_pedo_md_t val)
  6533. {
  6534. lsm6dso_pedo_cmd_reg_t pedo_cmd_reg;
  6535. int32_t ret;
  6536. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG,
  6537. (uint8_t *)&pedo_cmd_reg);
  6538. if (ret == 0)
  6539. {
  6540. pedo_cmd_reg.fp_rejection_en = ((uint8_t)val & 0x10U) >> 4;
  6541. pedo_cmd_reg.ad_det_en = ((uint8_t)val & 0x20U) >> 5;
  6542. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_CMD_REG,
  6543. (uint8_t *)&pedo_cmd_reg);
  6544. }
  6545. return ret;
  6546. }
  6547. /**
  6548. * @brief Enable pedometer algorithm.[get]
  6549. *
  6550. * @param ctx read / write interface definitions
  6551. * @param val turn on and configure pedometer
  6552. * @retval interface status (MANDATORY: return 0 -> no Error)
  6553. *
  6554. */
  6555. int32_t lsm6dso_pedo_sens_get(stmdev_ctx_t *ctx,
  6556. lsm6dso_pedo_md_t *val)
  6557. {
  6558. lsm6dso_pedo_cmd_reg_t pedo_cmd_reg;
  6559. int32_t ret;
  6560. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG,
  6561. (uint8_t *)&pedo_cmd_reg);
  6562. switch ((pedo_cmd_reg.ad_det_en << 5) | (pedo_cmd_reg.fp_rejection_en
  6563. << 4))
  6564. {
  6565. case LSM6DSO_PEDO_BASE_MODE:
  6566. *val = LSM6DSO_PEDO_BASE_MODE;
  6567. break;
  6568. case LSM6DSO_FALSE_STEP_REJ:
  6569. *val = LSM6DSO_FALSE_STEP_REJ;
  6570. break;
  6571. case LSM6DSO_FALSE_STEP_REJ_ADV_MODE:
  6572. *val = LSM6DSO_FALSE_STEP_REJ_ADV_MODE;
  6573. break;
  6574. default:
  6575. *val = LSM6DSO_PEDO_BASE_MODE;
  6576. break;
  6577. }
  6578. return ret;
  6579. }
  6580. /**
  6581. * @brief Interrupt status bit for step detection.[get]
  6582. *
  6583. * @param ctx read / write interface definitions
  6584. * @param val change the values of is_step_det in reg EMB_FUNC_STATUS
  6585. * @retval interface status (MANDATORY: return 0 -> no Error)
  6586. *
  6587. */
  6588. int32_t lsm6dso_pedo_step_detect_get(stmdev_ctx_t *ctx, uint8_t *val)
  6589. {
  6590. lsm6dso_emb_func_status_t reg;
  6591. int32_t ret;
  6592. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  6593. if (ret == 0)
  6594. {
  6595. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t *)&reg, 1);
  6596. }
  6597. if (ret == 0)
  6598. {
  6599. *val = reg.is_step_det;
  6600. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6601. }
  6602. return ret;
  6603. }
  6604. /**
  6605. * @brief Pedometer debounce configuration register (r/w).[set]
  6606. *
  6607. * @param ctx read / write interface definitions
  6608. * @param buff buffer that contains data to write
  6609. * @retval interface status (MANDATORY: return 0 -> no Error)
  6610. *
  6611. */
  6612. int32_t lsm6dso_pedo_debounce_steps_set(stmdev_ctx_t *ctx,
  6613. uint8_t *buff)
  6614. {
  6615. int32_t ret;
  6616. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_DEB_STEPS_CONF,
  6617. buff);
  6618. return ret;
  6619. }
  6620. /**
  6621. * @brief Pedometer debounce configuration register (r/w).[get]
  6622. *
  6623. * @param ctx read / write interface definitions
  6624. * @param buff buffer that stores data read
  6625. * @retval interface status (MANDATORY: return 0 -> no Error)
  6626. *
  6627. */
  6628. int32_t lsm6dso_pedo_debounce_steps_get(stmdev_ctx_t *ctx,
  6629. uint8_t *buff)
  6630. {
  6631. int32_t ret;
  6632. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_DEB_STEPS_CONF, buff);
  6633. return ret;
  6634. }
  6635. /**
  6636. * @brief Time period register for step detection on delta time (r/w).[set]
  6637. *
  6638. * @param ctx read / write interface definitions
  6639. * @param buff buffer that contains data to write
  6640. * @retval interface status (MANDATORY: return 0 -> no Error)
  6641. *
  6642. */
  6643. int32_t lsm6dso_pedo_steps_period_set(stmdev_ctx_t *ctx, uint16_t val)
  6644. {
  6645. uint8_t buff[2];
  6646. int32_t ret;
  6647. buff[1] = (uint8_t)(val / 256U);
  6648. buff[0] = (uint8_t)(val - (buff[1] * 256U));
  6649. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_L,
  6650. &buff[0]);
  6651. if (ret == 0)
  6652. {
  6653. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_H,
  6654. &buff[1]);
  6655. }
  6656. return ret;
  6657. }
  6658. /**
  6659. * @brief Time period register for step detection on delta time (r/w).[get]
  6660. *
  6661. * @param ctx read / write interface definitions
  6662. * @param buff buffer that stores data read
  6663. * @retval interface status (MANDATORY: return 0 -> no Error)
  6664. *
  6665. */
  6666. int32_t lsm6dso_pedo_steps_period_get(stmdev_ctx_t *ctx,
  6667. uint16_t *val)
  6668. {
  6669. uint8_t buff[2];
  6670. int32_t ret;
  6671. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_L,
  6672. &buff[0]);
  6673. if (ret == 0)
  6674. {
  6675. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_H,
  6676. &buff[1]);
  6677. *val = buff[1];
  6678. *val = (*val * 256U) + buff[0];
  6679. }
  6680. return ret;
  6681. }
  6682. /**
  6683. * @brief Set when user wants to generate interrupt on count overflow
  6684. * event/every step.[set]
  6685. *
  6686. * @param ctx read / write interface definitions
  6687. * @param val change the values of carry_count_en in reg PEDO_CMD_REG
  6688. * @retval interface status (MANDATORY: return 0 -> no Error)
  6689. *
  6690. */
  6691. int32_t lsm6dso_pedo_int_mode_set(stmdev_ctx_t *ctx,
  6692. lsm6dso_carry_count_en_t val)
  6693. {
  6694. lsm6dso_pedo_cmd_reg_t reg;
  6695. int32_t ret;
  6696. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG,
  6697. (uint8_t *)&reg);
  6698. if (ret == 0)
  6699. {
  6700. reg.carry_count_en = (uint8_t)val;
  6701. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_CMD_REG,
  6702. (uint8_t *)&reg);
  6703. }
  6704. return ret;
  6705. }
  6706. /**
  6707. * @brief Set when user wants to generate interrupt on count overflow
  6708. * event/every step.[get]
  6709. *
  6710. * @param ctx read / write interface definitions
  6711. * @param val Get the values of carry_count_en in reg PEDO_CMD_REG
  6712. * @retval interface status (MANDATORY: return 0 -> no Error)
  6713. *
  6714. */
  6715. int32_t lsm6dso_pedo_int_mode_get(stmdev_ctx_t *ctx,
  6716. lsm6dso_carry_count_en_t *val)
  6717. {
  6718. lsm6dso_pedo_cmd_reg_t reg;
  6719. int32_t ret;
  6720. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG,
  6721. (uint8_t *)&reg);
  6722. switch (reg.carry_count_en)
  6723. {
  6724. case LSM6DSO_EVERY_STEP:
  6725. *val = LSM6DSO_EVERY_STEP;
  6726. break;
  6727. case LSM6DSO_COUNT_OVERFLOW:
  6728. *val = LSM6DSO_COUNT_OVERFLOW;
  6729. break;
  6730. default:
  6731. *val = LSM6DSO_EVERY_STEP;
  6732. break;
  6733. }
  6734. return ret;
  6735. }
  6736. /**
  6737. * @}
  6738. *
  6739. */
  6740. /**
  6741. * @defgroup LSM6DSO_significant_motion
  6742. * @brief This section groups all the functions that manage the
  6743. * significant motion detection.
  6744. * @{
  6745. *
  6746. */
  6747. /**
  6748. * @brief Interrupt status bit for significant motion detection.[get]
  6749. *
  6750. * @param ctx read / write interface definitions
  6751. * @param val change the values of is_sigmot in reg EMB_FUNC_STATUS
  6752. * @retval interface status (MANDATORY: return 0 -> no Error)
  6753. *
  6754. */
  6755. int32_t lsm6dso_motion_flag_data_ready_get(stmdev_ctx_t *ctx,
  6756. uint8_t *val)
  6757. {
  6758. lsm6dso_emb_func_status_t reg;
  6759. int32_t ret;
  6760. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  6761. if (ret == 0)
  6762. {
  6763. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t *)&reg, 1);
  6764. }
  6765. if (ret == 0)
  6766. {
  6767. *val = reg.is_sigmot;
  6768. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6769. }
  6770. return ret;
  6771. }
  6772. /**
  6773. * @}
  6774. *
  6775. */
  6776. /**
  6777. * @defgroup LSM6DSO_tilt_detection
  6778. * @brief This section groups all the functions that manage the tilt
  6779. * event detection.
  6780. * @{
  6781. *
  6782. */
  6783. /**
  6784. * @brief Interrupt status bit for tilt detection.[get]
  6785. *
  6786. * @param ctx read / write interface definitions
  6787. * @param val change the values of is_tilt in reg EMB_FUNC_STATUS
  6788. * @retval interface status (MANDATORY: return 0 -> no Error)
  6789. *
  6790. */
  6791. int32_t lsm6dso_tilt_flag_data_ready_get(stmdev_ctx_t *ctx,
  6792. uint8_t *val)
  6793. {
  6794. lsm6dso_emb_func_status_t reg;
  6795. int32_t ret;
  6796. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  6797. if (ret == 0)
  6798. {
  6799. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t *)&reg, 1);
  6800. }
  6801. if (ret == 0)
  6802. {
  6803. *val = reg.is_tilt;
  6804. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  6805. }
  6806. return ret;
  6807. }
  6808. /**
  6809. * @}
  6810. *
  6811. */
  6812. /**
  6813. * @defgroup LSM6DSO_ magnetometer_sensor
  6814. * @brief This section groups all the functions that manage additional
  6815. * magnetometer sensor.
  6816. * @{
  6817. *
  6818. */
  6819. /**
  6820. * @brief External magnetometer sensitivity value register.[set]
  6821. *
  6822. * @param ctx read / write interface definitions
  6823. * @param buff buffer that contains data to write
  6824. * @retval interface status (MANDATORY: return 0 -> no Error)
  6825. *
  6826. */
  6827. int32_t lsm6dso_mag_sensitivity_set(stmdev_ctx_t *ctx, uint16_t val)
  6828. {
  6829. uint8_t buff[2];
  6830. int32_t ret;
  6831. buff[1] = (uint8_t)(val / 256U);
  6832. buff[0] = (uint8_t)(val - (buff[1] * 256U));
  6833. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SENSITIVITY_L,
  6834. &buff[0]);
  6835. if (ret == 0)
  6836. {
  6837. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SENSITIVITY_H,
  6838. &buff[1]);
  6839. }
  6840. return ret;
  6841. }
  6842. /**
  6843. * @brief External magnetometer sensitivity value register.[get]
  6844. *
  6845. * @param ctx read / write interface definitions
  6846. * @param buff buffer that stores data read
  6847. * @retval interface status (MANDATORY: return 0 -> no Error)
  6848. *
  6849. */
  6850. int32_t lsm6dso_mag_sensitivity_get(stmdev_ctx_t *ctx, uint16_t *val)
  6851. {
  6852. uint8_t buff[2];
  6853. int32_t ret;
  6854. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SENSITIVITY_L,
  6855. &buff[0]);
  6856. if (ret == 0)
  6857. {
  6858. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SENSITIVITY_H,
  6859. &buff[1]);
  6860. *val = buff[1];
  6861. *val = (*val * 256U) + buff[0];
  6862. }
  6863. return ret;
  6864. }
  6865. /**
  6866. * @brief Offset for hard-iron compensation register (r/w).[set]
  6867. *
  6868. * @param ctx read / write interface definitions
  6869. * @param buff buffer that contains data to write
  6870. * @retval interface status (MANDATORY: return 0 -> no Error)
  6871. *
  6872. */
  6873. int32_t lsm6dso_mag_offset_set(stmdev_ctx_t *ctx, int16_t *val)
  6874. {
  6875. uint8_t buff[6];
  6876. int32_t ret;
  6877. buff[1] = (uint8_t)((uint16_t)val[0] / 256U);
  6878. buff[0] = (uint8_t)((uint16_t)val[0] - (buff[1] * 256U));
  6879. buff[3] = (uint8_t)((uint16_t)val[1] / 256U);
  6880. buff[2] = (uint8_t)((uint16_t)val[1] - (buff[3] * 256U));
  6881. buff[5] = (uint8_t)((uint16_t)val[2] / 256U);
  6882. buff[4] = (uint8_t)((uint16_t)val[2] - (buff[5] * 256U));
  6883. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFX_L, &buff[0]);
  6884. if (ret == 0)
  6885. {
  6886. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFX_H, &buff[1]);
  6887. }
  6888. if (ret == 0)
  6889. {
  6890. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFY_L, &buff[2]);
  6891. }
  6892. if (ret == 0)
  6893. {
  6894. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFY_H, &buff[3]);
  6895. }
  6896. if (ret == 0)
  6897. {
  6898. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFZ_L, &buff[4]);
  6899. }
  6900. if (ret == 0)
  6901. {
  6902. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFZ_H, &buff[5]);
  6903. }
  6904. return ret;
  6905. }
  6906. /**
  6907. * @brief Offset for hard-iron compensation register (r/w).[get]
  6908. *
  6909. * @param ctx read / write interface definitions
  6910. * @param buff buffer that stores data read
  6911. * @retval interface status (MANDATORY: return 0 -> no Error)
  6912. *
  6913. */
  6914. int32_t lsm6dso_mag_offset_get(stmdev_ctx_t *ctx, int16_t *val)
  6915. {
  6916. uint8_t buff[6];
  6917. int32_t ret;
  6918. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFX_L, &buff[0]);
  6919. if (ret == 0)
  6920. {
  6921. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFX_H, &buff[1]);
  6922. }
  6923. if (ret == 0)
  6924. {
  6925. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFY_L, &buff[2]);
  6926. }
  6927. if (ret == 0)
  6928. {
  6929. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFY_H, &buff[3]);
  6930. }
  6931. if (ret == 0)
  6932. {
  6933. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFZ_L, &buff[4]);
  6934. }
  6935. if (ret == 0)
  6936. {
  6937. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFZ_H, &buff[5]);
  6938. val[0] = (int16_t)buff[1];
  6939. val[0] = (val[0] * 256) + (int16_t)buff[0];
  6940. val[1] = (int16_t)buff[3];
  6941. val[1] = (val[1] * 256) + (int16_t)buff[2];
  6942. val[2] = (int16_t)buff[5];
  6943. val[2] = (val[2] * 256) + (int16_t)buff[4];
  6944. }
  6945. return ret;
  6946. }
  6947. /**
  6948. * @brief Soft-iron (3x3 symmetric) matrix correction
  6949. * register (r/w). The value is expressed as
  6950. * half-precision floating-point format:
  6951. * SEEEEEFFFFFFFFFF
  6952. * S: 1 sign bit;
  6953. * E: 5 exponent bits;
  6954. * F: 10 fraction bits).[set]
  6955. *
  6956. * @param ctx read / write interface definitions
  6957. * @param buff buffer that contains data to write
  6958. * @retval interface status (MANDATORY: return 0 -> no Error)
  6959. *
  6960. */
  6961. int32_t lsm6dso_mag_soft_iron_set(stmdev_ctx_t *ctx, int16_t *val)
  6962. {
  6963. uint8_t buff[12];
  6964. int32_t ret;
  6965. uint8_t index;
  6966. buff[1] = (uint8_t)((uint16_t)val[0] / 256U);
  6967. buff[0] = (uint8_t)((uint16_t)val[0] - (buff[1] * 256U));
  6968. buff[3] = (uint8_t)((uint16_t)val[1] / 256U);
  6969. buff[2] = (uint8_t)((uint16_t)val[1] - (buff[3] * 256U));
  6970. buff[5] = (uint8_t)((uint16_t)val[2] / 256U);
  6971. buff[4] = (uint8_t)((uint16_t)val[2] - (buff[5] * 256U));
  6972. buff[7] = (uint8_t)((uint16_t)val[3] / 256U);
  6973. buff[6] = (uint8_t)((uint16_t)val[3] - (buff[7] * 256U));
  6974. buff[9] = (uint8_t)((uint16_t)val[4] / 256U);
  6975. buff[8] = (uint8_t)((uint16_t)val[4] - (buff[9] * 256U));
  6976. buff[11] = (uint8_t)((uint16_t)val[5] / 256U);
  6977. buff[10] = (uint8_t)((uint16_t)val[5] - (buff[11] * 256U));
  6978. index = 0x00U;
  6979. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XX_L,
  6980. &buff[index]);
  6981. if (ret == 0)
  6982. {
  6983. index++;
  6984. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XX_H,
  6985. &buff[index]);
  6986. }
  6987. if (ret == 0)
  6988. {
  6989. index++;
  6990. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XY_L,
  6991. &buff[index]);
  6992. }
  6993. if (ret == 0)
  6994. {
  6995. index++;
  6996. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XY_H,
  6997. &buff[index]);
  6998. }
  6999. if (ret == 0)
  7000. {
  7001. index++;
  7002. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XZ_L,
  7003. &buff[index]);
  7004. }
  7005. if (ret == 0)
  7006. {
  7007. index++;
  7008. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XZ_H,
  7009. &buff[index]);
  7010. }
  7011. if (ret == 0)
  7012. {
  7013. index++;
  7014. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YY_L,
  7015. &buff[index]);
  7016. }
  7017. if (ret == 0)
  7018. {
  7019. index++;
  7020. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YY_H,
  7021. &buff[index]);
  7022. }
  7023. if (ret == 0)
  7024. {
  7025. index++;
  7026. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YZ_L,
  7027. &buff[index]);
  7028. }
  7029. if (ret == 0)
  7030. {
  7031. index++;
  7032. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YZ_H,
  7033. &buff[index]);
  7034. }
  7035. if (ret == 0)
  7036. {
  7037. index++;
  7038. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_ZZ_L,
  7039. &buff[index]);
  7040. }
  7041. if (ret == 0)
  7042. {
  7043. index++;
  7044. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_ZZ_H,
  7045. &buff[index]);
  7046. }
  7047. return ret;
  7048. }
  7049. /**
  7050. * @brief Soft-iron (3x3 symmetric) matrix
  7051. * correction register (r/w).
  7052. * The value is expressed as half-precision
  7053. * floating-point format:
  7054. * SEEEEEFFFFFFFFFF
  7055. * S: 1 sign bit;
  7056. * E: 5 exponent bits;
  7057. * F: 10 fraction bits.[get]
  7058. *
  7059. * @param ctx read / write interface definitions
  7060. * @param buff buffer that stores data read
  7061. * @retval interface status (MANDATORY: return 0 -> no Error)
  7062. *
  7063. */
  7064. int32_t lsm6dso_mag_soft_iron_get(stmdev_ctx_t *ctx, int16_t *val)
  7065. {
  7066. uint8_t buff[12];
  7067. int32_t ret;
  7068. uint8_t index;
  7069. index = 0x00U;
  7070. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XX_L, &buff[index]);
  7071. if (ret == 0)
  7072. {
  7073. index++;
  7074. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XX_H, &buff[index]);
  7075. }
  7076. if (ret == 0)
  7077. {
  7078. index++;
  7079. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XY_L, &buff[index]);
  7080. }
  7081. if (ret == 0)
  7082. {
  7083. index++;
  7084. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XY_H, &buff[index]);
  7085. }
  7086. if (ret == 0)
  7087. {
  7088. index++;
  7089. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XZ_L, &buff[index]);
  7090. }
  7091. if (ret == 0)
  7092. {
  7093. index++;
  7094. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XZ_H, &buff[index]);
  7095. }
  7096. if (ret == 0)
  7097. {
  7098. index++;
  7099. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YY_L, &buff[index]);
  7100. }
  7101. if (ret == 0)
  7102. {
  7103. index++;
  7104. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YY_H, &buff[index]);
  7105. }
  7106. if (ret == 0)
  7107. {
  7108. index++;
  7109. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YZ_L, &buff[index]);
  7110. }
  7111. if (ret == 0)
  7112. {
  7113. index++;
  7114. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YZ_H, &buff[index]);
  7115. }
  7116. if (ret == 0)
  7117. {
  7118. index++;
  7119. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_ZZ_L, &buff[index]);
  7120. }
  7121. if (ret == 0)
  7122. {
  7123. index++;
  7124. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_ZZ_H, &buff[index]);
  7125. }
  7126. val[0] = (int16_t)buff[1];
  7127. val[0] = (val[0] * 256) + (int16_t)buff[0];
  7128. val[1] = (int16_t)buff[3];
  7129. val[1] = (val[1] * 256) + (int16_t)buff[2];
  7130. val[2] = (int16_t)buff[5];
  7131. val[2] = (val[2] * 256) + (int16_t)buff[4];
  7132. val[3] = (int16_t)buff[7];
  7133. val[3] = (val[3] * 256) + (int16_t)buff[6];
  7134. val[4] = (int16_t)buff[9];
  7135. val[4] = (val[4] * 256) + (int16_t)buff[8];
  7136. val[5] = (int16_t)buff[11];
  7137. val[5] = (val[5] * 256) + (int16_t)buff[10];
  7138. return ret;
  7139. }
  7140. /**
  7141. * @brief Magnetometer Z-axis coordinates
  7142. * rotation (to be aligned to
  7143. * accelerometer/gyroscope axes
  7144. * orientation).[set]
  7145. *
  7146. * @param ctx read / write interface definitions
  7147. * @param val change the values of mag_z_axis in reg MAG_CFG_A
  7148. * @retval interface status (MANDATORY: return 0 -> no Error)
  7149. *
  7150. */
  7151. int32_t lsm6dso_mag_z_orient_set(stmdev_ctx_t *ctx,
  7152. lsm6dso_mag_z_axis_t val)
  7153. {
  7154. lsm6dso_mag_cfg_a_t reg;
  7155. int32_t ret;
  7156. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A,
  7157. (uint8_t *)&reg);
  7158. if (ret == 0)
  7159. {
  7160. reg.mag_z_axis = (uint8_t) val;
  7161. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_CFG_A,
  7162. (uint8_t *)&reg);
  7163. }
  7164. return ret;
  7165. }
  7166. /**
  7167. * @brief Magnetometer Z-axis coordinates
  7168. * rotation (to be aligned to
  7169. * accelerometer/gyroscope axes
  7170. * orientation).[get]
  7171. *
  7172. * @param ctx read / write interface definitions
  7173. * @param val Get the values of mag_z_axis in reg MAG_CFG_A
  7174. * @retval interface status (MANDATORY: return 0 -> no Error)
  7175. *
  7176. */
  7177. int32_t lsm6dso_mag_z_orient_get(stmdev_ctx_t *ctx,
  7178. lsm6dso_mag_z_axis_t *val)
  7179. {
  7180. lsm6dso_mag_cfg_a_t reg;
  7181. int32_t ret;
  7182. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A,
  7183. (uint8_t *)&reg);
  7184. switch (reg.mag_z_axis)
  7185. {
  7186. case LSM6DSO_Z_EQ_Y:
  7187. *val = LSM6DSO_Z_EQ_Y;
  7188. break;
  7189. case LSM6DSO_Z_EQ_MIN_Y:
  7190. *val = LSM6DSO_Z_EQ_MIN_Y;
  7191. break;
  7192. case LSM6DSO_Z_EQ_X:
  7193. *val = LSM6DSO_Z_EQ_X;
  7194. break;
  7195. case LSM6DSO_Z_EQ_MIN_X:
  7196. *val = LSM6DSO_Z_EQ_MIN_X;
  7197. break;
  7198. case LSM6DSO_Z_EQ_MIN_Z:
  7199. *val = LSM6DSO_Z_EQ_MIN_Z;
  7200. break;
  7201. case LSM6DSO_Z_EQ_Z:
  7202. *val = LSM6DSO_Z_EQ_Z;
  7203. break;
  7204. default:
  7205. *val = LSM6DSO_Z_EQ_Y;
  7206. break;
  7207. }
  7208. return ret;
  7209. }
  7210. /**
  7211. * @brief Magnetometer Y-axis coordinates
  7212. * rotation (to be aligned to
  7213. * accelerometer/gyroscope axes
  7214. * orientation).[set]
  7215. *
  7216. * @param ctx read / write interface definitions
  7217. * @param val change the values of mag_y_axis in reg MAG_CFG_A
  7218. * @retval interface status (MANDATORY: return 0 -> no Error)
  7219. *
  7220. */
  7221. int32_t lsm6dso_mag_y_orient_set(stmdev_ctx_t *ctx,
  7222. lsm6dso_mag_y_axis_t val)
  7223. {
  7224. lsm6dso_mag_cfg_a_t reg;
  7225. int32_t ret;
  7226. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A,
  7227. (uint8_t *)&reg);
  7228. if (ret == 0)
  7229. {
  7230. reg.mag_y_axis = (uint8_t)val;
  7231. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_CFG_A,
  7232. (uint8_t *) &reg);
  7233. }
  7234. return ret;
  7235. }
  7236. /**
  7237. * @brief Magnetometer Y-axis coordinates
  7238. * rotation (to be aligned to
  7239. * accelerometer/gyroscope axes
  7240. * orientation).[get]
  7241. *
  7242. * @param ctx read / write interface definitions
  7243. * @param val Get the values of mag_y_axis in reg MAG_CFG_A
  7244. * @retval interface status (MANDATORY: return 0 -> no Error)
  7245. *
  7246. */
  7247. int32_t lsm6dso_mag_y_orient_get(stmdev_ctx_t *ctx,
  7248. lsm6dso_mag_y_axis_t *val)
  7249. {
  7250. lsm6dso_mag_cfg_a_t reg;
  7251. int32_t ret;
  7252. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A,
  7253. (uint8_t *)&reg);
  7254. switch (reg.mag_y_axis)
  7255. {
  7256. case LSM6DSO_Y_EQ_Y:
  7257. *val = LSM6DSO_Y_EQ_Y;
  7258. break;
  7259. case LSM6DSO_Y_EQ_MIN_Y:
  7260. *val = LSM6DSO_Y_EQ_MIN_Y;
  7261. break;
  7262. case LSM6DSO_Y_EQ_X:
  7263. *val = LSM6DSO_Y_EQ_X;
  7264. break;
  7265. case LSM6DSO_Y_EQ_MIN_X:
  7266. *val = LSM6DSO_Y_EQ_MIN_X;
  7267. break;
  7268. case LSM6DSO_Y_EQ_MIN_Z:
  7269. *val = LSM6DSO_Y_EQ_MIN_Z;
  7270. break;
  7271. case LSM6DSO_Y_EQ_Z:
  7272. *val = LSM6DSO_Y_EQ_Z;
  7273. break;
  7274. default:
  7275. *val = LSM6DSO_Y_EQ_Y;
  7276. break;
  7277. }
  7278. return ret;
  7279. }
  7280. /**
  7281. * @brief Magnetometer X-axis coordinates
  7282. * rotation (to be aligned to
  7283. * accelerometer/gyroscope axes
  7284. * orientation).[set]
  7285. *
  7286. * @param ctx read / write interface definitions
  7287. * @param val change the values of mag_x_axis in reg MAG_CFG_B
  7288. * @retval interface status (MANDATORY: return 0 -> no Error)
  7289. *
  7290. */
  7291. int32_t lsm6dso_mag_x_orient_set(stmdev_ctx_t *ctx,
  7292. lsm6dso_mag_x_axis_t val)
  7293. {
  7294. lsm6dso_mag_cfg_b_t reg;
  7295. int32_t ret;
  7296. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_B,
  7297. (uint8_t *)&reg);
  7298. if (ret == 0)
  7299. {
  7300. reg.mag_x_axis = (uint8_t)val;
  7301. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_CFG_B,
  7302. (uint8_t *)&reg);
  7303. }
  7304. return ret;
  7305. }
  7306. /**
  7307. * @brief Magnetometer X-axis coordinates
  7308. * rotation (to be aligned to
  7309. * accelerometer/gyroscope axes
  7310. * orientation).[get]
  7311. *
  7312. * @param ctx read / write interface definitions
  7313. * @param val Get the values of mag_x_axis in reg MAG_CFG_B
  7314. * @retval interface status (MANDATORY: return 0 -> no Error)
  7315. *
  7316. */
  7317. int32_t lsm6dso_mag_x_orient_get(stmdev_ctx_t *ctx,
  7318. lsm6dso_mag_x_axis_t *val)
  7319. {
  7320. lsm6dso_mag_cfg_b_t reg;
  7321. int32_t ret;
  7322. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_B,
  7323. (uint8_t *)&reg);
  7324. switch (reg.mag_x_axis)
  7325. {
  7326. case LSM6DSO_X_EQ_Y:
  7327. *val = LSM6DSO_X_EQ_Y;
  7328. break;
  7329. case LSM6DSO_X_EQ_MIN_Y:
  7330. *val = LSM6DSO_X_EQ_MIN_Y;
  7331. break;
  7332. case LSM6DSO_X_EQ_X:
  7333. *val = LSM6DSO_X_EQ_X;
  7334. break;
  7335. case LSM6DSO_X_EQ_MIN_X:
  7336. *val = LSM6DSO_X_EQ_MIN_X;
  7337. break;
  7338. case LSM6DSO_X_EQ_MIN_Z:
  7339. *val = LSM6DSO_X_EQ_MIN_Z;
  7340. break;
  7341. case LSM6DSO_X_EQ_Z:
  7342. *val = LSM6DSO_X_EQ_Z;
  7343. break;
  7344. default:
  7345. *val = LSM6DSO_X_EQ_Y;
  7346. break;
  7347. }
  7348. return ret;
  7349. }
  7350. /**
  7351. * @}
  7352. *
  7353. */
  7354. /**
  7355. * @defgroup LSM6DSO_finite_state_machine
  7356. * @brief This section groups all the functions that manage the
  7357. * state_machine.
  7358. * @{
  7359. *
  7360. */
  7361. /**
  7362. * @brief Interrupt status bit for FSM long counter
  7363. * timeout interrupt event.[get]
  7364. *
  7365. * @param ctx read / write interface definitions
  7366. * @param val change the values of is_fsm_lc in reg EMB_FUNC_STATUS
  7367. * @retval interface status (MANDATORY: return 0 -> no Error)
  7368. *
  7369. */
  7370. int32_t lsm6dso_long_cnt_flag_data_ready_get(stmdev_ctx_t *ctx,
  7371. uint8_t *val)
  7372. {
  7373. lsm6dso_emb_func_status_t reg;
  7374. int32_t ret;
  7375. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7376. if (ret == 0)
  7377. {
  7378. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t *)&reg, 1);
  7379. }
  7380. if (ret == 0)
  7381. {
  7382. *val = reg.is_fsm_lc;
  7383. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7384. }
  7385. return ret;
  7386. }
  7387. /**
  7388. * @brief Final State Machine enable.[set]
  7389. *
  7390. * @param ctx read / write interface definitions
  7391. * @param val union of registers from FSM_ENABLE_A to FSM_ENABLE_B
  7392. * @retval interface status (MANDATORY: return 0 -> no Error)
  7393. *
  7394. */
  7395. int32_t lsm6dso_fsm_enable_set(stmdev_ctx_t *ctx,
  7396. lsm6dso_emb_fsm_enable_t *val)
  7397. {
  7398. int32_t ret;
  7399. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7400. if (ret == 0)
  7401. {
  7402. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_ENABLE_A,
  7403. (uint8_t *)&val->fsm_enable_a, 1);
  7404. }
  7405. if (ret == 0)
  7406. {
  7407. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_ENABLE_B,
  7408. (uint8_t *)&val->fsm_enable_b, 1);
  7409. }
  7410. if (ret == 0)
  7411. {
  7412. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7413. }
  7414. return ret;
  7415. }
  7416. /**
  7417. * @brief Final State Machine enable.[get]
  7418. *
  7419. * @param ctx read / write interface definitions
  7420. * @param val union of registers from FSM_ENABLE_A to FSM_ENABLE_B
  7421. * @retval interface status (MANDATORY: return 0 -> no Error)
  7422. *
  7423. */
  7424. int32_t lsm6dso_fsm_enable_get(stmdev_ctx_t *ctx,
  7425. lsm6dso_emb_fsm_enable_t *val)
  7426. {
  7427. int32_t ret;
  7428. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7429. if (ret == 0)
  7430. {
  7431. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_ENABLE_A, (uint8_t *) val, 2);
  7432. }
  7433. if (ret == 0)
  7434. {
  7435. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7436. }
  7437. return ret;
  7438. }
  7439. /**
  7440. * @brief FSM long counter status register. Long counter value is an
  7441. * unsigned integer value (16-bit format).[set]
  7442. *
  7443. * @param ctx read / write interface definitions
  7444. * @param buff buffer that contains data to write
  7445. * @retval interface status (MANDATORY: return 0 -> no Error)
  7446. *
  7447. */
  7448. int32_t lsm6dso_long_cnt_set(stmdev_ctx_t *ctx, uint16_t val)
  7449. {
  7450. uint8_t buff[2];
  7451. int32_t ret;
  7452. buff[1] = (uint8_t)(val / 256U);
  7453. buff[0] = (uint8_t)(val - (buff[1] * 256U));
  7454. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7455. if (ret == 0)
  7456. {
  7457. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_L, buff, 2);
  7458. }
  7459. if (ret == 0)
  7460. {
  7461. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7462. }
  7463. return ret;
  7464. }
  7465. /**
  7466. * @brief FSM long counter status register. Long counter value is an
  7467. * unsigned integer value (16-bit format).[get]
  7468. *
  7469. * @param ctx read / write interface definitions
  7470. * @param buff buffer that stores data read
  7471. * @retval interface status (MANDATORY: return 0 -> no Error)
  7472. *
  7473. */
  7474. int32_t lsm6dso_long_cnt_get(stmdev_ctx_t *ctx, uint16_t *val)
  7475. {
  7476. uint8_t buff[2];
  7477. int32_t ret;
  7478. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7479. if (ret == 0)
  7480. {
  7481. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_L, buff, 2);
  7482. }
  7483. if (ret == 0)
  7484. {
  7485. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7486. *val = buff[1];
  7487. *val = (*val * 256U) + buff[0];
  7488. }
  7489. return ret;
  7490. }
  7491. /**
  7492. * @brief Clear FSM long counter value.[set]
  7493. *
  7494. * @param ctx read / write interface definitions
  7495. * @param val change the values of fsm_lc_clr in
  7496. * reg FSM_LONG_COUNTER_CLEAR
  7497. * @retval interface status (MANDATORY: return 0 -> no Error)
  7498. *
  7499. */
  7500. int32_t lsm6dso_long_clr_set(stmdev_ctx_t *ctx,
  7501. lsm6dso_fsm_lc_clr_t val)
  7502. {
  7503. lsm6dso_fsm_long_counter_clear_t reg;
  7504. int32_t ret;
  7505. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7506. if (ret == 0)
  7507. {
  7508. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_CLEAR,
  7509. (uint8_t *)&reg, 1);
  7510. }
  7511. if (ret == 0)
  7512. {
  7513. reg. fsm_lc_clr = (uint8_t)val;
  7514. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_CLEAR,
  7515. (uint8_t *)&reg, 1);
  7516. }
  7517. if (ret == 0)
  7518. {
  7519. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7520. }
  7521. return ret;
  7522. }
  7523. /**
  7524. * @brief Clear FSM long counter value.[get]
  7525. *
  7526. * @param ctx read / write interface definitions
  7527. * @param val Get the values of fsm_lc_clr in
  7528. * reg FSM_LONG_COUNTER_CLEAR
  7529. * @retval interface status (MANDATORY: return 0 -> no Error)
  7530. *
  7531. */
  7532. int32_t lsm6dso_long_clr_get(stmdev_ctx_t *ctx,
  7533. lsm6dso_fsm_lc_clr_t *val)
  7534. {
  7535. lsm6dso_fsm_long_counter_clear_t reg;
  7536. int32_t ret;
  7537. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7538. if (ret == 0)
  7539. {
  7540. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_CLEAR,
  7541. (uint8_t *)&reg, 1);
  7542. }
  7543. if (ret == 0)
  7544. {
  7545. switch (reg.fsm_lc_clr)
  7546. {
  7547. case LSM6DSO_LC_NORMAL:
  7548. *val = LSM6DSO_LC_NORMAL;
  7549. break;
  7550. case LSM6DSO_LC_CLEAR:
  7551. *val = LSM6DSO_LC_CLEAR;
  7552. break;
  7553. case LSM6DSO_LC_CLEAR_DONE:
  7554. *val = LSM6DSO_LC_CLEAR_DONE;
  7555. break;
  7556. default:
  7557. *val = LSM6DSO_LC_NORMAL;
  7558. break;
  7559. }
  7560. }
  7561. if (ret == 0)
  7562. {
  7563. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7564. }
  7565. return ret;
  7566. }
  7567. /**
  7568. * @brief FSM output registers[get]
  7569. *
  7570. * @param ctx read / write interface definitions
  7571. * @param val struct of registers from FSM_OUTS1 to FSM_OUTS16
  7572. * @retval interface status (MANDATORY: return 0 -> no Error)
  7573. *
  7574. */
  7575. int32_t lsm6dso_fsm_out_get(stmdev_ctx_t *ctx, lsm6dso_fsm_out_t *val)
  7576. {
  7577. int32_t ret;
  7578. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7579. if (ret == 0)
  7580. {
  7581. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_OUTS1, (uint8_t *)val, 16);
  7582. }
  7583. if (ret == 0)
  7584. {
  7585. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7586. }
  7587. return ret;
  7588. }
  7589. /**
  7590. * @brief Finite State Machine ODR configuration.[set]
  7591. *
  7592. * @param ctx read / write interface definitions
  7593. * @param val change the values of fsm_odr in reg EMB_FUNC_ODR_CFG_B
  7594. * @retval interface status (MANDATORY: return 0 -> no Error)
  7595. *
  7596. */
  7597. int32_t lsm6dso_fsm_data_rate_set(stmdev_ctx_t *ctx,
  7598. lsm6dso_fsm_odr_t val)
  7599. {
  7600. lsm6dso_emb_func_odr_cfg_b_t reg;
  7601. int32_t ret;
  7602. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7603. if (ret == 0)
  7604. {
  7605. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
  7606. (uint8_t *)&reg, 1);
  7607. }
  7608. if (ret == 0)
  7609. {
  7610. reg.not_used_01 = 3; /* set default values */
  7611. reg.not_used_02 = 2; /* set default values */
  7612. reg.fsm_odr = (uint8_t)val;
  7613. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
  7614. (uint8_t *)&reg, 1);
  7615. }
  7616. if (ret == 0)
  7617. {
  7618. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7619. }
  7620. return ret;
  7621. }
  7622. /**
  7623. * @brief Finite State Machine ODR configuration.[get]
  7624. *
  7625. * @param ctx read / write interface definitions
  7626. * @param val Get the values of fsm_odr in reg EMB_FUNC_ODR_CFG_B
  7627. * @retval interface status (MANDATORY: return 0 -> no Error)
  7628. *
  7629. */
  7630. int32_t lsm6dso_fsm_data_rate_get(stmdev_ctx_t *ctx,
  7631. lsm6dso_fsm_odr_t *val)
  7632. {
  7633. lsm6dso_emb_func_odr_cfg_b_t reg;
  7634. int32_t ret;
  7635. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7636. if (ret == 0)
  7637. {
  7638. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
  7639. (uint8_t *)&reg, 1);
  7640. }
  7641. if (ret == 0)
  7642. {
  7643. switch (reg.fsm_odr)
  7644. {
  7645. case LSM6DSO_ODR_FSM_12Hz5:
  7646. *val = LSM6DSO_ODR_FSM_12Hz5;
  7647. break;
  7648. case LSM6DSO_ODR_FSM_26Hz:
  7649. *val = LSM6DSO_ODR_FSM_26Hz;
  7650. break;
  7651. case LSM6DSO_ODR_FSM_52Hz:
  7652. *val = LSM6DSO_ODR_FSM_52Hz;
  7653. break;
  7654. case LSM6DSO_ODR_FSM_104Hz:
  7655. *val = LSM6DSO_ODR_FSM_104Hz;
  7656. break;
  7657. default:
  7658. *val = LSM6DSO_ODR_FSM_12Hz5;
  7659. break;
  7660. }
  7661. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7662. }
  7663. return ret;
  7664. }
  7665. /**
  7666. * @brief FSM initialization request.[set]
  7667. *
  7668. * @param ctx read / write interface definitions
  7669. * @param val change the values of fsm_init in reg FSM_INIT
  7670. * @retval interface status (MANDATORY: return 0 -> no Error)
  7671. *
  7672. */
  7673. int32_t lsm6dso_fsm_init_set(stmdev_ctx_t *ctx, uint8_t val)
  7674. {
  7675. lsm6dso_emb_func_init_b_t reg;
  7676. int32_t ret;
  7677. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7678. if (ret == 0)
  7679. {
  7680. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t *)&reg, 1);
  7681. }
  7682. if (ret == 0)
  7683. {
  7684. reg.fsm_init = val;
  7685. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t *)&reg, 1);
  7686. }
  7687. if (ret == 0)
  7688. {
  7689. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7690. }
  7691. return ret;
  7692. }
  7693. /**
  7694. * @brief FSM initialization request.[get]
  7695. *
  7696. * @param ctx read / write interface definitions
  7697. * @param val change the values of fsm_init in reg FSM_INIT
  7698. * @retval interface status (MANDATORY: return 0 -> no Error)
  7699. *
  7700. */
  7701. int32_t lsm6dso_fsm_init_get(stmdev_ctx_t *ctx, uint8_t *val)
  7702. {
  7703. lsm6dso_emb_func_init_b_t reg;
  7704. int32_t ret;
  7705. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  7706. if (ret == 0)
  7707. {
  7708. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t *)&reg, 1);
  7709. }
  7710. if (ret == 0)
  7711. {
  7712. *val = reg.fsm_init;
  7713. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7714. }
  7715. return ret;
  7716. }
  7717. /**
  7718. * @brief FSM long counter timeout register (r/w). The long counter
  7719. * timeout value is an unsigned integer value (16-bit format).
  7720. * When the long counter value reached this value,
  7721. * the FSM generates an interrupt.[set]
  7722. *
  7723. * @param ctx read / write interface definitions
  7724. * @param val the value of long counter
  7725. * @retval interface status (MANDATORY: return 0 -> no Error)
  7726. *
  7727. */
  7728. int32_t lsm6dso_long_cnt_int_value_set(stmdev_ctx_t *ctx,
  7729. uint16_t val)
  7730. {
  7731. uint8_t buff[2];
  7732. int32_t ret;
  7733. buff[1] = (uint8_t)(val / 256U);
  7734. buff[0] = (uint8_t)(val - (buff[1] * 256U));
  7735. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L,
  7736. &buff[0]);
  7737. if (ret == 0)
  7738. {
  7739. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H,
  7740. &buff[1]);
  7741. }
  7742. return ret;
  7743. }
  7744. /**
  7745. * @brief FSM long counter timeout register (r/w). The long counter
  7746. * timeout value is an unsigned integer value (16-bit format).
  7747. * When the long counter value reached this value,
  7748. * the FSM generates an interrupt.[get]
  7749. *
  7750. * @param ctx read / write interface definitions
  7751. * @param val buffer that stores the value of long counter
  7752. * @retval interface status (MANDATORY: return 0 -> no Error)
  7753. *
  7754. */
  7755. int32_t lsm6dso_long_cnt_int_value_get(stmdev_ctx_t *ctx,
  7756. uint16_t *val)
  7757. {
  7758. uint8_t buff[2];
  7759. int32_t ret;
  7760. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L,
  7761. &buff[0]);
  7762. if (ret == 0)
  7763. {
  7764. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H,
  7765. &buff[1]);
  7766. *val = buff[1];
  7767. *val = (*val * 256U) + buff[0];
  7768. }
  7769. return ret;
  7770. }
  7771. /**
  7772. * @brief FSM number of programs register.[set]
  7773. *
  7774. * @param ctx read / write interface definitions
  7775. * @param val value to write
  7776. * @retval interface status (MANDATORY: return 0 -> no Error)
  7777. *
  7778. */
  7779. int32_t lsm6dso_fsm_number_of_programs_set(stmdev_ctx_t *ctx,
  7780. uint8_t val)
  7781. {
  7782. int32_t ret;
  7783. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_PROGRAMS, &val);
  7784. return ret;
  7785. }
  7786. /**
  7787. * @brief FSM number of programs register.[get]
  7788. *
  7789. * @param ctx read / write interface definitions
  7790. * @param val buffer that stores data read.
  7791. * @retval interface status (MANDATORY: return 0 -> no Error)
  7792. *
  7793. */
  7794. int32_t lsm6dso_fsm_number_of_programs_get(stmdev_ctx_t *ctx,
  7795. uint8_t *val)
  7796. {
  7797. int32_t ret;
  7798. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_PROGRAMS, val);
  7799. return ret;
  7800. }
  7801. /**
  7802. * @brief FSM start address register (r/w).
  7803. * First available address is 0x033C.[set]
  7804. *
  7805. * @param ctx read / write interface definitions
  7806. * @param val the value of start address
  7807. * @retval interface status (MANDATORY: return 0 -> no Error)
  7808. *
  7809. */
  7810. int32_t lsm6dso_fsm_start_address_set(stmdev_ctx_t *ctx, uint16_t val)
  7811. {
  7812. uint8_t buff[2];
  7813. int32_t ret;
  7814. buff[1] = (uint8_t)(val / 256U);
  7815. buff[0] = (uint8_t)(val - (buff[1] * 256U));
  7816. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_L,
  7817. &buff[0]);
  7818. if (ret == 0)
  7819. {
  7820. ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_H,
  7821. &buff[1]);
  7822. }
  7823. return ret;
  7824. }
  7825. /**
  7826. * @brief FSM start address register (r/w).
  7827. * First available address is 0x033C.[get]
  7828. *
  7829. * @param ctx read / write interface definitions
  7830. * @param val buffer the value of start address.
  7831. * @retval interface status (MANDATORY: return 0 -> no Error)
  7832. *
  7833. */
  7834. int32_t lsm6dso_fsm_start_address_get(stmdev_ctx_t *ctx,
  7835. uint16_t *val)
  7836. {
  7837. uint8_t buff[2];
  7838. int32_t ret;
  7839. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_L, &buff[0]);
  7840. if (ret == 0)
  7841. {
  7842. ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_H, &buff[1]);
  7843. *val = buff[1];
  7844. *val = (*val * 256U) + buff[0];
  7845. }
  7846. return ret;
  7847. }
  7848. /**
  7849. * @}
  7850. *
  7851. */
  7852. /**
  7853. * @defgroup LSM6DSO_Sensor_hub
  7854. * @brief This section groups all the functions that manage the
  7855. * sensor hub.
  7856. * @{
  7857. *
  7858. */
  7859. /**
  7860. * @brief Sensor hub output registers.[get]
  7861. *
  7862. * @param ctx read / write interface definitions
  7863. * @param val values read from registers SENSOR_HUB_1 to SENSOR_HUB_18
  7864. * @param len number of consecutive register to read (max 18)
  7865. * @retval interface status (MANDATORY: return 0 -> no Error)
  7866. *
  7867. */
  7868. int32_t lsm6dso_sh_read_data_raw_get(stmdev_ctx_t *ctx, uint8_t *val,
  7869. uint8_t len)
  7870. {
  7871. int32_t ret;
  7872. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  7873. if (ret == 0)
  7874. {
  7875. ret = lsm6dso_read_reg(ctx, LSM6DSO_SENSOR_HUB_1, (uint8_t *) val,
  7876. len);
  7877. }
  7878. if (ret == 0)
  7879. {
  7880. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7881. }
  7882. return ret;
  7883. }
  7884. /**
  7885. * @brief Number of external sensors to be read by the sensor hub.[set]
  7886. *
  7887. * @param ctx read / write interface definitions
  7888. * @param val change the values of aux_sens_on in reg MASTER_CONFIG
  7889. * @retval interface status (MANDATORY: return 0 -> no Error)
  7890. *
  7891. */
  7892. int32_t lsm6dso_sh_slave_connected_set(stmdev_ctx_t *ctx,
  7893. lsm6dso_aux_sens_on_t val)
  7894. {
  7895. lsm6dso_master_config_t reg;
  7896. int32_t ret;
  7897. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  7898. if (ret == 0)
  7899. {
  7900. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  7901. }
  7902. if (ret == 0)
  7903. {
  7904. reg.aux_sens_on = (uint8_t)val;
  7905. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  7906. }
  7907. if (ret == 0)
  7908. {
  7909. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7910. }
  7911. return ret;
  7912. }
  7913. /**
  7914. * @brief Number of external sensors to be read by the sensor hub.[get]
  7915. *
  7916. * @param ctx read / write interface definitions
  7917. * @param val Get the values of aux_sens_on in reg MASTER_CONFIG
  7918. * @retval interface status (MANDATORY: return 0 -> no Error)
  7919. *
  7920. */
  7921. int32_t lsm6dso_sh_slave_connected_get(stmdev_ctx_t *ctx,
  7922. lsm6dso_aux_sens_on_t *val)
  7923. {
  7924. lsm6dso_master_config_t reg;
  7925. int32_t ret;
  7926. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  7927. if (ret == 0)
  7928. {
  7929. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  7930. }
  7931. if (ret == 0)
  7932. {
  7933. switch (reg.aux_sens_on)
  7934. {
  7935. case LSM6DSO_SLV_0:
  7936. *val = LSM6DSO_SLV_0;
  7937. break;
  7938. case LSM6DSO_SLV_0_1:
  7939. *val = LSM6DSO_SLV_0_1;
  7940. break;
  7941. case LSM6DSO_SLV_0_1_2:
  7942. *val = LSM6DSO_SLV_0_1_2;
  7943. break;
  7944. case LSM6DSO_SLV_0_1_2_3:
  7945. *val = LSM6DSO_SLV_0_1_2_3;
  7946. break;
  7947. default:
  7948. *val = LSM6DSO_SLV_0;
  7949. break;
  7950. }
  7951. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7952. }
  7953. return ret;
  7954. }
  7955. /**
  7956. * @brief Sensor hub I2C master enable.[set]
  7957. *
  7958. * @param ctx read / write interface definitions
  7959. * @param val change the values of master_on in reg MASTER_CONFIG
  7960. * @retval interface status (MANDATORY: return 0 -> no Error)
  7961. *
  7962. */
  7963. int32_t lsm6dso_sh_master_set(stmdev_ctx_t *ctx, uint8_t val)
  7964. {
  7965. lsm6dso_master_config_t reg;
  7966. int32_t ret;
  7967. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  7968. if (ret == 0)
  7969. {
  7970. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  7971. }
  7972. if (ret == 0)
  7973. {
  7974. reg.master_on = val;
  7975. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  7976. }
  7977. if (ret == 0)
  7978. {
  7979. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  7980. }
  7981. return ret;
  7982. }
  7983. /**
  7984. * @brief Sensor hub I2C master enable.[get]
  7985. *
  7986. * @param ctx read / write interface definitions
  7987. * @param val change the values of master_on in reg MASTER_CONFIG
  7988. * @retval interface status (MANDATORY: return 0 -> no Error)
  7989. *
  7990. */
  7991. int32_t lsm6dso_sh_master_get(stmdev_ctx_t *ctx, uint8_t *val)
  7992. {
  7993. lsm6dso_master_config_t reg;
  7994. int32_t ret;
  7995. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  7996. if (ret == 0)
  7997. {
  7998. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  7999. }
  8000. if (ret == 0)
  8001. {
  8002. *val = reg.master_on;
  8003. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8004. }
  8005. return ret;
  8006. }
  8007. /**
  8008. * @brief Master I2C pull-up enable.[set]
  8009. *
  8010. * @param ctx read / write interface definitions
  8011. * @param val change the values of shub_pu_en in reg MASTER_CONFIG
  8012. * @retval interface status (MANDATORY: return 0 -> no Error)
  8013. *
  8014. */
  8015. int32_t lsm6dso_sh_pin_mode_set(stmdev_ctx_t *ctx,
  8016. lsm6dso_shub_pu_en_t val)
  8017. {
  8018. lsm6dso_master_config_t reg;
  8019. int32_t ret;
  8020. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8021. if (ret == 0)
  8022. {
  8023. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8024. }
  8025. if (ret == 0)
  8026. {
  8027. reg.shub_pu_en = (uint8_t)val;
  8028. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8029. }
  8030. if (ret == 0)
  8031. {
  8032. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8033. }
  8034. return ret;
  8035. }
  8036. /**
  8037. * @brief Master I2C pull-up enable.[get]
  8038. *
  8039. * @param ctx read / write interface definitions
  8040. * @param val Get the values of shub_pu_en in reg MASTER_CONFIG
  8041. * @retval interface status (MANDATORY: return 0 -> no Error)
  8042. *
  8043. */
  8044. int32_t lsm6dso_sh_pin_mode_get(stmdev_ctx_t *ctx,
  8045. lsm6dso_shub_pu_en_t *val)
  8046. {
  8047. lsm6dso_master_config_t reg;
  8048. int32_t ret;
  8049. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8050. if (ret == 0)
  8051. {
  8052. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8053. }
  8054. if (ret == 0)
  8055. {
  8056. switch (reg.shub_pu_en)
  8057. {
  8058. case LSM6DSO_EXT_PULL_UP:
  8059. *val = LSM6DSO_EXT_PULL_UP;
  8060. break;
  8061. case LSM6DSO_INTERNAL_PULL_UP:
  8062. *val = LSM6DSO_INTERNAL_PULL_UP;
  8063. break;
  8064. default:
  8065. *val = LSM6DSO_EXT_PULL_UP;
  8066. break;
  8067. }
  8068. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8069. }
  8070. return ret;
  8071. }
  8072. /**
  8073. * @brief I2C interface pass-through.[set]
  8074. *
  8075. * @param ctx read / write interface definitions
  8076. * @param val change the values of pass_through_mode in
  8077. * reg MASTER_CONFIG
  8078. * @retval interface status (MANDATORY: return 0 -> no Error)
  8079. *
  8080. */
  8081. int32_t lsm6dso_sh_pass_through_set(stmdev_ctx_t *ctx, uint8_t val)
  8082. {
  8083. lsm6dso_master_config_t reg;
  8084. int32_t ret;
  8085. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8086. if (ret == 0)
  8087. {
  8088. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8089. }
  8090. if (ret == 0)
  8091. {
  8092. reg.pass_through_mode = val;
  8093. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8094. }
  8095. if (ret == 0)
  8096. {
  8097. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8098. }
  8099. return ret;
  8100. }
  8101. /**
  8102. * @brief I2C interface pass-through.[get]
  8103. *
  8104. * @param ctx read / write interface definitions
  8105. * @param val change the values of pass_through_mode in
  8106. * reg MASTER_CONFIG
  8107. * @retval interface status (MANDATORY: return 0 -> no Error)
  8108. *
  8109. */
  8110. int32_t lsm6dso_sh_pass_through_get(stmdev_ctx_t *ctx, uint8_t *val)
  8111. {
  8112. lsm6dso_master_config_t reg;
  8113. int32_t ret;
  8114. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8115. if (ret == 0)
  8116. {
  8117. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8118. }
  8119. if (ret == 0)
  8120. {
  8121. *val = reg.pass_through_mode;
  8122. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8123. }
  8124. return ret;
  8125. }
  8126. /**
  8127. * @brief Sensor hub trigger signal selection.[set]
  8128. *
  8129. * @param ctx read / write interface definitions
  8130. * @param val change the values of start_config in reg MASTER_CONFIG
  8131. * @retval interface status (MANDATORY: return 0 -> no Error)
  8132. *
  8133. */
  8134. int32_t lsm6dso_sh_syncro_mode_set(stmdev_ctx_t *ctx,
  8135. lsm6dso_start_config_t val)
  8136. {
  8137. lsm6dso_master_config_t reg;
  8138. int32_t ret;
  8139. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8140. if (ret == 0)
  8141. {
  8142. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8143. }
  8144. if (ret == 0)
  8145. {
  8146. reg.start_config = (uint8_t)val;
  8147. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8148. }
  8149. if (ret == 0)
  8150. {
  8151. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8152. }
  8153. return ret;
  8154. }
  8155. /**
  8156. * @brief Sensor hub trigger signal selection.[get]
  8157. *
  8158. * @param ctx read / write interface definitions
  8159. * @param val Get the values of start_config in reg MASTER_CONFIG
  8160. * @retval interface status (MANDATORY: return 0 -> no Error)
  8161. *
  8162. */
  8163. int32_t lsm6dso_sh_syncro_mode_get(stmdev_ctx_t *ctx,
  8164. lsm6dso_start_config_t *val)
  8165. {
  8166. lsm6dso_master_config_t reg;
  8167. int32_t ret;
  8168. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8169. if (ret == 0)
  8170. {
  8171. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8172. }
  8173. if (ret == 0)
  8174. {
  8175. switch (reg.start_config)
  8176. {
  8177. case LSM6DSO_EXT_ON_INT2_PIN:
  8178. *val = LSM6DSO_EXT_ON_INT2_PIN;
  8179. break;
  8180. case LSM6DSO_XL_GY_DRDY:
  8181. *val = LSM6DSO_XL_GY_DRDY;
  8182. break;
  8183. default:
  8184. *val = LSM6DSO_EXT_ON_INT2_PIN;
  8185. break;
  8186. }
  8187. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8188. }
  8189. return ret;
  8190. }
  8191. /**
  8192. * @brief Slave 0 write operation is performed only at the first
  8193. * sensor hub cycle.[set]
  8194. *
  8195. * @param ctx read / write interface definitions
  8196. * @param val change the values of write_once in reg MASTER_CONFIG
  8197. * @retval interface status (MANDATORY: return 0 -> no Error)
  8198. *
  8199. */
  8200. int32_t lsm6dso_sh_write_mode_set(stmdev_ctx_t *ctx,
  8201. lsm6dso_write_once_t val)
  8202. {
  8203. lsm6dso_master_config_t reg;
  8204. int32_t ret;
  8205. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8206. if (ret == 0)
  8207. {
  8208. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8209. }
  8210. if (ret == 0)
  8211. {
  8212. reg.write_once = (uint8_t)val;
  8213. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8214. }
  8215. if (ret == 0)
  8216. {
  8217. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8218. }
  8219. return ret;
  8220. }
  8221. /**
  8222. * @brief Slave 0 write operation is performed only at the first sensor
  8223. * hub cycle.[get]
  8224. *
  8225. * @param ctx read / write interface definitions
  8226. * @param val Get the values of write_once in reg MASTER_CONFIG
  8227. * @retval interface status (MANDATORY: return 0 -> no Error)
  8228. *
  8229. */
  8230. int32_t lsm6dso_sh_write_mode_get(stmdev_ctx_t *ctx,
  8231. lsm6dso_write_once_t *val)
  8232. {
  8233. lsm6dso_master_config_t reg;
  8234. int32_t ret;
  8235. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8236. if (ret == 0)
  8237. {
  8238. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8239. }
  8240. if (ret == 0)
  8241. {
  8242. switch (reg.write_once)
  8243. {
  8244. case LSM6DSO_EACH_SH_CYCLE:
  8245. *val = LSM6DSO_EACH_SH_CYCLE;
  8246. break;
  8247. case LSM6DSO_ONLY_FIRST_CYCLE:
  8248. *val = LSM6DSO_ONLY_FIRST_CYCLE;
  8249. break;
  8250. default:
  8251. *val = LSM6DSO_EACH_SH_CYCLE;
  8252. break;
  8253. }
  8254. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8255. }
  8256. return ret;
  8257. }
  8258. /**
  8259. * @brief Reset Master logic and output registers.[set]
  8260. *
  8261. * @param ctx read / write interface definitions
  8262. * @retval interface status (MANDATORY: return 0 -> no Error)
  8263. *
  8264. */
  8265. int32_t lsm6dso_sh_reset_set(stmdev_ctx_t *ctx)
  8266. {
  8267. lsm6dso_master_config_t reg;
  8268. int32_t ret;
  8269. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8270. if (ret == 0)
  8271. {
  8272. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8273. }
  8274. if (ret == 0)
  8275. {
  8276. reg.rst_master_regs = PROPERTY_ENABLE;
  8277. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8278. }
  8279. if (ret == 0)
  8280. {
  8281. reg.rst_master_regs = PROPERTY_DISABLE;
  8282. ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8283. }
  8284. if (ret == 0)
  8285. {
  8286. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8287. }
  8288. return ret;
  8289. }
  8290. /**
  8291. * @brief Reset Master logic and output registers.[get]
  8292. *
  8293. * @param ctx read / write interface definitions
  8294. * @param val change the values of rst_master_regs in reg MASTER_CONFIG
  8295. * @retval interface status (MANDATORY: return 0 -> no Error)
  8296. *
  8297. */
  8298. int32_t lsm6dso_sh_reset_get(stmdev_ctx_t *ctx, uint8_t *val)
  8299. {
  8300. lsm6dso_master_config_t reg;
  8301. int32_t ret;
  8302. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8303. if (ret == 0)
  8304. {
  8305. ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t *)&reg, 1);
  8306. }
  8307. if (ret == 0)
  8308. {
  8309. *val = reg.rst_master_regs;
  8310. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8311. }
  8312. return ret;
  8313. }
  8314. /**
  8315. * @brief Rate at which the master communicates.[set]
  8316. *
  8317. * @param ctx read / write interface definitions
  8318. * @param val change the values of shub_odr in reg slv1_CONFIG
  8319. * @retval interface status (MANDATORY: return 0 -> no Error)
  8320. *
  8321. */
  8322. int32_t lsm6dso_sh_data_rate_set(stmdev_ctx_t *ctx,
  8323. lsm6dso_shub_odr_t val)
  8324. {
  8325. lsm6dso_slv0_config_t reg;
  8326. int32_t ret;
  8327. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8328. if (ret == 0)
  8329. {
  8330. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t *)&reg, 1);
  8331. }
  8332. if (ret == 0)
  8333. {
  8334. reg.shub_odr = (uint8_t)val;
  8335. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t *)&reg, 1);
  8336. }
  8337. if (ret == 0)
  8338. {
  8339. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8340. }
  8341. return ret;
  8342. }
  8343. /**
  8344. * @brief Rate at which the master communicates.[get]
  8345. *
  8346. * @param ctx read / write interface definitions
  8347. * @param val Get the values of shub_odr in reg slv1_CONFIG
  8348. * @retval interface status (MANDATORY: return 0 -> no Error)
  8349. *
  8350. */
  8351. int32_t lsm6dso_sh_data_rate_get(stmdev_ctx_t *ctx,
  8352. lsm6dso_shub_odr_t *val)
  8353. {
  8354. lsm6dso_slv0_config_t reg;
  8355. int32_t ret;
  8356. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8357. if (ret == 0)
  8358. {
  8359. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t *)&reg, 1);
  8360. }
  8361. if (ret == 0)
  8362. {
  8363. switch (reg.shub_odr)
  8364. {
  8365. case LSM6DSO_SH_ODR_104Hz:
  8366. *val = LSM6DSO_SH_ODR_104Hz;
  8367. break;
  8368. case LSM6DSO_SH_ODR_52Hz:
  8369. *val = LSM6DSO_SH_ODR_52Hz;
  8370. break;
  8371. case LSM6DSO_SH_ODR_26Hz:
  8372. *val = LSM6DSO_SH_ODR_26Hz;
  8373. break;
  8374. case LSM6DSO_SH_ODR_13Hz:
  8375. *val = LSM6DSO_SH_ODR_13Hz;
  8376. break;
  8377. default:
  8378. *val = LSM6DSO_SH_ODR_104Hz;
  8379. break;
  8380. }
  8381. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8382. }
  8383. return ret;
  8384. }
  8385. /**
  8386. * @brief Configure slave 0 for perform a write.[set]
  8387. *
  8388. * @param ctx read / write interface definitions
  8389. * @param val a structure that contain
  8390. * - uint8_t slv1_add; 8 bit i2c device address
  8391. * - uint8_t slv1_subadd; 8 bit register device address
  8392. * - uint8_t slv1_data; 8 bit data to write
  8393. * @retval interface status (MANDATORY: return 0 -> no Error)
  8394. *
  8395. */
  8396. int32_t lsm6dso_sh_cfg_write(stmdev_ctx_t *ctx,
  8397. lsm6dso_sh_cfg_write_t *val)
  8398. {
  8399. lsm6dso_slv0_add_t reg;
  8400. int32_t ret;
  8401. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8402. if (ret == 0)
  8403. {
  8404. reg.slave0 = val->slv0_add;
  8405. reg.rw_0 = 0;
  8406. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_ADD, (uint8_t *)&reg, 1);
  8407. }
  8408. if (ret == 0)
  8409. {
  8410. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_SUBADD,
  8411. &(val->slv0_subadd), 1);
  8412. }
  8413. if (ret == 0)
  8414. {
  8415. ret = lsm6dso_write_reg(ctx, LSM6DSO_DATAWRITE_SLV0,
  8416. &(val->slv0_data), 1);
  8417. }
  8418. if (ret == 0)
  8419. {
  8420. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8421. }
  8422. return ret;
  8423. }
  8424. /**
  8425. * @brief Configure slave 0 for perform a read.[set]
  8426. *
  8427. * @param ctx read / write interface definitions
  8428. * @param val Structure that contain
  8429. * - uint8_t slv1_add; 8 bit i2c device address
  8430. * - uint8_t slv1_subadd; 8 bit register device address
  8431. * - uint8_t slv1_len; num of bit to read
  8432. * @retval interface status (MANDATORY: return 0 -> no Error)
  8433. *
  8434. */
  8435. int32_t lsm6dso_sh_slv0_cfg_read(stmdev_ctx_t *ctx,
  8436. lsm6dso_sh_cfg_read_t *val)
  8437. {
  8438. lsm6dso_slv0_add_t slv0_add;
  8439. lsm6dso_slv0_config_t slv0_config;
  8440. int32_t ret;
  8441. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8442. if (ret == 0)
  8443. {
  8444. slv0_add.slave0 = val->slv_add;
  8445. slv0_add.rw_0 = 1;
  8446. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_ADD, (uint8_t *)&slv0_add, 1);
  8447. }
  8448. if (ret == 0)
  8449. {
  8450. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_SUBADD,
  8451. &(val->slv_subadd), 1);
  8452. }
  8453. if (ret == 0)
  8454. {
  8455. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG,
  8456. (uint8_t *)&slv0_config, 1);
  8457. }
  8458. if (ret == 0)
  8459. {
  8460. slv0_config.slave0_numop = val->slv_len;
  8461. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_CONFIG,
  8462. (uint8_t *)&slv0_config, 1);
  8463. }
  8464. if (ret == 0)
  8465. {
  8466. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8467. }
  8468. return ret;
  8469. }
  8470. /**
  8471. * @brief Configure slave 0 for perform a write/read.[set]
  8472. *
  8473. * @param ctx read / write interface definitions
  8474. * @param val Structure that contain
  8475. * - uint8_t slv1_add; 8 bit i2c device address
  8476. * - uint8_t slv1_subadd; 8 bit register device address
  8477. * - uint8_t slv1_len; num of bit to read
  8478. * @retval interface status (MANDATORY: return 0 -> no Error)
  8479. *
  8480. */
  8481. int32_t lsm6dso_sh_slv1_cfg_read(stmdev_ctx_t *ctx,
  8482. lsm6dso_sh_cfg_read_t *val)
  8483. {
  8484. lsm6dso_slv1_add_t slv1_add;
  8485. lsm6dso_slv1_config_t slv1_config;
  8486. int32_t ret;
  8487. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8488. if (ret == 0)
  8489. {
  8490. slv1_add.slave1_add = val->slv_add;
  8491. slv1_add.r_1 = 1;
  8492. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_ADD, (uint8_t *)&slv1_add, 1);
  8493. }
  8494. if (ret == 0)
  8495. {
  8496. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_SUBADD,
  8497. &(val->slv_subadd), 1);
  8498. }
  8499. if (ret == 0)
  8500. {
  8501. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG,
  8502. (uint8_t *)&slv1_config, 1);
  8503. }
  8504. if (ret == 0)
  8505. {
  8506. slv1_config.slave1_numop = val->slv_len;
  8507. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_CONFIG,
  8508. (uint8_t *)&slv1_config, 1);
  8509. }
  8510. if (ret == 0)
  8511. {
  8512. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8513. }
  8514. return ret;
  8515. }
  8516. /**
  8517. * @brief Configure slave 0 for perform a write/read.[set]
  8518. *
  8519. * @param ctx read / write interface definitions
  8520. * @param val Structure that contain
  8521. * - uint8_t slv2_add; 8 bit i2c device address
  8522. * - uint8_t slv2_subadd; 8 bit register device address
  8523. * - uint8_t slv2_len; num of bit to read
  8524. * @retval interface status (MANDATORY: return 0 -> no Error)
  8525. *
  8526. */
  8527. int32_t lsm6dso_sh_slv2_cfg_read(stmdev_ctx_t *ctx,
  8528. lsm6dso_sh_cfg_read_t *val)
  8529. {
  8530. lsm6dso_slv2_add_t slv2_add;
  8531. lsm6dso_slv2_config_t slv2_config;
  8532. int32_t ret;
  8533. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8534. if (ret == 0)
  8535. {
  8536. slv2_add.slave2_add = val->slv_add;
  8537. slv2_add.r_2 = 1;
  8538. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_ADD, (uint8_t *)&slv2_add, 1);
  8539. }
  8540. if (ret == 0)
  8541. {
  8542. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_SUBADD,
  8543. &(val->slv_subadd), 1);
  8544. }
  8545. if (ret == 0)
  8546. {
  8547. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV2_CONFIG,
  8548. (uint8_t *)&slv2_config, 1);
  8549. }
  8550. if (ret == 0)
  8551. {
  8552. slv2_config.slave2_numop = val->slv_len;
  8553. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_CONFIG,
  8554. (uint8_t *)&slv2_config, 1);
  8555. }
  8556. if (ret == 0)
  8557. {
  8558. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8559. }
  8560. return ret;
  8561. }
  8562. /**
  8563. * @brief Configure slave 0 for perform a write/read.[set]
  8564. *
  8565. * @param ctx read / write interface definitions
  8566. * @param val Structure that contain
  8567. * - uint8_t slv3_add; 8 bit i2c device address
  8568. * - uint8_t slv3_subadd; 8 bit register device address
  8569. * - uint8_t slv3_len; num of bit to read
  8570. * @retval interface status (MANDATORY: return 0 -> no Error)
  8571. *
  8572. */
  8573. int32_t lsm6dso_sh_slv3_cfg_read(stmdev_ctx_t *ctx,
  8574. lsm6dso_sh_cfg_read_t *val)
  8575. {
  8576. lsm6dso_slv3_add_t slv3_add;
  8577. lsm6dso_slv3_config_t slv3_config;
  8578. int32_t ret;
  8579. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8580. if (ret == 0)
  8581. {
  8582. slv3_add.slave3_add = val->slv_add;
  8583. slv3_add.r_3 = 1;
  8584. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_ADD, (uint8_t *)&slv3_add, 1);
  8585. }
  8586. if (ret == 0)
  8587. {
  8588. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_SUBADD,
  8589. &(val->slv_subadd), 1);
  8590. }
  8591. if (ret == 0)
  8592. {
  8593. ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV3_CONFIG,
  8594. (uint8_t *)&slv3_config, 1);
  8595. }
  8596. if (ret == 0)
  8597. {
  8598. slv3_config.slave3_numop = val->slv_len;
  8599. ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_CONFIG,
  8600. (uint8_t *)&slv3_config, 1);
  8601. }
  8602. if (ret == 0)
  8603. {
  8604. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8605. }
  8606. return ret;
  8607. }
  8608. /**
  8609. * @brief Sensor hub source register.[get]
  8610. *
  8611. * @param ctx read / write interface definitions
  8612. * @param val union of registers from STATUS_MASTER to
  8613. * @retval interface status (MANDATORY: return 0 -> no Error)
  8614. *
  8615. */
  8616. int32_t lsm6dso_sh_status_get(stmdev_ctx_t *ctx,
  8617. lsm6dso_status_master_t *val)
  8618. {
  8619. int32_t ret;
  8620. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
  8621. if (ret == 0)
  8622. {
  8623. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_MASTER, (uint8_t *) val, 1);
  8624. }
  8625. if (ret == 0)
  8626. {
  8627. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8628. }
  8629. return ret;
  8630. }
  8631. /**
  8632. * @}
  8633. *
  8634. */
  8635. /**
  8636. * @defgroup Basic configuration
  8637. * @brief This section groups all the functions concerning
  8638. * device basic configuration.
  8639. * @{
  8640. *
  8641. */
  8642. /**
  8643. * @brief Device "Who am I".[get]
  8644. *
  8645. * @param ctx communication interface handler. Use NULL to ignore
  8646. * this interface.(ptr)
  8647. * @param aux_ctx auxiliary communication interface handler. Use NULL
  8648. * to ignore this interface.(ptr)
  8649. * @param val ID values read from the two interfaces. ID values
  8650. * will be the same.(ptr)
  8651. * @retval interface status (MANDATORY: return 0 -> no Error)
  8652. *
  8653. */
  8654. int32_t lsm6dso_id_get(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  8655. lsm6dso_id_t *val)
  8656. {
  8657. int32_t ret = 0;
  8658. if (ctx != NULL)
  8659. {
  8660. ret = lsm6dso_read_reg(ctx, LSM6DSO_WHO_AM_I,
  8661. (uint8_t *) & (val->ui), 1);
  8662. }
  8663. if (aux_ctx != NULL)
  8664. {
  8665. if (ret == 0)
  8666. {
  8667. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_WHO_AM_I,
  8668. (uint8_t *) & (val->aux), 1);
  8669. }
  8670. }
  8671. return ret;
  8672. }
  8673. /**
  8674. * @brief Re-initialize the device.[set]
  8675. *
  8676. * @param ctx communication interface handler.(ptr)
  8677. * @param val re-initialization mode. Refer to datasheet
  8678. * and application note for more information
  8679. * about differencies between boot and sw_reset
  8680. * procedure.
  8681. * @retval interface status (MANDATORY: return 0 -> no Error)
  8682. *
  8683. */
  8684. int32_t lsm6dso_init_set(stmdev_ctx_t *ctx, lsm6dso_init_t val)
  8685. {
  8686. lsm6dso_emb_func_init_a_t emb_func_init_a;
  8687. lsm6dso_emb_func_init_b_t emb_func_init_b;
  8688. lsm6dso_ctrl3_c_t ctrl3_c;
  8689. int32_t ret;
  8690. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  8691. if (ret == 0)
  8692. {
  8693. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B,
  8694. (uint8_t *)&emb_func_init_b, 1);
  8695. }
  8696. if (ret == 0)
  8697. {
  8698. emb_func_init_b.fifo_compr_init = (uint8_t)val
  8699. & ((uint8_t)LSM6DSO_FIFO_COMP >> 2);
  8700. emb_func_init_b.fsm_init = (uint8_t)val
  8701. & ((uint8_t)LSM6DSO_FSM >> 3);
  8702. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B,
  8703. (uint8_t *)&emb_func_init_b, 1);
  8704. }
  8705. if (ret == 0)
  8706. {
  8707. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_A,
  8708. (uint8_t *)&emb_func_init_a, 1);
  8709. }
  8710. if (ret == 0)
  8711. {
  8712. emb_func_init_a.step_det_init = ((uint8_t)val
  8713. & (uint8_t)LSM6DSO_PEDO) >> 5;
  8714. emb_func_init_a.tilt_init = ((uint8_t)val
  8715. & (uint8_t)LSM6DSO_TILT) >> 6;
  8716. emb_func_init_a.sig_mot_init = ((uint8_t)val
  8717. & (uint8_t)LSM6DSO_SMOTION) >> 7;
  8718. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_A,
  8719. (uint8_t *)&emb_func_init_a, 1);
  8720. }
  8721. if (ret == 0)
  8722. {
  8723. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  8724. }
  8725. if (ret == 0)
  8726. {
  8727. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  8728. }
  8729. if (((val == LSM6DSO_BOOT) || (val == LSM6DSO_RESET)) &&
  8730. (ret == 0))
  8731. {
  8732. ctrl3_c.boot = (uint8_t)val & (uint8_t)LSM6DSO_BOOT;
  8733. ctrl3_c.sw_reset = ((uint8_t)val & (uint8_t)LSM6DSO_RESET) >> 1;
  8734. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  8735. }
  8736. if ((val == LSM6DSO_DRV_RDY)
  8737. && ((ctrl3_c.bdu == PROPERTY_DISABLE)
  8738. || (ctrl3_c.if_inc == PROPERTY_DISABLE)) && (ret == 0))
  8739. {
  8740. ctrl3_c.bdu = PROPERTY_ENABLE;
  8741. ctrl3_c.if_inc = PROPERTY_ENABLE;
  8742. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  8743. }
  8744. return ret;
  8745. }
  8746. /**
  8747. * @brief Configures the bus operating mode.[set]
  8748. *
  8749. * @param ctx communication interface handler. Use NULL to ignore
  8750. * this interface.(ptr)
  8751. * @param aux_ctx auxiliary communication interface handler. Use NULL
  8752. * to ignore this interface.(ptr)
  8753. * @param val configures the bus operating mode for both the
  8754. * main and the auxiliary interface.
  8755. * @retval interface status (MANDATORY: return 0 -> no Error)
  8756. *
  8757. */
  8758. int32_t lsm6dso_bus_mode_set(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  8759. lsm6dso_bus_mode_t val)
  8760. {
  8761. lsm6dso_ctrl1_ois_t ctrl1_ois;
  8762. lsm6dso_i3c_bus_avb_t i3c_bus_avb;
  8763. lsm6dso_ctrl9_xl_t ctrl9_xl;
  8764. lsm6dso_ctrl3_c_t ctrl3_c;
  8765. lsm6dso_ctrl4_c_t ctrl4_c;
  8766. uint8_t bit_val;
  8767. int32_t ret;
  8768. ret = 0;
  8769. if (aux_ctx != NULL)
  8770. {
  8771. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS,
  8772. (uint8_t *)&ctrl1_ois, 1);
  8773. bit_val = ((uint8_t)val.aux_bus_md & 0x04U) >> 2;
  8774. if ((ret == 0) && (ctrl1_ois.sim_ois != bit_val))
  8775. {
  8776. ctrl1_ois.sim_ois = bit_val;
  8777. ret = lsm6dso_write_reg(aux_ctx, LSM6DSO_CTRL1_OIS,
  8778. (uint8_t *)&ctrl1_ois, 1);
  8779. }
  8780. }
  8781. if (ctx != NULL)
  8782. {
  8783. if (ret == 0)
  8784. {
  8785. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL,
  8786. (uint8_t *)&ctrl9_xl, 1);
  8787. }
  8788. bit_val = ((uint8_t)val.ui_bus_md & 0x04U) >> 2;
  8789. if ((ret == 0) && (ctrl9_xl.i3c_disable != bit_val))
  8790. {
  8791. ctrl9_xl.i3c_disable = bit_val;
  8792. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL,
  8793. (uint8_t *)&ctrl9_xl, 1);
  8794. }
  8795. if (ret == 0)
  8796. {
  8797. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  8798. (uint8_t *)&i3c_bus_avb, 1);
  8799. }
  8800. bit_val = ((uint8_t)val.ui_bus_md & 0x30U) >> 4;
  8801. if ((ret == 0) && (i3c_bus_avb.i3c_bus_avb_sel != bit_val))
  8802. {
  8803. i3c_bus_avb.i3c_bus_avb_sel = bit_val;
  8804. ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  8805. (uint8_t *)&i3c_bus_avb, 1);
  8806. }
  8807. if (ret == 0)
  8808. {
  8809. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C,
  8810. (uint8_t *)&ctrl4_c, 1);
  8811. }
  8812. bit_val = ((uint8_t)val.ui_bus_md & 0x02U) >> 1;
  8813. if ((ret == 0) && (ctrl4_c.i2c_disable != bit_val))
  8814. {
  8815. ctrl4_c.i2c_disable = bit_val;
  8816. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C,
  8817. (uint8_t *)&ctrl4_c, 1);
  8818. }
  8819. if (ret == 0)
  8820. {
  8821. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C,
  8822. (uint8_t *)&ctrl3_c, 1);
  8823. }
  8824. bit_val = (uint8_t)val.ui_bus_md & 0x01U;
  8825. if ((ret == 0) && (ctrl3_c.sim != bit_val))
  8826. {
  8827. ctrl3_c.sim = bit_val;
  8828. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C,
  8829. (uint8_t *)&ctrl3_c, 1);
  8830. }
  8831. }
  8832. return ret;
  8833. }
  8834. /**
  8835. * @brief Get the bus operating mode.[get]
  8836. *
  8837. * @param ctx communication interface handler. Use NULL to ignore
  8838. * this interface.(ptr)
  8839. * @param aux_ctx auxiliary communication interface handler. Use NULL
  8840. * to ignore this interface.(ptr)
  8841. * @param val retrieves the bus operating mode for both the main
  8842. * and the auxiliary interface.(ptr)
  8843. * @retval interface status (MANDATORY: return 0 -> no Error)
  8844. *
  8845. */
  8846. int32_t lsm6dso_bus_mode_get(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  8847. lsm6dso_bus_mode_t *val)
  8848. {
  8849. lsm6dso_ctrl1_ois_t ctrl1_ois;
  8850. lsm6dso_i3c_bus_avb_t i3c_bus_avb;
  8851. lsm6dso_ctrl9_xl_t ctrl9_xl;
  8852. lsm6dso_ctrl3_c_t ctrl3_c;
  8853. lsm6dso_ctrl4_c_t ctrl4_c;
  8854. int32_t ret = 0;
  8855. if (aux_ctx != NULL)
  8856. {
  8857. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS,
  8858. (uint8_t *)&ctrl1_ois, 1);
  8859. switch (ctrl1_ois.sim_ois)
  8860. {
  8861. case LSM6DSO_SPI_4W_AUX:
  8862. val->aux_bus_md = LSM6DSO_SPI_4W_AUX;
  8863. break;
  8864. case LSM6DSO_SPI_3W_AUX:
  8865. val->aux_bus_md = LSM6DSO_SPI_3W_AUX;
  8866. break;
  8867. default:
  8868. val->aux_bus_md = LSM6DSO_SPI_4W_AUX;
  8869. break;
  8870. }
  8871. }
  8872. if (ctx != NULL)
  8873. {
  8874. if (ret == 0)
  8875. {
  8876. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL,
  8877. (uint8_t *)&ctrl9_xl, 1);
  8878. }
  8879. if (ret == 0)
  8880. {
  8881. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  8882. (uint8_t *)&i3c_bus_avb, 1);
  8883. }
  8884. if (ret == 0)
  8885. {
  8886. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C,
  8887. (uint8_t *)&ctrl4_c, 1);
  8888. }
  8889. if (ret == 0)
  8890. {
  8891. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C,
  8892. (uint8_t *)&ctrl3_c, 1);
  8893. switch ((i3c_bus_avb.i3c_bus_avb_sel << 4) &
  8894. (ctrl9_xl.i3c_disable << 2) &
  8895. (ctrl4_c.i2c_disable << 1) & ctrl3_c.sim)
  8896. {
  8897. case LSM6DSO_SEL_BY_HW:
  8898. val->ui_bus_md = LSM6DSO_SEL_BY_HW;
  8899. break;
  8900. case LSM6DSO_SPI_4W:
  8901. val->ui_bus_md = LSM6DSO_SPI_4W;
  8902. break;
  8903. case LSM6DSO_SPI_3W:
  8904. val->ui_bus_md = LSM6DSO_SPI_3W;
  8905. break;
  8906. case LSM6DSO_I2C:
  8907. val->ui_bus_md = LSM6DSO_I2C;
  8908. break;
  8909. case LSM6DSO_I3C_T_50us:
  8910. val->ui_bus_md = LSM6DSO_I3C_T_50us;
  8911. break;
  8912. case LSM6DSO_I3C_T_2us:
  8913. val->ui_bus_md = LSM6DSO_I3C_T_2us;
  8914. break;
  8915. case LSM6DSO_I3C_T_1ms:
  8916. val->ui_bus_md = LSM6DSO_I3C_T_1ms;
  8917. break;
  8918. case LSM6DSO_I3C_T_25ms:
  8919. val->ui_bus_md = LSM6DSO_I3C_T_25ms;
  8920. break;
  8921. default:
  8922. val->ui_bus_md = LSM6DSO_SEL_BY_HW;
  8923. break;
  8924. }
  8925. }
  8926. }
  8927. return ret;
  8928. }
  8929. /**
  8930. * @brief Get the status of the device.[get]
  8931. *
  8932. * @param ctx communication interface handler. Use NULL to ignore
  8933. * this interface.(ptr)
  8934. * @param aux_ctx auxiliary communication interface handler. Use NULL
  8935. * to ignore this interface.(ptr)
  8936. * @param val the status of the device.(ptr)
  8937. * @retval interface status (MANDATORY: return 0 -> no Error)
  8938. *
  8939. */
  8940. int32_t lsm6dso_status_get(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  8941. lsm6dso_status_t *val)
  8942. {
  8943. lsm6dso_status_spiaux_t status_spiaux;
  8944. lsm6dso_status_reg_t status_reg;
  8945. lsm6dso_ctrl3_c_t ctrl3_c;
  8946. int32_t ret;
  8947. ret = 0;
  8948. if (aux_ctx != NULL)
  8949. {
  8950. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_STATUS_SPIAUX,
  8951. (uint8_t *)&status_spiaux, 1);
  8952. val->ois_drdy_xl = status_spiaux.xlda;
  8953. val->ois_drdy_g = status_spiaux.gda;
  8954. val->ois_gyro_settling = status_spiaux.gyro_settling;
  8955. }
  8956. if (ctx != NULL)
  8957. {
  8958. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  8959. val->sw_reset = ctrl3_c.sw_reset;
  8960. val->boot = ctrl3_c.boot;
  8961. if ((ret == 0) && (ctrl3_c.sw_reset == PROPERTY_DISABLE) &&
  8962. (ctrl3_c.boot == PROPERTY_DISABLE))
  8963. {
  8964. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG,
  8965. (uint8_t *)&status_reg, 1);
  8966. val->drdy_xl = status_reg.xlda;
  8967. val->drdy_g = status_reg.gda;
  8968. val->drdy_temp = status_reg.tda;
  8969. }
  8970. }
  8971. return ret;
  8972. }
  8973. /**
  8974. * @brief Electrical pin configuration.[set]
  8975. *
  8976. * @param ctx communication interface handler.(ptr)
  8977. * @param val the electrical settings for the configurable
  8978. * pins.
  8979. * @retval interface status (MANDATORY: return 0 -> no Error)
  8980. *
  8981. */
  8982. int32_t lsm6dso_pin_conf_set(stmdev_ctx_t *ctx,
  8983. lsm6dso_pin_conf_t val)
  8984. {
  8985. lsm6dso_i3c_bus_avb_t i3c_bus_avb;
  8986. lsm6dso_pin_ctrl_t pin_ctrl;
  8987. lsm6dso_ctrl3_c_t ctrl3_c;
  8988. int32_t ret;
  8989. ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
  8990. if (ret == 0)
  8991. {
  8992. pin_ctrl.ois_pu_dis = ~val.aux_sdo_ocs_pull_up;
  8993. pin_ctrl.sdo_pu_en = val.sdo_sa0_pull_up;
  8994. ret = lsm6dso_write_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
  8995. }
  8996. if (ret == 0)
  8997. {
  8998. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  8999. }
  9000. if (ret == 0)
  9001. {
  9002. ctrl3_c.pp_od = ~val.int1_int2_push_pull;
  9003. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  9004. }
  9005. if (ret == 0)
  9006. {
  9007. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  9008. (uint8_t *)&i3c_bus_avb, 1);
  9009. }
  9010. if (ret == 0)
  9011. {
  9012. i3c_bus_avb.pd_dis_int1 = ~val.int1_pull_down;
  9013. ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  9014. (uint8_t *)&i3c_bus_avb, 1);
  9015. }
  9016. return ret;
  9017. }
  9018. /**
  9019. * @brief Electrical pin configuration.[get]
  9020. *
  9021. * @param ctx communication interface handler.(ptr)
  9022. * @param val the electrical settings for the configurable
  9023. * pins.(ptr)
  9024. * @retval interface status (MANDATORY: return 0 -> no Error)
  9025. *
  9026. */
  9027. int32_t lsm6dso_pin_conf_get(stmdev_ctx_t *ctx,
  9028. lsm6dso_pin_conf_t *val)
  9029. {
  9030. lsm6dso_i3c_bus_avb_t i3c_bus_avb;
  9031. lsm6dso_pin_ctrl_t pin_ctrl;
  9032. lsm6dso_ctrl3_c_t ctrl3_c;
  9033. int32_t ret;
  9034. ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
  9035. if (ret == 0)
  9036. {
  9037. val->aux_sdo_ocs_pull_up = ~pin_ctrl.ois_pu_dis;
  9038. val->aux_sdo_ocs_pull_up = pin_ctrl.sdo_pu_en;
  9039. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  9040. }
  9041. if (ret == 0)
  9042. {
  9043. val->int1_int2_push_pull = ~ctrl3_c.pp_od;
  9044. ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
  9045. (uint8_t *)&i3c_bus_avb, 1);
  9046. }
  9047. if (ret == 0)
  9048. {
  9049. val->int1_pull_down = ~i3c_bus_avb.pd_dis_int1;
  9050. }
  9051. return ret;
  9052. }
  9053. /**
  9054. * @brief Interrupt pins hardware signal configuration.[set]
  9055. *
  9056. * @param ctx communication interface handler.(ptr)
  9057. * @param val the pins hardware signal settings.
  9058. * @retval interface status (MANDATORY: return 0 -> no Error)
  9059. *
  9060. */
  9061. int32_t lsm6dso_interrupt_mode_set(stmdev_ctx_t *ctx,
  9062. lsm6dso_int_mode_t val)
  9063. {
  9064. lsm6dso_tap_cfg0_t tap_cfg0;
  9065. lsm6dso_page_rw_t page_rw;
  9066. lsm6dso_ctrl3_c_t ctrl3_c;
  9067. int32_t ret;
  9068. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  9069. if (ret == 0)
  9070. {
  9071. ctrl3_c.h_lactive = val.active_low;
  9072. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  9073. }
  9074. if (ret == 0)
  9075. {
  9076. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *) &tap_cfg0, 1);
  9077. }
  9078. if (ret == 0)
  9079. {
  9080. tap_cfg0.lir = val.base_latched;
  9081. tap_cfg0.int_clr_on_read = val.base_latched | val.emb_latched;
  9082. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *) &tap_cfg0, 1);
  9083. }
  9084. if (ret == 0)
  9085. {
  9086. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  9087. }
  9088. if (ret == 0)
  9089. {
  9090. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  9091. }
  9092. if (ret == 0)
  9093. {
  9094. page_rw.emb_func_lir = val.emb_latched;
  9095. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  9096. }
  9097. if (ret == 0)
  9098. {
  9099. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  9100. }
  9101. return ret;
  9102. }
  9103. /**
  9104. * @brief Interrupt pins hardware signal configuration.[get]
  9105. *
  9106. * @param ctx communication interface handler.(ptr)
  9107. * @param val the pins hardware signal settings.(ptr)
  9108. * @retval interface status (MANDATORY: return 0 -> no Error)
  9109. *
  9110. */
  9111. int32_t lsm6dso_interrupt_mode_get(stmdev_ctx_t *ctx,
  9112. lsm6dso_int_mode_t *val)
  9113. {
  9114. lsm6dso_tap_cfg0_t tap_cfg0;
  9115. lsm6dso_page_rw_t page_rw;
  9116. lsm6dso_ctrl3_c_t ctrl3_c;
  9117. int32_t ret;
  9118. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
  9119. if (ret == 0)
  9120. {
  9121. ctrl3_c.h_lactive = val->active_low;
  9122. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t *) &tap_cfg0, 1);
  9123. }
  9124. if (ret == 0)
  9125. {
  9126. tap_cfg0.lir = val->base_latched;
  9127. tap_cfg0.int_clr_on_read = val->base_latched | val->emb_latched;
  9128. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  9129. }
  9130. if (ret == 0)
  9131. {
  9132. ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  9133. }
  9134. if (ret == 0)
  9135. {
  9136. page_rw.emb_func_lir = val->emb_latched;
  9137. ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t *) &page_rw, 1);
  9138. }
  9139. if (ret == 0)
  9140. {
  9141. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  9142. }
  9143. return ret;
  9144. }
  9145. /**
  9146. * @brief Route interrupt signals on int1 pin.[set]
  9147. *
  9148. * @param ctx communication interface handler.(ptr)
  9149. * @param val the signals to route on int1 pin.
  9150. * @retval interface status (MANDATORY: return 0 -> no Error)
  9151. *
  9152. */
  9153. int32_t lsm6dso_pin_int1_route_set(stmdev_ctx_t *ctx,
  9154. lsm6dso_pin_int1_route_t val)
  9155. {
  9156. lsm6dso_pin_int2_route_t pin_int2_route;
  9157. lsm6dso_emb_func_int1_t emb_func_int1;
  9158. lsm6dso_fsm_int1_a_t fsm_int1_a;
  9159. lsm6dso_fsm_int1_b_t fsm_int1_b;
  9160. lsm6dso_int1_ctrl_t int1_ctrl;
  9161. lsm6dso_int2_ctrl_t int2_ctrl;
  9162. lsm6dso_tap_cfg2_t tap_cfg2;
  9163. lsm6dso_md2_cfg_t md2_cfg;
  9164. lsm6dso_md1_cfg_t md1_cfg;
  9165. lsm6dso_ctrl4_c_t ctrl4_c;
  9166. int32_t ret;
  9167. int1_ctrl.int1_drdy_xl = val.drdy_xl;
  9168. int1_ctrl.int1_drdy_g = val.drdy_g;
  9169. int1_ctrl.int1_boot = val.boot;
  9170. int1_ctrl.int1_fifo_th = val.fifo_th;
  9171. int1_ctrl.int1_fifo_ovr = val.fifo_ovr;
  9172. int1_ctrl.int1_fifo_full = val.fifo_full;
  9173. int1_ctrl.int1_cnt_bdr = val.fifo_bdr;
  9174. int1_ctrl.den_drdy_flag = val.den_flag;
  9175. md1_cfg.int1_shub = val.sh_endop;
  9176. md1_cfg.int1_6d = val.six_d;
  9177. md1_cfg.int1_double_tap = val.double_tap;
  9178. md1_cfg.int1_ff = val.free_fall;
  9179. md1_cfg.int1_wu = val.wake_up;
  9180. md1_cfg.int1_single_tap = val.single_tap;
  9181. md1_cfg.int1_sleep_change = val.sleep_change;
  9182. emb_func_int1.not_used_01 = 0;
  9183. emb_func_int1.int1_step_detector = val.step_detector;
  9184. emb_func_int1.int1_tilt = val.tilt;
  9185. emb_func_int1.int1_sig_mot = val.sig_mot;
  9186. emb_func_int1.not_used_02 = 0;
  9187. emb_func_int1.int1_fsm_lc = val.fsm_lc;
  9188. fsm_int1_a.int1_fsm1 = val.fsm1;
  9189. fsm_int1_a.int1_fsm2 = val.fsm2;
  9190. fsm_int1_a.int1_fsm3 = val.fsm3;
  9191. fsm_int1_a.int1_fsm4 = val.fsm4;
  9192. fsm_int1_a.int1_fsm5 = val.fsm5;
  9193. fsm_int1_a.int1_fsm6 = val.fsm6;
  9194. fsm_int1_a.int1_fsm7 = val.fsm7;
  9195. fsm_int1_a.int1_fsm8 = val.fsm8;
  9196. fsm_int1_b.int1_fsm9 = val.fsm9 ;
  9197. fsm_int1_b.int1_fsm10 = val.fsm10;
  9198. fsm_int1_b.int1_fsm11 = val.fsm11;
  9199. fsm_int1_b.int1_fsm12 = val.fsm12;
  9200. fsm_int1_b.int1_fsm13 = val.fsm13;
  9201. fsm_int1_b.int1_fsm14 = val.fsm14;
  9202. fsm_int1_b.int1_fsm15 = val.fsm15;
  9203. fsm_int1_b.int1_fsm16 = val.fsm16;
  9204. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
  9205. if (ret == 0)
  9206. {
  9207. if ((val.drdy_temp | val.timestamp) != PROPERTY_DISABLE)
  9208. {
  9209. ctrl4_c.int2_on_int1 = PROPERTY_ENABLE;
  9210. }
  9211. else
  9212. {
  9213. ctrl4_c.int2_on_int1 = PROPERTY_DISABLE;
  9214. }
  9215. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
  9216. }
  9217. if (ret == 0)
  9218. {
  9219. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  9220. }
  9221. if (ret == 0)
  9222. {
  9223. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INT1,
  9224. (uint8_t *)&emb_func_int1, 1);
  9225. }
  9226. if (ret == 0)
  9227. {
  9228. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT1_A,
  9229. (uint8_t *)&fsm_int1_a, 1);
  9230. }
  9231. if (ret == 0)
  9232. {
  9233. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT1_B,
  9234. (uint8_t *)&fsm_int1_b, 1);
  9235. }
  9236. if (ret == 0)
  9237. {
  9238. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  9239. }
  9240. if (ret == 0)
  9241. {
  9242. if ((emb_func_int1.int1_fsm_lc
  9243. | emb_func_int1.int1_sig_mot
  9244. | emb_func_int1.int1_step_detector
  9245. | emb_func_int1.int1_tilt
  9246. | fsm_int1_a.int1_fsm1
  9247. | fsm_int1_a.int1_fsm2
  9248. | fsm_int1_a.int1_fsm3
  9249. | fsm_int1_a.int1_fsm4
  9250. | fsm_int1_a.int1_fsm5
  9251. | fsm_int1_a.int1_fsm6
  9252. | fsm_int1_a.int1_fsm7
  9253. | fsm_int1_a.int1_fsm8
  9254. | fsm_int1_b.int1_fsm9
  9255. | fsm_int1_b.int1_fsm10
  9256. | fsm_int1_b.int1_fsm11
  9257. | fsm_int1_b.int1_fsm12
  9258. | fsm_int1_b.int1_fsm13
  9259. | fsm_int1_b.int1_fsm14
  9260. | fsm_int1_b.int1_fsm15
  9261. | fsm_int1_b.int1_fsm16) != PROPERTY_DISABLE)
  9262. {
  9263. md1_cfg.int1_emb_func = PROPERTY_ENABLE;
  9264. }
  9265. else
  9266. {
  9267. md1_cfg.int1_emb_func = PROPERTY_DISABLE;
  9268. }
  9269. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT1_CTRL,
  9270. (uint8_t *)&int1_ctrl, 1);
  9271. }
  9272. if (ret == 0)
  9273. {
  9274. ret = lsm6dso_write_reg(ctx, LSM6DSO_MD1_CFG, (uint8_t *)&md1_cfg, 1);
  9275. }
  9276. if (ret == 0)
  9277. {
  9278. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
  9279. }
  9280. if (ret == 0)
  9281. {
  9282. int2_ctrl.int2_drdy_temp = val.drdy_temp;
  9283. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
  9284. }
  9285. if (ret == 0)
  9286. {
  9287. ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t *)&md2_cfg, 1);
  9288. }
  9289. if (ret == 0)
  9290. {
  9291. md2_cfg.int2_timestamp = val.timestamp;
  9292. ret = lsm6dso_write_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t *)&md2_cfg, 1);
  9293. }
  9294. if (ret == 0)
  9295. {
  9296. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *) &tap_cfg2, 1);
  9297. }
  9298. if (ret == 0)
  9299. {
  9300. ret = lsm6dso_pin_int2_route_get(ctx, NULL, &pin_int2_route);
  9301. }
  9302. if (ret == 0)
  9303. {
  9304. if ((pin_int2_route.fifo_bdr
  9305. | pin_int2_route.drdy_g
  9306. | pin_int2_route.drdy_temp
  9307. | pin_int2_route.drdy_xl
  9308. | pin_int2_route.fifo_full
  9309. | pin_int2_route.fifo_ovr
  9310. | pin_int2_route.fifo_th
  9311. | pin_int2_route.six_d
  9312. | pin_int2_route.double_tap
  9313. | pin_int2_route.free_fall
  9314. | pin_int2_route.wake_up
  9315. | pin_int2_route.single_tap
  9316. | pin_int2_route.sleep_change
  9317. | int1_ctrl.den_drdy_flag
  9318. | int1_ctrl.int1_boot
  9319. | int1_ctrl.int1_cnt_bdr
  9320. | int1_ctrl.int1_drdy_g
  9321. | int1_ctrl.int1_drdy_xl
  9322. | int1_ctrl.int1_fifo_full
  9323. | int1_ctrl.int1_fifo_ovr
  9324. | int1_ctrl.int1_fifo_th
  9325. | md1_cfg.int1_shub
  9326. | md1_cfg.int1_6d
  9327. | md1_cfg.int1_double_tap
  9328. | md1_cfg.int1_ff
  9329. | md1_cfg.int1_wu
  9330. | md1_cfg.int1_single_tap
  9331. | md1_cfg.int1_sleep_change) != PROPERTY_DISABLE)
  9332. {
  9333. tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
  9334. }
  9335. else
  9336. {
  9337. tap_cfg2.interrupts_enable = PROPERTY_DISABLE;
  9338. }
  9339. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *) &tap_cfg2, 1);
  9340. }
  9341. return ret;
  9342. }
  9343. /**
  9344. * @brief Route interrupt signals on int1 pin.[get]
  9345. *
  9346. * @param ctx communication interface handler.(ptr)
  9347. * @param val the signals that are routed on int1 pin.(ptr)
  9348. * @retval interface status (MANDATORY: return 0 -> no Error)
  9349. *
  9350. */
  9351. int32_t lsm6dso_pin_int1_route_get(stmdev_ctx_t *ctx,
  9352. lsm6dso_pin_int1_route_t *val)
  9353. {
  9354. lsm6dso_emb_func_int1_t emb_func_int1;
  9355. lsm6dso_fsm_int1_a_t fsm_int1_a;
  9356. lsm6dso_fsm_int1_b_t fsm_int1_b;
  9357. lsm6dso_int1_ctrl_t int1_ctrl;
  9358. lsm6dso_int2_ctrl_t int2_ctrl;
  9359. lsm6dso_md2_cfg_t md2_cfg;
  9360. lsm6dso_md1_cfg_t md1_cfg;
  9361. lsm6dso_ctrl4_c_t ctrl4_c;
  9362. int32_t ret;
  9363. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  9364. if (ret == 0)
  9365. {
  9366. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INT1,
  9367. (uint8_t *)&emb_func_int1, 1);
  9368. }
  9369. if (ret == 0)
  9370. {
  9371. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT1_A,
  9372. (uint8_t *)&fsm_int1_a, 1);
  9373. }
  9374. if (ret == 0)
  9375. {
  9376. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT1_B,
  9377. (uint8_t *)&fsm_int1_b, 1);
  9378. }
  9379. if (ret == 0)
  9380. {
  9381. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  9382. }
  9383. if (ret == 0)
  9384. {
  9385. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT1_CTRL,
  9386. (uint8_t *)&int1_ctrl, 1);
  9387. }
  9388. if (ret == 0)
  9389. {
  9390. ret = lsm6dso_read_reg(ctx, LSM6DSO_MD1_CFG, (uint8_t *)&md1_cfg, 1);
  9391. }
  9392. if (ret == 0)
  9393. {
  9394. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
  9395. }
  9396. if (ctrl4_c.int2_on_int1 == PROPERTY_ENABLE)
  9397. {
  9398. if (ret == 0)
  9399. {
  9400. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
  9401. val->drdy_temp = int2_ctrl.int2_drdy_temp;
  9402. }
  9403. if (ret == 0)
  9404. {
  9405. ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t *)&md2_cfg, 1);
  9406. val->timestamp = md2_cfg.int2_timestamp;
  9407. }
  9408. }
  9409. else
  9410. {
  9411. val->drdy_temp = PROPERTY_DISABLE;
  9412. val->timestamp = PROPERTY_DISABLE;
  9413. }
  9414. val->drdy_xl = int1_ctrl.int1_drdy_xl;
  9415. val->drdy_g = int1_ctrl.int1_drdy_g;
  9416. val->boot = int1_ctrl.int1_boot;
  9417. val->fifo_th = int1_ctrl.int1_fifo_th;
  9418. val->fifo_ovr = int1_ctrl.int1_fifo_ovr;
  9419. val->fifo_full = int1_ctrl.int1_fifo_full;
  9420. val->fifo_bdr = int1_ctrl.int1_cnt_bdr;
  9421. val->den_flag = int1_ctrl.den_drdy_flag;
  9422. val->sh_endop = md1_cfg.int1_shub;
  9423. val->six_d = md1_cfg.int1_6d;
  9424. val->double_tap = md1_cfg.int1_double_tap;
  9425. val->free_fall = md1_cfg.int1_ff;
  9426. val->wake_up = md1_cfg.int1_wu;
  9427. val->single_tap = md1_cfg.int1_single_tap;
  9428. val->sleep_change = md1_cfg.int1_sleep_change;
  9429. val->step_detector = emb_func_int1.int1_step_detector;
  9430. val->tilt = emb_func_int1.int1_tilt;
  9431. val->sig_mot = emb_func_int1.int1_sig_mot;
  9432. val->fsm_lc = emb_func_int1.int1_fsm_lc;
  9433. val->fsm1 = fsm_int1_a.int1_fsm1;
  9434. val->fsm2 = fsm_int1_a.int1_fsm2;
  9435. val->fsm3 = fsm_int1_a.int1_fsm3;
  9436. val->fsm4 = fsm_int1_a.int1_fsm4;
  9437. val->fsm5 = fsm_int1_a.int1_fsm5;
  9438. val->fsm6 = fsm_int1_a.int1_fsm6;
  9439. val->fsm7 = fsm_int1_a.int1_fsm7;
  9440. val->fsm8 = fsm_int1_a.int1_fsm8;
  9441. val->fsm9 = fsm_int1_b.int1_fsm9;
  9442. val->fsm10 = fsm_int1_b.int1_fsm10;
  9443. val->fsm11 = fsm_int1_b.int1_fsm11;
  9444. val->fsm12 = fsm_int1_b.int1_fsm12;
  9445. val->fsm13 = fsm_int1_b.int1_fsm13;
  9446. val->fsm14 = fsm_int1_b.int1_fsm14;
  9447. val->fsm15 = fsm_int1_b.int1_fsm15;
  9448. val->fsm16 = fsm_int1_b.int1_fsm16;
  9449. return ret;
  9450. }
  9451. /**
  9452. * @brief Route interrupt signals on int2 pin.[set]
  9453. *
  9454. * @param ctx communication interface handler. Use NULL to ignore
  9455. * this interface.(ptr)
  9456. * @param aux_ctx auxiliary communication interface handler. Use NULL
  9457. * to ignore this interface.(ptr)
  9458. * @param val the signals to route on int2 pin.
  9459. * @retval interface status (MANDATORY: return 0 -> no Error)
  9460. *
  9461. */
  9462. int32_t lsm6dso_pin_int2_route_set(stmdev_ctx_t *ctx,
  9463. stmdev_ctx_t *aux_ctx,
  9464. lsm6dso_pin_int2_route_t val)
  9465. {
  9466. lsm6dso_pin_int1_route_t pin_int1_route;
  9467. lsm6dso_emb_func_int2_t emb_func_int2;
  9468. lsm6dso_fsm_int2_a_t fsm_int2_a;
  9469. lsm6dso_fsm_int2_b_t fsm_int2_b;
  9470. lsm6dso_int2_ctrl_t int2_ctrl;
  9471. lsm6dso_tap_cfg2_t tap_cfg2;
  9472. lsm6dso_md2_cfg_t md2_cfg;
  9473. lsm6dso_ctrl4_c_t ctrl4_c;
  9474. lsm6dso_int_ois_t int_ois;
  9475. int32_t ret;
  9476. ret = 0;
  9477. if (aux_ctx != NULL)
  9478. {
  9479. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_INT_OIS,
  9480. (uint8_t *)&int_ois, 1);
  9481. if (ret == 0)
  9482. {
  9483. int_ois.int2_drdy_ois = val.drdy_ois;
  9484. ret = lsm6dso_write_reg(aux_ctx, LSM6DSO_INT_OIS,
  9485. (uint8_t *)&int_ois, 1);
  9486. }
  9487. }
  9488. if (ctx != NULL)
  9489. {
  9490. int2_ctrl.int2_drdy_xl = val.drdy_xl;
  9491. int2_ctrl.int2_drdy_g = val.drdy_g;
  9492. int2_ctrl.int2_drdy_temp = val.drdy_temp;
  9493. int2_ctrl.int2_fifo_th = val.fifo_th;
  9494. int2_ctrl.int2_fifo_ovr = val.fifo_ovr;
  9495. int2_ctrl.int2_fifo_full = val.fifo_full;
  9496. int2_ctrl.int2_cnt_bdr = val.fifo_bdr;
  9497. int2_ctrl.not_used_01 = 0;
  9498. md2_cfg.int2_timestamp = val.timestamp;
  9499. md2_cfg.int2_6d = val.six_d;
  9500. md2_cfg.int2_double_tap = val.double_tap;
  9501. md2_cfg.int2_ff = val.free_fall;
  9502. md2_cfg.int2_wu = val.wake_up;
  9503. md2_cfg.int2_single_tap = val.single_tap;
  9504. md2_cfg.int2_sleep_change = val.sleep_change;
  9505. emb_func_int2.not_used_01 = 0;
  9506. emb_func_int2. int2_step_detector = val.step_detector;
  9507. emb_func_int2.int2_tilt = val.tilt;
  9508. emb_func_int2.int2_sig_mot = val.sig_mot;
  9509. emb_func_int2.not_used_02 = 0;
  9510. emb_func_int2.int2_fsm_lc = val.fsm_lc;
  9511. fsm_int2_a.int2_fsm1 = val.fsm1;
  9512. fsm_int2_a.int2_fsm2 = val.fsm2;
  9513. fsm_int2_a.int2_fsm3 = val.fsm3;
  9514. fsm_int2_a.int2_fsm4 = val.fsm4;
  9515. fsm_int2_a.int2_fsm5 = val.fsm5;
  9516. fsm_int2_a.int2_fsm6 = val.fsm6;
  9517. fsm_int2_a.int2_fsm7 = val.fsm7;
  9518. fsm_int2_a.int2_fsm8 = val.fsm8;
  9519. fsm_int2_b.int2_fsm9 = val.fsm9 ;
  9520. fsm_int2_b.int2_fsm10 = val.fsm10;
  9521. fsm_int2_b.int2_fsm11 = val.fsm11;
  9522. fsm_int2_b.int2_fsm12 = val.fsm12;
  9523. fsm_int2_b.int2_fsm13 = val.fsm13;
  9524. fsm_int2_b.int2_fsm14 = val.fsm14;
  9525. fsm_int2_b.int2_fsm15 = val.fsm15;
  9526. fsm_int2_b.int2_fsm16 = val.fsm16;
  9527. if (ret == 0)
  9528. {
  9529. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
  9530. if (ret == 0)
  9531. {
  9532. if ((val.drdy_temp | val.timestamp) != PROPERTY_DISABLE)
  9533. {
  9534. ctrl4_c.int2_on_int1 = PROPERTY_DISABLE;
  9535. }
  9536. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
  9537. }
  9538. }
  9539. if (ret == 0)
  9540. {
  9541. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  9542. }
  9543. if (ret == 0)
  9544. {
  9545. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INT2,
  9546. (uint8_t *)&emb_func_int2, 1);
  9547. }
  9548. if (ret == 0)
  9549. {
  9550. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT2_A,
  9551. (uint8_t *)&fsm_int2_a, 1);
  9552. }
  9553. if (ret == 0)
  9554. {
  9555. ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT2_B,
  9556. (uint8_t *)&fsm_int2_b, 1);
  9557. }
  9558. if (ret == 0)
  9559. {
  9560. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  9561. }
  9562. if (ret == 0)
  9563. {
  9564. if ((emb_func_int2.int2_fsm_lc
  9565. | emb_func_int2.int2_sig_mot
  9566. | emb_func_int2.int2_step_detector
  9567. | emb_func_int2.int2_tilt
  9568. | fsm_int2_a.int2_fsm1
  9569. | fsm_int2_a.int2_fsm2
  9570. | fsm_int2_a.int2_fsm3
  9571. | fsm_int2_a.int2_fsm4
  9572. | fsm_int2_a.int2_fsm5
  9573. | fsm_int2_a.int2_fsm6
  9574. | fsm_int2_a.int2_fsm7
  9575. | fsm_int2_a.int2_fsm8
  9576. | fsm_int2_b.int2_fsm9
  9577. | fsm_int2_b.int2_fsm10
  9578. | fsm_int2_b.int2_fsm11
  9579. | fsm_int2_b.int2_fsm12
  9580. | fsm_int2_b.int2_fsm13
  9581. | fsm_int2_b.int2_fsm14
  9582. | fsm_int2_b.int2_fsm15
  9583. | fsm_int2_b.int2_fsm16) != PROPERTY_DISABLE)
  9584. {
  9585. md2_cfg.int2_emb_func = PROPERTY_ENABLE;
  9586. }
  9587. else
  9588. {
  9589. md2_cfg.int2_emb_func = PROPERTY_DISABLE;
  9590. }
  9591. ret = lsm6dso_write_reg(ctx, LSM6DSO_INT2_CTRL,
  9592. (uint8_t *)&int2_ctrl, 1);
  9593. }
  9594. if (ret == 0)
  9595. {
  9596. ret = lsm6dso_write_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t *)&md2_cfg, 1);
  9597. }
  9598. if (ret == 0)
  9599. {
  9600. ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *) &tap_cfg2, 1);
  9601. }
  9602. if (ret == 0)
  9603. {
  9604. ret = lsm6dso_pin_int1_route_get(ctx, &pin_int1_route);
  9605. }
  9606. if (ret == 0)
  9607. {
  9608. if ((val.fifo_bdr
  9609. | val.drdy_g
  9610. | val.drdy_temp
  9611. | val.drdy_xl
  9612. | val.fifo_full
  9613. | val.fifo_ovr
  9614. | val.fifo_th
  9615. | val.six_d
  9616. | val.double_tap
  9617. | val.free_fall
  9618. | val.wake_up
  9619. | val.single_tap
  9620. | val.sleep_change
  9621. | pin_int1_route.den_flag
  9622. | pin_int1_route.boot
  9623. | pin_int1_route.fifo_bdr
  9624. | pin_int1_route.drdy_g
  9625. | pin_int1_route.drdy_xl
  9626. | pin_int1_route.fifo_full
  9627. | pin_int1_route.fifo_ovr
  9628. | pin_int1_route.fifo_th
  9629. | pin_int1_route.six_d
  9630. | pin_int1_route.double_tap
  9631. | pin_int1_route.free_fall
  9632. | pin_int1_route.wake_up
  9633. | pin_int1_route.single_tap
  9634. | pin_int1_route.sleep_change) != PROPERTY_DISABLE)
  9635. {
  9636. tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
  9637. }
  9638. else
  9639. {
  9640. tap_cfg2.interrupts_enable = PROPERTY_DISABLE;
  9641. }
  9642. ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t *) &tap_cfg2, 1);
  9643. }
  9644. }
  9645. return ret;
  9646. }
  9647. /**
  9648. * @brief Route interrupt signals on int2 pin.[get]
  9649. *
  9650. * @param ctx communication interface handler. Use NULL to ignore
  9651. * this interface.(ptr)
  9652. * @param aux_ctx auxiliary communication interface handler. Use NULL
  9653. * to ignore this interface.(ptr)
  9654. * @param val the signals that are routed on int2 pin.(ptr)
  9655. * @retval interface status (MANDATORY: return 0 -> no Error)
  9656. *
  9657. */
  9658. int32_t lsm6dso_pin_int2_route_get(stmdev_ctx_t *ctx,
  9659. stmdev_ctx_t *aux_ctx,
  9660. lsm6dso_pin_int2_route_t *val)
  9661. {
  9662. lsm6dso_emb_func_int2_t emb_func_int2;
  9663. lsm6dso_fsm_int2_a_t fsm_int2_a;
  9664. lsm6dso_fsm_int2_b_t fsm_int2_b;
  9665. lsm6dso_int2_ctrl_t int2_ctrl;
  9666. lsm6dso_md2_cfg_t md2_cfg;
  9667. lsm6dso_ctrl4_c_t ctrl4_c;
  9668. lsm6dso_int_ois_t int_ois;
  9669. int32_t ret;
  9670. ret = 0;
  9671. if (aux_ctx != NULL)
  9672. {
  9673. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_INT_OIS,
  9674. (uint8_t *)&int_ois, 1);
  9675. val->drdy_ois = int_ois.int2_drdy_ois;
  9676. }
  9677. if (ctx != NULL)
  9678. {
  9679. if (ret == 0)
  9680. {
  9681. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  9682. }
  9683. if (ret == 0)
  9684. {
  9685. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INT2,
  9686. (uint8_t *)&emb_func_int2, 1);
  9687. }
  9688. if (ret == 0)
  9689. {
  9690. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT2_A,
  9691. (uint8_t *)&fsm_int2_a, 1);
  9692. }
  9693. if (ret == 0)
  9694. {
  9695. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT2_B,
  9696. (uint8_t *)&fsm_int2_b, 1);
  9697. }
  9698. if (ret == 0)
  9699. {
  9700. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  9701. }
  9702. if (ret == 0)
  9703. {
  9704. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL,
  9705. (uint8_t *)&int2_ctrl, 1);
  9706. }
  9707. if (ret == 0)
  9708. {
  9709. ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG,
  9710. (uint8_t *)&md2_cfg, 1);
  9711. }
  9712. if (ret == 0)
  9713. {
  9714. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
  9715. }
  9716. if (ctrl4_c.int2_on_int1 == PROPERTY_DISABLE)
  9717. {
  9718. if (ret == 0)
  9719. {
  9720. ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL,
  9721. (uint8_t *)&int2_ctrl, 1);
  9722. val->drdy_temp = int2_ctrl.int2_drdy_temp;
  9723. }
  9724. if (ret == 0)
  9725. {
  9726. ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t *)&md2_cfg, 1);
  9727. val->timestamp = md2_cfg.int2_timestamp;
  9728. }
  9729. }
  9730. else
  9731. {
  9732. val->drdy_temp = PROPERTY_DISABLE;
  9733. val->timestamp = PROPERTY_DISABLE;
  9734. }
  9735. val->drdy_xl = int2_ctrl.int2_drdy_xl;
  9736. val->drdy_g = int2_ctrl.int2_drdy_g;
  9737. val->drdy_temp = int2_ctrl.int2_drdy_temp;
  9738. val->fifo_th = int2_ctrl.int2_fifo_th;
  9739. val->fifo_ovr = int2_ctrl.int2_fifo_ovr;
  9740. val->fifo_full = int2_ctrl.int2_fifo_full;
  9741. val->fifo_bdr = int2_ctrl.int2_cnt_bdr;
  9742. val->timestamp = md2_cfg.int2_timestamp;
  9743. val->six_d = md2_cfg.int2_6d;
  9744. val->double_tap = md2_cfg.int2_double_tap;
  9745. val->free_fall = md2_cfg.int2_ff;
  9746. val->wake_up = md2_cfg.int2_wu;
  9747. val->single_tap = md2_cfg.int2_single_tap;
  9748. val->sleep_change = md2_cfg.int2_sleep_change;
  9749. val->step_detector = emb_func_int2. int2_step_detector;
  9750. val->tilt = emb_func_int2.int2_tilt;
  9751. val->fsm_lc = emb_func_int2.int2_fsm_lc;
  9752. val->fsm1 = fsm_int2_a.int2_fsm1;
  9753. val->fsm2 = fsm_int2_a.int2_fsm2;
  9754. val->fsm3 = fsm_int2_a.int2_fsm3;
  9755. val->fsm4 = fsm_int2_a.int2_fsm4;
  9756. val->fsm5 = fsm_int2_a.int2_fsm5;
  9757. val->fsm6 = fsm_int2_a.int2_fsm6;
  9758. val->fsm7 = fsm_int2_a.int2_fsm7;
  9759. val->fsm8 = fsm_int2_a.int2_fsm8;
  9760. val->fsm9 = fsm_int2_b.int2_fsm9;
  9761. val->fsm10 = fsm_int2_b.int2_fsm10;
  9762. val->fsm11 = fsm_int2_b.int2_fsm11;
  9763. val->fsm12 = fsm_int2_b.int2_fsm12;
  9764. val->fsm13 = fsm_int2_b.int2_fsm13;
  9765. val->fsm14 = fsm_int2_b.int2_fsm14;
  9766. val->fsm15 = fsm_int2_b.int2_fsm15;
  9767. val->fsm16 = fsm_int2_b.int2_fsm16;
  9768. }
  9769. return ret;
  9770. }
  9771. /**
  9772. * @brief Get the status of all the interrupt sources.[get]
  9773. *
  9774. * @param ctx communication interface handler.(ptr)
  9775. * @param val the status of all the interrupt sources.(ptr)
  9776. * @retval interface status (MANDATORY: return 0 -> no Error)
  9777. *
  9778. */
  9779. int32_t lsm6dso_all_sources_get(stmdev_ctx_t *ctx,
  9780. lsm6dso_all_sources_t *val)
  9781. {
  9782. lsm6dso_emb_func_status_mainpage_t emb_func_status_mainpage;
  9783. lsm6dso_status_master_mainpage_t status_master_mainpage;
  9784. lsm6dso_fsm_status_a_mainpage_t fsm_status_a_mainpage;
  9785. lsm6dso_fsm_status_b_mainpage_t fsm_status_b_mainpage;
  9786. lsm6dso_fifo_status1_t fifo_status1;
  9787. lsm6dso_fifo_status2_t fifo_status2;
  9788. lsm6dso_all_int_src_t all_int_src;
  9789. lsm6dso_wake_up_src_t wake_up_src;
  9790. lsm6dso_status_reg_t status_reg;
  9791. lsm6dso_tap_src_t tap_src;
  9792. lsm6dso_d6d_src_t d6d_src;
  9793. uint8_t reg[5];
  9794. int32_t ret;
  9795. ret = lsm6dso_read_reg(ctx, LSM6DSO_ALL_INT_SRC, reg, 5);
  9796. if (ret == 0)
  9797. {
  9798. bytecpy((uint8_t *)&all_int_src, &reg[0]);
  9799. bytecpy((uint8_t *)&wake_up_src, &reg[1]);
  9800. bytecpy((uint8_t *)&tap_src, &reg[2]);
  9801. bytecpy((uint8_t *)&d6d_src, &reg[3]);
  9802. bytecpy((uint8_t *)&status_reg, &reg[4]);
  9803. val->timestamp = all_int_src.timestamp_endcount;
  9804. val->wake_up_z = wake_up_src.z_wu;
  9805. val->wake_up_y = wake_up_src.y_wu;
  9806. val->wake_up_x = wake_up_src.x_wu;
  9807. val->wake_up = wake_up_src.wu_ia;
  9808. val->sleep_state = wake_up_src.sleep_state;
  9809. val->free_fall = wake_up_src.ff_ia;
  9810. val->sleep_change = wake_up_src.sleep_change_ia;
  9811. val->tap_x = tap_src.x_tap;
  9812. val->tap_y = tap_src.y_tap;
  9813. val->tap_z = tap_src.z_tap;
  9814. val->tap_sign = tap_src.tap_sign;
  9815. val->double_tap = tap_src.double_tap;
  9816. val->single_tap = tap_src.single_tap;
  9817. val->six_d_xl = d6d_src.xl;
  9818. val->six_d_xh = d6d_src.xh;
  9819. val->six_d_yl = d6d_src.yl;
  9820. val->six_d_yh = d6d_src.yh;
  9821. val->six_d_zl = d6d_src.zl;
  9822. val->six_d_zh = d6d_src.zh;
  9823. val->six_d = d6d_src.d6d_ia;
  9824. val->den_flag = d6d_src.den_drdy;
  9825. val->drdy_xl = status_reg.xlda;
  9826. val->drdy_g = status_reg.gda;
  9827. val->drdy_temp = status_reg.tda;
  9828. }
  9829. if (ret == 0)
  9830. {
  9831. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS_MAINPAGE, reg, 3);
  9832. }
  9833. if (ret == 0)
  9834. {
  9835. bytecpy((uint8_t *)&emb_func_status_mainpage, &reg[0]);
  9836. bytecpy((uint8_t *)&fsm_status_a_mainpage, &reg[1]);
  9837. bytecpy((uint8_t *)&fsm_status_b_mainpage, &reg[2]);
  9838. val->step_detector = emb_func_status_mainpage.is_step_det;
  9839. val->tilt = emb_func_status_mainpage.is_tilt;
  9840. val->sig_mot = emb_func_status_mainpage.is_sigmot;
  9841. val->fsm_lc = emb_func_status_mainpage.is_fsm_lc;
  9842. val->fsm1 = fsm_status_a_mainpage.is_fsm1;
  9843. val->fsm2 = fsm_status_a_mainpage.is_fsm2;
  9844. val->fsm3 = fsm_status_a_mainpage.is_fsm3;
  9845. val->fsm4 = fsm_status_a_mainpage.is_fsm4;
  9846. val->fsm5 = fsm_status_a_mainpage.is_fsm5;
  9847. val->fsm6 = fsm_status_a_mainpage.is_fsm6;
  9848. val->fsm7 = fsm_status_a_mainpage.is_fsm7;
  9849. val->fsm8 = fsm_status_a_mainpage.is_fsm8;
  9850. val->fsm9 = fsm_status_b_mainpage.is_fsm9;
  9851. val->fsm10 = fsm_status_b_mainpage.is_fsm10;
  9852. val->fsm11 = fsm_status_b_mainpage.is_fsm11;
  9853. val->fsm12 = fsm_status_b_mainpage.is_fsm12;
  9854. val->fsm13 = fsm_status_b_mainpage.is_fsm13;
  9855. val->fsm14 = fsm_status_b_mainpage.is_fsm14;
  9856. val->fsm15 = fsm_status_b_mainpage.is_fsm15;
  9857. val->fsm16 = fsm_status_b_mainpage.is_fsm16;
  9858. }
  9859. if (ret == 0)
  9860. {
  9861. ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_MASTER_MAINPAGE, reg, 3);
  9862. }
  9863. if (ret == 0)
  9864. {
  9865. bytecpy((uint8_t *)&status_master_mainpage, &reg[0]);
  9866. bytecpy((uint8_t *)&fifo_status1, &reg[1]);
  9867. bytecpy((uint8_t *)&fifo_status2, &reg[2]);
  9868. val->sh_endop = status_master_mainpage.sens_hub_endop;
  9869. val->sh_slave0_nack = status_master_mainpage.slave0_nack;
  9870. val->sh_slave1_nack = status_master_mainpage.slave1_nack;
  9871. val->sh_slave2_nack = status_master_mainpage.slave2_nack;
  9872. val->sh_slave3_nack = status_master_mainpage.slave3_nack;
  9873. val->sh_wr_once = status_master_mainpage.wr_once_done;
  9874. val->fifo_diff = (256U * fifo_status2.diff_fifo) +
  9875. fifo_status1.diff_fifo;
  9876. val->fifo_ovr_latched = fifo_status2.over_run_latched;
  9877. val->fifo_bdr = fifo_status2.counter_bdr_ia;
  9878. val->fifo_full = fifo_status2.fifo_full_ia;
  9879. val->fifo_ovr = fifo_status2.fifo_ovr_ia;
  9880. val->fifo_th = fifo_status2.fifo_wtm_ia;
  9881. }
  9882. return ret;
  9883. }
  9884. /**
  9885. * @brief Sensor conversion parameters selection.[set]
  9886. *
  9887. * @param ctx communication interface handler. Use NULL to ignore
  9888. * this interface.(ptr)
  9889. * @param aux_ctx auxiliary communication interface handler. Use NULL
  9890. * to ignore this interface.(ptr)
  9891. * @param val set the sensor conversion parameters by checking
  9892. * the constraints of the device.(ptr)
  9893. * @retval interface status (MANDATORY: return 0 -> no Error)
  9894. *
  9895. */
  9896. int32_t lsm6dso_mode_set(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  9897. lsm6dso_md_t *val)
  9898. {
  9899. lsm6dso_func_cfg_access_t func_cfg_access;
  9900. lsm6dso_ctrl1_ois_t ctrl1_ois;
  9901. lsm6dso_ctrl2_ois_t ctrl2_ois;
  9902. lsm6dso_ctrl3_ois_t ctrl3_ois;
  9903. lsm6dso_ctrl1_xl_t ctrl1_xl;
  9904. lsm6dso_ctrl8_xl_t ctrl8_xl;
  9905. lsm6dso_ctrl2_g_t ctrl2_g;
  9906. lsm6dso_ctrl3_c_t ctrl3_c;
  9907. lsm6dso_ctrl4_c_t ctrl4_c;
  9908. lsm6dso_ctrl5_c_t ctrl5_c;
  9909. lsm6dso_ctrl6_c_t ctrl6_c;
  9910. lsm6dso_ctrl7_g_t ctrl7_g;
  9911. uint8_t xl_hm_mode;
  9912. uint8_t g_hm_mode;
  9913. uint8_t xl_ulp_en;
  9914. uint8_t odr_gy;
  9915. uint8_t odr_xl;
  9916. uint8_t reg[8];
  9917. int32_t ret;
  9918. ret = 0;
  9919. /* FIXME: Remove warnings with STM32CubeIDE */
  9920. ctrl3_c.not_used_01 = 0;
  9921. ctrl4_c.not_used_01 = 0;
  9922. ctrl5_c.xl_ulp_en = 0;
  9923. /* reading input configuration */
  9924. xl_hm_mode = ((uint8_t)val->ui.xl.odr & 0x10U) >> 4;
  9925. xl_ulp_en = ((uint8_t)val->ui.xl.odr & 0x20U) >> 5;
  9926. odr_xl = (uint8_t)val->ui.xl.odr & 0x0FU;
  9927. /* if enable xl ultra low power mode disable gy and OIS chain */
  9928. if (xl_ulp_en == PROPERTY_ENABLE)
  9929. {
  9930. val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
  9931. val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
  9932. val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
  9933. }
  9934. /* if OIS xl is enabled also gyro OIS is enabled */
  9935. if (val->ois.xl.odr == LSM6DSO_XL_OIS_6667Hz_HP)
  9936. {
  9937. val->ois.gy.odr = LSM6DSO_GY_OIS_6667Hz_HP;
  9938. }
  9939. g_hm_mode = ((uint8_t)val->ui.gy.odr & 0x10U) >> 4;
  9940. odr_gy = (uint8_t)val->ui.gy.odr & 0x0FU;
  9941. /* reading registers to be configured */
  9942. if (ctx != NULL)
  9943. {
  9944. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, reg, 8);
  9945. bytecpy((uint8_t *)&ctrl1_xl, &reg[0]);
  9946. bytecpy((uint8_t *)&ctrl2_g, &reg[1]);
  9947. bytecpy((uint8_t *)&ctrl3_c, &reg[2]);
  9948. bytecpy((uint8_t *)&ctrl4_c, &reg[3]);
  9949. bytecpy((uint8_t *)&ctrl5_c, &reg[4]);
  9950. bytecpy((uint8_t *)&ctrl6_c, &reg[5]);
  9951. bytecpy((uint8_t *)&ctrl7_g, &reg[6]);
  9952. bytecpy((uint8_t *)&ctrl8_xl, &reg[7]);
  9953. if (ret == 0)
  9954. {
  9955. ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS,
  9956. (uint8_t *)&func_cfg_access, 1);
  9957. }
  9958. /* if toggle xl ultra low power mode, turn off xl before reconfigure */
  9959. if (ctrl5_c.xl_ulp_en != xl_ulp_en)
  9960. {
  9961. ctrl1_xl.odr_xl = (uint8_t) 0x00U;
  9962. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL,
  9963. (uint8_t *)&ctrl1_xl, 1);
  9964. }
  9965. }
  9966. /* reading OIS registers to be configured */
  9967. if (aux_ctx != NULL)
  9968. {
  9969. if (ret == 0)
  9970. {
  9971. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS, reg, 3);
  9972. }
  9973. bytecpy((uint8_t *)&ctrl1_ois, &reg[0]);
  9974. bytecpy((uint8_t *)&ctrl2_ois, &reg[1]);
  9975. bytecpy((uint8_t *)&ctrl3_ois, &reg[2]);
  9976. }
  9977. else
  9978. {
  9979. if (ctx != NULL)
  9980. {
  9981. if (ret == 0)
  9982. {
  9983. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, reg, 3);
  9984. }
  9985. bytecpy((uint8_t *)&ctrl1_ois, &reg[0]);
  9986. bytecpy((uint8_t *)&ctrl2_ois, &reg[1]);
  9987. bytecpy((uint8_t *)&ctrl3_ois, &reg[2]);
  9988. }
  9989. }
  9990. /* Check the Finite State Machine data rate constraints */
  9991. if (val->fsm.sens != LSM6DSO_FSM_DISABLE)
  9992. {
  9993. switch (val->fsm.odr)
  9994. {
  9995. case LSM6DSO_FSM_12Hz5:
  9996. if ((val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl == 0x00U))
  9997. {
  9998. odr_xl = 0x01U;
  9999. }
  10000. if ((val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy == 0x00U))
  10001. {
  10002. xl_ulp_en = PROPERTY_DISABLE;
  10003. odr_gy = 0x01U;
  10004. }
  10005. break;
  10006. case LSM6DSO_FSM_26Hz:
  10007. if ((val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl < 0x02U))
  10008. {
  10009. odr_xl = 0x02U;
  10010. }
  10011. if ((val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy < 0x02U))
  10012. {
  10013. xl_ulp_en = PROPERTY_DISABLE;
  10014. odr_gy = 0x02U;
  10015. }
  10016. break;
  10017. case LSM6DSO_FSM_52Hz:
  10018. if ((val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl < 0x03U))
  10019. {
  10020. odr_xl = 0x03U;
  10021. }
  10022. if ((val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy < 0x03U))
  10023. {
  10024. xl_ulp_en = PROPERTY_DISABLE;
  10025. odr_gy = 0x03U;
  10026. }
  10027. break;
  10028. case LSM6DSO_FSM_104Hz:
  10029. if ((val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl < 0x04U))
  10030. {
  10031. odr_xl = 0x04U;
  10032. }
  10033. if ((val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy < 0x04U))
  10034. {
  10035. xl_ulp_en = PROPERTY_DISABLE;
  10036. odr_gy = 0x04U;
  10037. }
  10038. break;
  10039. default:
  10040. odr_xl = 0x00U;
  10041. odr_gy = 0x00U;
  10042. break;
  10043. }
  10044. }
  10045. /* Updating the accelerometer data rate configuration */
  10046. switch ((ctrl5_c.xl_ulp_en << 5) | (ctrl6_c.xl_hm_mode << 4) |
  10047. ctrl1_xl.odr_xl)
  10048. {
  10049. case LSM6DSO_XL_UI_OFF:
  10050. val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
  10051. break;
  10052. case LSM6DSO_XL_UI_12Hz5_HP:
  10053. val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_HP;
  10054. break;
  10055. case LSM6DSO_XL_UI_26Hz_HP:
  10056. val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_HP;
  10057. break;
  10058. case LSM6DSO_XL_UI_52Hz_HP:
  10059. val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_HP;
  10060. break;
  10061. case LSM6DSO_XL_UI_104Hz_HP:
  10062. val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_HP;
  10063. break;
  10064. case LSM6DSO_XL_UI_208Hz_HP:
  10065. val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_HP;
  10066. break;
  10067. case LSM6DSO_XL_UI_416Hz_HP:
  10068. val->ui.xl.odr = LSM6DSO_XL_UI_416Hz_HP;
  10069. break;
  10070. case LSM6DSO_XL_UI_833Hz_HP:
  10071. val->ui.xl.odr = LSM6DSO_XL_UI_833Hz_HP;
  10072. break;
  10073. case LSM6DSO_XL_UI_1667Hz_HP:
  10074. val->ui.xl.odr = LSM6DSO_XL_UI_1667Hz_HP;
  10075. break;
  10076. case LSM6DSO_XL_UI_3333Hz_HP:
  10077. val->ui.xl.odr = LSM6DSO_XL_UI_3333Hz_HP;
  10078. break;
  10079. case LSM6DSO_XL_UI_6667Hz_HP:
  10080. val->ui.xl.odr = LSM6DSO_XL_UI_6667Hz_HP;
  10081. break;
  10082. case LSM6DSO_XL_UI_1Hz6_LP:
  10083. val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_LP;
  10084. break;
  10085. case LSM6DSO_XL_UI_12Hz5_LP:
  10086. val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_LP;
  10087. break;
  10088. case LSM6DSO_XL_UI_26Hz_LP:
  10089. val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_LP;
  10090. break;
  10091. case LSM6DSO_XL_UI_52Hz_LP:
  10092. val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_LP;
  10093. break;
  10094. case LSM6DSO_XL_UI_104Hz_NM:
  10095. val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_NM;
  10096. break;
  10097. case LSM6DSO_XL_UI_208Hz_NM:
  10098. val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_NM;
  10099. break;
  10100. case LSM6DSO_XL_UI_1Hz6_ULP:
  10101. val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_ULP;
  10102. break;
  10103. case LSM6DSO_XL_UI_12Hz5_ULP:
  10104. val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_ULP;
  10105. break;
  10106. case LSM6DSO_XL_UI_26Hz_ULP:
  10107. val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_ULP;
  10108. break;
  10109. case LSM6DSO_XL_UI_52Hz_ULP:
  10110. val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_ULP;
  10111. break;
  10112. case LSM6DSO_XL_UI_104Hz_ULP:
  10113. val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_ULP;
  10114. break;
  10115. case LSM6DSO_XL_UI_208Hz_ULP:
  10116. val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_ULP;
  10117. break;
  10118. default:
  10119. val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
  10120. break;
  10121. }
  10122. /* Updating the accelerometer data rate configuration */
  10123. switch ((ctrl7_g.g_hm_mode << 4) | ctrl2_g.odr_g)
  10124. {
  10125. case LSM6DSO_GY_UI_OFF:
  10126. val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
  10127. break;
  10128. case LSM6DSO_GY_UI_12Hz5_LP:
  10129. val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_LP;
  10130. break;
  10131. case LSM6DSO_GY_UI_12Hz5_HP:
  10132. val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_HP;
  10133. break;
  10134. case LSM6DSO_GY_UI_26Hz_LP:
  10135. val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_LP;
  10136. break;
  10137. case LSM6DSO_GY_UI_26Hz_HP:
  10138. val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_HP;
  10139. break;
  10140. case LSM6DSO_GY_UI_52Hz_LP:
  10141. val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_LP;
  10142. break;
  10143. case LSM6DSO_GY_UI_52Hz_HP:
  10144. val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_HP;
  10145. break;
  10146. case LSM6DSO_GY_UI_104Hz_NM:
  10147. val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_NM;
  10148. break;
  10149. case LSM6DSO_GY_UI_104Hz_HP:
  10150. val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_HP;
  10151. break;
  10152. case LSM6DSO_GY_UI_208Hz_NM:
  10153. val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_NM;
  10154. break;
  10155. case LSM6DSO_GY_UI_208Hz_HP:
  10156. val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_HP;
  10157. break;
  10158. case LSM6DSO_GY_UI_416Hz_HP:
  10159. val->ui.gy.odr = LSM6DSO_GY_UI_416Hz_HP;
  10160. break;
  10161. case LSM6DSO_GY_UI_833Hz_HP:
  10162. val->ui.gy.odr = LSM6DSO_GY_UI_833Hz_HP;
  10163. break;
  10164. case LSM6DSO_GY_UI_1667Hz_HP:
  10165. val->ui.gy.odr = LSM6DSO_GY_UI_1667Hz_HP;
  10166. break;
  10167. case LSM6DSO_GY_UI_3333Hz_HP:
  10168. val->ui.gy.odr = LSM6DSO_GY_UI_3333Hz_HP;
  10169. break;
  10170. case LSM6DSO_GY_UI_6667Hz_HP:
  10171. val->ui.gy.odr = LSM6DSO_GY_UI_6667Hz_HP;
  10172. break;
  10173. default:
  10174. val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
  10175. break;
  10176. }
  10177. /* Check accelerometer full scale constraints */
  10178. /* Full scale of 16g must be the same for UI and OIS */
  10179. if ((val->ui.xl.fs == LSM6DSO_XL_UI_16g) ||
  10180. (val->ois.xl.fs == LSM6DSO_XL_OIS_16g))
  10181. {
  10182. val->ui.xl.fs = LSM6DSO_XL_UI_16g;
  10183. val->ois.xl.fs = LSM6DSO_XL_OIS_16g;
  10184. }
  10185. /* prapare new configuration */
  10186. /* Full scale of 16g must be the same for UI and OIS */
  10187. if (val->ui.xl.fs == LSM6DSO_XL_UI_16g)
  10188. {
  10189. ctrl8_xl.xl_fs_mode = PROPERTY_DISABLE;
  10190. }
  10191. else
  10192. {
  10193. ctrl8_xl.xl_fs_mode = PROPERTY_ENABLE;
  10194. }
  10195. /* OIS new configuration */
  10196. ctrl7_g.ois_on_en = val->ois.ctrl_md & 0x01U;
  10197. switch (val->ois.ctrl_md)
  10198. {
  10199. case LSM6DSO_OIS_ONLY_AUX:
  10200. ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
  10201. ctrl1_ois.ois_en_spi2 = (uint8_t)val->ois.gy.odr |
  10202. (uint8_t)val->ois.xl.odr;
  10203. ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
  10204. ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
  10205. break;
  10206. case LSM6DSO_OIS_MIXED:
  10207. ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
  10208. ctrl7_g.ois_on = (uint8_t)val->ois.gy.odr | (uint8_t)val->ois.xl.odr;
  10209. ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
  10210. ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
  10211. break;
  10212. default:
  10213. ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
  10214. ctrl1_ois.ois_en_spi2 = (uint8_t)val->ois.gy.odr |
  10215. (uint8_t)val->ois.xl.odr;
  10216. ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
  10217. ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
  10218. break;
  10219. }
  10220. /* UI new configuration */
  10221. ctrl1_xl.odr_xl = odr_xl;
  10222. ctrl1_xl.fs_xl = (uint8_t)val->ui.xl.fs;
  10223. ctrl5_c.xl_ulp_en = xl_ulp_en;
  10224. ctrl6_c.xl_hm_mode = xl_hm_mode;
  10225. ctrl7_g.g_hm_mode = g_hm_mode;
  10226. ctrl2_g.odr_g = odr_gy;
  10227. ctrl2_g.fs_g = (uint8_t) val->ui.gy.fs;
  10228. /* writing checked configuration */
  10229. if (ctx != NULL)
  10230. {
  10231. bytecpy(&reg[0], (uint8_t *)&ctrl1_xl);
  10232. bytecpy(&reg[1], (uint8_t *)&ctrl2_g);
  10233. bytecpy(&reg[2], (uint8_t *)&ctrl3_c);
  10234. bytecpy(&reg[3], (uint8_t *)&ctrl4_c);
  10235. bytecpy(&reg[4], (uint8_t *)&ctrl5_c);
  10236. bytecpy(&reg[5], (uint8_t *)&ctrl6_c);
  10237. bytecpy(&reg[6], (uint8_t *)&ctrl7_g);
  10238. bytecpy(&reg[7], (uint8_t *)&ctrl8_xl);
  10239. if (ret == 0)
  10240. {
  10241. ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t *)&reg, 8);
  10242. }
  10243. if (ret == 0)
  10244. {
  10245. ret = lsm6dso_write_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS,
  10246. (uint8_t *)&func_cfg_access, 1);
  10247. }
  10248. }
  10249. /* writing OIS checked configuration */
  10250. if (aux_ctx != NULL)
  10251. {
  10252. bytecpy(&reg[0], (uint8_t *)&ctrl1_ois);
  10253. bytecpy(&reg[1], (uint8_t *)&ctrl2_ois);
  10254. bytecpy(&reg[2], (uint8_t *)&ctrl3_ois);
  10255. if (ret == 0)
  10256. {
  10257. ret = lsm6dso_write_reg(aux_ctx, LSM6DSO_CTRL1_OIS, reg, 3);
  10258. }
  10259. }
  10260. return ret;
  10261. }
  10262. /**
  10263. * @brief Sensor conversion parameters selection.[get]
  10264. *
  10265. * @param ctx communication interface handler. Use NULL to ignore
  10266. * this interface.(ptr)
  10267. * @param aux_ctx auxiliary communication interface handler. Use NULL
  10268. * to ignore this interface.(ptr)
  10269. * @param val get the sensor conversion parameters.(ptr)
  10270. * @retval interface status (MANDATORY: return 0 -> no Error)
  10271. *
  10272. */
  10273. int32_t lsm6dso_mode_get(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  10274. lsm6dso_md_t *val)
  10275. {
  10276. lsm6dso_emb_func_odr_cfg_b_t emb_func_odr_cfg_b;
  10277. lsm6dso_func_cfg_access_t func_cfg_access;
  10278. lsm6dso_emb_func_en_b_t emb_func_en_b;
  10279. lsm6dso_fsm_enable_a_t fsm_enable_a;
  10280. lsm6dso_fsm_enable_b_t fsm_enable_b;
  10281. lsm6dso_ctrl1_ois_t ctrl1_ois;
  10282. lsm6dso_ctrl2_ois_t ctrl2_ois;
  10283. lsm6dso_ctrl3_ois_t ctrl3_ois;
  10284. lsm6dso_ctrl1_xl_t ctrl1_xl;
  10285. lsm6dso_ctrl2_g_t ctrl2_g;
  10286. lsm6dso_ctrl3_c_t ctrl3_c;
  10287. lsm6dso_ctrl4_c_t ctrl4_c;
  10288. lsm6dso_ctrl5_c_t ctrl5_c;
  10289. lsm6dso_ctrl6_c_t ctrl6_c;
  10290. lsm6dso_ctrl7_g_t ctrl7_g;
  10291. uint8_t reg[8];
  10292. int32_t ret;
  10293. ret = 0;
  10294. /* reading the registers of the device */
  10295. if (ctx != NULL)
  10296. {
  10297. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, reg, 7);
  10298. bytecpy((uint8_t *)&ctrl1_xl, &reg[0]);
  10299. bytecpy((uint8_t *)&ctrl2_g, &reg[1]);
  10300. bytecpy((uint8_t *)&ctrl3_c, &reg[2]);
  10301. bytecpy((uint8_t *)&ctrl4_c, &reg[3]);
  10302. bytecpy((uint8_t *)&ctrl5_c, &reg[4]);
  10303. bytecpy((uint8_t *)&ctrl6_c, &reg[5]);
  10304. bytecpy((uint8_t *)&ctrl7_g, &reg[6]);
  10305. if (ret == 0)
  10306. {
  10307. ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS,
  10308. (uint8_t *)&func_cfg_access, 1);
  10309. }
  10310. if (ret == 0)
  10311. {
  10312. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  10313. }
  10314. if (ret == 0)
  10315. {
  10316. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B, reg, 1);
  10317. bytecpy((uint8_t *)&emb_func_odr_cfg_b, &reg[0]);
  10318. }
  10319. if (ret == 0)
  10320. {
  10321. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
  10322. (uint8_t *)&emb_func_en_b, 1);
  10323. }
  10324. if (ret == 0)
  10325. {
  10326. ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_ENABLE_A, reg, 2);
  10327. bytecpy((uint8_t *)&fsm_enable_a, &reg[0]);
  10328. bytecpy((uint8_t *)&fsm_enable_b, &reg[1]);
  10329. }
  10330. if (ret == 0)
  10331. {
  10332. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  10333. }
  10334. }
  10335. if (aux_ctx != NULL)
  10336. {
  10337. if (ret == 0)
  10338. {
  10339. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS, reg, 3);
  10340. }
  10341. bytecpy((uint8_t *)&ctrl1_ois, &reg[0]);
  10342. bytecpy((uint8_t *)&ctrl2_ois, &reg[1]);
  10343. bytecpy((uint8_t *)&ctrl3_ois, &reg[2]);
  10344. }
  10345. else
  10346. {
  10347. if (ctx != NULL)
  10348. {
  10349. if (ret == 0)
  10350. {
  10351. ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, reg, 3);
  10352. }
  10353. bytecpy((uint8_t *)&ctrl1_ois, &reg[0]);
  10354. bytecpy((uint8_t *)&ctrl2_ois, &reg[1]);
  10355. bytecpy((uint8_t *)&ctrl3_ois, &reg[2]);
  10356. }
  10357. }
  10358. /* fill the input structure */
  10359. /* get accelerometer configuration */
  10360. switch ((ctrl5_c.xl_ulp_en << 5) | (ctrl6_c.xl_hm_mode << 4) |
  10361. ctrl1_xl.odr_xl)
  10362. {
  10363. case LSM6DSO_XL_UI_OFF:
  10364. val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
  10365. break;
  10366. case LSM6DSO_XL_UI_12Hz5_HP:
  10367. val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_HP;
  10368. break;
  10369. case LSM6DSO_XL_UI_26Hz_HP:
  10370. val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_HP;
  10371. break;
  10372. case LSM6DSO_XL_UI_52Hz_HP:
  10373. val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_HP;
  10374. break;
  10375. case LSM6DSO_XL_UI_104Hz_HP:
  10376. val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_HP;
  10377. break;
  10378. case LSM6DSO_XL_UI_208Hz_HP:
  10379. val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_HP;
  10380. break;
  10381. case LSM6DSO_XL_UI_416Hz_HP:
  10382. val->ui.xl.odr = LSM6DSO_XL_UI_416Hz_HP;
  10383. break;
  10384. case LSM6DSO_XL_UI_833Hz_HP:
  10385. val->ui.xl.odr = LSM6DSO_XL_UI_833Hz_HP;
  10386. break;
  10387. case LSM6DSO_XL_UI_1667Hz_HP:
  10388. val->ui.xl.odr = LSM6DSO_XL_UI_1667Hz_HP;
  10389. break;
  10390. case LSM6DSO_XL_UI_3333Hz_HP:
  10391. val->ui.xl.odr = LSM6DSO_XL_UI_3333Hz_HP;
  10392. break;
  10393. case LSM6DSO_XL_UI_6667Hz_HP:
  10394. val->ui.xl.odr = LSM6DSO_XL_UI_6667Hz_HP;
  10395. break;
  10396. case LSM6DSO_XL_UI_1Hz6_LP:
  10397. val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_LP;
  10398. break;
  10399. case LSM6DSO_XL_UI_12Hz5_LP:
  10400. val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_LP;
  10401. break;
  10402. case LSM6DSO_XL_UI_26Hz_LP:
  10403. val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_LP;
  10404. break;
  10405. case LSM6DSO_XL_UI_52Hz_LP:
  10406. val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_LP;
  10407. break;
  10408. case LSM6DSO_XL_UI_104Hz_NM:
  10409. val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_NM;
  10410. break;
  10411. case LSM6DSO_XL_UI_208Hz_NM:
  10412. val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_NM;
  10413. break;
  10414. case LSM6DSO_XL_UI_1Hz6_ULP:
  10415. val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_ULP;
  10416. break;
  10417. case LSM6DSO_XL_UI_12Hz5_ULP:
  10418. val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_ULP;
  10419. break;
  10420. case LSM6DSO_XL_UI_26Hz_ULP:
  10421. val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_ULP;
  10422. break;
  10423. case LSM6DSO_XL_UI_52Hz_ULP:
  10424. val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_ULP;
  10425. break;
  10426. case LSM6DSO_XL_UI_104Hz_ULP:
  10427. val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_ULP;
  10428. break;
  10429. case LSM6DSO_XL_UI_208Hz_ULP:
  10430. val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_ULP;
  10431. break;
  10432. default:
  10433. val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
  10434. break;
  10435. }
  10436. switch (ctrl1_xl.fs_xl)
  10437. {
  10438. case LSM6DSO_XL_UI_2g:
  10439. val->ui.xl.fs = LSM6DSO_XL_UI_2g;
  10440. break;
  10441. case LSM6DSO_XL_UI_4g:
  10442. val->ui.xl.fs = LSM6DSO_XL_UI_4g;
  10443. break;
  10444. case LSM6DSO_XL_UI_8g:
  10445. val->ui.xl.fs = LSM6DSO_XL_UI_8g;
  10446. break;
  10447. case LSM6DSO_XL_UI_16g:
  10448. val->ui.xl.fs = LSM6DSO_XL_UI_16g;
  10449. break;
  10450. default:
  10451. val->ui.xl.fs = LSM6DSO_XL_UI_2g;
  10452. break;
  10453. }
  10454. /* get gyroscope configuration */
  10455. switch ((ctrl7_g.g_hm_mode << 4) | ctrl2_g.odr_g)
  10456. {
  10457. case LSM6DSO_GY_UI_OFF:
  10458. val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
  10459. break;
  10460. case LSM6DSO_GY_UI_12Hz5_LP:
  10461. val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_LP;
  10462. break;
  10463. case LSM6DSO_GY_UI_12Hz5_HP:
  10464. val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_HP;
  10465. break;
  10466. case LSM6DSO_GY_UI_26Hz_LP:
  10467. val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_LP;
  10468. break;
  10469. case LSM6DSO_GY_UI_26Hz_HP:
  10470. val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_HP;
  10471. break;
  10472. case LSM6DSO_GY_UI_52Hz_LP:
  10473. val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_LP;
  10474. break;
  10475. case LSM6DSO_GY_UI_52Hz_HP:
  10476. val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_HP;
  10477. break;
  10478. case LSM6DSO_GY_UI_104Hz_NM:
  10479. val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_NM;
  10480. break;
  10481. case LSM6DSO_GY_UI_104Hz_HP:
  10482. val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_HP;
  10483. break;
  10484. case LSM6DSO_GY_UI_208Hz_NM:
  10485. val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_NM;
  10486. break;
  10487. case LSM6DSO_GY_UI_208Hz_HP:
  10488. val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_HP;
  10489. break;
  10490. case LSM6DSO_GY_UI_416Hz_HP:
  10491. val->ui.gy.odr = LSM6DSO_GY_UI_416Hz_HP;
  10492. break;
  10493. case LSM6DSO_GY_UI_833Hz_HP:
  10494. val->ui.gy.odr = LSM6DSO_GY_UI_833Hz_HP;
  10495. break;
  10496. case LSM6DSO_GY_UI_1667Hz_HP:
  10497. val->ui.gy.odr = LSM6DSO_GY_UI_1667Hz_HP;
  10498. break;
  10499. case LSM6DSO_GY_UI_3333Hz_HP:
  10500. val->ui.gy.odr = LSM6DSO_GY_UI_3333Hz_HP;
  10501. break;
  10502. case LSM6DSO_GY_UI_6667Hz_HP:
  10503. val->ui.gy.odr = LSM6DSO_GY_UI_6667Hz_HP;
  10504. break;
  10505. default:
  10506. val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
  10507. break;
  10508. }
  10509. switch (ctrl2_g.fs_g)
  10510. {
  10511. case LSM6DSO_GY_UI_125dps:
  10512. val->ui.gy.fs = LSM6DSO_GY_UI_125dps;
  10513. break;
  10514. case LSM6DSO_GY_UI_250dps:
  10515. val->ui.gy.fs = LSM6DSO_GY_UI_250dps;
  10516. break;
  10517. case LSM6DSO_GY_UI_500dps:
  10518. val->ui.gy.fs = LSM6DSO_GY_UI_500dps;
  10519. break;
  10520. case LSM6DSO_GY_UI_1000dps:
  10521. val->ui.gy.fs = LSM6DSO_GY_UI_1000dps;
  10522. break;
  10523. case LSM6DSO_GY_UI_2000dps:
  10524. val->ui.gy.fs = LSM6DSO_GY_UI_2000dps;
  10525. break;
  10526. default:
  10527. val->ui.gy.fs = LSM6DSO_GY_UI_125dps;
  10528. break;
  10529. }
  10530. /* get finite state machine configuration */
  10531. if ((fsm_enable_a.fsm1_en | fsm_enable_a.fsm2_en |
  10532. fsm_enable_a.fsm3_en |
  10533. fsm_enable_a.fsm4_en | fsm_enable_a.fsm5_en | fsm_enable_a.fsm6_en |
  10534. fsm_enable_a.fsm7_en | fsm_enable_a.fsm8_en | fsm_enable_b.fsm9_en |
  10535. fsm_enable_b.fsm10_en | fsm_enable_b.fsm11_en |
  10536. fsm_enable_b.fsm12_en | fsm_enable_b.fsm13_en |
  10537. fsm_enable_b.fsm14_en | fsm_enable_b.fsm15_en |
  10538. fsm_enable_b.fsm16_en) == PROPERTY_ENABLE)
  10539. {
  10540. switch (emb_func_odr_cfg_b.fsm_odr)
  10541. {
  10542. case LSM6DSO_FSM_12Hz5:
  10543. val->fsm.odr = LSM6DSO_FSM_12Hz5;
  10544. break;
  10545. case LSM6DSO_FSM_26Hz:
  10546. val->fsm.odr = LSM6DSO_FSM_26Hz;
  10547. break;
  10548. case LSM6DSO_FSM_52Hz:
  10549. val->fsm.odr = LSM6DSO_FSM_52Hz;
  10550. break;
  10551. case LSM6DSO_FSM_104Hz:
  10552. val->fsm.odr = LSM6DSO_FSM_104Hz;
  10553. break;
  10554. default:
  10555. val->fsm.odr = LSM6DSO_FSM_12Hz5;
  10556. break;
  10557. }
  10558. val->fsm.sens = LSM6DSO_FSM_XL_GY;
  10559. if (val->ui.gy.odr == LSM6DSO_GY_UI_OFF)
  10560. {
  10561. val->fsm.sens = LSM6DSO_FSM_XL;
  10562. }
  10563. if (val->ui.xl.odr == LSM6DSO_XL_UI_OFF)
  10564. {
  10565. val->fsm.sens = LSM6DSO_FSM_GY;
  10566. }
  10567. }
  10568. else
  10569. {
  10570. val->fsm.sens = LSM6DSO_FSM_DISABLE;
  10571. }
  10572. /* get ois configuration */
  10573. /* OIS configuration mode */
  10574. switch (ctrl7_g.ois_on_en)
  10575. {
  10576. case LSM6DSO_OIS_ONLY_AUX:
  10577. switch (ctrl3_ois.fs_xl_ois)
  10578. {
  10579. case LSM6DSO_XL_OIS_2g:
  10580. val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
  10581. break;
  10582. case LSM6DSO_XL_OIS_4g:
  10583. val->ois.xl.fs = LSM6DSO_XL_OIS_4g;
  10584. break;
  10585. case LSM6DSO_XL_OIS_8g:
  10586. val->ois.xl.fs = LSM6DSO_XL_OIS_8g;
  10587. break;
  10588. case LSM6DSO_XL_OIS_16g:
  10589. val->ois.xl.fs = LSM6DSO_XL_OIS_16g;
  10590. break;
  10591. default:
  10592. val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
  10593. break;
  10594. }
  10595. switch (ctrl1_ois.mode4_en)
  10596. {
  10597. case LSM6DSO_XL_OIS_OFF:
  10598. val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
  10599. break;
  10600. case LSM6DSO_XL_OIS_6667Hz_HP:
  10601. val->ois.xl.odr = LSM6DSO_XL_OIS_6667Hz_HP;
  10602. break;
  10603. default:
  10604. val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
  10605. break;
  10606. }
  10607. switch (ctrl1_ois.fs_g_ois)
  10608. {
  10609. case LSM6DSO_GY_OIS_250dps:
  10610. val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
  10611. break;
  10612. case LSM6DSO_GY_OIS_500dps:
  10613. val->ois.gy.fs = LSM6DSO_GY_OIS_500dps;
  10614. break;
  10615. case LSM6DSO_GY_OIS_1000dps:
  10616. val->ois.gy.fs = LSM6DSO_GY_OIS_1000dps;
  10617. break;
  10618. case LSM6DSO_GY_OIS_2000dps:
  10619. val->ois.gy.fs = LSM6DSO_GY_OIS_2000dps;
  10620. break;
  10621. default:
  10622. val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
  10623. break;
  10624. }
  10625. switch (ctrl1_ois.ois_en_spi2)
  10626. {
  10627. case LSM6DSO_GY_OIS_OFF:
  10628. val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
  10629. break;
  10630. case LSM6DSO_GY_OIS_6667Hz_HP:
  10631. val->ois.gy.odr = LSM6DSO_GY_OIS_6667Hz_HP;
  10632. break;
  10633. default:
  10634. val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
  10635. break;
  10636. }
  10637. val->ois.ctrl_md = LSM6DSO_OIS_ONLY_AUX;
  10638. break;
  10639. case LSM6DSO_OIS_MIXED:
  10640. switch (ctrl3_ois.fs_xl_ois)
  10641. {
  10642. case LSM6DSO_XL_OIS_2g:
  10643. val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
  10644. break;
  10645. case LSM6DSO_XL_OIS_4g:
  10646. val->ois.xl.fs = LSM6DSO_XL_OIS_4g;
  10647. break;
  10648. case LSM6DSO_XL_OIS_8g:
  10649. val->ois.xl.fs = LSM6DSO_XL_OIS_8g;
  10650. break;
  10651. case LSM6DSO_XL_OIS_16g:
  10652. val->ois.xl.fs = LSM6DSO_XL_OIS_16g;
  10653. break;
  10654. default:
  10655. val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
  10656. break;
  10657. }
  10658. switch (ctrl1_ois.mode4_en)
  10659. {
  10660. case LSM6DSO_XL_OIS_OFF:
  10661. val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
  10662. break;
  10663. case LSM6DSO_XL_OIS_6667Hz_HP:
  10664. val->ois.xl.odr = LSM6DSO_XL_OIS_6667Hz_HP;
  10665. break;
  10666. default:
  10667. val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
  10668. break;
  10669. }
  10670. switch (ctrl1_ois.fs_g_ois)
  10671. {
  10672. case LSM6DSO_GY_OIS_250dps:
  10673. val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
  10674. break;
  10675. case LSM6DSO_GY_OIS_500dps:
  10676. val->ois.gy.fs = LSM6DSO_GY_OIS_500dps;
  10677. break;
  10678. case LSM6DSO_GY_OIS_1000dps:
  10679. val->ois.gy.fs = LSM6DSO_GY_OIS_1000dps;
  10680. break;
  10681. case LSM6DSO_GY_OIS_2000dps:
  10682. val->ois.gy.fs = LSM6DSO_GY_OIS_2000dps;
  10683. break;
  10684. default:
  10685. val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
  10686. break;
  10687. }
  10688. switch (ctrl1_ois.ois_en_spi2)
  10689. {
  10690. case LSM6DSO_GY_OIS_OFF:
  10691. val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
  10692. break;
  10693. case LSM6DSO_GY_OIS_6667Hz_HP:
  10694. val->ois.gy.odr = LSM6DSO_GY_OIS_6667Hz_HP;
  10695. break;
  10696. default:
  10697. val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
  10698. break;
  10699. }
  10700. val->ois.ctrl_md = LSM6DSO_OIS_MIXED;
  10701. break;
  10702. default:
  10703. ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
  10704. ctrl1_ois.ois_en_spi2 = (uint8_t)val->ois.gy.odr |
  10705. (uint8_t)val->ois.xl.odr;
  10706. ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
  10707. ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
  10708. val->ois.ctrl_md = LSM6DSO_OIS_ONLY_AUX;
  10709. break;
  10710. }
  10711. return ret;
  10712. }
  10713. /**
  10714. * @brief Read data in engineering unit.[get]
  10715. *
  10716. * @param ctx communication interface handler.(ptr)
  10717. * @param md the sensor conversion parameters.(ptr)
  10718. * @retval interface status (MANDATORY: return 0 -> no Error)
  10719. *
  10720. */
  10721. int32_t lsm6dso_data_get(stmdev_ctx_t *ctx, stmdev_ctx_t *aux_ctx,
  10722. lsm6dso_md_t *md, lsm6dso_data_t *data)
  10723. {
  10724. uint8_t buff[14];
  10725. int32_t ret;
  10726. uint8_t i;
  10727. uint8_t j;
  10728. ret = 0;
  10729. /* read data */
  10730. if (ctx != NULL)
  10731. {
  10732. ret = lsm6dso_read_reg(ctx, LSM6DSO_OUT_TEMP_L, buff, 14);
  10733. }
  10734. j = 0;
  10735. /* temperature conversion */
  10736. data->ui.heat.raw = (int16_t)buff[j + 1U];
  10737. data->ui.heat.raw = (((int16_t)data->ui.heat.raw * (int16_t)256) +
  10738. (int16_t)buff[j]);
  10739. j += 2U;
  10740. data->ui.heat.deg_c = lsm6dso_from_lsb_to_celsius((
  10741. int16_t)data->ui.heat.raw);
  10742. /* angular rate conversion */
  10743. for (i = 0U; i < 3U; i++)
  10744. {
  10745. data->ui.gy.raw[i] = (int16_t)buff[j + 1U];
  10746. data->ui.gy.raw[i] = (data->ui.gy.raw[i] * 256) + (int16_t) buff[j];
  10747. j += 2U;
  10748. switch (md->ui.gy.fs)
  10749. {
  10750. case LSM6DSO_GY_UI_250dps:
  10751. data->ui.gy.mdps[i] = lsm6dso_from_fs250_to_mdps(data->ui.gy.raw[i]);
  10752. break;
  10753. case LSM6DSO_GY_UI_125dps:
  10754. data->ui.gy.mdps[i] = lsm6dso_from_fs125_to_mdps(data->ui.gy.raw[i]);
  10755. break;
  10756. case LSM6DSO_GY_UI_500dps:
  10757. data->ui.gy.mdps[i] = lsm6dso_from_fs500_to_mdps(data->ui.gy.raw[i]);
  10758. break;
  10759. case LSM6DSO_GY_UI_1000dps:
  10760. data->ui.gy.mdps[i] = lsm6dso_from_fs1000_to_mdps(data->ui.gy.raw[i]);
  10761. break;
  10762. case LSM6DSO_GY_UI_2000dps:
  10763. data->ui.gy.mdps[i] = lsm6dso_from_fs2000_to_mdps(data->ui.gy.raw[i]);
  10764. break;
  10765. default:
  10766. data->ui.gy.mdps[i] = 0.0f;
  10767. break;
  10768. }
  10769. }
  10770. /* acceleration conversion */
  10771. for (i = 0U; i < 3U; i++)
  10772. {
  10773. data->ui.xl.raw[i] = (int16_t)buff[j + 1U];
  10774. data->ui.xl.raw[i] = (data->ui.xl.raw[i] * 256) + (int16_t) buff[j];
  10775. j += 2U;
  10776. switch (md->ui.xl.fs)
  10777. {
  10778. case LSM6DSO_XL_UI_2g:
  10779. data->ui.xl.mg[i] = lsm6dso_from_fs2_to_mg(data->ui.xl.raw[i]);
  10780. break;
  10781. case LSM6DSO_XL_UI_4g:
  10782. data->ui.xl.mg[i] = lsm6dso_from_fs4_to_mg(data->ui.xl.raw[i]);
  10783. break;
  10784. case LSM6DSO_XL_UI_8g:
  10785. data->ui.xl.mg[i] = lsm6dso_from_fs8_to_mg(data->ui.xl.raw[i]);
  10786. break;
  10787. case LSM6DSO_XL_UI_16g:
  10788. data->ui.xl.mg[i] = lsm6dso_from_fs16_to_mg(data->ui.xl.raw[i]);
  10789. break;
  10790. default:
  10791. data->ui.xl.mg[i] = 0.0f;
  10792. break;
  10793. }
  10794. }
  10795. /* read data from ois chain */
  10796. if (aux_ctx != NULL)
  10797. {
  10798. if (ret == 0)
  10799. {
  10800. ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_OUTX_L_G, buff, 12);
  10801. }
  10802. }
  10803. j = 0;
  10804. /* ois angular rate conversion */
  10805. for (i = 0U; i < 3U; i++)
  10806. {
  10807. data->ois.gy.raw[i] = (int16_t) buff[j + 1U];
  10808. data->ois.gy.raw[i] = (data->ois.gy.raw[i] * 256) + (int16_t) buff[j];
  10809. j += 2U;
  10810. switch (md->ois.gy.fs)
  10811. {
  10812. case LSM6DSO_GY_UI_250dps:
  10813. data->ois.gy.mdps[i] = lsm6dso_from_fs250_to_mdps(
  10814. data->ois.gy.raw[i]);
  10815. break;
  10816. case LSM6DSO_GY_UI_125dps:
  10817. data->ois.gy.mdps[i] = lsm6dso_from_fs125_to_mdps(
  10818. data->ois.gy.raw[i]);
  10819. break;
  10820. case LSM6DSO_GY_UI_500dps:
  10821. data->ois.gy.mdps[i] = lsm6dso_from_fs500_to_mdps(
  10822. data->ois.gy.raw[i]);
  10823. break;
  10824. case LSM6DSO_GY_UI_1000dps:
  10825. data->ois.gy.mdps[i] = lsm6dso_from_fs1000_to_mdps(
  10826. data->ois.gy.raw[i]);
  10827. break;
  10828. case LSM6DSO_GY_UI_2000dps:
  10829. data->ois.gy.mdps[i] = lsm6dso_from_fs2000_to_mdps(
  10830. data->ois.gy.raw[i]);
  10831. break;
  10832. default:
  10833. data->ois.gy.mdps[i] = 0.0f;
  10834. break;
  10835. }
  10836. }
  10837. /* ois acceleration conversion */
  10838. for (i = 0U; i < 3U; i++)
  10839. {
  10840. data->ois.xl.raw[i] = (int16_t) buff[j + 1U];
  10841. data->ois.xl.raw[i] = (data->ois.xl.raw[i] * 256) + (int16_t) buff[j];
  10842. j += 2U;
  10843. switch (md->ois.xl.fs)
  10844. {
  10845. case LSM6DSO_XL_UI_2g:
  10846. data->ois.xl.mg[i] = lsm6dso_from_fs2_to_mg(data->ois.xl.raw[i]);
  10847. break;
  10848. case LSM6DSO_XL_UI_4g:
  10849. data->ois.xl.mg[i] = lsm6dso_from_fs4_to_mg(data->ois.xl.raw[i]);
  10850. break;
  10851. case LSM6DSO_XL_UI_8g:
  10852. data->ois.xl.mg[i] = lsm6dso_from_fs8_to_mg(data->ois.xl.raw[i]);
  10853. break;
  10854. case LSM6DSO_XL_UI_16g:
  10855. data->ois.xl.mg[i] = lsm6dso_from_fs16_to_mg(data->ois.xl.raw[i]);
  10856. break;
  10857. default:
  10858. data->ois.xl.mg[i] = 0.0f;
  10859. break;
  10860. }
  10861. }
  10862. return ret;
  10863. }
  10864. /**
  10865. * @brief Embedded functions.[set]
  10866. *
  10867. * @param ctx read / write interface definitions
  10868. * @param val change the values of registers
  10869. * EMB_FUNC_EN_A e EMB_FUNC_EN_B.
  10870. * @retval interface status (MANDATORY: return 0 -> no Error)
  10871. *
  10872. */
  10873. int32_t lsm6dso_embedded_sens_set(stmdev_ctx_t *ctx,
  10874. lsm6dso_emb_sens_t *val)
  10875. {
  10876. lsm6dso_emb_func_en_a_t emb_func_en_a;
  10877. lsm6dso_emb_func_en_b_t emb_func_en_b;
  10878. int32_t ret;
  10879. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  10880. if (ret == 0)
  10881. {
  10882. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
  10883. (uint8_t *)&emb_func_en_a, 1);
  10884. }
  10885. if (ret == 0)
  10886. {
  10887. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
  10888. (uint8_t *)&emb_func_en_b, 1);
  10889. emb_func_en_b.fsm_en = val->fsm;
  10890. emb_func_en_a.tilt_en = val->tilt;
  10891. emb_func_en_a.pedo_en = val->step;
  10892. emb_func_en_b.pedo_adv_en = val->step_adv;
  10893. emb_func_en_a.sign_motion_en = val->sig_mot;
  10894. emb_func_en_b.fifo_compr_en = val->fifo_compr;
  10895. }
  10896. if (ret == 0)
  10897. {
  10898. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
  10899. (uint8_t *)&emb_func_en_a, 1);
  10900. }
  10901. if (ret == 0)
  10902. {
  10903. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
  10904. (uint8_t *)&emb_func_en_b, 1);
  10905. }
  10906. if (ret == 0)
  10907. {
  10908. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  10909. }
  10910. return ret;
  10911. }
  10912. /**
  10913. * @brief Embedded functions.[get]
  10914. *
  10915. * @param ctx read / write interface definitions
  10916. * @param val get the values of registers
  10917. * EMB_FUNC_EN_A e EMB_FUNC_EN_B.
  10918. * @retval interface status (MANDATORY: return 0 -> no Error)
  10919. *
  10920. */
  10921. int32_t lsm6dso_embedded_sens_get(stmdev_ctx_t *ctx,
  10922. lsm6dso_emb_sens_t *emb_sens)
  10923. {
  10924. lsm6dso_emb_func_en_a_t emb_func_en_a;
  10925. lsm6dso_emb_func_en_b_t emb_func_en_b;
  10926. int32_t ret;
  10927. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  10928. if (ret == 0)
  10929. {
  10930. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
  10931. (uint8_t *)&emb_func_en_a, 1);
  10932. }
  10933. if (ret == 0)
  10934. {
  10935. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
  10936. (uint8_t *)&emb_func_en_b, 1);
  10937. emb_sens->fsm = emb_func_en_b.fsm_en;
  10938. emb_sens->tilt = emb_func_en_a.tilt_en;
  10939. emb_sens->step = emb_func_en_a.pedo_en;
  10940. emb_sens->step_adv = emb_func_en_b.pedo_adv_en;
  10941. emb_sens->sig_mot = emb_func_en_a.sign_motion_en;
  10942. emb_sens->fifo_compr = emb_func_en_b.fifo_compr_en;
  10943. }
  10944. if (ret == 0)
  10945. {
  10946. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  10947. }
  10948. return ret;
  10949. }
  10950. /**
  10951. * @brief turn off all embedded functions.[get]
  10952. *
  10953. * @param ctx read / write interface definitions
  10954. * @param val get the values of registers
  10955. * EMB_FUNC_EN_A e EMB_FUNC_EN_B.
  10956. * @retval interface status (MANDATORY: return 0 -> no Error)
  10957. *
  10958. */
  10959. int32_t lsm6dso_embedded_sens_off(stmdev_ctx_t *ctx)
  10960. {
  10961. lsm6dso_emb_func_en_a_t emb_func_en_a;
  10962. lsm6dso_emb_func_en_b_t emb_func_en_b;
  10963. int32_t ret;
  10964. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
  10965. if (ret == 0)
  10966. {
  10967. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
  10968. (uint8_t *)&emb_func_en_a, 1);
  10969. }
  10970. if (ret == 0)
  10971. {
  10972. ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
  10973. (uint8_t *)&emb_func_en_b, 1);
  10974. emb_func_en_b.fsm_en = PROPERTY_DISABLE;
  10975. emb_func_en_a.tilt_en = PROPERTY_DISABLE;
  10976. emb_func_en_a.pedo_en = PROPERTY_DISABLE;
  10977. emb_func_en_b.pedo_adv_en = PROPERTY_DISABLE;
  10978. emb_func_en_a.sign_motion_en = PROPERTY_DISABLE;
  10979. emb_func_en_b.fifo_compr_en = PROPERTY_DISABLE;
  10980. }
  10981. if (ret == 0)
  10982. {
  10983. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
  10984. (uint8_t *)&emb_func_en_a, 1);
  10985. }
  10986. if (ret == 0)
  10987. {
  10988. ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
  10989. (uint8_t *)&emb_func_en_b, 1);
  10990. }
  10991. if (ret == 0)
  10992. {
  10993. ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
  10994. }
  10995. return ret;
  10996. }
  10997. /**
  10998. * @}
  10999. *
  11000. */
  11001. /**
  11002. * @}
  11003. *
  11004. */