bmm150.c 106 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663
  1. /* bmm150.c - bmm150 compass driver
  2. *
  3. *
  4. * This software program is licensed subject to the GNU General Public License
  5. * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html
  6. * (C) Copyright 2011 Bosch Sensortec GmbH
  7. * All Rights Reserved
  8. *
  9. * VERSION: V1.2
  10. * History: V1.0 --- Driver creation
  11. * V1.1 --- Add share I2C address solution
  12. * V1.2 --- Fix bug that daemon can't get
  13. * delay command.
  14. */
  15. #include <linux/interrupt.h>
  16. #include <linux/i2c.h>
  17. #include <linux/slab.h>
  18. #include <linux/irq.h>
  19. #include <linux/miscdevice.h>
  20. #include <asm/uaccess.h>
  21. #include <asm/atomic.h>
  22. #include <linux/delay.h>
  23. #include <linux/input.h>
  24. #include <linux/workqueue.h>
  25. #include <linux/kobject.h>
  26. #include <linux/platform_device.h>
  27. #ifdef CONFIG_HAS_EARLYSUSPEND
  28. #include <linux/earlysuspend.h>
  29. #endif
  30. #include <linux/time.h>
  31. #include <linux/hrtimer.h>
  32. #include <linux/module.h>
  33. #include <mag.h>
  34. #include <cust_mag.h>
  35. #include "bmm150.h"
  36. /*----------------------------------------------------------------------------*/
  37. /*
  38. * Enable the driver to block e-compass daemon on suspend
  39. */
  40. #define BMC150_BLOCK_DAEMON_ON_SUSPEND
  41. //#undef BMC150_BLOCK_DAEMON_ON_SUSPEND
  42. /*
  43. * Enable gyroscope feature with BMC150
  44. */
  45. #define BMC150_M4G
  46. #undef BMC150_M4G
  47. /*
  48. * Enable rotation vecter feature with BMC150
  49. */
  50. #define BMC150_VRV
  51. #undef BMC150_VRV
  52. /*
  53. * Enable virtual linear accelerometer feature with BMC150
  54. */
  55. #define BMC150_VLA
  56. #undef BMC150_VLA
  57. /*
  58. * Enable virtual gravity feature with BMC150
  59. */
  60. #define BMC150_VG
  61. #undef BMC150_VG
  62. #ifdef BMC150_M4G
  63. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  64. #define ECOMPASS_IOC_GET_GFLAG _IOR(MSENSOR, 0x30, short)
  65. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  66. #define ECOMPASS_IOC_GET_GDELAY _IOR(MSENSOR, 0x31, int)
  67. #endif //BMC150_M4G
  68. #ifdef BMC150_VRV
  69. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  70. #define ECOMPASS_IOC_GET_VRVFLAG _IOR(MSENSOR, 0x32, short)
  71. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  72. #define ECOMPASS_IOC_GET_VRVDELAY _IOR(MSENSOR, 0x33, int)
  73. #endif //BMC150_VRV
  74. #ifdef BMC150_VLA
  75. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  76. #define ECOMPASS_IOC_GET_VLAFLAG _IOR(MSENSOR, 0x34, short)
  77. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  78. #define ECOMPASS_IOC_GET_VLADELAY _IOR(MSENSOR, 0x35, int)
  79. #endif //BMC150_VLA
  80. #ifdef BMC150_VG
  81. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  82. #define ECOMPASS_IOC_GET_VGFLAG _IOR(MSENSOR, 0x36, short)
  83. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  84. #define ECOMPASS_IOC_GET_VGDELAY _IOR(MSENSOR, 0x37, int)
  85. #endif //BMC150_VG
  86. /*----------------------------------------------------------------------------*/
  87. /* BMM150 API Section */
  88. /*----------------------------------------------------------------------------*/
  89. #define BMM150_U16 unsigned short
  90. #define BMM150_S16 signed short
  91. #define BMM150_S32 signed int
  92. #define BMM150_BUS_WR_RETURN_TYPE char
  93. #define BMM150_BUS_WR_PARAM_TYPES\
  94. unsigned char, unsigned char, unsigned char *, unsigned char
  95. #define BMM150_BUS_WR_PARAM_ORDER\
  96. (device_addr, register_addr, register_data, wr_len)
  97. #define BMM150_BUS_WRITE_FUNC(\
  98. device_addr, register_addr, register_data, wr_len)\
  99. bus_write(device_addr, register_addr, register_data, wr_len)
  100. #define BMM150_BUS_RD_RETURN_TYPE char
  101. #define BMM150_BUS_RD_PARAM_TYPES\
  102. unsigned char, unsigned char, unsigned char *, unsigned char
  103. #define BMM150_BUS_RD_PARAM_ORDER (device_addr, register_addr, register_data)
  104. #define BMM150_BUS_READ_FUNC(device_addr, register_addr, register_data, rd_len)\
  105. bus_read(device_addr, register_addr, register_data, rd_len)
  106. #define BMM150_DELAY_RETURN_TYPE void
  107. #define BMM150_DELAY_PARAM_TYPES unsigned int
  108. #define BMM150_DELAY_FUNC(delay_in_msec)\
  109. delay_func(delay_in_msec)
  110. #define BMM150_DELAY_POWEROFF_SUSPEND 1
  111. #define BMM150_DELAY_SUSPEND_SLEEP 2
  112. #define BMM150_DELAY_SLEEP_ACTIVE 1
  113. #define BMM150_DELAY_ACTIVE_SLEEP 1
  114. #define BMM150_DELAY_SLEEP_SUSPEND 1
  115. #define BMM150_DELAY_ACTIVE_SUSPEND 1
  116. #define BMM150_DELAY_SLEEP_POWEROFF 1
  117. #define BMM150_DELAY_ACTIVE_POWEROFF 1
  118. #define BMM150_DELAY_SETTLING_TIME 2
  119. #define BMM150_RETURN_FUNCTION_TYPE char
  120. #define BMM150_I2C_ADDRESS 0x10
  121. /*General Info datas*/
  122. #define BMM150_SOFT_RESET7_ON 1
  123. #define BMM150_SOFT_RESET1_ON 1
  124. #define BMM150_SOFT_RESET7_OFF 0
  125. #define BMM150_SOFT_RESET1_OFF 0
  126. #define BMM150_DELAY_SOFTRESET 1
  127. /* Fixed Data Registers */
  128. #define BMM150_CHIP_ID 0x40
  129. /* Data Registers */
  130. #define BMM150_DATAX_LSB 0x42
  131. #define BMM150_DATAX_MSB 0x43
  132. #define BMM150_DATAY_LSB 0x44
  133. #define BMM150_DATAY_MSB 0x45
  134. #define BMM150_DATAZ_LSB 0x46
  135. #define BMM150_DATAZ_MSB 0x47
  136. #define BMM150_R_LSB 0x48
  137. #define BMM150_R_MSB 0x49
  138. /* Status Registers */
  139. #define BMM150_INT_STAT 0x4A
  140. /* Control Registers */
  141. #define BMM150_POWER_CNTL 0x4B
  142. #define BMM150_CONTROL 0x4C
  143. #define BMM150_INT_CNTL 0x4D
  144. #define BMM150_SENS_CNTL 0x4E
  145. #define BMM150_LOW_THRES 0x4F
  146. #define BMM150_HIGH_THRES 0x50
  147. #define BMM150_NO_REPETITIONS_XY 0x51
  148. #define BMM150_NO_REPETITIONS_Z 0x52
  149. /* Trim Extended Registers */
  150. #define BMM150_DIG_X1 0x5D
  151. #define BMM150_DIG_Y1 0x5E
  152. #define BMM150_DIG_Z4_LSB 0x62
  153. #define BMM150_DIG_Z4_MSB 0x63
  154. #define BMM150_DIG_X2 0x64
  155. #define BMM150_DIG_Y2 0x65
  156. #define BMM150_DIG_Z2_LSB 0x68
  157. #define BMM150_DIG_Z2_MSB 0x69
  158. #define BMM150_DIG_Z1_LSB 0x6A
  159. #define BMM150_DIG_Z1_MSB 0x6B
  160. #define BMM150_DIG_XYZ1_LSB 0x6C
  161. #define BMM150_DIG_XYZ1_MSB 0x6D
  162. #define BMM150_DIG_Z3_LSB 0x6E
  163. #define BMM150_DIG_Z3_MSB 0x6F
  164. #define BMM150_DIG_XY2 0x70
  165. #define BMM150_DIG_XY1 0x71
  166. /* Data X LSB Regsiter */
  167. #define BMM150_DATAX_LSB_VALUEX__POS 3
  168. #define BMM150_DATAX_LSB_VALUEX__LEN 5
  169. #define BMM150_DATAX_LSB_VALUEX__MSK 0xF8
  170. #define BMM150_DATAX_LSB_VALUEX__REG BMM150_DATAX_LSB
  171. #define BMM150_DATAX_LSB_TESTX__POS 0
  172. #define BMM150_DATAX_LSB_TESTX__LEN 1
  173. #define BMM150_DATAX_LSB_TESTX__MSK 0x01
  174. #define BMM150_DATAX_LSB_TESTX__REG BMM150_DATAX_LSB
  175. /* Data Y LSB Regsiter */
  176. #define BMM150_DATAY_LSB_VALUEY__POS 3
  177. #define BMM150_DATAY_LSB_VALUEY__LEN 5
  178. #define BMM150_DATAY_LSB_VALUEY__MSK 0xF8
  179. #define BMM150_DATAY_LSB_VALUEY__REG BMM150_DATAY_LSB
  180. #define BMM150_DATAY_LSB_TESTY__POS 0
  181. #define BMM150_DATAY_LSB_TESTY__LEN 1
  182. #define BMM150_DATAY_LSB_TESTY__MSK 0x01
  183. #define BMM150_DATAY_LSB_TESTY__REG BMM150_DATAY_LSB
  184. /* Data Z LSB Regsiter */
  185. #define BMM150_DATAZ_LSB_VALUEZ__POS 1
  186. #define BMM150_DATAZ_LSB_VALUEZ__LEN 7
  187. #define BMM150_DATAZ_LSB_VALUEZ__MSK 0xFE
  188. #define BMM150_DATAZ_LSB_VALUEZ__REG BMM150_DATAZ_LSB
  189. #define BMM150_DATAZ_LSB_TESTZ__POS 0
  190. #define BMM150_DATAZ_LSB_TESTZ__LEN 1
  191. #define BMM150_DATAZ_LSB_TESTZ__MSK 0x01
  192. #define BMM150_DATAZ_LSB_TESTZ__REG BMM150_DATAZ_LSB
  193. /* Hall Resistance LSB Regsiter */
  194. #define BMM150_R_LSB_VALUE__POS 2
  195. #define BMM150_R_LSB_VALUE__LEN 6
  196. #define BMM150_R_LSB_VALUE__MSK 0xFC
  197. #define BMM150_R_LSB_VALUE__REG BMM150_R_LSB
  198. #define BMM150_DATA_RDYSTAT__POS 0
  199. #define BMM150_DATA_RDYSTAT__LEN 1
  200. #define BMM150_DATA_RDYSTAT__MSK 0x01
  201. #define BMM150_DATA_RDYSTAT__REG BMM150_R_LSB
  202. /* Interupt Status Register */
  203. #define BMM150_INT_STAT_DOR__POS 7
  204. #define BMM150_INT_STAT_DOR__LEN 1
  205. #define BMM150_INT_STAT_DOR__MSK 0x80
  206. #define BMM150_INT_STAT_DOR__REG BMM150_INT_STAT
  207. #define BMM150_INT_STAT_OVRFLOW__POS 6
  208. #define BMM150_INT_STAT_OVRFLOW__LEN 1
  209. #define BMM150_INT_STAT_OVRFLOW__MSK 0x40
  210. #define BMM150_INT_STAT_OVRFLOW__REG BMM150_INT_STAT
  211. #define BMM150_INT_STAT_HIGH_THZ__POS 5
  212. #define BMM150_INT_STAT_HIGH_THZ__LEN 1
  213. #define BMM150_INT_STAT_HIGH_THZ__MSK 0x20
  214. #define BMM150_INT_STAT_HIGH_THZ__REG BMM150_INT_STAT
  215. #define BMM150_INT_STAT_HIGH_THY__POS 4
  216. #define BMM150_INT_STAT_HIGH_THY__LEN 1
  217. #define BMM150_INT_STAT_HIGH_THY__MSK 0x10
  218. #define BMM150_INT_STAT_HIGH_THY__REG BMM150_INT_STAT
  219. #define BMM150_INT_STAT_HIGH_THX__POS 3
  220. #define BMM150_INT_STAT_HIGH_THX__LEN 1
  221. #define BMM150_INT_STAT_HIGH_THX__MSK 0x08
  222. #define BMM150_INT_STAT_HIGH_THX__REG BMM150_INT_STAT
  223. #define BMM150_INT_STAT_LOW_THZ__POS 2
  224. #define BMM150_INT_STAT_LOW_THZ__LEN 1
  225. #define BMM150_INT_STAT_LOW_THZ__MSK 0x04
  226. #define BMM150_INT_STAT_LOW_THZ__REG BMM150_INT_STAT
  227. #define BMM150_INT_STAT_LOW_THY__POS 1
  228. #define BMM150_INT_STAT_LOW_THY__LEN 1
  229. #define BMM150_INT_STAT_LOW_THY__MSK 0x02
  230. #define BMM150_INT_STAT_LOW_THY__REG BMM150_INT_STAT
  231. #define BMM150_INT_STAT_LOW_THX__POS 0
  232. #define BMM150_INT_STAT_LOW_THX__LEN 1
  233. #define BMM150_INT_STAT_LOW_THX__MSK 0x01
  234. #define BMM150_INT_STAT_LOW_THX__REG BMM150_INT_STAT
  235. /* Power Control Register */
  236. #define BMM150_POWER_CNTL_SRST7__POS 7
  237. #define BMM150_POWER_CNTL_SRST7__LEN 1
  238. #define BMM150_POWER_CNTL_SRST7__MSK 0x80
  239. #define BMM150_POWER_CNTL_SRST7__REG BMM150_POWER_CNTL
  240. #define BMM150_POWER_CNTL_SPI3_EN__POS 2
  241. #define BMM150_POWER_CNTL_SPI3_EN__LEN 1
  242. #define BMM150_POWER_CNTL_SPI3_EN__MSK 0x04
  243. #define BMM150_POWER_CNTL_SPI3_EN__REG BMM150_POWER_CNTL
  244. #define BMM150_POWER_CNTL_SRST1__POS 1
  245. #define BMM150_POWER_CNTL_SRST1__LEN 1
  246. #define BMM150_POWER_CNTL_SRST1__MSK 0x02
  247. #define BMM150_POWER_CNTL_SRST1__REG BMM150_POWER_CNTL
  248. #define BMM150_POWER_CNTL_PCB__POS 0
  249. #define BMM150_POWER_CNTL_PCB__LEN 1
  250. #define BMM150_POWER_CNTL_PCB__MSK 0x01
  251. #define BMM150_POWER_CNTL_PCB__REG BMM150_POWER_CNTL
  252. /* Control Register */
  253. #define BMM150_CNTL_ADV_ST__POS 6
  254. #define BMM150_CNTL_ADV_ST__LEN 2
  255. #define BMM150_CNTL_ADV_ST__MSK 0xC0
  256. #define BMM150_CNTL_ADV_ST__REG BMM150_CONTROL
  257. #define BMM150_CNTL_DR__POS 3
  258. #define BMM150_CNTL_DR__LEN 3
  259. #define BMM150_CNTL_DR__MSK 0x38
  260. #define BMM150_CNTL_DR__REG BMM150_CONTROL
  261. #define BMM150_CNTL_OPMODE__POS 1
  262. #define BMM150_CNTL_OPMODE__LEN 2
  263. #define BMM150_CNTL_OPMODE__MSK 0x06
  264. #define BMM150_CNTL_OPMODE__REG BMM150_CONTROL
  265. #define BMM150_CNTL_S_TEST__POS 0
  266. #define BMM150_CNTL_S_TEST__LEN 1
  267. #define BMM150_CNTL_S_TEST__MSK 0x01
  268. #define BMM150_CNTL_S_TEST__REG BMM150_CONTROL
  269. /* Interupt Control Register */
  270. #define BMM150_INT_CNTL_DOR_EN__POS 7
  271. #define BMM150_INT_CNTL_DOR_EN__LEN 1
  272. #define BMM150_INT_CNTL_DOR_EN__MSK 0x80
  273. #define BMM150_INT_CNTL_DOR_EN__REG BMM150_INT_CNTL
  274. #define BMM150_INT_CNTL_OVRFLOW_EN__POS 6
  275. #define BMM150_INT_CNTL_OVRFLOW_EN__LEN 1
  276. #define BMM150_INT_CNTL_OVRFLOW_EN__MSK 0x40
  277. #define BMM150_INT_CNTL_OVRFLOW_EN__REG BMM150_INT_CNTL
  278. #define BMM150_INT_CNTL_HIGH_THZ_EN__POS 5
  279. #define BMM150_INT_CNTL_HIGH_THZ_EN__LEN 1
  280. #define BMM150_INT_CNTL_HIGH_THZ_EN__MSK 0x20
  281. #define BMM150_INT_CNTL_HIGH_THZ_EN__REG BMM150_INT_CNTL
  282. #define BMM150_INT_CNTL_HIGH_THY_EN__POS 4
  283. #define BMM150_INT_CNTL_HIGH_THY_EN__LEN 1
  284. #define BMM150_INT_CNTL_HIGH_THY_EN__MSK 0x10
  285. #define BMM150_INT_CNTL_HIGH_THY_EN__REG BMM150_INT_CNTL
  286. #define BMM150_INT_CNTL_HIGH_THX_EN__POS 3
  287. #define BMM150_INT_CNTL_HIGH_THX_EN__LEN 1
  288. #define BMM150_INT_CNTL_HIGH_THX_EN__MSK 0x08
  289. #define BMM150_INT_CNTL_HIGH_THX_EN__REG BMM150_INT_CNTL
  290. #define BMM150_INT_CNTL_LOW_THZ_EN__POS 2
  291. #define BMM150_INT_CNTL_LOW_THZ_EN__LEN 1
  292. #define BMM150_INT_CNTL_LOW_THZ_EN__MSK 0x04
  293. #define BMM150_INT_CNTL_LOW_THZ_EN__REG BMM150_INT_CNTL
  294. #define BMM150_INT_CNTL_LOW_THY_EN__POS 1
  295. #define BMM150_INT_CNTL_LOW_THY_EN__LEN 1
  296. #define BMM150_INT_CNTL_LOW_THY_EN__MSK 0x02
  297. #define BMM150_INT_CNTL_LOW_THY_EN__REG BMM150_INT_CNTL
  298. #define BMM150_INT_CNTL_LOW_THX_EN__POS 0
  299. #define BMM150_INT_CNTL_LOW_THX_EN__LEN 1
  300. #define BMM150_INT_CNTL_LOW_THX_EN__MSK 0x01
  301. #define BMM150_INT_CNTL_LOW_THX_EN__REG BMM150_INT_CNTL
  302. /* Sensor Control Register */
  303. #define BMM150_SENS_CNTL_DRDY_EN__POS 7
  304. #define BMM150_SENS_CNTL_DRDY_EN__LEN 1
  305. #define BMM150_SENS_CNTL_DRDY_EN__MSK 0x80
  306. #define BMM150_SENS_CNTL_DRDY_EN__REG BMM150_SENS_CNTL
  307. #define BMM150_SENS_CNTL_IE__POS 6
  308. #define BMM150_SENS_CNTL_IE__LEN 1
  309. #define BMM150_SENS_CNTL_IE__MSK 0x40
  310. #define BMM150_SENS_CNTL_IE__REG BMM150_SENS_CNTL
  311. #define BMM150_SENS_CNTL_CHANNELZ__POS 5
  312. #define BMM150_SENS_CNTL_CHANNELZ__LEN 1
  313. #define BMM150_SENS_CNTL_CHANNELZ__MSK 0x20
  314. #define BMM150_SENS_CNTL_CHANNELZ__REG BMM150_SENS_CNTL
  315. #define BMM150_SENS_CNTL_CHANNELY__POS 4
  316. #define BMM150_SENS_CNTL_CHANNELY__LEN 1
  317. #define BMM150_SENS_CNTL_CHANNELY__MSK 0x10
  318. #define BMM150_SENS_CNTL_CHANNELY__REG BMM150_SENS_CNTL
  319. #define BMM150_SENS_CNTL_CHANNELX__POS 3
  320. #define BMM150_SENS_CNTL_CHANNELX__LEN 1
  321. #define BMM150_SENS_CNTL_CHANNELX__MSK 0x08
  322. #define BMM150_SENS_CNTL_CHANNELX__REG BMM150_SENS_CNTL
  323. #define BMM150_SENS_CNTL_DR_POLARITY__POS 2
  324. #define BMM150_SENS_CNTL_DR_POLARITY__LEN 1
  325. #define BMM150_SENS_CNTL_DR_POLARITY__MSK 0x04
  326. #define BMM150_SENS_CNTL_DR_POLARITY__REG BMM150_SENS_CNTL
  327. #define BMM150_SENS_CNTL_INTERRUPT_LATCH__POS 1
  328. #define BMM150_SENS_CNTL_INTERRUPT_LATCH__LEN 1
  329. #define BMM150_SENS_CNTL_INTERRUPT_LATCH__MSK 0x02
  330. #define BMM150_SENS_CNTL_INTERRUPT_LATCH__REG BMM150_SENS_CNTL
  331. #define BMM150_SENS_CNTL_INTERRUPT_POLARITY__POS 0
  332. #define BMM150_SENS_CNTL_INTERRUPT_POLARITY__LEN 1
  333. #define BMM150_SENS_CNTL_INTERRUPT_POLARITY__MSK 0x01
  334. #define BMM150_SENS_CNTL_INTERRUPT_POLARITY__REG BMM150_SENS_CNTL
  335. /* Register 6D */
  336. #define BMM150_DIG_XYZ1_MSB__POS 0
  337. #define BMM150_DIG_XYZ1_MSB__LEN 7
  338. #define BMM150_DIG_XYZ1_MSB__MSK 0x7F
  339. #define BMM150_DIG_XYZ1_MSB__REG BMM150_DIG_XYZ1_MSB
  340. #define BMM150_X_AXIS 0
  341. #define BMM150_Y_AXIS 1
  342. #define BMM150_Z_AXIS 2
  343. #define BMM150_RESISTANCE 3
  344. #define BMM150_X 1
  345. #define BMM150_Y 2
  346. #define BMM150_Z 4
  347. #define BMM150_XYZ 7
  348. /* Constants */
  349. #define BMM150_NULL 0
  350. #define BMM150_DISABLE 0
  351. #define BMM150_ENABLE 1
  352. #define BMM150_CHANNEL_DISABLE 1
  353. #define BMM150_CHANNEL_ENABLE 0
  354. #define BMM150_INTPIN_LATCH_ENABLE 1
  355. #define BMM150_INTPIN_LATCH_DISABLE 0
  356. #define BMM150_OFF 0
  357. #define BMM150_ON 1
  358. #define BMM150_NORMAL_MODE 0x00
  359. #define BMM150_FORCED_MODE 0x01
  360. #define BMM150_SUSPEND_MODE 0x02
  361. #define BMM150_SLEEP_MODE 0x03
  362. #define BMM150_ADVANCED_SELFTEST_OFF 0
  363. #define BMM150_ADVANCED_SELFTEST_NEGATIVE 2
  364. #define BMM150_ADVANCED_SELFTEST_POSITIVE 3
  365. #define BMM150_NEGATIVE_SATURATION_Z -32767
  366. #define BMM150_POSITIVE_SATURATION_Z 32767
  367. #define BMM150_SPI_RD_MASK 0x80
  368. #define BMM150_READ_SET 0x01
  369. #define E_BMM150_NULL_PTR ((char)-127)
  370. #define E_BMM150_COMM_RES ((char)-1)
  371. #define E_BMM150_OUT_OF_RANGE ((char)-2)
  372. #define E_BMM150_UNDEFINED_MODE 0
  373. #define BMM150_WR_FUNC_PTR\
  374. char (*bus_write)(unsigned char, unsigned char,\
  375. unsigned char *, unsigned char)
  376. #define BMM150_RD_FUNC_PTR\
  377. char (*bus_read)(unsigned char, unsigned char,\
  378. unsigned char *, unsigned char)
  379. #define BMM150_MDELAY_DATA_TYPE unsigned int
  380. /*Shifting Constants*/
  381. #define SHIFT_RIGHT_1_POSITION 1
  382. #define SHIFT_RIGHT_2_POSITION 2
  383. #define SHIFT_RIGHT_3_POSITION 3
  384. #define SHIFT_RIGHT_4_POSITION 4
  385. #define SHIFT_RIGHT_5_POSITION 5
  386. #define SHIFT_RIGHT_6_POSITION 6
  387. #define SHIFT_RIGHT_7_POSITION 7
  388. #define SHIFT_RIGHT_8_POSITION 8
  389. #define SHIFT_LEFT_1_POSITION 1
  390. #define SHIFT_LEFT_2_POSITION 2
  391. #define SHIFT_LEFT_3_POSITION 3
  392. #define SHIFT_LEFT_4_POSITION 4
  393. #define SHIFT_LEFT_5_POSITION 5
  394. #define SHIFT_LEFT_6_POSITION 6
  395. #define SHIFT_LEFT_7_POSITION 7
  396. #define SHIFT_LEFT_8_POSITION 8
  397. /* Conversion factors*/
  398. #define BMM150_CONVFACTOR_LSB_UT 6
  399. /* get bit slice */
  400. #define BMM150_GET_BITSLICE(regvar, bitname)\
  401. ((regvar & bitname##__MSK) >> bitname##__POS)
  402. /* Set bit slice */
  403. #define BMM150_SET_BITSLICE(regvar, bitname, val)\
  404. ((regvar & ~bitname##__MSK) | ((val<<bitname##__POS)&bitname##__MSK))
  405. /* compensated output value returned if sensor had overflow */
  406. #define BMM150_OVERFLOW_OUTPUT -32768
  407. #define BMM150_OVERFLOW_OUTPUT_S32 ((BMM150_S32)(-2147483647-1))
  408. #define BMM150_OVERFLOW_OUTPUT_FLOAT 0.0f
  409. #define BMM150_FLIP_OVERFLOW_ADCVAL -4096
  410. #define BMM150_HALL_OVERFLOW_ADCVAL -16384
  411. #define BMM150_PRESETMODE_LOWPOWER 1
  412. #define BMM150_PRESETMODE_REGULAR 2
  413. #define BMM150_PRESETMODE_HIGHACCURACY 3
  414. #define BMM150_PRESETMODE_ENHANCED 4
  415. /* PRESET MODES - DATA RATES */
  416. #define BMM150_LOWPOWER_DR BMM150_DR_10HZ
  417. #define BMM150_REGULAR_DR BMM150_DR_10HZ
  418. #define BMM150_HIGHACCURACY_DR BMM150_DR_20HZ
  419. #define BMM150_ENHANCED_DR BMM150_DR_10HZ
  420. /* PRESET MODES - REPETITIONS-XY RATES */
  421. #define BMM150_LOWPOWER_REPXY 1
  422. #define BMM150_REGULAR_REPXY 4
  423. #define BMM150_HIGHACCURACY_REPXY 23
  424. #define BMM150_ENHANCED_REPXY 7
  425. /* PRESET MODES - REPETITIONS-Z RATES */
  426. #define BMM150_LOWPOWER_REPZ 2
  427. #define BMM150_REGULAR_REPZ 15
  428. #define BMM150_HIGHACCURACY_REPZ 82
  429. #define BMM150_ENHANCED_REPZ 26
  430. /* Data Rates */
  431. #define BMM150_DR_10HZ 0
  432. #define BMM150_DR_02HZ 1
  433. #define BMM150_DR_06HZ 2
  434. #define BMM150_DR_08HZ 3
  435. #define BMM150_DR_15HZ 4
  436. #define BMM150_DR_20HZ 5
  437. #define BMM150_DR_25HZ 6
  438. #define BMM150_DR_30HZ 7
  439. /*user defined Structures*/
  440. struct bmm150api_mdata {
  441. BMM150_S16 datax;
  442. BMM150_S16 datay;
  443. BMM150_S16 dataz;
  444. BMM150_U16 resistance;
  445. };
  446. struct bmm150api_mdata_s32 {
  447. BMM150_S32 datax;
  448. BMM150_S32 datay;
  449. BMM150_S32 dataz;
  450. BMM150_U16 resistance;
  451. };
  452. struct bmm150api_mdata_float {
  453. float datax;
  454. float datay;
  455. float dataz;
  456. BMM150_U16 resistance;
  457. };
  458. struct bmm150api {
  459. unsigned char company_id;
  460. unsigned char dev_addr;
  461. BMM150_WR_FUNC_PTR;
  462. BMM150_RD_FUNC_PTR;
  463. void(*delay_msec)(BMM150_MDELAY_DATA_TYPE);
  464. signed char dig_x1;
  465. signed char dig_y1;
  466. signed char dig_x2;
  467. signed char dig_y2;
  468. BMM150_U16 dig_z1;
  469. BMM150_S16 dig_z2;
  470. BMM150_S16 dig_z3;
  471. BMM150_S16 dig_z4;
  472. unsigned char dig_xy1;
  473. signed char dig_xy2;
  474. BMM150_U16 dig_xyz1;
  475. };
  476. BMM150_RETURN_FUNCTION_TYPE bmm150api_init(struct bmm150api *p_bmm150);
  477. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_mdataXYZ(
  478. struct bmm150api_mdata *mdata);
  479. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_mdataXYZ_s32(
  480. struct bmm150api_mdata_s32 *mdata);
  481. #ifdef ENABLE_FLOAT
  482. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_mdataXYZ_float(
  483. struct bmm150api_mdata_float *mdata);
  484. #endif
  485. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_register(
  486. unsigned char addr, unsigned char *data, unsigned char len);
  487. BMM150_RETURN_FUNCTION_TYPE bmm150api_write_register(
  488. unsigned char addr, unsigned char *data, unsigned char len);
  489. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_self_test_XYZ(
  490. unsigned char *self_testxyz);
  491. BMM150_S16 bmm150api_compensate_X(
  492. BMM150_S16 mdata_x, BMM150_U16 data_R);
  493. BMM150_S32 bmm150api_compensate_X_s32(
  494. BMM150_S16 mdata_x, BMM150_U16 data_R);
  495. #ifdef ENABLE_FLOAT
  496. float bmm150api_compensate_X_float(
  497. BMM150_S16 mdata_x, BMM150_U16 data_R);
  498. #endif
  499. BMM150_S16 bmm150api_compensate_Y(
  500. BMM150_S16 mdata_y, BMM150_U16 data_R);
  501. BMM150_S32 bmm150api_compensate_Y_s32(
  502. BMM150_S16 mdata_y, BMM150_U16 data_R);
  503. #ifdef ENABLE_FLOAT
  504. float bmm150api_compensate_Y_float(
  505. BMM150_S16 mdata_y, BMM150_U16 data_R);
  506. #endif
  507. BMM150_S16 bmm150api_compensate_Z(
  508. BMM150_S16 mdata_z, BMM150_U16 data_R);
  509. BMM150_S32 bmm150api_compensate_Z_s32(
  510. BMM150_S16 mdata_z, BMM150_U16 data_R);
  511. #ifdef ENABLE_FLOAT
  512. float bmm150api_compensate_Z_float(
  513. BMM150_S16 mdata_z, BMM150_U16 data_R);
  514. #endif
  515. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_raw_xyz(
  516. struct bmm150api_mdata *mdata);
  517. BMM150_RETURN_FUNCTION_TYPE bmm150api_init_trim_registers(void);
  518. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_spi3(
  519. unsigned char value);
  520. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_powermode(
  521. unsigned char *mode);
  522. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_powermode(
  523. unsigned char mode);
  524. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_adv_selftest(
  525. unsigned char adv_selftest);
  526. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_adv_selftest(
  527. unsigned char *adv_selftest);
  528. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_datarate(
  529. unsigned char data_rate);
  530. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_datarate(
  531. unsigned char *data_rate);
  532. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_functional_state(
  533. unsigned char functional_state);
  534. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_functional_state(
  535. unsigned char *functional_state);
  536. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_selftest(
  537. unsigned char selftest);
  538. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_selftest(
  539. unsigned char *selftest);
  540. BMM150_RETURN_FUNCTION_TYPE bmm150api_perform_advanced_selftest(
  541. BMM150_S16 *diff_z);
  542. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_repetitions_XY(
  543. unsigned char *no_repetitions_xy);
  544. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_repetitions_XY(
  545. unsigned char no_repetitions_xy);
  546. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_repetitions_Z(
  547. unsigned char *no_repetitions_z);
  548. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_repetitions_Z(
  549. unsigned char no_repetitions_z);
  550. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_presetmode(unsigned char *mode);
  551. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_presetmode(unsigned char mode);
  552. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_control_measurement_x(
  553. unsigned char enable_disable);
  554. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_control_measurement_y(
  555. unsigned char enable_disable);
  556. BMM150_RETURN_FUNCTION_TYPE bmm150api_soft_reset(void);
  557. static struct bmm150api *p_bmm150;
  558. BMM150_RETURN_FUNCTION_TYPE bmm150api_init(struct bmm150api *bmm150)
  559. {
  560. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  561. unsigned char a_data_u8r[2];
  562. p_bmm150 = bmm150;
  563. p_bmm150->dev_addr = BMM150_I2C_ADDRESS;
  564. /* set device from suspend into sleep mode */
  565. bmm150api_set_powermode(BMM150_ON);
  566. /* wait two millisecond for bmc to settle */
  567. p_bmm150->delay_msec(BMM150_DELAY_SETTLING_TIME);
  568. /*Read CHIP_ID and REv. info */
  569. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  570. BMM150_CHIP_ID, a_data_u8r, 1);
  571. p_bmm150->company_id = a_data_u8r[0];
  572. /* Function to initialise trim values */
  573. bmm150api_init_trim_registers();
  574. bmm150api_set_presetmode(BMM150_PRESETMODE_REGULAR);
  575. return comres;
  576. }
  577. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_presetmode(unsigned char mode)
  578. {
  579. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  580. switch (mode) {
  581. case BMM150_PRESETMODE_LOWPOWER:
  582. /* Set the data rate for Low Power mode */
  583. comres = bmm150api_set_datarate(BMM150_LOWPOWER_DR);
  584. /* Set the XY-repetitions number for Low Power mode */
  585. comres |= bmm150api_set_repetitions_XY(BMM150_LOWPOWER_REPXY);
  586. /* Set the Z-repetitions number for Low Power mode */
  587. comres |= bmm150api_set_repetitions_Z(BMM150_LOWPOWER_REPZ);
  588. break;
  589. case BMM150_PRESETMODE_REGULAR:
  590. /* Set the data rate for Regular mode */
  591. comres = bmm150api_set_datarate(BMM150_REGULAR_DR);
  592. /* Set the XY-repetitions number for Regular mode */
  593. comres |= bmm150api_set_repetitions_XY(BMM150_REGULAR_REPXY);
  594. /* Set the Z-repetitions number for Regular mode */
  595. comres |= bmm150api_set_repetitions_Z(BMM150_REGULAR_REPZ);
  596. break;
  597. case BMM150_PRESETMODE_HIGHACCURACY:
  598. /* Set the data rate for High Accuracy mode */
  599. comres = bmm150api_set_datarate(BMM150_HIGHACCURACY_DR);
  600. /* Set the XY-repetitions number for High Accuracy mode */
  601. comres |= bmm150api_set_repetitions_XY(BMM150_HIGHACCURACY_REPXY);
  602. /* Set the Z-repetitions number for High Accuracyr mode */
  603. comres |= bmm150api_set_repetitions_Z(BMM150_HIGHACCURACY_REPZ);
  604. break;
  605. case BMM150_PRESETMODE_ENHANCED:
  606. /* Set the data rate for Enhanced Accuracy mode */
  607. comres = bmm150api_set_datarate(BMM150_ENHANCED_DR);
  608. /* Set the XY-repetitions number for High Enhanced mode */
  609. comres |= bmm150api_set_repetitions_XY(BMM150_ENHANCED_REPXY);
  610. /* Set the Z-repetitions number for High Enhanced mode */
  611. comres |= bmm150api_set_repetitions_Z(BMM150_ENHANCED_REPZ);
  612. break;
  613. default:
  614. comres = E_BMM150_OUT_OF_RANGE;
  615. break;
  616. }
  617. return comres;
  618. }
  619. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_functional_state(
  620. unsigned char functional_state)
  621. {
  622. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  623. unsigned char v_data1_u8r;
  624. if (p_bmm150 == BMM150_NULL) {
  625. comres = E_BMM150_NULL_PTR;
  626. } else {
  627. switch (functional_state) {
  628. case BMM150_NORMAL_MODE:
  629. comres = bmm150api_get_powermode(&v_data1_u8r);
  630. if (v_data1_u8r == BMM150_OFF) {
  631. comres |= bmm150api_set_powermode(BMM150_ON);
  632. p_bmm150->delay_msec(
  633. BMM150_DELAY_SUSPEND_SLEEP);
  634. }
  635. {
  636. comres |= p_bmm150->BMM150_BUS_READ_FUNC(
  637. p_bmm150->dev_addr,
  638. BMM150_CNTL_OPMODE__REG,
  639. &v_data1_u8r, 1);
  640. v_data1_u8r = BMM150_SET_BITSLICE(
  641. v_data1_u8r,
  642. BMM150_CNTL_OPMODE,
  643. BMM150_NORMAL_MODE);
  644. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  645. p_bmm150->dev_addr,
  646. BMM150_CNTL_OPMODE__REG,
  647. &v_data1_u8r, 1);
  648. }
  649. break;
  650. case BMM150_SUSPEND_MODE:
  651. comres = bmm150api_set_powermode(BMM150_OFF);
  652. break;
  653. case BMM150_FORCED_MODE:
  654. comres = bmm150api_get_powermode(&v_data1_u8r);
  655. if (v_data1_u8r == BMM150_OFF) {
  656. comres = bmm150api_set_powermode(BMM150_ON);
  657. p_bmm150->delay_msec(
  658. BMM150_DELAY_SUSPEND_SLEEP);
  659. }
  660. comres |= p_bmm150->BMM150_BUS_READ_FUNC(
  661. p_bmm150->dev_addr,
  662. BMM150_CNTL_OPMODE__REG,
  663. &v_data1_u8r, 1);
  664. v_data1_u8r = BMM150_SET_BITSLICE(
  665. v_data1_u8r,
  666. BMM150_CNTL_OPMODE, BMM150_ON);
  667. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  668. p_bmm150->dev_addr,
  669. BMM150_CNTL_OPMODE__REG,
  670. &v_data1_u8r, 1);
  671. break;
  672. case BMM150_SLEEP_MODE:
  673. bmm150api_get_powermode(&v_data1_u8r);
  674. if (v_data1_u8r == BMM150_OFF) {
  675. comres = bmm150api_set_powermode(BMM150_ON);
  676. p_bmm150->delay_msec(
  677. BMM150_DELAY_SUSPEND_SLEEP);
  678. }
  679. comres |= p_bmm150->BMM150_BUS_READ_FUNC(
  680. p_bmm150->dev_addr,
  681. BMM150_CNTL_OPMODE__REG,
  682. &v_data1_u8r, 1);
  683. v_data1_u8r = BMM150_SET_BITSLICE(
  684. v_data1_u8r,
  685. BMM150_CNTL_OPMODE,
  686. BMM150_SLEEP_MODE);
  687. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  688. p_bmm150->dev_addr,
  689. BMM150_CNTL_OPMODE__REG,
  690. &v_data1_u8r, 1);
  691. break;
  692. default:
  693. comres = E_BMM150_OUT_OF_RANGE;
  694. break;
  695. }
  696. }
  697. return comres;
  698. }
  699. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_functional_state(
  700. unsigned char *functional_state)
  701. {
  702. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  703. unsigned char v_data_u8r;
  704. if (p_bmm150 == BMM150_NULL) {
  705. comres = E_BMM150_NULL_PTR;
  706. } else {
  707. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  708. p_bmm150->dev_addr,
  709. BMM150_CNTL_OPMODE__REG,
  710. &v_data_u8r, 1);
  711. *functional_state = BMM150_GET_BITSLICE(
  712. v_data_u8r, BMM150_CNTL_OPMODE);
  713. }
  714. return comres;
  715. }
  716. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_mdataXYZ(struct bmm150api_mdata *mdata)
  717. {
  718. BMM150_RETURN_FUNCTION_TYPE comres;
  719. unsigned char a_data_u8r[8];
  720. struct {
  721. BMM150_S16 raw_dataX;
  722. BMM150_S16 raw_dataY;
  723. BMM150_S16 raw_dataZ;
  724. BMM150_U16 raw_dataR;
  725. } raw_dataXYZ;
  726. if (p_bmm150 == BMM150_NULL) {
  727. comres = E_BMM150_NULL_PTR;
  728. } else {
  729. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  730. BMM150_DATAX_LSB, a_data_u8r, 8);
  731. /* Reading data for X axis */
  732. a_data_u8r[0] = BMM150_GET_BITSLICE(a_data_u8r[0],
  733. BMM150_DATAX_LSB_VALUEX);
  734. raw_dataXYZ.raw_dataX = (BMM150_S16)((((BMM150_S16)
  735. ((signed char)a_data_u8r[1])) <<
  736. SHIFT_LEFT_5_POSITION) | a_data_u8r[0]);
  737. /* Reading data for Y axis */
  738. a_data_u8r[2] = BMM150_GET_BITSLICE(a_data_u8r[2],
  739. BMM150_DATAY_LSB_VALUEY);
  740. raw_dataXYZ.raw_dataY = (BMM150_S16)((((BMM150_S16)
  741. ((signed char)a_data_u8r[3])) <<
  742. SHIFT_LEFT_5_POSITION) | a_data_u8r[2]);
  743. /* Reading data for Z axis */
  744. a_data_u8r[4] = BMM150_GET_BITSLICE(a_data_u8r[4],
  745. BMM150_DATAZ_LSB_VALUEZ);
  746. raw_dataXYZ.raw_dataZ = (BMM150_S16)((((BMM150_S16)
  747. ((signed char)a_data_u8r[5])) <<
  748. SHIFT_LEFT_7_POSITION) | a_data_u8r[4]);
  749. /* Reading data for Resistance*/
  750. a_data_u8r[6] = BMM150_GET_BITSLICE(a_data_u8r[6],
  751. BMM150_R_LSB_VALUE);
  752. raw_dataXYZ.raw_dataR = (BMM150_U16)((((BMM150_U16)
  753. a_data_u8r[7]) <<
  754. SHIFT_LEFT_6_POSITION) | a_data_u8r[6]);
  755. /* Compensation for X axis */
  756. mdata->datax = bmm150api_compensate_X(raw_dataXYZ.raw_dataX,
  757. raw_dataXYZ.raw_dataR);
  758. /* Compensation for Y axis */
  759. mdata->datay = bmm150api_compensate_Y(raw_dataXYZ.raw_dataY,
  760. raw_dataXYZ.raw_dataR);
  761. /* Compensation for Z axis */
  762. mdata->dataz = bmm150api_compensate_Z(raw_dataXYZ.raw_dataZ,
  763. raw_dataXYZ.raw_dataR);
  764. /* Output raw resistance value */
  765. mdata->resistance = raw_dataXYZ.raw_dataR;
  766. }
  767. return comres;
  768. }
  769. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_mdataXYZ_s32(
  770. struct bmm150api_mdata_s32 *mdata)
  771. {
  772. BMM150_RETURN_FUNCTION_TYPE comres;
  773. unsigned char a_data_u8r[8];
  774. struct {
  775. BMM150_S16 raw_dataX;
  776. BMM150_S16 raw_dataY;
  777. BMM150_S16 raw_dataZ;
  778. BMM150_U16 raw_dataR;
  779. } raw_dataXYZ;
  780. if (p_bmm150 == BMM150_NULL) {
  781. comres = E_BMM150_NULL_PTR;
  782. } else {
  783. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  784. BMM150_DATAX_LSB, a_data_u8r, 8);
  785. /* Reading data for X axis */
  786. a_data_u8r[0] = BMM150_GET_BITSLICE(a_data_u8r[0],
  787. BMM150_DATAX_LSB_VALUEX);
  788. raw_dataXYZ.raw_dataX = (BMM150_S16)((((BMM150_S16)
  789. ((signed char)a_data_u8r[1])) <<
  790. SHIFT_LEFT_5_POSITION) | a_data_u8r[0]);
  791. /* Reading data for Y axis */
  792. a_data_u8r[2] = BMM150_GET_BITSLICE(a_data_u8r[2],
  793. BMM150_DATAY_LSB_VALUEY);
  794. raw_dataXYZ.raw_dataY = (BMM150_S16)((((BMM150_S16)
  795. ((signed char)a_data_u8r[3])) <<
  796. SHIFT_LEFT_5_POSITION) | a_data_u8r[2]);
  797. /* Reading data for Z axis */
  798. a_data_u8r[4] = BMM150_GET_BITSLICE(a_data_u8r[4],
  799. BMM150_DATAZ_LSB_VALUEZ);
  800. raw_dataXYZ.raw_dataZ = (BMM150_S16)((((BMM150_S16)
  801. ((signed char)a_data_u8r[5])) <<
  802. SHIFT_LEFT_7_POSITION) | a_data_u8r[4]);
  803. /* Reading data for Resistance*/
  804. a_data_u8r[6] = BMM150_GET_BITSLICE(a_data_u8r[6],
  805. BMM150_R_LSB_VALUE);
  806. raw_dataXYZ.raw_dataR = (BMM150_U16)((((BMM150_U16)
  807. a_data_u8r[7]) <<
  808. SHIFT_LEFT_6_POSITION) | a_data_u8r[6]);
  809. /* Compensation for X axis */
  810. mdata->datax = bmm150api_compensate_X_s32(raw_dataXYZ.raw_dataX,
  811. raw_dataXYZ.raw_dataR);
  812. /* Compensation for Y axis */
  813. mdata->datay = bmm150api_compensate_Y_s32(raw_dataXYZ.raw_dataY,
  814. raw_dataXYZ.raw_dataR);
  815. /* Compensation for Z axis */
  816. mdata->dataz = bmm150api_compensate_Z_s32(raw_dataXYZ.raw_dataZ,
  817. raw_dataXYZ.raw_dataR);
  818. /* Output raw resistance value */
  819. mdata->resistance = raw_dataXYZ.raw_dataR;
  820. }
  821. return comres;
  822. }
  823. #ifdef ENABLE_FLOAT
  824. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_mdataXYZ_float(
  825. struct bmm150api_mdata_float *mdata)
  826. {
  827. BMM150_RETURN_FUNCTION_TYPE comres;
  828. unsigned char a_data_u8r[8];
  829. struct {
  830. BMM150_S16 raw_dataX;
  831. BMM150_S16 raw_dataY;
  832. BMM150_S16 raw_dataZ;
  833. BMM150_U16 raw_dataR;
  834. } raw_dataXYZ;
  835. if (p_bmm150 == BMM150_NULL) {
  836. comres = E_BMM150_NULL_PTR;
  837. } else {
  838. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  839. BMM150_DATAX_LSB, a_data_u8r, 8);
  840. /* Reading data for X axis */
  841. a_data_u8r[0] = BMM150_GET_BITSLICE(a_data_u8r[0],
  842. BMM150_DATAX_LSB_VALUEX);
  843. raw_dataXYZ.raw_dataX = (BMM150_S16)((((BMM150_S16)
  844. ((signed char)a_data_u8r[1])) <<
  845. SHIFT_LEFT_5_POSITION) | a_data_u8r[0]);
  846. /* Reading data for Y axis */
  847. a_data_u8r[2] = BMM150_GET_BITSLICE(a_data_u8r[2],
  848. BMM150_DATAY_LSB_VALUEY);
  849. raw_dataXYZ.raw_dataY = (BMM150_S16)((((BMM150_S16)
  850. ((signed char)a_data_u8r[3])) <<
  851. SHIFT_LEFT_5_POSITION) | a_data_u8r[2]);
  852. /* Reading data for Z axis */
  853. a_data_u8r[4] = BMM150_GET_BITSLICE(a_data_u8r[4],
  854. BMM150_DATAZ_LSB_VALUEZ);
  855. raw_dataXYZ.raw_dataZ = (BMM150_S16)((((BMM150_S16)
  856. ((signed char)a_data_u8r[5])) <<
  857. SHIFT_LEFT_7_POSITION) | a_data_u8r[4]);
  858. /* Reading data for Resistance*/
  859. a_data_u8r[6] = BMM150_GET_BITSLICE(a_data_u8r[6],
  860. BMM150_R_LSB_VALUE);
  861. raw_dataXYZ.raw_dataR = (BMM150_U16)((((BMM150_U16)
  862. a_data_u8r[7]) <<
  863. SHIFT_LEFT_6_POSITION) | a_data_u8r[6]);
  864. /* Compensation for X axis */
  865. mdata->datax = bmm150api_compensate_X_float(raw_dataXYZ.raw_dataX,
  866. raw_dataXYZ.raw_dataR);
  867. /* Compensation for Y axis */
  868. mdata->datay = bmm150api_compensate_Y_float(raw_dataXYZ.raw_dataY,
  869. raw_dataXYZ.raw_dataR);
  870. /* Compensation for Z axis */
  871. mdata->dataz = bmm150api_compensate_Z_float(raw_dataXYZ.raw_dataZ,
  872. raw_dataXYZ.raw_dataR);
  873. /* Output raw resistance value */
  874. mdata->resistance = raw_dataXYZ.raw_dataR;
  875. }
  876. return comres;
  877. }
  878. #endif
  879. BMM150_RETURN_FUNCTION_TYPE bmm150api_read_register(unsigned char addr,
  880. unsigned char *data, unsigned char len)
  881. {
  882. BMM150_RETURN_FUNCTION_TYPE comres;
  883. if (p_bmm150 == BMM150_NULL) {
  884. comres = E_BMM150_NULL_PTR;
  885. } else {
  886. comres += p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  887. addr, data, len);
  888. }
  889. return comres;
  890. }
  891. BMM150_RETURN_FUNCTION_TYPE bmm150api_write_register(unsigned char addr,
  892. unsigned char *data, unsigned char len)
  893. {
  894. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  895. if (p_bmm150 == BMM150_NULL) {
  896. comres = E_BMM150_NULL_PTR;
  897. } else {
  898. comres = p_bmm150->BMM150_BUS_WRITE_FUNC(p_bmm150->dev_addr,
  899. addr, data, len);
  900. }
  901. return comres;
  902. }
  903. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_selftest(unsigned char selftest)
  904. {
  905. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  906. unsigned char v_data1_u8r;
  907. if (p_bmm150 == BMM150_NULL) {
  908. comres = E_BMM150_NULL_PTR;
  909. } else {
  910. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  911. p_bmm150->dev_addr, BMM150_CNTL_S_TEST__REG,
  912. &v_data1_u8r, 1);
  913. v_data1_u8r = BMM150_SET_BITSLICE(
  914. v_data1_u8r, BMM150_CNTL_S_TEST, selftest);
  915. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  916. p_bmm150->dev_addr, BMM150_CNTL_S_TEST__REG,
  917. &v_data1_u8r, 1);
  918. }
  919. return comres;
  920. }
  921. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_self_test_XYZ(
  922. unsigned char *self_testxyz)
  923. {
  924. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  925. unsigned char a_data_u8r[5], v_result_u8r = 0x00;
  926. if (p_bmm150 == BMM150_NULL) {
  927. comres = E_BMM150_NULL_PTR;
  928. } else {
  929. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  930. p_bmm150->dev_addr, BMM150_DATAX_LSB_TESTX__REG,
  931. a_data_u8r, 5);
  932. v_result_u8r = BMM150_GET_BITSLICE(a_data_u8r[4],
  933. BMM150_DATAZ_LSB_TESTZ);
  934. v_result_u8r = (v_result_u8r << 1);
  935. v_result_u8r = (v_result_u8r | BMM150_GET_BITSLICE(
  936. a_data_u8r[2], BMM150_DATAY_LSB_TESTY));
  937. v_result_u8r = (v_result_u8r << 1);
  938. v_result_u8r = (v_result_u8r | BMM150_GET_BITSLICE(
  939. a_data_u8r[0], BMM150_DATAX_LSB_TESTX));
  940. *self_testxyz = v_result_u8r;
  941. }
  942. return comres;
  943. }
  944. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_spi3(unsigned char value)
  945. {
  946. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  947. unsigned char v_data1_u8r;
  948. if (p_bmm150 == BMM150_NULL) {
  949. comres = E_BMM150_NULL_PTR;
  950. } else {
  951. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  952. BMM150_POWER_CNTL_SPI3_EN__REG, &v_data1_u8r, 1);
  953. v_data1_u8r = BMM150_SET_BITSLICE(v_data1_u8r,
  954. BMM150_POWER_CNTL_SPI3_EN, value);
  955. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(p_bmm150->dev_addr,
  956. BMM150_POWER_CNTL_SPI3_EN__REG, &v_data1_u8r, 1);
  957. }
  958. return comres;
  959. }
  960. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_datarate(unsigned char data_rate)
  961. {
  962. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  963. unsigned char v_data1_u8r;
  964. if (p_bmm150 == BMM150_NULL) {
  965. comres = E_BMM150_NULL_PTR;
  966. } else {
  967. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  968. p_bmm150->dev_addr,
  969. BMM150_CNTL_DR__REG,
  970. &v_data1_u8r, 1);
  971. v_data1_u8r = BMM150_SET_BITSLICE(v_data1_u8r,
  972. BMM150_CNTL_DR, data_rate);
  973. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  974. p_bmm150->dev_addr,
  975. BMM150_CNTL_DR__REG,
  976. &v_data1_u8r, 1);
  977. }
  978. return comres;
  979. }
  980. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_datarate(unsigned char *data_rate)
  981. {
  982. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  983. unsigned char v_data_u8r;
  984. if (p_bmm150 == BMM150_NULL) {
  985. comres = E_BMM150_NULL_PTR;
  986. } else {
  987. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  988. p_bmm150->dev_addr,
  989. BMM150_CNTL_DR__REG,
  990. &v_data_u8r, 1);
  991. *data_rate = BMM150_GET_BITSLICE(v_data_u8r,
  992. BMM150_CNTL_DR);
  993. }
  994. return comres;
  995. }
  996. BMM150_RETURN_FUNCTION_TYPE bmm150api_perform_advanced_selftest(
  997. BMM150_S16 *diff_z)
  998. {
  999. BMM150_RETURN_FUNCTION_TYPE comres;
  1000. BMM150_S16 result_positive, result_negative;
  1001. struct bmm150api_mdata_s32 mdata;
  1002. if (p_bmm150 == BMM150_NULL) {
  1003. comres = E_BMM150_NULL_PTR;
  1004. } else {
  1005. /* set sleep mode to prepare for forced measurement.
  1006. * If sensor is off, this will turn it on
  1007. * and respect needed delays. */
  1008. comres = bmm150api_set_functional_state(BMM150_SLEEP_MODE);
  1009. /* set normal accuracy mode */
  1010. comres |= bmm150api_set_repetitions_Z(BMM150_LOWPOWER_REPZ);
  1011. /* 14 repetitions Z in normal accuracy mode */
  1012. /* disable X, Y channel */
  1013. comres |= bmm150api_set_control_measurement_x(
  1014. BMM150_CHANNEL_DISABLE);
  1015. comres |= bmm150api_set_control_measurement_y(
  1016. BMM150_CHANNEL_DISABLE);
  1017. /* enable positive current and force a
  1018. * measurement with positive field */
  1019. comres |= bmm150api_set_adv_selftest(
  1020. BMM150_ADVANCED_SELFTEST_POSITIVE);
  1021. comres |= bmm150api_set_functional_state(BMM150_FORCED_MODE);
  1022. /* wait for measurement to complete */
  1023. p_bmm150->delay_msec(4);
  1024. /* read result from positive field measurement */
  1025. comres |= bmm150api_read_mdataXYZ_s32(&mdata);
  1026. result_positive = mdata.dataz;
  1027. /* enable negative current and force a
  1028. * measurement with negative field */
  1029. comres |= bmm150api_set_adv_selftest(
  1030. BMM150_ADVANCED_SELFTEST_NEGATIVE);
  1031. comres |= bmm150api_set_functional_state(BMM150_FORCED_MODE);
  1032. p_bmm150->delay_msec(4); /* wait for measurement to complete */
  1033. /* read result from negative field measurement */
  1034. comres |= bmm150api_read_mdataXYZ_s32(&mdata);
  1035. result_negative = mdata.dataz;
  1036. /* turn off self test current */
  1037. comres |= bmm150api_set_adv_selftest(
  1038. BMM150_ADVANCED_SELFTEST_OFF);
  1039. /* enable X, Y channel */
  1040. comres |= bmm150api_set_control_measurement_x(
  1041. BMM150_CHANNEL_ENABLE);
  1042. comres |= bmm150api_set_control_measurement_y(
  1043. BMM150_CHANNEL_ENABLE);
  1044. /* write out difference in positive and negative field.
  1045. * This should be ~ 200 mT = 3200 LSB */
  1046. *diff_z = (result_positive - result_negative);
  1047. }
  1048. return comres;
  1049. }
  1050. BMM150_RETURN_FUNCTION_TYPE bmm150api_init_trim_registers(void)
  1051. {
  1052. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1053. unsigned char a_data_u8r[2];
  1054. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1055. BMM150_DIG_X1, (unsigned char *)&p_bmm150->dig_x1, 1);
  1056. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1057. BMM150_DIG_Y1, (unsigned char *)&p_bmm150->dig_y1, 1);
  1058. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1059. BMM150_DIG_X2, (unsigned char *)&p_bmm150->dig_x2, 1);
  1060. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1061. BMM150_DIG_Y2, (unsigned char *)&p_bmm150->dig_y2, 1);
  1062. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1063. BMM150_DIG_XY1, (unsigned char *)&p_bmm150->dig_xy1, 1);
  1064. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1065. BMM150_DIG_XY2, (unsigned char *)&p_bmm150->dig_xy2, 1);
  1066. /* shorts can not be recasted into (unsigned char*)
  1067. * due to possible mixup between trim data
  1068. * arrangement and memory arrangement */
  1069. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1070. BMM150_DIG_Z1_LSB, a_data_u8r, 2);
  1071. p_bmm150->dig_z1 = (BMM150_U16)((((BMM150_U16)((unsigned char)
  1072. a_data_u8r[1])) <<
  1073. SHIFT_LEFT_8_POSITION) | a_data_u8r[0]);
  1074. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1075. BMM150_DIG_Z2_LSB, a_data_u8r, 2);
  1076. p_bmm150->dig_z2 = (BMM150_S16)((((BMM150_S16)(
  1077. (signed char)a_data_u8r[1])) <<
  1078. SHIFT_LEFT_8_POSITION) | a_data_u8r[0]);
  1079. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1080. BMM150_DIG_Z3_LSB, a_data_u8r, 2);
  1081. p_bmm150->dig_z3 = (BMM150_S16)((((BMM150_S16)(
  1082. (signed char)a_data_u8r[1])) <<
  1083. SHIFT_LEFT_8_POSITION) | a_data_u8r[0]);
  1084. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1085. BMM150_DIG_Z4_LSB, a_data_u8r, 2);
  1086. p_bmm150->dig_z4 = (BMM150_S16)((((BMM150_S16)(
  1087. (signed char)a_data_u8r[1])) <<
  1088. SHIFT_LEFT_8_POSITION) | a_data_u8r[0]);
  1089. comres |= p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1090. BMM150_DIG_XYZ1_LSB, a_data_u8r, 2);
  1091. a_data_u8r[1] = BMM150_GET_BITSLICE(a_data_u8r[1], BMM150_DIG_XYZ1_MSB);
  1092. p_bmm150->dig_xyz1 = (BMM150_U16)((((BMM150_U16)
  1093. ((unsigned char)a_data_u8r[1])) <<
  1094. SHIFT_LEFT_8_POSITION) | a_data_u8r[0]);
  1095. return comres;
  1096. }
  1097. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_adv_selftest(unsigned char adv_selftest)
  1098. {
  1099. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1100. unsigned char v_data1_u8r;
  1101. if (p_bmm150 == BMM150_NULL) {
  1102. comres = E_BMM150_NULL_PTR;
  1103. } else {
  1104. switch (adv_selftest) {
  1105. case BMM150_ADVANCED_SELFTEST_OFF:
  1106. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1107. p_bmm150->dev_addr,
  1108. BMM150_CNTL_ADV_ST__REG,
  1109. &v_data1_u8r, 1);
  1110. v_data1_u8r = BMM150_SET_BITSLICE(
  1111. v_data1_u8r,
  1112. BMM150_CNTL_ADV_ST,
  1113. BMM150_ADVANCED_SELFTEST_OFF);
  1114. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1115. p_bmm150->dev_addr,
  1116. BMM150_CNTL_ADV_ST__REG,
  1117. &v_data1_u8r, 1);
  1118. break;
  1119. case BMM150_ADVANCED_SELFTEST_POSITIVE:
  1120. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1121. p_bmm150->dev_addr,
  1122. BMM150_CNTL_ADV_ST__REG,
  1123. &v_data1_u8r, 1);
  1124. v_data1_u8r = BMM150_SET_BITSLICE(
  1125. v_data1_u8r,
  1126. BMM150_CNTL_ADV_ST,
  1127. BMM150_ADVANCED_SELFTEST_POSITIVE);
  1128. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1129. p_bmm150->dev_addr,
  1130. BMM150_CNTL_ADV_ST__REG,
  1131. &v_data1_u8r, 1);
  1132. break;
  1133. case BMM150_ADVANCED_SELFTEST_NEGATIVE:
  1134. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1135. p_bmm150->dev_addr,
  1136. BMM150_CNTL_ADV_ST__REG,
  1137. &v_data1_u8r, 1);
  1138. v_data1_u8r = BMM150_SET_BITSLICE(
  1139. v_data1_u8r,
  1140. BMM150_CNTL_ADV_ST,
  1141. BMM150_ADVANCED_SELFTEST_NEGATIVE);
  1142. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1143. p_bmm150->dev_addr,
  1144. BMM150_CNTL_ADV_ST__REG,
  1145. &v_data1_u8r, 1);
  1146. break;
  1147. default:
  1148. break;
  1149. }
  1150. }
  1151. return comres;
  1152. }
  1153. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_adv_selftest(unsigned char *adv_selftest)
  1154. {
  1155. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1156. unsigned char v_data_u8r;
  1157. if (p_bmm150 == BMM150_NULL) {
  1158. comres = E_BMM150_NULL_PTR;
  1159. } else {
  1160. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1161. BMM150_CNTL_ADV_ST__REG, &v_data_u8r, 1);
  1162. *adv_selftest = BMM150_GET_BITSLICE(v_data_u8r,
  1163. BMM150_CNTL_ADV_ST);
  1164. }
  1165. return comres;
  1166. }
  1167. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_presetmode(
  1168. unsigned char *mode)
  1169. {
  1170. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1171. unsigned char data_rate = 0;
  1172. unsigned char repetitionsxy = 0;
  1173. unsigned char repetitionsz = 0;
  1174. /* Get the current data rate */
  1175. comres = bmm150api_get_datarate(&data_rate);
  1176. /* Get the preset number of XY Repetitions */
  1177. comres |= bmm150api_get_repetitions_XY(&repetitionsxy);
  1178. /* Get the preset number of Z Repetitions */
  1179. comres |= bmm150api_get_repetitions_Z(&repetitionsz);
  1180. if ((data_rate == BMM150_LOWPOWER_DR) && (
  1181. repetitionsxy == BMM150_LOWPOWER_REPXY) && (
  1182. repetitionsz == BMM150_LOWPOWER_REPZ)) {
  1183. *mode = BMM150_PRESETMODE_LOWPOWER;
  1184. } else {
  1185. if ((data_rate == BMM150_REGULAR_DR) && (
  1186. repetitionsxy == BMM150_REGULAR_REPXY) && (
  1187. repetitionsz == BMM150_REGULAR_REPZ)) {
  1188. *mode = BMM150_PRESETMODE_REGULAR;
  1189. } else {
  1190. if ((data_rate == BMM150_HIGHACCURACY_DR) && (
  1191. repetitionsxy == BMM150_HIGHACCURACY_REPXY) && (
  1192. repetitionsz == BMM150_HIGHACCURACY_REPZ)) {
  1193. *mode = BMM150_PRESETMODE_HIGHACCURACY;
  1194. } else {
  1195. if ((data_rate == BMM150_ENHANCED_DR) && (
  1196. repetitionsxy == BMM150_ENHANCED_REPXY) && (
  1197. repetitionsz == BMM150_ENHANCED_REPZ)) {
  1198. *mode = BMM150_PRESETMODE_ENHANCED;
  1199. } else {
  1200. *mode = E_BMM150_UNDEFINED_MODE;
  1201. }
  1202. }
  1203. }
  1204. }
  1205. return comres;
  1206. }
  1207. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_powermode(unsigned char *mode)
  1208. {
  1209. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1210. unsigned char v_data_u8r;
  1211. if (p_bmm150 == BMM150_NULL) {
  1212. comres = E_BMM150_NULL_PTR;
  1213. } else {
  1214. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1215. p_bmm150->dev_addr,
  1216. BMM150_POWER_CNTL_PCB__REG,
  1217. &v_data_u8r, 1);
  1218. *mode = BMM150_GET_BITSLICE(v_data_u8r,
  1219. BMM150_POWER_CNTL_PCB);
  1220. }
  1221. return comres;
  1222. }
  1223. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_powermode(unsigned char mode)
  1224. {
  1225. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1226. unsigned char v_data_u8r;
  1227. if (p_bmm150 == BMM150_NULL) {
  1228. comres = E_BMM150_NULL_PTR;
  1229. } else {
  1230. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1231. p_bmm150->dev_addr,
  1232. BMM150_POWER_CNTL_PCB__REG,
  1233. &v_data_u8r, 1);
  1234. v_data_u8r = BMM150_SET_BITSLICE(v_data_u8r,
  1235. BMM150_POWER_CNTL_PCB, mode);
  1236. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1237. p_bmm150->dev_addr,
  1238. BMM150_POWER_CNTL_PCB__REG,
  1239. &v_data_u8r, 1);
  1240. }
  1241. return comres;
  1242. }
  1243. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_repetitions_XY(
  1244. unsigned char *no_repetitions_xy)
  1245. {
  1246. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1247. unsigned char v_data_u8r;
  1248. if (p_bmm150 == BMM150_NULL) {
  1249. comres = E_BMM150_NULL_PTR;
  1250. } else {
  1251. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1252. p_bmm150->dev_addr,
  1253. BMM150_NO_REPETITIONS_XY,
  1254. &v_data_u8r, 1);
  1255. *no_repetitions_xy = v_data_u8r;
  1256. }
  1257. return comres;
  1258. }
  1259. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_repetitions_XY(
  1260. unsigned char no_repetitions_xy)
  1261. {
  1262. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1263. unsigned char v_data_u8r;
  1264. if (p_bmm150 == BMM150_NULL) {
  1265. comres = E_BMM150_NULL_PTR;
  1266. } else {
  1267. v_data_u8r = no_repetitions_xy;
  1268. comres = p_bmm150->BMM150_BUS_WRITE_FUNC(
  1269. p_bmm150->dev_addr,
  1270. BMM150_NO_REPETITIONS_XY,
  1271. &v_data_u8r, 1);
  1272. }
  1273. return comres;
  1274. }
  1275. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_repetitions_Z(
  1276. unsigned char *no_repetitions_z)
  1277. {
  1278. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1279. unsigned char v_data_u8r;
  1280. if (p_bmm150 == BMM150_NULL) {
  1281. comres = E_BMM150_NULL_PTR;
  1282. } else {
  1283. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1284. p_bmm150->dev_addr,
  1285. BMM150_NO_REPETITIONS_Z,
  1286. &v_data_u8r, 1);
  1287. *no_repetitions_z = v_data_u8r;
  1288. }
  1289. return comres;
  1290. }
  1291. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_repetitions_Z(
  1292. unsigned char no_repetitions_z)
  1293. {
  1294. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1295. unsigned char v_data_u8r;
  1296. if (p_bmm150 == BMM150_NULL) {
  1297. comres = E_BMM150_NULL_PTR;
  1298. } else {
  1299. v_data_u8r = no_repetitions_z;
  1300. comres = p_bmm150->BMM150_BUS_WRITE_FUNC(p_bmm150->dev_addr,
  1301. BMM150_NO_REPETITIONS_Z, &v_data_u8r, 1);
  1302. }
  1303. return comres;
  1304. }
  1305. BMM150_S16 bmm150api_compensate_X(BMM150_S16 mdata_x, BMM150_U16 data_R)
  1306. {
  1307. BMM150_S16 inter_retval;
  1308. if (mdata_x != BMM150_FLIP_OVERFLOW_ADCVAL /* no overflow */
  1309. ) {
  1310. inter_retval = ((BMM150_S16)(((BMM150_U16)
  1311. ((((BMM150_S32)p_bmm150->dig_xyz1) << 14) /
  1312. (data_R != 0 ? data_R : p_bmm150->dig_xyz1))) -
  1313. ((BMM150_U16)0x4000)));
  1314. inter_retval = ((BMM150_S16)((((BMM150_S32)mdata_x) *
  1315. ((((((((BMM150_S32)p_bmm150->dig_xy2) *
  1316. ((((BMM150_S32)inter_retval) *
  1317. ((BMM150_S32)inter_retval)) >> 7)) +
  1318. (((BMM150_S32)inter_retval) *
  1319. ((BMM150_S32)(((BMM150_S16)p_bmm150->dig_xy1)
  1320. << 7)))) >> 9) +
  1321. ((BMM150_S32)0x100000)) *
  1322. ((BMM150_S32)(((BMM150_S16)p_bmm150->dig_x2) +
  1323. ((BMM150_S16)0xA0)))) >> 12)) >> 13)) +
  1324. (((BMM150_S16)p_bmm150->dig_x1) << 3);
  1325. } else {
  1326. /* overflow */
  1327. inter_retval = BMM150_OVERFLOW_OUTPUT;
  1328. }
  1329. return inter_retval;
  1330. }
  1331. BMM150_S32 bmm150api_compensate_X_s32 (BMM150_S16 mdata_x, BMM150_U16 data_R)
  1332. {
  1333. BMM150_S32 retval;
  1334. retval = bmm150api_compensate_X(mdata_x, data_R);
  1335. if (retval == (BMM150_S32)BMM150_OVERFLOW_OUTPUT)
  1336. retval = BMM150_OVERFLOW_OUTPUT_S32;
  1337. return retval;
  1338. }
  1339. #ifdef ENABLE_FLOAT
  1340. float bmm150api_compensate_X_float (BMM150_S16 mdata_x, BMM150_U16 data_R)
  1341. {
  1342. float inter_retval;
  1343. if (mdata_x != BMM150_FLIP_OVERFLOW_ADCVAL /* no overflow */
  1344. ) {
  1345. if (data_R != 0) {
  1346. inter_retval = ((((float)p_bmm150->dig_xyz1)*16384.0f
  1347. /data_R)-16384.0f);
  1348. } else {
  1349. inter_retval = 0;
  1350. }
  1351. inter_retval = (((mdata_x * ((((((float)p_bmm150->dig_xy2) *
  1352. (inter_retval*inter_retval / 268435456.0f) +
  1353. inter_retval*((float)p_bmm150->dig_xy1)/16384.0f))
  1354. + 256.0f) * (((float)p_bmm150->dig_x2) + 160.0f)))
  1355. / 8192.0f) + (((float)p_bmm150->dig_x1) * 8.0f))/16.0f;
  1356. } else {
  1357. inter_retval = BMM150_OVERFLOW_OUTPUT_FLOAT;
  1358. }
  1359. return inter_retval;
  1360. }
  1361. #endif
  1362. BMM150_S16 bmm150api_compensate_Y(BMM150_S16 mdata_y, BMM150_U16 data_R)
  1363. {
  1364. BMM150_S16 inter_retval;
  1365. if (mdata_y != BMM150_FLIP_OVERFLOW_ADCVAL /* no overflow */
  1366. ) {
  1367. inter_retval = ((BMM150_S16)(((BMM150_U16)(((
  1368. (BMM150_S32)p_bmm150->dig_xyz1) << 14) /
  1369. (data_R != 0 ?
  1370. data_R : p_bmm150->dig_xyz1))) -
  1371. ((BMM150_U16)0x4000)));
  1372. inter_retval = ((BMM150_S16)((((BMM150_S32)mdata_y) *
  1373. ((((((((BMM150_S32)
  1374. p_bmm150->dig_xy2) *
  1375. ((((BMM150_S32) inter_retval) *
  1376. ((BMM150_S32)inter_retval)) >> 7)) +
  1377. (((BMM150_S32)inter_retval) *
  1378. ((BMM150_S32)(((BMM150_S16)
  1379. p_bmm150->dig_xy1) << 7)))) >> 9) +
  1380. ((BMM150_S32)0x100000)) *
  1381. ((BMM150_S32)(((BMM150_S16)p_bmm150->dig_y2)
  1382. + ((BMM150_S16)0xA0))))
  1383. >> 12)) >> 13)) +
  1384. (((BMM150_S16)p_bmm150->dig_y1) << 3);
  1385. } else {
  1386. /* overflow */
  1387. inter_retval = BMM150_OVERFLOW_OUTPUT;
  1388. }
  1389. return inter_retval;
  1390. }
  1391. BMM150_S32 bmm150api_compensate_Y_s32 (BMM150_S16 mdata_y, BMM150_U16 data_R)
  1392. {
  1393. BMM150_S32 retval;
  1394. retval = bmm150api_compensate_Y(mdata_y, data_R);
  1395. if (retval == BMM150_OVERFLOW_OUTPUT)
  1396. retval = BMM150_OVERFLOW_OUTPUT_S32;
  1397. return retval;
  1398. }
  1399. #ifdef ENABLE_FLOAT
  1400. float bmm150api_compensate_Y_float(BMM150_S16 mdata_y, BMM150_U16 data_R)
  1401. {
  1402. float inter_retval;
  1403. if (mdata_y != BMM150_FLIP_OVERFLOW_ADCVAL /* no overflow */
  1404. ) {
  1405. if (data_R != 0) {
  1406. inter_retval = ((((float)p_bmm150->dig_xyz1)*16384.0f
  1407. /data_R)-16384.0f);
  1408. } else {
  1409. inter_retval = 0;
  1410. }
  1411. inter_retval = (((mdata_y * ((((((float)p_bmm150->dig_xy2) *
  1412. (inter_retval*inter_retval / 268435456.0f) +
  1413. inter_retval * ((float)p_bmm150->dig_xy1)/16384.0f)) +
  1414. 256.0f) * (((float)p_bmm150->dig_y2) + 160.0f)))
  1415. / 8192.0f) + (((float)p_bmm150->dig_y1) * 8.0f))/16.0f;
  1416. } else {
  1417. /* overflow, set output to 0.0f */
  1418. inter_retval = BMM150_OVERFLOW_OUTPUT_FLOAT;
  1419. }
  1420. return inter_retval;
  1421. }
  1422. #endif
  1423. BMM150_S16 bmm150api_compensate_Z(BMM150_S16 mdata_z, BMM150_U16 data_R)
  1424. {
  1425. BMM150_S32 retval;
  1426. if ((mdata_z != BMM150_HALL_OVERFLOW_ADCVAL) /* no overflow */
  1427. ) {
  1428. retval = (((((BMM150_S32)(mdata_z - p_bmm150->dig_z4)) << 15) -
  1429. ((((BMM150_S32)p_bmm150->dig_z3) *
  1430. ((BMM150_S32)(((BMM150_S16)data_R) -
  1431. ((BMM150_S16)
  1432. p_bmm150->dig_xyz1))))>>2)) /
  1433. (p_bmm150->dig_z2 +
  1434. ((BMM150_S16)(((((BMM150_S32)
  1435. p_bmm150->dig_z1) *
  1436. ((((BMM150_S16)data_R) << 1)))+
  1437. (1<<15))>>16))));
  1438. /* saturate result to +/- 2 mT */
  1439. if (retval > BMM150_POSITIVE_SATURATION_Z) {
  1440. retval = BMM150_POSITIVE_SATURATION_Z;
  1441. } else {
  1442. if (retval < BMM150_NEGATIVE_SATURATION_Z)
  1443. retval = BMM150_NEGATIVE_SATURATION_Z;
  1444. }
  1445. } else {
  1446. /* overflow */
  1447. retval = BMM150_OVERFLOW_OUTPUT;
  1448. }
  1449. return (BMM150_S16)retval;
  1450. }
  1451. BMM150_S32 bmm150api_compensate_Z_s32(BMM150_S16 mdata_z, BMM150_U16 data_R)
  1452. {
  1453. BMM150_S32 retval;
  1454. if (mdata_z != BMM150_HALL_OVERFLOW_ADCVAL) {
  1455. retval = (((((BMM150_S32)(mdata_z - p_bmm150->dig_z4)) << 15) -
  1456. ((((BMM150_S32)p_bmm150->dig_z3) *
  1457. ((BMM150_S32)(((BMM150_S16)data_R) -
  1458. ((BMM150_S16)p_bmm150->dig_xyz1))))>>2)) /
  1459. (p_bmm150->dig_z2 +
  1460. ((BMM150_S16)(((((BMM150_S32)p_bmm150->dig_z1) *
  1461. ((((BMM150_S16)data_R) << 1)))+(1<<15))>>16))));
  1462. } else {
  1463. retval = BMM150_OVERFLOW_OUTPUT_S32;
  1464. }
  1465. return retval;
  1466. }
  1467. #ifdef ENABLE_FLOAT
  1468. float bmm150api_compensate_Z_float (BMM150_S16 mdata_z, BMM150_U16 data_R)
  1469. {
  1470. float inter_retval;
  1471. if (mdata_z != BMM150_HALL_OVERFLOW_ADCVAL /* no overflow */
  1472. ) {
  1473. inter_retval = ((((((float)mdata_z)-((float)p_bmm150->dig_z4))*
  1474. 131072.0f)-(((float)p_bmm150->dig_z3)*(((float)data_R)-
  1475. ((float)p_bmm150->dig_xyz1))))/((((float)p_bmm150->dig_z2)+
  1476. ((float)p_bmm150->dig_z1)*((float)data_R)/32768.0)*4.0))/16.0;
  1477. } else {
  1478. /* overflow, set output to 0.0f */
  1479. inter_retval = BMM150_OVERFLOW_OUTPUT_FLOAT;
  1480. }
  1481. return inter_retval;
  1482. }
  1483. #endif
  1484. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_control_measurement_x(
  1485. unsigned char enable_disable)
  1486. {
  1487. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1488. unsigned char v_data1_u8r;
  1489. if (p_bmm150 == BMM150_NULL) {
  1490. comres = E_BMM150_NULL_PTR;
  1491. } else {
  1492. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1493. p_bmm150->dev_addr,
  1494. BMM150_SENS_CNTL_CHANNELX__REG,
  1495. &v_data1_u8r, 1);
  1496. v_data1_u8r = BMM150_SET_BITSLICE(v_data1_u8r,
  1497. BMM150_SENS_CNTL_CHANNELX,
  1498. enable_disable);
  1499. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1500. p_bmm150->dev_addr,
  1501. BMM150_SENS_CNTL_CHANNELX__REG,
  1502. &v_data1_u8r, 1);
  1503. }
  1504. return comres;
  1505. }
  1506. BMM150_RETURN_FUNCTION_TYPE bmm150api_set_control_measurement_y(
  1507. unsigned char enable_disable)
  1508. {
  1509. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1510. unsigned char v_data1_u8r;
  1511. if (p_bmm150 == BMM150_NULL) {
  1512. comres = E_BMM150_NULL_PTR;
  1513. } else {
  1514. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1515. p_bmm150->dev_addr,
  1516. BMM150_SENS_CNTL_CHANNELY__REG,
  1517. &v_data1_u8r, 1);
  1518. v_data1_u8r = BMM150_SET_BITSLICE(
  1519. v_data1_u8r,
  1520. BMM150_SENS_CNTL_CHANNELY,
  1521. enable_disable);
  1522. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1523. p_bmm150->dev_addr,
  1524. BMM150_SENS_CNTL_CHANNELY__REG,
  1525. &v_data1_u8r, 1);
  1526. }
  1527. return comres;
  1528. }
  1529. BMM150_RETURN_FUNCTION_TYPE bmm150api_soft_reset(void)
  1530. {
  1531. BMM150_RETURN_FUNCTION_TYPE comres = 0;
  1532. unsigned char v_data_u8r;
  1533. if (p_bmm150 == BMM150_NULL) {
  1534. comres = E_BMM150_NULL_PTR;
  1535. } else {
  1536. v_data_u8r = BMM150_ON;
  1537. comres = p_bmm150->BMM150_BUS_READ_FUNC(
  1538. p_bmm150->dev_addr,
  1539. BMM150_POWER_CNTL_SRST7__REG,
  1540. &v_data_u8r, 1);
  1541. v_data_u8r = BMM150_SET_BITSLICE(v_data_u8r,
  1542. BMM150_POWER_CNTL_SRST7,
  1543. BMM150_SOFT_RESET7_ON);
  1544. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1545. p_bmm150->dev_addr,
  1546. BMM150_POWER_CNTL_SRST7__REG, &v_data_u8r, 1);
  1547. comres |= p_bmm150->BMM150_BUS_READ_FUNC(
  1548. p_bmm150->dev_addr,
  1549. BMM150_POWER_CNTL_SRST1__REG,
  1550. &v_data_u8r, 1);
  1551. v_data_u8r = BMM150_SET_BITSLICE(v_data_u8r,
  1552. BMM150_POWER_CNTL_SRST1,
  1553. BMM150_SOFT_RESET1_ON);
  1554. comres |= p_bmm150->BMM150_BUS_WRITE_FUNC(
  1555. p_bmm150->dev_addr,
  1556. BMM150_POWER_CNTL_SRST1__REG,
  1557. &v_data_u8r, 1);
  1558. p_bmm150->delay_msec(BMM150_DELAY_SOFTRESET);
  1559. }
  1560. return comres;
  1561. }
  1562. BMM150_RETURN_FUNCTION_TYPE bmm150api_get_raw_xyz(struct bmm150api_mdata *mdata)
  1563. {
  1564. BMM150_RETURN_FUNCTION_TYPE comres;
  1565. unsigned char a_data_u8r[6];
  1566. if (p_bmm150 == BMM150_NULL) {
  1567. comres = E_BMM150_NULL_PTR;
  1568. } else {
  1569. comres = p_bmm150->BMM150_BUS_READ_FUNC(p_bmm150->dev_addr,
  1570. BMM150_DATAX_LSB, a_data_u8r, 6);
  1571. a_data_u8r[0] = BMM150_GET_BITSLICE(a_data_u8r[0],
  1572. BMM150_DATAX_LSB_VALUEX);
  1573. mdata->datax = (BMM150_S16)((((BMM150_S16)
  1574. ((signed char)a_data_u8r[1]))
  1575. << SHIFT_LEFT_5_POSITION)
  1576. | a_data_u8r[0]);
  1577. a_data_u8r[2] = BMM150_GET_BITSLICE(a_data_u8r[2],
  1578. BMM150_DATAY_LSB_VALUEY);
  1579. mdata->datay = (BMM150_S16)((((BMM150_S16)
  1580. ((signed char)a_data_u8r[3]))
  1581. << SHIFT_LEFT_5_POSITION)
  1582. | a_data_u8r[2]);
  1583. a_data_u8r[4] = BMM150_GET_BITSLICE(a_data_u8r[4],
  1584. BMM150_DATAZ_LSB_VALUEZ);
  1585. mdata->dataz = (BMM150_S16)((((BMM150_S16)
  1586. ((signed char)a_data_u8r[5]))
  1587. << SHIFT_LEFT_7_POSITION)
  1588. | a_data_u8r[4]);
  1589. }
  1590. return comres;
  1591. }
  1592. /*----------------------------------------------------------------------------*/
  1593. /* End of API Section */
  1594. /*----------------------------------------------------------------------------*/
  1595. /*----------------------------------------------------------------------------*/
  1596. #define DEBUG 1
  1597. #define BMM150_DEV_NAME "bmm150"
  1598. /*----------------------------------------------------------------------------*/
  1599. #define SENSOR_CHIP_ID_BMM (0x32)
  1600. #define BMM150_DEFAULT_DELAY 100
  1601. #define BMM150_BUFSIZE 0x20
  1602. #define MSE_TAG "[Msensor] "
  1603. #define MSE_FUN(f) printk(KERN_INFO MSE_TAG"%s\n", __FUNCTION__)
  1604. #define MSE_ERR(fmt, args...) printk(KERN_ERR MSE_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args)
  1605. #define MSE_LOG(fmt, args...) printk(KERN_INFO MSE_TAG fmt, ##args)
  1606. static struct i2c_client *this_client = NULL;
  1607. // calibration msensor and orientation data
  1608. static int sensor_data[CALIBRATION_DATA_SIZE];
  1609. #if defined(BMC150_M4G) || defined(BMC150_VRV)
  1610. static int m4g_data[CALIBRATION_DATA_SIZE];
  1611. #endif //BMC150_M4G || BMC150_VRV
  1612. #if defined(BMC150_VLA)
  1613. static int vla_data[CALIBRATION_DATA_SIZE];
  1614. #endif //BMC150_VLA
  1615. #if defined(BMC150_VG)
  1616. static int vg_data[CALIBRATION_DATA_SIZE];
  1617. #endif //BMC150_VG
  1618. static struct mutex sensor_data_mutex;
  1619. static DECLARE_WAIT_QUEUE_HEAD(uplink_event_flag_wq);
  1620. static int bmm150d_delay = BMM150_DEFAULT_DELAY;
  1621. #ifdef BMC150_M4G
  1622. static int m4g_delay = BMM150_DEFAULT_DELAY;
  1623. #endif //BMC150_M4G
  1624. #ifdef BMC150_VRV
  1625. static int vrv_delay = BMM150_DEFAULT_DELAY;
  1626. #endif //BMC150_VRV
  1627. #ifdef BMC150_VLA
  1628. static int vla_delay = BMM150_DEFAULT_DELAY;
  1629. #endif //BMC150_VRV
  1630. #ifdef BMC150_VG
  1631. static int vg_delay = BMM150_DEFAULT_DELAY;
  1632. #endif //BMC150_VG
  1633. static atomic_t m_flag = ATOMIC_INIT(0);
  1634. static atomic_t o_flag = ATOMIC_INIT(0);
  1635. #ifdef BMC150_M4G
  1636. static atomic_t g_flag = ATOMIC_INIT(0);
  1637. #endif //BMC150_M4G
  1638. #ifdef BMC150_VRV
  1639. static atomic_t vrv_flag = ATOMIC_INIT(0);
  1640. #endif //BMC150_VRV
  1641. #ifdef BMC150_VLA
  1642. static atomic_t vla_flag = ATOMIC_INIT(0);
  1643. #endif //BMC150_VLA
  1644. #ifdef BMC150_VG
  1645. static atomic_t vg_flag = ATOMIC_INIT(0);
  1646. #endif //BMC150_VG
  1647. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  1648. static atomic_t driver_suspend_flag = ATOMIC_INIT(0);
  1649. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  1650. static struct mutex uplink_event_flag_mutex;
  1651. /* uplink event flag */
  1652. static volatile u32 uplink_event_flag = 0;
  1653. /* uplink event flag bitmap */
  1654. enum {
  1655. /* active */
  1656. BMMDRV_ULEVT_FLAG_O_ACTIVE = 0x0001,
  1657. BMMDRV_ULEVT_FLAG_M_ACTIVE = 0x0002,
  1658. BMMDRV_ULEVT_FLAG_G_ACTIVE = 0x0004,
  1659. BMMDRV_ULEVT_FLAG_VRV_ACTIVE = 0x0008,/* Virtual Rotation Vector */
  1660. BMMDRV_ULEVT_FLAG_FLIP_ACTIVE = 0x0010,
  1661. BMMDRV_ULEVT_FLAG_VLA_ACTIVE = 0x0020,/* Virtual Linear Accelerometer */
  1662. BMMDRV_ULEVT_FLAG_VG_ACTIVE = 0x0040,/* Virtual Gravity */
  1663. /* delay */
  1664. BMMDRV_ULEVT_FLAG_O_DELAY = 0x0100,
  1665. BMMDRV_ULEVT_FLAG_M_DELAY = 0x0200,
  1666. BMMDRV_ULEVT_FLAG_G_DELAY = 0x0400,
  1667. BMMDRV_ULEVT_FLAG_VRV_DELAY = 0x0800,
  1668. BMMDRV_ULEVT_FLAG_FLIP_DELAY = 0x1000,
  1669. BMMDRV_ULEVT_FLAG_VLA_DELAY = 0x2000,
  1670. BMMDRV_ULEVT_FLAG_VG_DELAY = 0x4000,
  1671. /* all */
  1672. BMMDRV_ULEVT_FLAG_ALL = 0xffff
  1673. };
  1674. /* Maintain cust info here */
  1675. struct mag_hw mag_cust;
  1676. static struct mag_hw *hw = &mag_cust;
  1677. /*----------------------------------------------------------------------------*/
  1678. /*----------------------------------------------------------------------------*/
  1679. static const struct i2c_device_id bmm150_i2c_id[] = {{BMM150_DEV_NAME,0},{}};
  1680. //static struct i2c_board_info __initdata bmm150_i2c_info = {I2C_BOARD_INFO(BMM150_DEV_NAME, BMM150_I2C_ADDR)};
  1681. static int bmm150_init_flag =-1; // 0<==>OK -1 <==> fail
  1682. static struct mag_init_info bmm150_init_info;
  1683. /*----------------------------------------------------------------------------*/
  1684. typedef enum {
  1685. MMC_FUN_DEBUG = 0x01,
  1686. MMC_DATA_DEBUG = 0X02,
  1687. MMC_HWM_DEBUG = 0X04,
  1688. MMC_CTR_DEBUG = 0X08,
  1689. MMC_I2C_DEBUG = 0x10,
  1690. } MMC_TRC;
  1691. /*----------------------------------------------------------------------------*/
  1692. struct bmm150_i2c_data {
  1693. struct i2c_client *client;
  1694. struct mag_hw *hw;
  1695. atomic_t layout;
  1696. atomic_t trace;
  1697. struct hwmsen_convert cvt;
  1698. struct bmm150api device;
  1699. u8 op_mode;
  1700. u8 odr;
  1701. u8 rept_xy;
  1702. u8 rept_z;
  1703. s16 result_test;
  1704. #if defined(CONFIG_HAS_EARLYSUSPEND)
  1705. struct early_suspend early_drv;
  1706. #endif
  1707. };
  1708. /*----------------------------------------------------------------------------*/
  1709. static void bmm150_restore_hw_cfg(struct i2c_client *client);
  1710. /*----------------------------------------------------------------------------*/
  1711. static void bmm150_power(struct mag_hw *hw, unsigned int on)
  1712. {
  1713. }
  1714. // Daemon application save the data
  1715. static int ECS_SaveData(int buf[CALIBRATION_DATA_SIZE])
  1716. {
  1717. #if DEBUG
  1718. struct bmm150_i2c_data *data = i2c_get_clientdata(this_client);
  1719. #endif
  1720. mutex_lock(&sensor_data_mutex);
  1721. switch (buf[0])
  1722. {
  1723. case 2: /* SENSOR_HANDLE_MAGNETIC_FIELD */
  1724. memcpy(sensor_data+4, buf+1, 4*sizeof(int));
  1725. break;
  1726. case 3: /* SENSOR_HANDLE_ORIENTATION */
  1727. memcpy(sensor_data+8, buf+1, 4*sizeof(int));
  1728. break;
  1729. #ifdef BMC150_M4G
  1730. case 4: /* SENSOR_HANDLE_GYROSCOPE */
  1731. memcpy(m4g_data, buf+1, 4*sizeof(int));
  1732. break;
  1733. #endif //BMC150_M4G
  1734. #ifdef BMC150_VRV
  1735. case 11: /* SENSOR_HANDLE_ROTATION_VECTOR */
  1736. memcpy(m4g_data+4, buf+1, 4*sizeof(int));
  1737. break;
  1738. #endif //BMC150_VRV
  1739. #ifdef BMC150_VLA
  1740. case 10: /* SENSOR_HANDLE_LINEAR_ACCELERATION */
  1741. memcpy(vla_data, buf+1, 4*sizeof(int));
  1742. break;
  1743. #endif //BMC150_VLA
  1744. #ifdef BMC150_VG
  1745. case 9: /* SENSOR_HANDLE_GRAVITY */
  1746. memcpy(vg_data, buf+1, 4*sizeof(int));
  1747. break;
  1748. #endif //BMC150_VG
  1749. default:
  1750. break;
  1751. }
  1752. mutex_unlock(&sensor_data_mutex);
  1753. #if DEBUG
  1754. if(atomic_read(&data->trace) & MMC_HWM_DEBUG)
  1755. {
  1756. MSE_LOG("Get daemon data: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d!\n",
  1757. sensor_data[0],sensor_data[1],sensor_data[2],sensor_data[3],
  1758. sensor_data[4],sensor_data[5],sensor_data[6],sensor_data[7],
  1759. sensor_data[8],sensor_data[9],sensor_data[10],sensor_data[11]);
  1760. #if defined(BMC150_M4G) || defined(BMC150_VRV)
  1761. MSE_LOG("Get m4g data: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d!\n",
  1762. m4g_data[0],m4g_data[1],m4g_data[2],m4g_data[3],
  1763. m4g_data[4],m4g_data[5],m4g_data[6],m4g_data[7],
  1764. m4g_data[8],m4g_data[9],m4g_data[10],m4g_data[11]);
  1765. #endif //BMC150_M4G || BMC150_VRV
  1766. #if defined(BMC150_VLA)
  1767. MSE_LOG("Get vla data: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d!\n",
  1768. vla_data[0],vla_data[1],vla_data[2],vla_data[3],
  1769. vla_data[4],vla_data[5],vla_data[6],vla_data[7],
  1770. vla_data[8],vla_data[9],vla_data[10],vla_data[11]);
  1771. #endif //BMC150_VLA
  1772. #if defined(BMC150_VG)
  1773. MSE_LOG("Get vg data: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d!\n",
  1774. vg_data[0],vg_data[1],vg_data[2],vg_data[3],
  1775. vg_data[4],vg_data[5],vg_data[6],vg_data[7],
  1776. vg_data[8],vg_data[9],vg_data[10],vg_data[11]);
  1777. #endif //BMC150_VG
  1778. }
  1779. #endif
  1780. return 0;
  1781. }
  1782. /*----------------------------------------------------------------------------*/
  1783. static int ECS_GetRawData(int data[3])
  1784. {
  1785. struct bmm150api_mdata_s32 mdata;
  1786. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  1787. u8 databuf[2] = {BMM150_CONTROL, 0x02};
  1788. bmm150api_read_mdataXYZ_s32(&mdata);
  1789. //data in uT
  1790. data[0] = mdata.datax/16;
  1791. data[1] = mdata.datay/16;
  1792. data[2] = mdata.dataz/16;
  1793. /* measure magnetic field for next sample */
  1794. if (obj->op_mode == BMM150_SUSPEND_MODE)
  1795. {
  1796. /* power on firstly */
  1797. bmm150api_set_powermode(BMM150_ON);
  1798. }
  1799. /* special treat of forced mode
  1800. * for optimization */
  1801. i2c_master_send(this_client, databuf, 2);
  1802. obj->op_mode = BMM150_SLEEP_MODE;
  1803. return 0;
  1804. }
  1805. /*----------------------------------------------------------------------------*/
  1806. static int bmm150_ReadChipInfo(char *buf, int bufsize)
  1807. {
  1808. if((!buf)||(bufsize <= BMM150_BUFSIZE -1))
  1809. {
  1810. return -1;
  1811. }
  1812. if(!this_client)
  1813. {
  1814. *buf = 0;
  1815. return -2;
  1816. }
  1817. sprintf(buf, "BMM150 Chip");
  1818. return 0;
  1819. }
  1820. /*----------------------------------------------------------------------------*/
  1821. static void bmm150_SetPowerMode(struct i2c_client *client, bool enable)
  1822. {
  1823. struct bmm150_i2c_data *obj = i2c_get_clientdata(client);
  1824. if (enable == false)
  1825. {
  1826. if (bmm150api_set_functional_state(BMM150_SUSPEND_MODE) != 0)
  1827. {
  1828. MSE_ERR("fail to suspend sensor");
  1829. return;
  1830. }
  1831. obj->op_mode = BMM150_SUSPEND_MODE;
  1832. }
  1833. else
  1834. {
  1835. if (obj->op_mode == BMM150_SUSPEND_MODE)
  1836. {
  1837. obj->op_mode = BMM150_SLEEP_MODE;
  1838. }
  1839. bmm150_restore_hw_cfg(client);
  1840. }
  1841. }
  1842. /*----------------------------------------------------------------------------*/
  1843. /* Driver Attributes Functions Section */
  1844. /*----------------------------------------------------------------------------*/
  1845. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  1846. {
  1847. char strbuf[BMM150_BUFSIZE];
  1848. bmm150_ReadChipInfo(strbuf, BMM150_BUFSIZE);
  1849. return sprintf(buf, "%s\n", strbuf);
  1850. }
  1851. /*----------------------------------------------------------------------------*/
  1852. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  1853. {
  1854. int sensordata[3];
  1855. char strbuf[BMM150_BUFSIZE];
  1856. ECS_GetRawData(sensordata);
  1857. sprintf(strbuf, "%d %d %d\n", sensordata[0],sensordata[1],sensordata[2]);
  1858. return sprintf(buf, "%s\n", strbuf);
  1859. }
  1860. /*----------------------------------------------------------------------------*/
  1861. static ssize_t show_posturedata_value(struct device_driver *ddri, char *buf)
  1862. {
  1863. int tmp[3];
  1864. char strbuf[BMM150_BUFSIZE];
  1865. tmp[0] = sensor_data[0] * CONVERT_O / CONVERT_O_DIV;
  1866. tmp[1] = sensor_data[1] * CONVERT_O / CONVERT_O_DIV;
  1867. tmp[2] = sensor_data[2] * CONVERT_O / CONVERT_O_DIV;
  1868. sprintf(strbuf, "%d, %d, %d\n", tmp[0],tmp[1], tmp[2]);
  1869. return sprintf(buf, "%s\n", strbuf);;
  1870. }
  1871. /*----------------------------------------------------------------------------*/
  1872. static ssize_t show_layout_value(struct device_driver *ddri, char *buf)
  1873. {
  1874. struct bmm150_i2c_data *data = i2c_get_clientdata(this_client);
  1875. return sprintf(buf, "(%d, %d)\n[%+2d %+2d %+2d]\n[%+2d %+2d %+2d]\n",
  1876. data->hw->direction,atomic_read(&data->layout), data->cvt.sign[0], data->cvt.sign[1],
  1877. data->cvt.sign[2],data->cvt.map[0], data->cvt.map[1], data->cvt.map[2]);
  1878. }
  1879. /*----------------------------------------------------------------------------*/
  1880. static ssize_t store_layout_value(struct device_driver *ddri,
  1881. const char *buf, size_t count)
  1882. {
  1883. struct bmm150_i2c_data *data = i2c_get_clientdata(this_client);
  1884. int layout = 0;
  1885. if(1 == sscanf(buf, "%d", &layout))
  1886. {
  1887. atomic_set(&data->layout, layout);
  1888. if(!hwmsen_get_convert(layout, &data->cvt))
  1889. {
  1890. MSE_ERR( "HWMSEN_GET_CONVERT function error!\r\n");
  1891. }
  1892. else if(!hwmsen_get_convert(data->hw->direction, &data->cvt))
  1893. {
  1894. MSE_ERR( "invalid layout: %d, restore to %d\n", layout, data->hw->direction);
  1895. }
  1896. else
  1897. {
  1898. MSE_ERR( "invalid layout: (%d, %d)\n", layout, data->hw->direction);
  1899. hwmsen_get_convert(0, &data->cvt);
  1900. }
  1901. }
  1902. else
  1903. {
  1904. MSE_ERR( "invalid format = '%s'\n", buf);
  1905. }
  1906. return count;
  1907. }
  1908. /*----------------------------------------------------------------------------*/
  1909. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  1910. {
  1911. struct bmm150_i2c_data *data = i2c_get_clientdata(this_client);
  1912. ssize_t len = 0;
  1913. if(data->hw)
  1914. {
  1915. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n",
  1916. data->hw->i2c_num, data->hw->direction, data->hw->power_id, data->hw->power_vol);
  1917. }
  1918. else
  1919. {
  1920. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n");
  1921. }
  1922. return len;
  1923. }
  1924. /*----------------------------------------------------------------------------*/
  1925. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  1926. {
  1927. ssize_t res;
  1928. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  1929. if(NULL == obj)
  1930. {
  1931. MSE_ERR( "bmm150_i2c_data is null!!\n");
  1932. return 0;
  1933. }
  1934. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  1935. return res;
  1936. }
  1937. /*----------------------------------------------------------------------------*/
  1938. static ssize_t store_trace_value(struct device_driver *ddri,
  1939. const char *buf, size_t count)
  1940. {
  1941. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  1942. int trace;
  1943. if(NULL == obj)
  1944. {
  1945. MSE_ERR( "bmm150_i2c_data is null!!\n");
  1946. return 0;
  1947. }
  1948. if(1 == sscanf(buf, "0x%x", &trace))
  1949. {
  1950. atomic_set(&obj->trace, trace);
  1951. }
  1952. else
  1953. {
  1954. MSE_ERR( "invalid content: '%s', length = %d \n", buf, (int)count);
  1955. }
  1956. return count;
  1957. }
  1958. /*----------------------------------------------------------------------------*/
  1959. #define BMM150_AXIS_X 0
  1960. #define BMM150_AXIS_Y 1
  1961. #define BMM150_AXIS_Z 2
  1962. static ssize_t show_cpsdata_value(struct device_driver *ddri, char *buf)
  1963. {
  1964. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  1965. struct bmm150api_mdata_s32 mdata;
  1966. s32 mag[3];
  1967. bmm150api_read_mdataXYZ_s32(&mdata);
  1968. /*remap coordinate*/
  1969. mag[obj->cvt.map[BMM150_AXIS_X]] = obj->cvt.sign[BMM150_AXIS_X]*mdata.datax;
  1970. mag[obj->cvt.map[BMM150_AXIS_Y]] = obj->cvt.sign[BMM150_AXIS_Y]*mdata.datay;
  1971. mag[obj->cvt.map[BMM150_AXIS_Z]] = obj->cvt.sign[BMM150_AXIS_Z]*mdata.dataz;
  1972. return sprintf(buf, "%d %d %d\n", mag[BMM150_AXIS_X], mag[BMM150_AXIS_Y], mag[BMM150_AXIS_Z]);
  1973. }
  1974. /*----------------------------------------------------------------------------*/
  1975. static ssize_t show_cpsopmode_value(struct device_driver *ddri, char *buf)
  1976. {
  1977. u8 op_mode = 0xff;
  1978. u8 power_mode;
  1979. bmm150api_get_powermode(&power_mode);
  1980. if (power_mode)
  1981. {
  1982. bmm150api_get_functional_state(&op_mode);
  1983. }
  1984. else
  1985. {
  1986. op_mode = BMM150_SUSPEND_MODE;
  1987. }
  1988. MSE_LOG("op_mode: %d", op_mode);
  1989. return sprintf(buf, "%d\n", op_mode);
  1990. }
  1991. /*----------------------------------------------------------------------------*/
  1992. static ssize_t store_cpsopmode_value(struct device_driver *ddri,
  1993. const char *buf, size_t count)
  1994. {
  1995. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  1996. long op_mode = -1;
  1997. int err;
  1998. err = kstrtoul(buf, 10, &op_mode);
  1999. if (err)
  2000. return err;
  2001. if ((unsigned char)op_mode > 3)
  2002. {
  2003. return -EINVAL;
  2004. }
  2005. if (op_mode == obj->op_mode)
  2006. {
  2007. /* don't return error here */
  2008. return count;
  2009. }
  2010. if (BMM150_FORCED_MODE == op_mode)
  2011. {
  2012. u8 databuf[2] = {BMM150_CONTROL, 0x02};
  2013. if (obj->op_mode == BMM150_SUSPEND_MODE)
  2014. {
  2015. /* power on firstly */
  2016. bmm150api_set_powermode(BMM150_ON);
  2017. }
  2018. /* special treat of forced mode
  2019. * for optimization */
  2020. i2c_master_send(this_client, databuf, 2);
  2021. obj->op_mode = BMM150_SLEEP_MODE;
  2022. }
  2023. else
  2024. {
  2025. bmm150api_set_functional_state((unsigned char)op_mode);
  2026. obj->op_mode = op_mode;
  2027. }
  2028. return count;
  2029. }
  2030. /*----------------------------------------------------------------------------*/
  2031. static ssize_t show_cpsreptxy_value(struct device_driver *ddri, char *buf)
  2032. {
  2033. unsigned char data = 0;
  2034. u8 power_mode;
  2035. int err;
  2036. bmm150api_get_powermode(&power_mode);
  2037. if (power_mode)
  2038. {
  2039. err = bmm150api_get_repetitions_XY(&data);
  2040. }
  2041. else
  2042. {
  2043. err = -EIO;
  2044. }
  2045. if (err)
  2046. return err;
  2047. return sprintf(buf, "%d\n", data);
  2048. }
  2049. /*----------------------------------------------------------------------------*/
  2050. static ssize_t store_cpsreptxy_value(struct device_driver *ddri,
  2051. const char *buf, size_t count)
  2052. {
  2053. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  2054. unsigned long tmp = 0;
  2055. int err;
  2056. u8 data;
  2057. u8 power_mode;
  2058. err = kstrtoul(buf, 10, &tmp);
  2059. if (err)
  2060. return err;
  2061. if (tmp > 255)
  2062. return -EINVAL;
  2063. data = (unsigned char)tmp;
  2064. bmm150api_get_powermode(&power_mode);
  2065. if (power_mode)
  2066. {
  2067. err = bmm150api_set_repetitions_XY(data);
  2068. if (!err)
  2069. {
  2070. //mdelay(BMM_I2C_WRITE_DELAY_TIME);
  2071. obj->rept_xy = data;
  2072. }
  2073. }
  2074. else
  2075. {
  2076. err = -EIO;
  2077. }
  2078. if (err)
  2079. return err;
  2080. return count;
  2081. }
  2082. /*----------------------------------------------------------------------------*/
  2083. static ssize_t show_cpsreptz_value(struct device_driver *ddri, char *buf)
  2084. {
  2085. unsigned char data = 0;
  2086. u8 power_mode;
  2087. int err;
  2088. bmm150api_get_powermode(&power_mode);
  2089. if (power_mode)
  2090. {
  2091. err = bmm150api_get_repetitions_Z(&data);
  2092. }
  2093. else
  2094. {
  2095. err = -EIO;
  2096. }
  2097. if (err)
  2098. return err;
  2099. return sprintf(buf, "%d\n", data);
  2100. }
  2101. /*----------------------------------------------------------------------------*/
  2102. static ssize_t store_cpsreptz_value(struct device_driver *ddri,
  2103. const char *buf, size_t count)
  2104. {
  2105. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  2106. unsigned long tmp = 0;
  2107. int err;
  2108. u8 data;
  2109. u8 power_mode;
  2110. err = kstrtoul(buf, 10, &tmp);
  2111. if (err)
  2112. return err;
  2113. if (tmp > 255)
  2114. return -EINVAL;
  2115. data = (unsigned char)tmp;
  2116. bmm150api_get_powermode(&power_mode);
  2117. if (power_mode)
  2118. {
  2119. err = bmm150api_set_repetitions_Z(data);
  2120. if (!err)
  2121. {
  2122. //mdelay(BMM_I2C_WRITE_DELAY_TIME);
  2123. obj->rept_z = data;
  2124. }
  2125. }
  2126. else
  2127. {
  2128. err = -EIO;
  2129. }
  2130. if (err)
  2131. return err;
  2132. return count;
  2133. }
  2134. static ssize_t show_test_value(struct device_driver *ddri, char *buf)
  2135. {
  2136. struct bmm150_i2c_data *client_data = i2c_get_clientdata(this_client);
  2137. int err;
  2138. err = sprintf(buf, "%d\n", client_data->result_test);
  2139. return err;
  2140. }
  2141. static ssize_t store_test_value(struct device_driver *ddri,
  2142. const char *buf, size_t count)
  2143. {
  2144. unsigned long data;
  2145. int err;
  2146. struct bmm150_i2c_data *client_data = i2c_get_clientdata(this_client);
  2147. u8 dummy;
  2148. err = kstrtoul(buf, 10, &data);
  2149. if (err)
  2150. return err;
  2151. /* the following code assumes the work thread is not running */
  2152. if (1 == data) {
  2153. /* self test */
  2154. err = bmm150api_set_functional_state(BMM150_SLEEP_MODE);
  2155. mdelay(3);
  2156. err = bmm150api_set_selftest(1);
  2157. mdelay(3);
  2158. err = bmm150api_get_self_test_XYZ(&dummy);
  2159. client_data->result_test = dummy;
  2160. } else if (2 == data) {
  2161. /* advanced self test */
  2162. err = bmm150api_perform_advanced_selftest(&client_data->result_test);
  2163. } else {
  2164. err = -EINVAL;
  2165. }
  2166. if (!err) {
  2167. bmm150api_soft_reset();
  2168. mdelay(1);
  2169. bmm150_restore_hw_cfg(this_client);
  2170. }
  2171. if (err)
  2172. count = -1;
  2173. return count;
  2174. }
  2175. /*----------------------------------------------------------------------------*/
  2176. static ssize_t show_daemon_name(struct device_driver *ddri, char *buf)
  2177. {
  2178. char strbuf[256];
  2179. sprintf(strbuf, "bmc150d");
  2180. return sprintf(buf, "%s", strbuf);
  2181. }
  2182. /*----------------------------------------------------------------------------*/
  2183. static DRIVER_ATTR(daemon, S_IRUGO, show_daemon_name, NULL);
  2184. static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL);
  2185. static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL);
  2186. static DRIVER_ATTR(posturedata, S_IRUGO, show_posturedata_value, NULL);
  2187. static DRIVER_ATTR(layout, S_IRUGO | S_IWUSR, show_layout_value, store_layout_value);
  2188. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  2189. static DRIVER_ATTR(trace, S_IRUGO | S_IWUSR, show_trace_value, store_trace_value);
  2190. static DRIVER_ATTR(cpsdata, S_IWUSR | S_IRUGO, show_cpsdata_value, NULL);
  2191. static DRIVER_ATTR(cpsopmode, S_IRUGO | S_IWUSR, show_cpsopmode_value, store_cpsopmode_value);
  2192. static DRIVER_ATTR(cpsreptxy, S_IRUGO | S_IWUSR, show_cpsreptxy_value, store_cpsreptxy_value);
  2193. static DRIVER_ATTR(cpsreptz, S_IRUGO | S_IWUSR, show_cpsreptz_value, store_cpsreptz_value);
  2194. static DRIVER_ATTR(test, S_IRUGO | S_IWUSR, show_test_value, store_test_value);
  2195. /*----------------------------------------------------------------------------*/
  2196. static struct driver_attribute *bmm150_attr_list[] = {
  2197. &driver_attr_daemon,
  2198. &driver_attr_chipinfo,
  2199. &driver_attr_sensordata,
  2200. &driver_attr_posturedata,
  2201. &driver_attr_layout,
  2202. &driver_attr_status,
  2203. &driver_attr_trace,
  2204. &driver_attr_cpsdata,
  2205. &driver_attr_cpsopmode,
  2206. &driver_attr_cpsreptxy,
  2207. &driver_attr_cpsreptz,
  2208. &driver_attr_test,
  2209. };
  2210. /*----------------------------------------------------------------------------*/
  2211. static int bmm150_create_attr(struct device_driver *driver)
  2212. {
  2213. int idx, err = 0;
  2214. int num = (int)(sizeof(bmm150_attr_list)/sizeof(bmm150_attr_list[0]));
  2215. if (driver == NULL)
  2216. {
  2217. return -EINVAL;
  2218. }
  2219. for(idx = 0; idx < num; idx++)
  2220. {
  2221. err = driver_create_file(driver, bmm150_attr_list[idx]);
  2222. if(err)
  2223. {
  2224. MSE_ERR( "driver_create_file (%s) = %d\n", bmm150_attr_list[idx]->attr.name, err);
  2225. break;
  2226. }
  2227. }
  2228. return err;
  2229. }
  2230. /*----------------------------------------------------------------------------*/
  2231. static int bmm150_delete_attr(struct device_driver *driver)
  2232. {
  2233. int idx;
  2234. int num = (int)(sizeof(bmm150_attr_list)/sizeof(bmm150_attr_list[0]));
  2235. if(driver == NULL)
  2236. {
  2237. return -EINVAL;
  2238. }
  2239. for(idx = 0; idx < num; idx++)
  2240. {
  2241. driver_remove_file(driver, bmm150_attr_list[idx]);
  2242. }
  2243. return 0;
  2244. }
  2245. /*----------------------------------------------------------------------------*/
  2246. static int bmm150_open(struct inode *inode, struct file *file)
  2247. {
  2248. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  2249. int ret = -1;
  2250. if(atomic_read(&obj->trace) & MMC_CTR_DEBUG)
  2251. {
  2252. MSE_LOG("Open device node:bmm150\n");
  2253. }
  2254. ret = nonseekable_open(inode, file);
  2255. return ret;
  2256. }
  2257. /*----------------------------------------------------------------------------*/
  2258. static int bmm150_release(struct inode *inode, struct file *file)
  2259. {
  2260. struct bmm150_i2c_data *obj = i2c_get_clientdata(this_client);
  2261. if(atomic_read(&obj->trace) & MMC_CTR_DEBUG)
  2262. {
  2263. MSE_LOG("Release device node:bmm150\n");
  2264. }
  2265. return 0;
  2266. }
  2267. /*----------------------------------------------------------------------------*/
  2268. /* !!! add a new definition in linux/sensors_io.h if possible !!! */
  2269. #define BMM_IOC_GET_EVENT_FLAG ECOMPASS_IOC_GET_OPEN_STATUS
  2270. static long bmm150_unlocked_ioctl(struct file *file, unsigned int cmd,unsigned long arg)
  2271. {
  2272. void __user *argp = (void __user *)arg;
  2273. /* NOTE: In this function the size of "char" should be 1-byte. */
  2274. char buff[BMM150_BUFSIZE]; /* for chip information */
  2275. int value[CALIBRATION_DATA_SIZE]; /* for SET_YPR */
  2276. int status; /* for OPEN/CLOSE_STATUS */
  2277. short sensor_status; /* for Orientation and Msensor status */
  2278. int vec[3] = {0};
  2279. struct bmm150_i2c_data *clientdata = i2c_get_clientdata(this_client);
  2280. struct hwm_sensor_data* osensor_data;
  2281. uint32_t enable;
  2282. switch (cmd)
  2283. {
  2284. case BMM_IOC_GET_EVENT_FLAG: // used by daemon only
  2285. /* block if no event updated */
  2286. wait_event_interruptible(uplink_event_flag_wq, (uplink_event_flag != 0));
  2287. mutex_lock(&uplink_event_flag_mutex);
  2288. status = uplink_event_flag;
  2289. mutex_unlock(&uplink_event_flag_mutex);
  2290. if(copy_to_user(argp, &status, sizeof(status)))
  2291. {
  2292. MSE_ERR("copy_to_user failed.");
  2293. return -EFAULT;
  2294. }
  2295. break;
  2296. case ECOMPASS_IOC_GET_DELAY: //used by daemon
  2297. if(copy_to_user(argp, &bmm150d_delay, sizeof(bmm150d_delay)))
  2298. {
  2299. MSE_ERR("copy_to_user failed.");
  2300. return -EFAULT;
  2301. }
  2302. /* clear the flag */
  2303. mutex_lock(&uplink_event_flag_mutex);
  2304. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_M_DELAY) != 0)
  2305. {
  2306. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_M_DELAY;
  2307. }
  2308. else if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_O_DELAY) != 0)
  2309. {
  2310. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_O_DELAY;
  2311. }
  2312. mutex_unlock(&uplink_event_flag_mutex);
  2313. /* wake up the wait queue */
  2314. wake_up(&uplink_event_flag_wq);
  2315. break;
  2316. case ECOMPASS_IOC_SET_YPR: //used by daemon
  2317. if(argp == NULL)
  2318. {
  2319. MSE_ERR("invalid argument.");
  2320. return -EINVAL;
  2321. }
  2322. if(copy_from_user(value, argp, sizeof(value)))
  2323. {
  2324. MSE_ERR("copy_from_user failed.");
  2325. return -EFAULT;
  2326. }
  2327. ECS_SaveData(value);
  2328. break;
  2329. case ECOMPASS_IOC_GET_MFLAG: //used by daemon
  2330. sensor_status = atomic_read(&m_flag);
  2331. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2332. if ((sensor_status == 1) && (atomic_read(&driver_suspend_flag) == 1))
  2333. {
  2334. /* de-active m-channel when driver suspend regardless of m_flag*/
  2335. sensor_status = 0;
  2336. }
  2337. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2338. if(copy_to_user(argp, &sensor_status, sizeof(sensor_status)))
  2339. {
  2340. MSE_ERR("copy_to_user failed.");
  2341. return -EFAULT;
  2342. }
  2343. /* clear the flag */
  2344. mutex_lock(&uplink_event_flag_mutex);
  2345. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_M_ACTIVE) != 0)
  2346. {
  2347. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_M_ACTIVE;
  2348. }
  2349. mutex_unlock(&uplink_event_flag_mutex);
  2350. /* wake up the wait queue */
  2351. wake_up(&uplink_event_flag_wq);
  2352. break;
  2353. case ECOMPASS_IOC_GET_OFLAG: //used by daemon
  2354. sensor_status = atomic_read(&o_flag);
  2355. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2356. if ((sensor_status == 1) && (atomic_read(&driver_suspend_flag) == 1))
  2357. {
  2358. /* de-active m-channel when driver suspend regardless of m_flag*/
  2359. sensor_status = 0;
  2360. }
  2361. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2362. if(copy_to_user(argp, &sensor_status, sizeof(sensor_status)))
  2363. {
  2364. MSE_ERR("copy_to_user failed.");
  2365. return -EFAULT;
  2366. }
  2367. /* clear the flag */
  2368. mutex_lock(&uplink_event_flag_mutex);
  2369. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_O_ACTIVE) != 0)
  2370. {
  2371. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_O_ACTIVE;
  2372. }
  2373. mutex_unlock(&uplink_event_flag_mutex);
  2374. /* wake up the wait queue */
  2375. wake_up(&uplink_event_flag_wq);
  2376. break;
  2377. #ifdef BMC150_M4G
  2378. case ECOMPASS_IOC_GET_GDELAY: //used by daemon
  2379. if(copy_to_user(argp, &m4g_delay, sizeof(m4g_delay)))
  2380. {
  2381. MSE_ERR("copy_to_user failed.");
  2382. return -EFAULT;
  2383. }
  2384. /* clear the flag */
  2385. mutex_lock(&uplink_event_flag_mutex);
  2386. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_G_DELAY) != 0)
  2387. {
  2388. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_G_DELAY;
  2389. }
  2390. mutex_unlock(&uplink_event_flag_mutex);
  2391. /* wake up the wait queue */
  2392. wake_up(&uplink_event_flag_wq);
  2393. break;
  2394. case ECOMPASS_IOC_GET_GFLAG: //used by daemon
  2395. sensor_status = atomic_read(&g_flag);
  2396. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2397. if ((sensor_status == 1) && (atomic_read(&driver_suspend_flag) == 1))
  2398. {
  2399. /* de-active g-channel when driver suspend regardless of g_flag*/
  2400. sensor_status = 0;
  2401. }
  2402. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2403. if(copy_to_user(argp, &sensor_status, sizeof(sensor_status)))
  2404. {
  2405. MSE_ERR("copy_to_user failed.");
  2406. return -EFAULT;
  2407. }
  2408. /* clear the flag */
  2409. mutex_lock(&uplink_event_flag_mutex);
  2410. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_G_ACTIVE) != 0)
  2411. {
  2412. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_G_ACTIVE;
  2413. }
  2414. mutex_unlock(&uplink_event_flag_mutex);
  2415. /* wake up the wait queue */
  2416. wake_up(&uplink_event_flag_wq);
  2417. break;
  2418. #endif //BMC150_M4G
  2419. #ifdef BMC150_VRV
  2420. case ECOMPASS_IOC_GET_VRVDELAY: //used by daemon
  2421. if(copy_to_user(argp, &vrv_delay, sizeof(vrv_delay)))
  2422. {
  2423. MSE_ERR("copy_to_user failed.");
  2424. return -EFAULT;
  2425. }
  2426. /* clear the flag */
  2427. mutex_lock(&uplink_event_flag_mutex);
  2428. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_VRV_DELAY) != 0)
  2429. {
  2430. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_VRV_DELAY;
  2431. }
  2432. mutex_unlock(&uplink_event_flag_mutex);
  2433. /* wake up the wait queue */
  2434. wake_up(&uplink_event_flag_wq);
  2435. break;
  2436. case ECOMPASS_IOC_GET_VRVFLAG: //used by daemon
  2437. sensor_status = atomic_read(&vrv_flag);
  2438. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2439. if ((sensor_status == 1) && (atomic_read(&driver_suspend_flag) == 1))
  2440. {
  2441. /* de-active vrv-channel when driver suspend regardless of vrv_flag*/
  2442. sensor_status = 0;
  2443. }
  2444. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2445. if(copy_to_user(argp, &sensor_status, sizeof(sensor_status)))
  2446. {
  2447. MSE_ERR("copy_to_user failed.");
  2448. return -EFAULT;
  2449. }
  2450. /* clear the flag */
  2451. mutex_lock(&uplink_event_flag_mutex);
  2452. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_VRV_ACTIVE) != 0)
  2453. {
  2454. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_VRV_ACTIVE;
  2455. }
  2456. mutex_unlock(&uplink_event_flag_mutex);
  2457. /* wake up the wait queue */
  2458. wake_up(&uplink_event_flag_wq);
  2459. break;
  2460. #endif //BMC150_VRV
  2461. #ifdef BMC150_VLA
  2462. case ECOMPASS_IOC_GET_VLADELAY: //used by daemon
  2463. if(copy_to_user(argp, &vla_delay, sizeof(vla_delay)))
  2464. {
  2465. MSE_ERR("copy_to_user failed.");
  2466. return -EFAULT;
  2467. }
  2468. /* clear the flag */
  2469. mutex_lock(&uplink_event_flag_mutex);
  2470. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_VLA_DELAY) != 0)
  2471. {
  2472. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_VLA_DELAY;
  2473. }
  2474. mutex_unlock(&uplink_event_flag_mutex);
  2475. /* wake up the wait queue */
  2476. wake_up(&uplink_event_flag_wq);
  2477. break;
  2478. case ECOMPASS_IOC_GET_VLAFLAG: //used by daemon
  2479. sensor_status = atomic_read(&vla_flag);
  2480. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2481. if ((sensor_status == 1) && (atomic_read(&driver_suspend_flag) == 1))
  2482. {
  2483. /* de-active vla-channel when driver suspend regardless of vla_flag*/
  2484. sensor_status = 0;
  2485. }
  2486. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2487. if(copy_to_user(argp, &sensor_status, sizeof(sensor_status)))
  2488. {
  2489. MSE_ERR("copy_to_user failed.");
  2490. return -EFAULT;
  2491. }
  2492. /* clear the flag */
  2493. mutex_lock(&uplink_event_flag_mutex);
  2494. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_VLA_ACTIVE) != 0)
  2495. {
  2496. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_VLA_ACTIVE;
  2497. }
  2498. mutex_unlock(&uplink_event_flag_mutex);
  2499. /* wake up the wait queue */
  2500. wake_up(&uplink_event_flag_wq);
  2501. break;
  2502. #endif //BMC150_VLA
  2503. #ifdef BMC150_VG
  2504. case ECOMPASS_IOC_GET_VGDELAY: //used by daemon
  2505. if(copy_to_user(argp, &vg_delay, sizeof(vg_delay)))
  2506. {
  2507. MSE_ERR("copy_to_user failed.");
  2508. return -EFAULT;
  2509. }
  2510. /* clear the flag */
  2511. mutex_lock(&uplink_event_flag_mutex);
  2512. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_VG_DELAY) != 0)
  2513. {
  2514. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_VG_DELAY;
  2515. }
  2516. mutex_unlock(&uplink_event_flag_mutex);
  2517. /* wake up the wait queue */
  2518. wake_up(&uplink_event_flag_wq);
  2519. break;
  2520. case ECOMPASS_IOC_GET_VGFLAG: //used by daemon
  2521. sensor_status = atomic_read(&vg_flag);
  2522. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2523. if ((sensor_status == 1) && (atomic_read(&driver_suspend_flag) == 1))
  2524. {
  2525. /* de-active vla-channel when driver suspend regardless of vla_flag*/
  2526. sensor_status = 0;
  2527. }
  2528. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2529. if(copy_to_user(argp, &sensor_status, sizeof(sensor_status)))
  2530. {
  2531. MSE_ERR("copy_to_user failed.");
  2532. return -EFAULT;
  2533. }
  2534. /* clear the flag */
  2535. mutex_lock(&uplink_event_flag_mutex);
  2536. if ((uplink_event_flag & BMMDRV_ULEVT_FLAG_VG_ACTIVE) != 0)
  2537. {
  2538. uplink_event_flag &= ~BMMDRV_ULEVT_FLAG_VG_ACTIVE;
  2539. }
  2540. mutex_unlock(&uplink_event_flag_mutex);
  2541. /* wake up the wait queue */
  2542. wake_up(&uplink_event_flag_wq);
  2543. break;
  2544. #endif //BMC150_VG
  2545. case MSENSOR_IOCTL_READ_CHIPINFO: //reserved
  2546. if(argp == NULL)
  2547. {
  2548. MSE_ERR( "IO parameter pointer is NULL!\r\n");
  2549. break;
  2550. }
  2551. bmm150_ReadChipInfo(buff, BMM150_BUFSIZE);
  2552. if(copy_to_user(argp, buff, strlen(buff)+1))
  2553. {
  2554. return -EFAULT;
  2555. }
  2556. break;
  2557. case MSENSOR_IOCTL_READ_SENSORDATA: //used by MTK ftm or engineering mode
  2558. if(argp == NULL)
  2559. {
  2560. MSE_ERR( "IO parameter pointer is NULL!\r\n");
  2561. break;
  2562. }
  2563. ECS_GetRawData(vec);
  2564. sprintf(buff, "%x %x %x", vec[0], vec[1], vec[2]);
  2565. if(copy_to_user(argp, buff, strlen(buff)+1))
  2566. {
  2567. return -EFAULT;
  2568. }
  2569. break;
  2570. case ECOMPASS_IOC_GET_LAYOUT: //used by daemon
  2571. status = atomic_read(&clientdata->layout);
  2572. if(copy_to_user(argp, &status, sizeof(status)))
  2573. {
  2574. MSE_ERR("copy_to_user failed.");
  2575. return -EFAULT;
  2576. }
  2577. break;
  2578. case MSENSOR_IOCTL_SENSOR_ENABLE: //used by MTK ftm
  2579. if(argp == NULL)
  2580. {
  2581. MSE_ERR( "IO parameter pointer is NULL!\r\n");
  2582. break;
  2583. }
  2584. if(copy_from_user(&enable, argp, sizeof(enable)))
  2585. {
  2586. MSE_ERR("copy_from_user failed.");
  2587. return -EFAULT;
  2588. }
  2589. else
  2590. {
  2591. MSE_LOG("MSENSOR_IOCTL_SENSOR_ENABLE enable=%d!\r\n",enable);
  2592. if(1 == enable)
  2593. {
  2594. atomic_set(&o_flag, 1);
  2595. }
  2596. else
  2597. {
  2598. atomic_set(&o_flag, 0);
  2599. }
  2600. /* set the flag */
  2601. mutex_lock(&uplink_event_flag_mutex);
  2602. uplink_event_flag |= BMMDRV_ULEVT_FLAG_O_ACTIVE;
  2603. mutex_unlock(&uplink_event_flag_mutex);
  2604. /* wake up the wait queue */
  2605. wake_up(&uplink_event_flag_wq);
  2606. }
  2607. break;
  2608. case MSENSOR_IOCTL_READ_FACTORY_SENSORDATA: //used by MTK ftm
  2609. if(argp == NULL)
  2610. {
  2611. MSE_ERR( "IO parameter pointer is NULL!\r\n");
  2612. break;
  2613. }
  2614. osensor_data = (struct hwm_sensor_data *)buff;
  2615. mutex_lock(&sensor_data_mutex);
  2616. osensor_data->values[0] = sensor_data[8];
  2617. osensor_data->values[1] = sensor_data[9];
  2618. osensor_data->values[2] = sensor_data[10];
  2619. osensor_data->status = sensor_data[11];
  2620. osensor_data->value_divide = CONVERT_O_DIV;
  2621. mutex_unlock(&sensor_data_mutex);
  2622. sprintf(buff, "%x %x %x %x %x", osensor_data->values[0], osensor_data->values[1],
  2623. osensor_data->values[2],osensor_data->status,osensor_data->value_divide);
  2624. if(copy_to_user(argp, buff, strlen(buff)+1))
  2625. {
  2626. return -EFAULT;
  2627. }
  2628. break;
  2629. default:
  2630. MSE_ERR( "%s not supported = 0x%04x", __FUNCTION__, cmd);
  2631. return -ENOIOCTLCMD;
  2632. break;
  2633. }
  2634. return 0;
  2635. }
  2636. /*----------------------------------------------------------------------------*/
  2637. static struct file_operations bmm150_fops = {
  2638. .owner = THIS_MODULE,
  2639. .open = bmm150_open,
  2640. .release = bmm150_release,
  2641. .unlocked_ioctl = bmm150_unlocked_ioctl,
  2642. };
  2643. /*----------------------------------------------------------------------------*/
  2644. static struct miscdevice bmm150_device = {
  2645. .minor = MISC_DYNAMIC_MINOR,
  2646. .name = "msensor",
  2647. .fops = &bmm150_fops,
  2648. };
  2649. /*----------------------------------------------------------------------------*/
  2650. static void bmm150_restore_hw_cfg(struct i2c_client *client)
  2651. {
  2652. struct bmm150_i2c_data *obj = i2c_get_clientdata(client);
  2653. if (obj->op_mode > 3)
  2654. {
  2655. obj->op_mode = BMM150_SLEEP_MODE;
  2656. }
  2657. bmm150api_set_functional_state(obj->op_mode);
  2658. bmm150api_set_datarate(obj->odr);
  2659. //mdelay(BMM_I2C_WRITE_DELAY_TIME);
  2660. bmm150api_set_repetitions_XY(obj->rept_xy);
  2661. //mdelay(BMM_I2C_WRITE_DELAY_TIME);
  2662. bmm150api_set_repetitions_Z(obj->rept_z);
  2663. //mdelay(BMM_I2C_WRITE_DELAY_TIME);
  2664. }
  2665. /*----------------------------------------------------------------------------*/
  2666. #ifndef CONFIG_HAS_EARLYSUSPEND
  2667. /*----------------------------------------------------------------------------*/
  2668. static int bmm150_suspend(struct i2c_client *client, pm_message_t msg)
  2669. {
  2670. struct bmm150_i2c_data *data = i2c_get_clientdata(client);
  2671. if(msg.event == PM_EVENT_SUSPEND)
  2672. {
  2673. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2674. /* set driver suspend flag */
  2675. atomic_set(&driver_suspend_flag, 1);
  2676. if (atomic_read(&m_flag) == 1)
  2677. {
  2678. /* set the flag to block e-compass daemon*/
  2679. mutex_lock(&uplink_event_flag_mutex);
  2680. uplink_event_flag |= BMMDRV_ULEVT_FLAG_M_ACTIVE;
  2681. mutex_unlock(&uplink_event_flag_mutex);
  2682. }
  2683. if (atomic_read(&o_flag) == 1)
  2684. {
  2685. /* set the flag to block e-compass daemon*/
  2686. mutex_lock(&uplink_event_flag_mutex);
  2687. uplink_event_flag |= BMMDRV_ULEVT_FLAG_O_ACTIVE;
  2688. mutex_unlock(&uplink_event_flag_mutex);
  2689. }
  2690. #ifdef BMC150_M4G
  2691. if (atomic_read(&g_flag) == 1)
  2692. {
  2693. /* set the flag to block e-compass daemon*/
  2694. mutex_lock(&uplink_event_flag_mutex);
  2695. uplink_event_flag |= BMMDRV_ULEVT_FLAG_G_ACTIVE;
  2696. mutex_unlock(&uplink_event_flag_mutex);
  2697. }
  2698. #endif //BMC150_M4G
  2699. #ifdef BMC150_VRV
  2700. if (atomic_read(&vrv_flag) == 1)
  2701. {
  2702. /* set the flag to block e-compass daemon*/
  2703. mutex_lock(&uplink_event_flag_mutex);
  2704. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VRV_ACTIVE;
  2705. mutex_unlock(&uplink_event_flag_mutex);
  2706. }
  2707. #endif //BMC150_VRV
  2708. #ifdef BMC150_VLA
  2709. if (atomic_read(&vla_flag) == 1)
  2710. {
  2711. /* set the flag to block e-compass daemon*/
  2712. mutex_lock(&uplink_event_flag_mutex);
  2713. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VLA_ACTIVE;
  2714. mutex_unlock(&uplink_event_flag_mutex);
  2715. }
  2716. #endif //BMC150_VLA
  2717. #ifdef BMC150_VG
  2718. if (atomic_read(&vg_flag) == 1)
  2719. {
  2720. /* set the flag to block e-compass daemon*/
  2721. mutex_lock(&uplink_event_flag_mutex);
  2722. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VG_ACTIVE;
  2723. mutex_unlock(&uplink_event_flag_mutex);
  2724. }
  2725. #endif //BMC150_VG
  2726. /* wake up the wait queue */
  2727. wake_up(&uplink_event_flag_wq);
  2728. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2729. bmm150_SetPowerMode(data->client, false);
  2730. bmm150_power(data->hw, 0);
  2731. }
  2732. return 0;
  2733. }
  2734. /*----------------------------------------------------------------------------*/
  2735. static int bmm150_resume(struct i2c_client *client)
  2736. {
  2737. struct bmm150_i2c_data *data = i2c_get_clientdata(client);
  2738. bmm150_power(data->hw, 1);
  2739. bmm150_SetPowerMode(data->client, true);
  2740. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2741. /* clear driver suspend flag */
  2742. atomic_set(&driver_suspend_flag, 0);
  2743. if (atomic_read(&m_flag) == 1)
  2744. {
  2745. /* set the flag to unblock e-compass daemon*/
  2746. mutex_lock(&uplink_event_flag_mutex);
  2747. uplink_event_flag |= BMMDRV_ULEVT_FLAG_M_ACTIVE;
  2748. mutex_unlock(&uplink_event_flag_mutex);
  2749. }
  2750. if (atomic_read(&o_flag) == 1)
  2751. {
  2752. /* set the flag to unblock e-compass daemon*/
  2753. mutex_lock(&uplink_event_flag_mutex);
  2754. uplink_event_flag |= BMMDRV_ULEVT_FLAG_O_ACTIVE;
  2755. mutex_unlock(&uplink_event_flag_mutex);
  2756. }
  2757. #ifdef BMC150_M4G
  2758. if (atomic_read(&g_flag) == 1)
  2759. {
  2760. /* set the flag to unblock e-compass daemon*/
  2761. mutex_lock(&uplink_event_flag_mutex);
  2762. uplink_event_flag |= BMMDRV_ULEVT_FLAG_G_ACTIVE;
  2763. mutex_unlock(&uplink_event_flag_mutex);
  2764. }
  2765. #endif //BMC150_M4G
  2766. #ifdef BMC150_VRV
  2767. if (atomic_read(&vrv_flag) == 1)
  2768. {
  2769. /* set the flag to unblock e-compass daemon*/
  2770. mutex_lock(&uplink_event_flag_mutex);
  2771. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VRV_ACTIVE;
  2772. mutex_unlock(&uplink_event_flag_mutex);
  2773. }
  2774. #endif //BMC150_VRV
  2775. #ifdef BMC150_VG
  2776. if (atomic_read(&vg_flag) == 1)
  2777. {
  2778. /* set the flag to unblock e-compass daemon*/
  2779. mutex_lock(&uplink_event_flag_mutex);
  2780. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VG_ACTIVE;
  2781. mutex_unlock(&uplink_event_flag_mutex);
  2782. }
  2783. #endif //BMC150_VG
  2784. /* wake up the wait queue */
  2785. wake_up(&uplink_event_flag_wq);
  2786. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2787. return 0;
  2788. }
  2789. /*----------------------------------------------------------------------------*/
  2790. #else /*CONFIG_HAS_EARLY_SUSPEND is defined*/
  2791. /*----------------------------------------------------------------------------*/
  2792. static void bmm150_early_suspend(struct early_suspend *h)
  2793. {
  2794. struct bmm150_i2c_data *obj = container_of(h, struct bmm150_i2c_data, early_drv);
  2795. u8 power_mode;
  2796. int err = 0;
  2797. if(NULL == obj)
  2798. {
  2799. MSE_ERR( "null pointer!!\n");
  2800. return;
  2801. }
  2802. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2803. /* set driver suspend flag */
  2804. atomic_set(&driver_suspend_flag, 1);
  2805. if (atomic_read(&m_flag) == 1)
  2806. {
  2807. /* set the flag to block e-compass daemon*/
  2808. mutex_lock(&uplink_event_flag_mutex);
  2809. uplink_event_flag |= BMMDRV_ULEVT_FLAG_M_ACTIVE;
  2810. mutex_unlock(&uplink_event_flag_mutex);
  2811. }
  2812. if (atomic_read(&o_flag) == 1)
  2813. {
  2814. /* set the flag to block e-compass daemon*/
  2815. mutex_lock(&uplink_event_flag_mutex);
  2816. uplink_event_flag |= BMMDRV_ULEVT_FLAG_O_ACTIVE;
  2817. mutex_unlock(&uplink_event_flag_mutex);
  2818. }
  2819. #ifdef BMC150_M4G
  2820. if (atomic_read(&g_flag) == 1)
  2821. {
  2822. /* set the flag to block e-compass daemon*/
  2823. mutex_lock(&uplink_event_flag_mutex);
  2824. uplink_event_flag |= BMMDRV_ULEVT_FLAG_G_ACTIVE;
  2825. mutex_unlock(&uplink_event_flag_mutex);
  2826. }
  2827. #endif //BMC150_M4G
  2828. #ifdef BMC150_VRV
  2829. if (atomic_read(&vrv_flag) == 1)
  2830. {
  2831. /* set the flag to block e-compass daemon*/
  2832. mutex_lock(&uplink_event_flag_mutex);
  2833. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VRV_ACTIVE;
  2834. mutex_unlock(&uplink_event_flag_mutex);
  2835. }
  2836. #endif //BMC150_VRV
  2837. #ifdef BMC150_VLA
  2838. if (atomic_read(&vla_flag) == 1)
  2839. {
  2840. /* set the flag to block e-compass daemon*/
  2841. mutex_lock(&uplink_event_flag_mutex);
  2842. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VLA_ACTIVE;
  2843. mutex_unlock(&uplink_event_flag_mutex);
  2844. }
  2845. #endif //BMC150_VLA
  2846. #ifdef BMC150_VRV
  2847. if (atomic_read(&vg_flag) == 1)
  2848. {
  2849. /* set the flag to block e-compass daemon*/
  2850. mutex_lock(&uplink_event_flag_mutex);
  2851. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VG_ACTIVE;
  2852. mutex_unlock(&uplink_event_flag_mutex);
  2853. }
  2854. #endif //BMC150_VG
  2855. /* wake up the wait queue */
  2856. wake_up(&uplink_event_flag_wq);
  2857. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2858. bmm150_SetPowerMode(obj->client, false);
  2859. bmm150_power(obj->hw, 0);
  2860. }
  2861. /*----------------------------------------------------------------------------*/
  2862. static void bmm150_late_resume(struct early_suspend *h)
  2863. {
  2864. struct bmm150_i2c_data *obj = container_of(h, struct bmm150_i2c_data, early_drv);
  2865. if(NULL == obj)
  2866. {
  2867. MSE_ERR( "null pointer!!\n");
  2868. return;
  2869. }
  2870. bmm150_power(obj->hw, 1);
  2871. bmm150_SetPowerMode(obj->client, true);
  2872. #ifdef BMC150_BLOCK_DAEMON_ON_SUSPEND
  2873. /* clear driver suspend flag */
  2874. atomic_set(&driver_suspend_flag, 0);
  2875. if (atomic_read(&m_flag) == 1)
  2876. {
  2877. /* set the flag to unblock e-compass daemon*/
  2878. mutex_lock(&uplink_event_flag_mutex);
  2879. uplink_event_flag |= BMMDRV_ULEVT_FLAG_M_ACTIVE;
  2880. mutex_unlock(&uplink_event_flag_mutex);
  2881. }
  2882. if (atomic_read(&o_flag) == 1)
  2883. {
  2884. /* set the flag to unblock e-compass daemon*/
  2885. mutex_lock(&uplink_event_flag_mutex);
  2886. uplink_event_flag |= BMMDRV_ULEVT_FLAG_O_ACTIVE;
  2887. mutex_unlock(&uplink_event_flag_mutex);
  2888. }
  2889. #ifdef BMC150_M4G
  2890. if (atomic_read(&g_flag) == 1)
  2891. {
  2892. /* set the flag to unblock e-compass daemon*/
  2893. mutex_lock(&uplink_event_flag_mutex);
  2894. uplink_event_flag |= BMMDRV_ULEVT_FLAG_G_ACTIVE;
  2895. mutex_unlock(&uplink_event_flag_mutex);
  2896. }
  2897. #endif //BMC150_M4G
  2898. #ifdef BMC150_VRV
  2899. if (atomic_read(&vrv_flag) == 1)
  2900. {
  2901. /* set the flag to unblock e-compass daemon*/
  2902. mutex_lock(&uplink_event_flag_mutex);
  2903. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VRV_ACTIVE;
  2904. mutex_unlock(&uplink_event_flag_mutex);
  2905. }
  2906. #endif //BMC150_VRV
  2907. #ifdef BMC150_VLA
  2908. if (atomic_read(&vla_flag) == 1)
  2909. {
  2910. /* set the flag to unblock e-compass daemon*/
  2911. mutex_lock(&uplink_event_flag_mutex);
  2912. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VLA_ACTIVE;
  2913. mutex_unlock(&uplink_event_flag_mutex);
  2914. }
  2915. #endif //BMC150_VLA
  2916. #ifdef BMC150_VG
  2917. if (atomic_read(&vg_flag) == 1)
  2918. {
  2919. /* set the flag to unblock e-compass daemon*/
  2920. mutex_lock(&uplink_event_flag_mutex);
  2921. uplink_event_flag |= BMMDRV_ULEVT_FLAG_VG_ACTIVE;
  2922. mutex_unlock(&uplink_event_flag_mutex);
  2923. }
  2924. #endif //BMC150_VG
  2925. /* wake up the wait queue */
  2926. wake_up(&uplink_event_flag_wq);
  2927. #endif //BMC150_BLOCK_DAEMON_ON_SUSPEND
  2928. }
  2929. #endif /*CONFIG_HAS_EARLYSUSPEND*/
  2930. /*----------------------------------------------------------------------------*/
  2931. #define BMM_MAX_RETRY_WAKEUP (5)
  2932. #define BMM_I2C_WRITE_DELAY_TIME (1)
  2933. static int bmm150_wakeup(struct i2c_client *client)
  2934. {
  2935. int err = 0;
  2936. int try_times = BMM_MAX_RETRY_WAKEUP;
  2937. u8 data[2] = {BMM150_POWER_CNTL, 0x01};
  2938. u8 dummy;
  2939. MSE_LOG("waking up the chip...");
  2940. while (try_times) {
  2941. err = i2c_master_send(client, data, 2);
  2942. mdelay(BMM_I2C_WRITE_DELAY_TIME);
  2943. dummy = 0;
  2944. err = hwmsen_read_block(client, BMM150_POWER_CNTL, &dummy, 1);
  2945. if (data[1] == dummy)
  2946. {
  2947. break;
  2948. }
  2949. try_times--;
  2950. }
  2951. MSE_LOG("wake up result: %s, tried times: %d",
  2952. (try_times > 0) ? "succeed" : "fail",
  2953. BMM_MAX_RETRY_WAKEUP - try_times + 1);
  2954. err = (try_times > 0) ? 0 : -1;
  2955. return err;
  2956. }
  2957. /*----------------------------------------------------------------------------*/
  2958. static int bmm150_checkchipid(struct i2c_client *client)
  2959. {
  2960. u8 chip_id = 0;
  2961. hwmsen_read_block(client, BMM150_CHIP_ID, &chip_id, 1);
  2962. MSE_LOG("read chip id result: %#x", chip_id);
  2963. if ((chip_id & 0xff) != SENSOR_CHIP_ID_BMM)
  2964. {
  2965. return -1;
  2966. }
  2967. else
  2968. {
  2969. return 0;
  2970. }
  2971. }
  2972. /*----------------------------------------------------------------------------*/
  2973. static char bmm150_i2c_read_wrapper(u8 dev_addr, u8 reg_addr, u8 *data, u8 len)
  2974. {
  2975. return hwmsen_read_block(this_client, reg_addr, data, len);
  2976. }
  2977. /*----------------------------------------------------------------------------*/
  2978. static char bmm150_i2c_write_wrapper(u8 dev_addr, u8 reg_addr, u8 *data, u8 len)
  2979. {
  2980. u8 buff[BMM150_BUFSIZE + 1];
  2981. if (len > BMM150_BUFSIZE)
  2982. {
  2983. return -1;
  2984. }
  2985. buff[0] = reg_addr;
  2986. memcpy(buff+1, data, len);
  2987. if (i2c_master_send(this_client, buff, len+1) != (len+1))
  2988. {
  2989. /* I2C transfer error */
  2990. return -EIO;
  2991. }
  2992. else
  2993. {
  2994. return 0;
  2995. }
  2996. }
  2997. /*----------------------------------------------------------------------------*/
  2998. static void bmm150_delay(u32 msec)
  2999. {
  3000. mdelay(msec);
  3001. }
  3002. /*----------------------------------------------------------------------------*/
  3003. static int bmm150_init_client(struct i2c_client *client)
  3004. {
  3005. struct bmm150_i2c_data *obj = i2c_get_clientdata(client);
  3006. int res = 0;
  3007. res = bmm150_wakeup(client);
  3008. if (res < 0)
  3009. {
  3010. return res;
  3011. }
  3012. res = bmm150_checkchipid(client);
  3013. if(res < 0)
  3014. {
  3015. return res;
  3016. }
  3017. MSE_LOG("check chip ID ok");
  3018. //bmm150 api init
  3019. obj->device.bus_read = bmm150_i2c_read_wrapper;
  3020. obj->device.bus_write = bmm150_i2c_write_wrapper;
  3021. obj->device.delay_msec = bmm150_delay;
  3022. bmm150api_init(&obj->device);
  3023. /* now it's power on which is considered as resuming from suspend */
  3024. obj->op_mode = BMM150_SUSPEND_MODE;
  3025. obj->odr = BMM150_REGULAR_DR;
  3026. obj->rept_xy = BMM150_REGULAR_REPXY;
  3027. obj->rept_z = BMM150_REGULAR_REPZ;
  3028. res = bmm150api_set_functional_state(BMM150_SUSPEND_MODE);
  3029. if (res)
  3030. {
  3031. return -EIO;
  3032. }
  3033. return 0;
  3034. }
  3035. /*----------------------------------------------------------------------------*/
  3036. int __attribute__((weak)) bsx_algo_m_enable(int en)
  3037. {
  3038. return 0;
  3039. }
  3040. int __attribute__((weak)) bsx_algo_m_set_delay(u64 ns)
  3041. {
  3042. return 0;
  3043. }
  3044. int __attribute__((weak)) bsx_algo_m_open_report_data(int open)
  3045. {
  3046. return 0;
  3047. }
  3048. int __attribute__((weak)) bsx_algo_o_enable(int en)
  3049. {
  3050. return 0;
  3051. }
  3052. int __attribute__((weak)) bsx_algo_o_set_delay(u64 ns)
  3053. {
  3054. return 0;
  3055. }
  3056. int __attribute__((weak)) bsx_algo_o_open_report_data(int open)
  3057. {
  3058. return 0;
  3059. }
  3060. int __attribute__((weak)) bsx_algo_o_get_data(int* x ,int* y,int* z, int* status)
  3061. {
  3062. return 0;
  3063. }
  3064. int __attribute__((weak)) bsx_algo_m_get_data(int* x ,int* y,int* z, int* status)
  3065. {
  3066. return 0;
  3067. }
  3068. /*----------------------------------------------------------------------------*/
  3069. int bmm150_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  3070. {
  3071. struct i2c_client *new_client;
  3072. struct bmm150_i2c_data *data;
  3073. int err = 0;
  3074. struct mag_control_path ctl={0};
  3075. struct mag_data_path mag_data={0};
  3076. MSE_FUN();
  3077. if(!(data = kmalloc(sizeof(struct bmm150_i2c_data), GFP_KERNEL)))
  3078. {
  3079. err = -ENOMEM;
  3080. goto exit;
  3081. }
  3082. memset(data, 0, sizeof(struct bmm150_i2c_data));
  3083. data->hw = hw;
  3084. err = hwmsen_get_convert(data->hw->direction, &data->cvt);
  3085. if(err)
  3086. {
  3087. MSE_ERR("invalid direction: %d\n", data->hw->direction);
  3088. goto exit;
  3089. }
  3090. atomic_set(&data->layout, data->hw->direction);
  3091. atomic_set(&data->trace, 0);
  3092. mutex_init(&sensor_data_mutex);
  3093. mutex_init(&uplink_event_flag_mutex);
  3094. init_waitqueue_head(&uplink_event_flag_wq);
  3095. data->client = client;
  3096. new_client = data->client;
  3097. i2c_set_clientdata(new_client, data);
  3098. this_client = new_client;
  3099. //initial client
  3100. err = bmm150_init_client(this_client);
  3101. if (err)
  3102. {
  3103. MSE_ERR("fail to initialize client");
  3104. goto exit_client_failed;
  3105. }
  3106. /* Register sysfs attribute */
  3107. err = bmm150_create_attr(&bmm150_init_info.platform_diver_addr->driver);
  3108. if(err)
  3109. {
  3110. MSE_ERR("create attribute err = %d\n", err);
  3111. goto exit_sysfs_create_group_failed;
  3112. }
  3113. err = misc_register(&bmm150_device);
  3114. if(err)
  3115. {
  3116. MSE_ERR("bmm150_device register failed\n");
  3117. goto exit_misc_device_register_failed;
  3118. }
  3119. ctl.m_enable = bsx_algo_m_enable;
  3120. ctl.m_set_delay = bsx_algo_m_set_delay;
  3121. ctl.m_open_report_data = bsx_algo_m_open_report_data;
  3122. ctl.o_enable = bsx_algo_o_enable;
  3123. ctl.o_set_delay = bsx_algo_o_set_delay;
  3124. ctl.o_open_report_data = bsx_algo_o_open_report_data;
  3125. ctl.is_report_input_direct = false;
  3126. err = mag_register_control_path(&ctl);
  3127. if(err)
  3128. {
  3129. MAG_ERR("register mag control path err\n");
  3130. goto exit_kfree;
  3131. }
  3132. mag_data.div_m = CONVERT_M_DIV;
  3133. mag_data.div_o = CONVERT_O_DIV;
  3134. mag_data.get_data_o = bsx_algo_o_get_data;
  3135. mag_data.get_data_m = bsx_algo_m_get_data;
  3136. err = mag_register_data_path(&mag_data);
  3137. if(err)
  3138. {
  3139. MAG_ERR("register data control path err\n");
  3140. goto exit_kfree;
  3141. }
  3142. #if defined(CONFIG_HAS_EARLYSUSPEND)
  3143. data->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1,
  3144. data->early_drv.suspend = bmm150_early_suspend,
  3145. data->early_drv.resume = bmm150_late_resume,
  3146. register_early_suspend(&data->early_drv);
  3147. #endif
  3148. bmm150_init_flag = 1;
  3149. MSE_LOG("%s: OK\n", __func__);
  3150. return 0;
  3151. exit_client_failed:
  3152. exit_sysfs_create_group_failed:
  3153. exit_misc_device_register_failed:
  3154. #if 1
  3155. exit_kfree:
  3156. #endif
  3157. kfree(data);
  3158. exit:
  3159. bmm150_init_flag = -1;
  3160. MSE_ERR( "%s: err = %d\n", __func__, err);
  3161. return err;
  3162. }
  3163. /*----------------------------------------------------------------------------*/
  3164. static int bmm150_i2c_remove(struct i2c_client *client)
  3165. {
  3166. struct bmm150_i2c_data *obj = i2c_get_clientdata(client);
  3167. if(bmm150_delete_attr(&bmm150_init_info.platform_diver_addr->driver))
  3168. {
  3169. MSE_ERR( "bmm150_delete_attr fail");
  3170. }
  3171. #ifdef CONFIG_HAS_EARLYSUSPEND
  3172. unregister_early_suspend(&obj->early_drv);
  3173. #endif
  3174. bmm150api_set_functional_state(BMM150_SUSPEND_MODE);
  3175. this_client = NULL;
  3176. i2c_unregister_device(client);
  3177. kfree(obj);
  3178. misc_deregister(&bmm150_device);
  3179. return 0;
  3180. }
  3181. /*----------------------------------------------------------------------------*/
  3182. #ifdef CONFIG_OF
  3183. static const struct of_device_id mag_of_match[] = {
  3184. {.compatible = "mediatek,msensor"},
  3185. {},
  3186. };
  3187. #endif
  3188. static struct i2c_driver bmm150_i2c_driver = {
  3189. .driver = {
  3190. .name = BMM150_DEV_NAME,
  3191. #ifdef CONFIG_OF
  3192. .of_match_table = mag_of_match,
  3193. #endif
  3194. },
  3195. .probe = bmm150_i2c_probe,
  3196. .remove = bmm150_i2c_remove,
  3197. #if !defined(CONFIG_HAS_EARLYSUSPEND)
  3198. .suspend = bmm150_suspend,
  3199. .resume = bmm150_resume,
  3200. #endif
  3201. .id_table = bmm150_i2c_id,
  3202. };
  3203. static int bmm150_remove(void)
  3204. {
  3205. MSE_FUN();
  3206. bmm150_power(hw, 0);
  3207. i2c_del_driver(&bmm150_i2c_driver);
  3208. return 0;
  3209. }
  3210. static int bmm150_local_init(void)
  3211. {
  3212. MSE_LOG("fwq loccal init+++\n");
  3213. bmm150_power(hw, 1);
  3214. if(i2c_add_driver(&bmm150_i2c_driver))
  3215. {
  3216. MSE_ERR("add driver error\n");
  3217. return -1;
  3218. }
  3219. if(-1 == bmm150_init_flag)
  3220. {
  3221. MSE_FUN();
  3222. return -1;
  3223. }
  3224. MSE_LOG("fwq loccal init---\n");
  3225. return 0;
  3226. }
  3227. static struct mag_init_info bmm150_init_info = {
  3228. .name = "bmm150",
  3229. .init = bmm150_local_init,
  3230. .uninit = bmm150_remove,
  3231. };
  3232. /*----------------------------------------------------------------------------*/
  3233. static int __init bmm150_init(void)
  3234. {
  3235. const char *name = "mediatek,bmm150";
  3236. hw = get_mag_dts_func(name, hw);
  3237. //i2c_register_board_info(hw->i2c_num, &bmm150_i2c_info, 1);
  3238. mag_driver_add(&bmm150_init_info);
  3239. return 0;
  3240. }
  3241. /*----------------------------------------------------------------------------*/
  3242. static void __exit bmm150_exit(void)
  3243. {
  3244. MSE_FUN();
  3245. }
  3246. /*----------------------------------------------------------------------------*/
  3247. module_init(bmm150_init);
  3248. module_exit(bmm150_exit);
  3249. MODULE_AUTHOR("hongji.zhou@bosch-sensortec.com");
  3250. MODULE_DESCRIPTION("bmm150 compass driver");
  3251. MODULE_LICENSE("GPLv2");