123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929 |
-
- #include "bmm150.h"
- #define MODE_SETTING_SEL UINT16_C(0x000F)
- #define INTERRUPT_PIN_SETTING_SEL UINT16_C(0x01F0)
- #define INTERRUPT_CONFIG_SEL UINT16_C(0x1E00)
- #define INTERRUPT_THRESHOLD_CONFIG_SEL UINT16_C(0x6000)
- static int8_t null_ptr_check(const struct bmm150_dev *dev);
- static int8_t set_power_control_bit(uint8_t pwrcntrl_bit, struct bmm150_dev *dev);
- static int8_t read_trim_registers(struct bmm150_dev *dev);
- static int8_t write_op_mode(uint8_t op_mode, const struct bmm150_dev *dev);
- static int8_t suspend_to_sleep_mode(struct bmm150_dev *dev);
- static int8_t set_xy_rep(const struct bmm150_dev *dev);
- static int8_t set_z_rep(const struct bmm150_dev *dev);
- static int8_t set_odr(const struct bmm150_dev *dev);
- static int8_t set_odr_xyz_rep(const struct bmm150_dev *dev);
- static int8_t set_control_measurement_xyz(const struct bmm150_dev *dev);
- static uint8_t are_settings_changed(uint16_t sub_settings, uint16_t settings);
- static int8_t mode_settings(uint16_t desired_settings, const struct bmm150_dev *dev);
- static void parse_setting(const uint8_t *reg_data, struct bmm150_dev *dev);
- static int8_t interrupt_pin_settings(uint16_t desired_settings, const struct bmm150_dev *dev);
- static int8_t interrupt_config(uint16_t desired_settings, const struct bmm150_dev *dev);
- static int8_t interrupt_threshold_settings(uint16_t desired_settings, const struct bmm150_dev *dev);
- #ifdef BMM150_USE_FLOATING_POINT
- static float compensate_x(int16_t mag_data_x, uint16_t data_rhall, const struct bmm150_dev *dev);
- static float compensate_y(int16_t mag_data_y, uint16_t data_rhall, const struct bmm150_dev *dev);
- static float compensate_z(int16_t mag_data_z, uint16_t data_rhall, const struct bmm150_dev *dev);
- #else
- static int16_t compensate_x(int16_t mag_data_x, uint16_t data_rhall, const struct bmm150_dev *dev);
- static int16_t compensate_y(int16_t mag_data_y, uint16_t data_rhall, const struct bmm150_dev *dev);
- static int16_t compensate_z(int16_t mag_data_z, uint16_t data_rhall, const struct bmm150_dev *dev);
- #endif
- static int8_t perform_normal_self_test(const struct bmm150_dev *dev);
- static int8_t enable_normal_self_test(uint8_t *self_test_enable, const struct bmm150_dev *dev);
- static int8_t validate_normal_self_test(const struct bmm150_dev *dev);
- static int8_t perform_adv_self_test(struct bmm150_dev *dev);
- static int8_t adv_self_test_settings(struct bmm150_dev *dev);
- static int8_t adv_self_test_measurement(uint8_t self_test_current, int16_t *data_z, struct bmm150_dev *dev);
- static int8_t validate_adv_self_test(int16_t positive_data_z, int16_t negative_data_z);
- static int8_t set_adv_self_test_current(uint8_t self_test_current, const struct bmm150_dev *dev);
- int8_t bmm150_init(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t chip_id = 0;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = set_power_control_bit(BMM150_POWER_CNTRL_ENABLE, dev);
-
- dev->delay_ms(BMM150_START_UP_TIME);
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_CHIP_ID_ADDR, &chip_id, 1, dev);
-
- if (rslt == BMM150_OK) {
-
- if (chip_id == BMM150_CHIP_ID) {
- dev->chip_id = chip_id;
-
- rslt = read_trim_registers(dev);
- } else {
- rslt = BMM150_E_DEV_NOT_FOUND;
- }
- }
- }
- }
- return rslt;
- }
- int8_t bmm150_set_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, const struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- rslt = null_ptr_check(dev);
-
- if ((rslt == BMM150_OK) && (reg_data != NULL) && (len != 0)) {
-
-
- rslt = dev->write(dev->dev_id, reg_addr, reg_data, len);
- } else {
- rslt = BMM150_E_NULL_PTR;
- }
- return rslt;
- }
- int8_t bmm150_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, const struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- rslt = null_ptr_check(dev);
-
- if ((rslt == BMM150_OK) && (reg_data != NULL)) {
- if (dev->intf != BMM150_I2C_INTF) {
-
- reg_addr = reg_addr | 0x80;
- }
-
- rslt = dev->read(dev->dev_id, reg_addr, reg_data, len);
- } else {
- rslt = BMM150_E_NULL_PTR;
- }
- return rslt;
- }
- int8_t bmm150_soft_reset(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- rslt = bmm150_get_regs(BMM150_POWER_CONTROL_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
- reg_data = reg_data | BMM150_SET_SOFT_RESET;
- rslt = bmm150_set_regs(BMM150_POWER_CONTROL_ADDR, ®_data, 1, dev);
- dev->delay_ms(BMM150_SOFT_RESET_DELAY);
- }
- }
- return rslt;
- }
- int8_t bmm150_set_op_mode(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t pwr_mode = dev->settings.pwr_mode;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- switch (pwr_mode) {
- case BMM150_NORMAL_MODE:
-
- rslt = suspend_to_sleep_mode(dev);
- if (rslt == BMM150_OK) {
-
- rslt = write_op_mode(pwr_mode, dev);
- }
- break;
- case BMM150_FORCED_MODE:
-
- rslt = suspend_to_sleep_mode(dev);
- if (rslt == BMM150_OK) {
-
- rslt = write_op_mode(pwr_mode, dev);
- }
- break;
- case BMM150_SLEEP_MODE:
-
- rslt = suspend_to_sleep_mode(dev);
- if (rslt == BMM150_OK) {
-
- rslt = write_op_mode(pwr_mode, dev);
- }
- break;
- case BMM150_SUSPEND_MODE:
-
- rslt = set_power_control_bit(BMM150_POWER_CNTRL_DISABLE, dev);
- break;
- default:
- rslt = BMM150_E_INVALID_CONFIG;
- break;
- }
- }
- return rslt;
- }
- int8_t bmm150_get_op_mode(uint8_t *op_mode, const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- if (dev->settings.pwr_cntrl_bit == BMM150_POWER_CNTRL_DISABLE) {
-
- *op_mode = BMM150_SUSPEND_MODE;
- } else {
-
- rslt = bmm150_get_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- *op_mode = BMM150_GET_BITS(reg_data, BMM150_OP_MODE);
- }
- }
- return rslt;
- }
- int8_t bmm150_set_presetmode(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t preset_mode;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- preset_mode = dev->settings.preset_mode;
- switch (preset_mode) {
- case BMM150_PRESETMODE_LOWPOWER:
-
- dev->settings.data_rate = BMM150_DATA_RATE_10HZ;
- dev->settings.xy_rep = BMM150_LOWPOWER_REPXY;
- dev->settings.z_rep = BMM150_LOWPOWER_REPZ;
- rslt = set_odr_xyz_rep(dev);
- break;
- case BMM150_PRESETMODE_REGULAR:
-
- dev->settings.data_rate = BMM150_DATA_RATE_10HZ;
- dev->settings.xy_rep = BMM150_REGULAR_REPXY;
- dev->settings.z_rep = BMM150_REGULAR_REPZ;
- rslt = set_odr_xyz_rep(dev);
- break;
- case BMM150_PRESETMODE_HIGHACCURACY:
-
- dev->settings.data_rate = BMM150_DATA_RATE_20HZ;
- dev->settings.xy_rep = BMM150_HIGHACCURACY_REPXY;
- dev->settings.z_rep = BMM150_HIGHACCURACY_REPZ;
- rslt = set_odr_xyz_rep(dev);
- break;
- case BMM150_PRESETMODE_ENHANCED:
-
- dev->settings.data_rate = BMM150_DATA_RATE_10HZ;
- dev->settings.xy_rep = BMM150_ENHANCED_REPXY;
- dev->settings.z_rep = BMM150_ENHANCED_REPZ;
- rslt = set_odr_xyz_rep(dev);
- break;
- default:
- rslt = BMM150_E_INVALID_CONFIG;
- break;
- }
- }
- return rslt;
- }
- int8_t bmm150_set_sensor_settings(uint16_t desired_settings, const struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- if (are_settings_changed(MODE_SETTING_SEL, desired_settings)) {
-
- rslt = mode_settings(desired_settings, dev);
- }
- if ((!rslt) && are_settings_changed(INTERRUPT_PIN_SETTING_SEL, desired_settings)) {
-
- rslt = interrupt_pin_settings(desired_settings, dev);
- }
- if ((!rslt) && are_settings_changed(INTERRUPT_CONFIG_SEL, desired_settings)) {
-
- rslt = interrupt_config(desired_settings, dev);
- }
- if ((!rslt) && are_settings_changed(INTERRUPT_THRESHOLD_CONFIG_SEL, desired_settings)) {
-
- rslt = interrupt_threshold_settings(desired_settings, dev);
- }
- }
- return rslt;
- }
- int8_t bmm150_get_sensor_settings(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t setting[BMM150_SETTING_DATA_LEN] = {0};
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_POWER_CONTROL_ADDR, setting, BMM150_SETTING_DATA_LEN, dev);
- if (rslt == BMM150_OK) {
-
- parse_setting(setting, dev);
- }
- }
- return rslt;
- }
- int8_t bmm150_read_mag_data(struct bmm150_dev *dev)
- {
- int8_t rslt;
- int16_t msb_data;
- uint8_t reg_data[BMM150_XYZR_DATA_LEN] = {0};
- struct bmm150_raw_mag_data raw_mag_data;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_DATA_X_LSB, reg_data, BMM150_XYZR_DATA_LEN, dev);
- if (rslt == BMM150_OK) {
-
- reg_data[0] = BMM150_GET_BITS(reg_data[0], BMM150_DATA_X);
-
-
- msb_data = ((int16_t)((int8_t)reg_data[1])) * 32;
-
- raw_mag_data.raw_datax = (int16_t)(msb_data | reg_data[0]);
-
- reg_data[2] = BMM150_GET_BITS(reg_data[2], BMM150_DATA_Y);
-
-
- msb_data = ((int16_t)((int8_t)reg_data[3])) * 32;
-
- raw_mag_data.raw_datay = (int16_t)(msb_data | reg_data[2]);
-
- reg_data[4] = BMM150_GET_BITS(reg_data[4], BMM150_DATA_Z);
-
-
- msb_data = ((int16_t)((int8_t)reg_data[5])) * 128;
-
- raw_mag_data.raw_dataz = (int16_t)(msb_data | reg_data[4]);
-
- reg_data[6] = BMM150_GET_BITS(reg_data[6], BMM150_DATA_RHALL);
- raw_mag_data.raw_data_r = (uint16_t)(((uint16_t)reg_data[7] << 6) | reg_data[6]);
-
- dev->data.x = compensate_x(raw_mag_data.raw_datax, raw_mag_data.raw_data_r, dev);
-
- dev->data.y = compensate_y(raw_mag_data.raw_datay, raw_mag_data.raw_data_r, dev);
-
- dev->data.z = compensate_z(raw_mag_data.raw_dataz, raw_mag_data.raw_data_r, dev);
- }
- }
- return rslt;
- }
- int8_t bmm150_perform_self_test(uint8_t self_test_mode, struct bmm150_dev *dev)
- {
- int8_t rslt;
- int8_t self_test_rslt = 0;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- switch (self_test_mode) {
- case BMM150_NORMAL_SELF_TEST:
-
- dev->settings.pwr_mode = BMM150_SLEEP_MODE;
- rslt = bmm150_set_op_mode(dev);
- if (rslt == BMM150_OK) {
-
- rslt = perform_normal_self_test(dev);
- }
- break;
- case BMM150_ADVANCED_SELF_TEST:
-
- rslt = perform_adv_self_test(dev);
-
- if (rslt >= BMM150_OK) {
-
- self_test_rslt = rslt;
-
- rslt = bmm150_soft_reset(dev);
- }
-
- if (rslt == BMM150_OK) {
-
- rslt = self_test_rslt;
- }
- break;
- default:
- rslt = BMM150_E_INVALID_CONFIG;
- break;
- }
- }
- return rslt;
- }
- int8_t bmm150_get_interrupt_status(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t interrupt_status;
- uint8_t data_ready_status;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_DATA_READY_STATUS, &data_ready_status, 1, dev);
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_INTERRUPT_STATUS, &interrupt_status, 1, dev);
- if (rslt == BMM150_OK) {
-
- data_ready_status = BMM150_GET_BITS_POS_0(data_ready_status, BMM150_DRDY_STATUS);
-
- dev->int_status = (data_ready_status << 8) | interrupt_status;
- }
- }
- }
- return rslt;
- }
- int8_t bmm150_aux_mag_data(uint8_t *aux_data, struct bmm150_dev *dev)
- {
- int8_t rslt;
- int16_t msb_data;
- struct bmm150_raw_mag_data raw_mag_data;
-
- rslt = null_ptr_check(dev);
-
- if ((rslt == BMM150_OK) && (aux_data != NULL)) {
-
- aux_data[0] = BMM150_GET_BITS(aux_data[0], BMM150_DATA_X);
-
-
- msb_data = ((int16_t)((int8_t)aux_data[1])) * 32;
-
- raw_mag_data.raw_datax = (int16_t)(msb_data | aux_data[0]);
-
- aux_data[2] = BMM150_GET_BITS(aux_data[2], BMM150_DATA_Y);
-
-
- msb_data = ((int16_t)((int8_t)aux_data[3])) * 32;
-
- raw_mag_data.raw_datay = (int16_t)(msb_data | aux_data[2]);
-
- aux_data[4] = BMM150_GET_BITS(aux_data[4], BMM150_DATA_Z);
-
-
- msb_data = ((int16_t)((int8_t)aux_data[5])) * 128;
-
- raw_mag_data.raw_dataz = (int16_t)(msb_data | aux_data[4]);
-
- aux_data[6] = BMM150_GET_BITS(aux_data[6], BMM150_DATA_RHALL);
- raw_mag_data.raw_data_r = (uint16_t)(((uint16_t)aux_data[7] << 6) | aux_data[6]);
-
- dev->data.x = compensate_x(raw_mag_data.raw_datax, raw_mag_data.raw_data_r, dev);
-
- dev->data.y = compensate_y(raw_mag_data.raw_datay, raw_mag_data.raw_data_r, dev);
-
- dev->data.z = compensate_z(raw_mag_data.raw_dataz, raw_mag_data.raw_data_r, dev);
- }
- return rslt;
- }
- static int8_t null_ptr_check(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- if ((dev == NULL) || (dev->read == NULL) || (dev->write == NULL) || (dev->delay_ms == NULL)) {
-
- rslt = BMM150_E_NULL_PTR;
- } else {
-
- rslt = BMM150_OK;
- }
- return rslt;
- }
- static int8_t set_power_control_bit(uint8_t pwrcntrl_bit, struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data = 0;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_POWER_CONTROL_ADDR, ®_data, 1, dev);
-
- if (rslt == BMM150_OK) {
-
- reg_data = BMM150_SET_BITS_POS_0(reg_data, BMM150_PWR_CNTRL, pwrcntrl_bit);
- rslt = bmm150_set_regs(BMM150_POWER_CONTROL_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
-
- dev->settings.pwr_cntrl_bit = pwrcntrl_bit;
- }
- }
- }
- return rslt;
- }
- static int8_t read_trim_registers(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t trim_x1y1[2] = {0};
- uint8_t trim_xyz_data[4] = {0};
- uint8_t trim_xy1xy2[10] = {0};
- uint16_t temp_msb = 0;
-
- rslt = bmm150_get_regs(BMM150_DIG_X1, trim_x1y1, 2, dev);
- if (rslt == BMM150_OK) {
- rslt = bmm150_get_regs(BMM150_DIG_Z4_LSB, trim_xyz_data, 4, dev);
- if (rslt == BMM150_OK) {
- rslt = bmm150_get_regs(BMM150_DIG_Z2_LSB, trim_xy1xy2, 10, dev);
- if (rslt == BMM150_OK) {
-
- dev->trim_data.dig_x1 = (int8_t)trim_x1y1[0];
- dev->trim_data.dig_y1 = (int8_t)trim_x1y1[1];
- dev->trim_data.dig_x2 = (int8_t)trim_xyz_data[2];
- dev->trim_data.dig_y2 = (int8_t)trim_xyz_data[3];
- temp_msb = ((uint16_t)trim_xy1xy2[3]) << 8;
- dev->trim_data.dig_z1 = (uint16_t)(temp_msb | trim_xy1xy2[2]);
- temp_msb = ((uint16_t)trim_xy1xy2[1]) << 8;
- dev->trim_data.dig_z2 = (int16_t)(temp_msb | trim_xy1xy2[0]);
- temp_msb = ((uint16_t)trim_xy1xy2[7]) << 8;
- dev->trim_data.dig_z3 = (int16_t)(temp_msb | trim_xy1xy2[6]);
- temp_msb = ((uint16_t)trim_xyz_data[1]) << 8;
- dev->trim_data.dig_z4 = (int16_t)(temp_msb | trim_xyz_data[0]);
- dev->trim_data.dig_xy1 = trim_xy1xy2[9];
- dev->trim_data.dig_xy2 = (int8_t)trim_xy1xy2[8];
- temp_msb = ((uint16_t)(trim_xy1xy2[5] & 0x7F)) << 8;
- dev->trim_data.dig_xyz1 = (uint16_t)(temp_msb | trim_xy1xy2[4]);
- }
- }
- }
- return rslt;
- }
- static int8_t write_op_mode(uint8_t op_mode, const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_OP_MODE, op_mode);
- rslt = bmm150_set_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- }
- }
- return rslt;
- }
- static int8_t suspend_to_sleep_mode(struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- if (dev->settings.pwr_cntrl_bit == BMM150_POWER_CNTRL_DISABLE) {
- rslt = set_power_control_bit(BMM150_POWER_CNTRL_ENABLE, dev);
-
- dev->delay_ms(BMM150_START_UP_TIME);
- }
- }
- return rslt;
- }
- static int8_t set_xy_rep(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t rep_xy;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rep_xy = dev->settings.xy_rep;
- rslt = bmm150_set_regs(BMM150_REP_XY_ADDR, &rep_xy, 1, dev);
- }
- return rslt;
- }
- static int8_t set_z_rep(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t rep_z;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rep_z = dev->settings.z_rep;
- rslt = bmm150_set_regs(BMM150_REP_Z_ADDR, &rep_z, 1, dev);
- }
- return rslt;
- }
- static int8_t set_odr(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_ODR, dev->settings.data_rate);
- rslt = bmm150_set_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- }
- }
- return rslt;
- }
- static int8_t set_odr_xyz_rep(const struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- rslt = set_odr(dev);
- if (rslt == BMM150_OK) {
-
- rslt = set_xy_rep(dev);
- if (rslt == BMM150_OK) {
-
- rslt = set_z_rep(dev);
- }
- }
- return rslt;
- }
- static int8_t set_control_measurement_xyz(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
-
- rslt = null_ptr_check(dev);
-
- if (rslt == BMM150_OK) {
- rslt = bmm150_get_regs(BMM150_AXES_ENABLE_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_CONTROL_MEASURE, dev->settings.xyz_axes_control);
- rslt = bmm150_set_regs(BMM150_AXES_ENABLE_ADDR, ®_data, 1, dev);
- }
- }
- return rslt;
- }
- static uint8_t are_settings_changed(uint16_t sub_settings, uint16_t desired_settings)
- {
- uint8_t settings_changed = FALSE;
- if (sub_settings & desired_settings) {
-
- settings_changed = TRUE;
- } else {
-
- settings_changed = FALSE;
- }
- return settings_changed;
- }
- static int8_t mode_settings(uint16_t desired_settings, const struct bmm150_dev *dev)
- {
- int8_t rslt = BMM150_E_INVALID_CONFIG;
- if (desired_settings & BMM150_DATA_RATE_SEL) {
-
- rslt = set_odr(dev);
- }
- if (desired_settings & BMM150_CONTROL_MEASURE_SEL) {
-
- rslt = set_control_measurement_xyz(dev);
- }
- if (desired_settings & BMM150_XY_REP_SEL) {
-
- rslt = set_xy_rep(dev);
- }
- if (desired_settings & BMM150_Z_REP_SEL) {
-
- rslt = set_z_rep(dev);
- }
- return rslt;
- }
- static void parse_setting(const uint8_t *reg_data, struct bmm150_dev *dev)
- {
-
- dev->settings.z_rep = reg_data[7];
- dev->settings.xy_rep = reg_data[6];
- dev->settings.int_settings.high_threshold = reg_data[5];
- dev->settings.int_settings.low_threshold = reg_data[4];
- dev->settings.xyz_axes_control = BMM150_GET_BITS(reg_data[3], BMM150_CONTROL_MEASURE);
- dev->settings.int_settings.drdy_pin_en = BMM150_GET_BITS(reg_data[3], BMM150_DRDY_EN);
- dev->settings.int_settings.int_pin_en = BMM150_GET_BITS(reg_data[3], BMM150_INT_PIN_EN);
- dev->settings.int_settings.drdy_polarity = BMM150_GET_BITS(reg_data[3], BMM150_DRDY_POLARITY);
- dev->settings.int_settings.int_latch = BMM150_GET_BITS(reg_data[3], BMM150_INT_LATCH);
- dev->settings.int_settings.int_polarity = BMM150_GET_BITS_POS_0(reg_data[3], BMM150_INT_POLARITY);
- dev->settings.int_settings.data_overrun_en = BMM150_GET_BITS(reg_data[2], BMM150_DATA_OVERRUN_INT);
- dev->settings.int_settings.overflow_int_en = BMM150_GET_BITS(reg_data[2], BMM150_OVERFLOW_INT);
- dev->settings.int_settings.high_int_en = BMM150_GET_BITS(reg_data[2], BMM150_HIGH_THRESHOLD_INT);
- dev->settings.int_settings.low_int_en = BMM150_GET_BITS_POS_0(reg_data[2], BMM150_LOW_THRESHOLD_INT);
- dev->settings.data_rate = BMM150_GET_BITS(reg_data[1], BMM150_ODR);
- }
- static int8_t interrupt_pin_settings(uint16_t desired_settings, const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
- struct bmm150_int_ctrl_settings int_settings;
- rslt = bmm150_get_regs(BMM150_AXES_ENABLE_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
- int_settings = dev->settings.int_settings;
- if (desired_settings & BMM150_DRDY_PIN_EN_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_DRDY_EN, int_settings.drdy_pin_en);
- }
- if (desired_settings & BMM150_INT_PIN_EN_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_INT_PIN_EN, int_settings.int_pin_en);
- }
- if (desired_settings & BMM150_DRDY_POLARITY_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_DRDY_POLARITY, int_settings.drdy_polarity);
- }
- if (desired_settings & BMM150_INT_LATCH_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_INT_LATCH, int_settings.int_latch);
- }
- if (desired_settings & BMM150_INT_POLARITY_SEL) {
-
- reg_data = BMM150_SET_BITS_POS_0(reg_data, BMM150_INT_POLARITY, int_settings.int_polarity);
- }
-
- rslt = bmm150_set_regs(BMM150_AXES_ENABLE_ADDR, ®_data, 1, dev);
- }
- return rslt;
- }
- static int8_t interrupt_config(uint16_t desired_settings, const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
- struct bmm150_int_ctrl_settings int_settings;
- rslt = bmm150_get_regs(BMM150_INT_CONFIG_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
- int_settings = dev->settings.int_settings;
- if (desired_settings & BMM150_DATA_OVERRUN_INT_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_DATA_OVERRUN_INT, int_settings.data_overrun_en);
- }
- if (desired_settings & BMM150_OVERFLOW_INT_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_OVERFLOW_INT, int_settings.overflow_int_en);
- }
- if (desired_settings & BMM150_HIGH_THRESHOLD_INT_SEL) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_HIGH_THRESHOLD_INT, int_settings.high_int_en);
- }
- if (desired_settings & BMM150_LOW_THRESHOLD_INT_SEL) {
-
- reg_data = BMM150_SET_BITS_POS_0(reg_data, BMM150_LOW_THRESHOLD_INT, int_settings.low_int_en);
- }
-
- rslt = bmm150_set_regs(BMM150_INT_CONFIG_ADDR, ®_data, 1, dev);
- }
- return rslt;
- }
- static int8_t interrupt_threshold_settings(uint16_t desired_settings, const struct bmm150_dev *dev)
- {
- int8_t rslt = BMM150_E_INVALID_CONFIG;
- uint8_t reg_data;
- if (desired_settings & BMM150_LOW_THRESHOLD_SETTING_SEL) {
-
- reg_data = dev->settings.int_settings.low_threshold;
- rslt = bmm150_set_regs(BMM150_LOW_THRESHOLD_ADDR, ®_data, 1, dev);
- }
- if (desired_settings & BMM150_HIGH_THRESHOLD_SETTING_SEL) {
-
- reg_data = dev->settings.int_settings.high_threshold;
- rslt = bmm150_set_regs(BMM150_HIGH_THRESHOLD_ADDR, ®_data, 1, dev);
- }
- return rslt;
- }
- #ifdef BMM150_USE_FLOATING_POINT
- static float compensate_x(int16_t mag_data_x, uint16_t data_rhall, const struct bmm150_dev *dev)
- {
- float retval = 0;
- float process_comp_x0;
- float process_comp_x1;
- float process_comp_x2;
- float process_comp_x3;
- float process_comp_x4;
-
- if ((mag_data_x != BMM150_XYAXES_FLIP_OVERFLOW_ADCVAL) &&
- (data_rhall != 0) && (dev->trim_data.dig_xyz1 != 0)) {
-
- process_comp_x0 = (((float)dev->trim_data.dig_xyz1) * 16384.0f / data_rhall);
- retval = (process_comp_x0 - 16384.0f);
- process_comp_x1 = ((float)dev->trim_data.dig_xy2) * (retval * retval / 268435456.0f);
- process_comp_x2 = process_comp_x1 + retval * ((float)dev->trim_data.dig_xy1) / 16384.0f;
- process_comp_x3 = ((float)dev->trim_data.dig_x2) + 160.0f;
- process_comp_x4 = mag_data_x * ((process_comp_x2 + 256.0f) * process_comp_x3);
- retval = ((process_comp_x4 / 8192.0f) + (((float)dev->trim_data.dig_x1) * 8.0f)) / 16.0f;
- } else {
-
- retval = BMM150_OVERFLOW_OUTPUT_FLOAT;
- }
- return retval;
- }
- static float compensate_y(int16_t mag_data_y, uint16_t data_rhall, const struct bmm150_dev *dev)
- {
- float retval = 0;
- float process_comp_y0;
- float process_comp_y1;
- float process_comp_y2;
- float process_comp_y3;
- float process_comp_y4;
-
- if ((mag_data_y != BMM150_XYAXES_FLIP_OVERFLOW_ADCVAL)
- && (data_rhall != 0) && (dev->trim_data.dig_xyz1 != 0)) {
-
- process_comp_y0 = ((float)dev->trim_data.dig_xyz1) * 16384.0f / data_rhall;
- retval = process_comp_y0 - 16384.0f;
- process_comp_y1 = ((float)dev->trim_data.dig_xy2) * (retval * retval / 268435456.0f);
- process_comp_y2 = process_comp_y1 + retval * ((float)dev->trim_data.dig_xy1) / 16384.0f;
- process_comp_y3 = ((float)dev->trim_data.dig_y2) + 160.0f;
- process_comp_y4 = mag_data_y * (((process_comp_y2) + 256.0f) * process_comp_y3);
- retval = ((process_comp_y4 / 8192.0f) + (((float)dev->trim_data.dig_y1) * 8.0f)) / 16.0f;
- } else {
-
- retval = BMM150_OVERFLOW_OUTPUT_FLOAT;
- }
- return retval;
- }
- static float compensate_z(int16_t mag_data_z, uint16_t data_rhall, const struct bmm150_dev *dev)
- {
- float retval = 0;
- float process_comp_z0;
- float process_comp_z1;
- float process_comp_z2;
- float process_comp_z3;
- float process_comp_z4;
- float process_comp_z5;
-
- if ((mag_data_z != BMM150_ZAXIS_HALL_OVERFLOW_ADCVAL) &&
- (dev->trim_data.dig_z2 != 0) && (dev->trim_data.dig_z1 != 0)
- && (dev->trim_data.dig_xyz1 != 0) && (data_rhall != 0)) {
-
- process_comp_z0 = ((float)mag_data_z) - ((float)dev->trim_data.dig_z4);
- process_comp_z1 = ((float)data_rhall) - ((float)dev->trim_data.dig_xyz1);
- process_comp_z2 = (((float)dev->trim_data.dig_z3) * process_comp_z1);
- process_comp_z3 = ((float)dev->trim_data.dig_z1) * ((float)data_rhall) / 32768.0f;
- process_comp_z4 = ((float)dev->trim_data.dig_z2) + process_comp_z3;
- process_comp_z5 = (process_comp_z0 * 131072.0f) - process_comp_z2;
- retval = (process_comp_z5 / ((process_comp_z4) * 4.0f)) / 16.0f;
- } else {
-
- retval = BMM150_OVERFLOW_OUTPUT_FLOAT;
- }
- return retval;
- }
- #else
- static int16_t compensate_x(int16_t mag_data_x, uint16_t data_rhall, const struct bmm150_dev *dev)
- {
- int16_t retval;
- uint16_t process_comp_x0 = 0;
- int32_t process_comp_x1;
- uint16_t process_comp_x2;
- int32_t process_comp_x3;
- int32_t process_comp_x4;
- int32_t process_comp_x5;
- int32_t process_comp_x6;
- int32_t process_comp_x7;
- int32_t process_comp_x8;
- int32_t process_comp_x9;
- int32_t process_comp_x10;
-
- if (mag_data_x != BMM150_XYAXES_FLIP_OVERFLOW_ADCVAL) {
- if (data_rhall != 0) {
-
- process_comp_x0 = data_rhall;
- } else if (dev->trim_data.dig_xyz1 != 0) {
- process_comp_x0 = dev->trim_data.dig_xyz1;
- } else {
- process_comp_x0 = 0;
- }
- if (process_comp_x0 != 0) {
-
- process_comp_x1 = ((int32_t)dev->trim_data.dig_xyz1) * 16384;
- process_comp_x2 = ((uint16_t)(process_comp_x1 / process_comp_x0)) - ((uint16_t)0x4000);
- retval = ((int16_t)process_comp_x2);
- process_comp_x3 = (((int32_t)retval) * ((int32_t)retval));
- process_comp_x4 = (((int32_t)dev->trim_data.dig_xy2) * (process_comp_x3 / 128));
- process_comp_x5 = (int32_t)(((int16_t)dev->trim_data.dig_xy1) * 128);
- process_comp_x6 = ((int32_t)retval) * process_comp_x5;
- process_comp_x7 = (((process_comp_x4 + process_comp_x6) / 512) + ((int32_t)0x100000));
- process_comp_x8 = ((int32_t)(((int16_t)dev->trim_data.dig_x2) + ((int16_t)0xA0)));
- process_comp_x9 = ((process_comp_x7 * process_comp_x8) / 4096);
- process_comp_x10 = ((int32_t)mag_data_x) * process_comp_x9;
- retval = ((int16_t)(process_comp_x10 / 8192));
- retval = (retval + (((int16_t)dev->trim_data.dig_x1) * 8)) / 16;
- } else {
- retval = BMM150_OVERFLOW_OUTPUT;
- }
- } else {
-
- retval = BMM150_OVERFLOW_OUTPUT;
- }
- return retval;
- }
- static int16_t compensate_y(int16_t mag_data_y, uint16_t data_rhall, const struct bmm150_dev *dev)
- {
- int16_t retval;
- uint16_t process_comp_y0 = 0;
- int32_t process_comp_y1;
- uint16_t process_comp_y2;
- int32_t process_comp_y3;
- int32_t process_comp_y4;
- int32_t process_comp_y5;
- int32_t process_comp_y6;
- int32_t process_comp_y7;
- int32_t process_comp_y8;
- int32_t process_comp_y9;
-
- if (mag_data_y != BMM150_XYAXES_FLIP_OVERFLOW_ADCVAL) {
- if (data_rhall != 0) {
-
- process_comp_y0 = data_rhall;
- } else if (dev->trim_data.dig_xyz1 != 0) {
- process_comp_y0 = dev->trim_data.dig_xyz1;
- } else {
- process_comp_y0 = 0;
- }
- if (process_comp_y0 != 0) {
-
- process_comp_y1 = (((int32_t)dev->trim_data.dig_xyz1) * 16384) / process_comp_y0;
- process_comp_y2 = ((uint16_t)process_comp_y1) - ((uint16_t)0x4000);
- retval = ((int16_t)process_comp_y2);
- process_comp_y3 = ((int32_t) retval) * ((int32_t)retval);
- process_comp_y4 = ((int32_t)dev->trim_data.dig_xy2) * (process_comp_y3 / 128);
- process_comp_y5 = ((int32_t)(((int16_t)dev->trim_data.dig_xy1) * 128));
- process_comp_y6 = ((process_comp_y4 + (((int32_t)retval) * process_comp_y5)) / 512);
- process_comp_y7 = ((int32_t)(((int16_t)dev->trim_data.dig_y2) + ((int16_t)0xA0)));
- process_comp_y8 = (((process_comp_y6 + ((int32_t)0x100000)) * process_comp_y7) / 4096);
- process_comp_y9 = (((int32_t)mag_data_y) * process_comp_y8);
- retval = (int16_t)(process_comp_y9 / 8192);
- retval = (retval + (((int16_t)dev->trim_data.dig_y1) * 8)) / 16;
- } else {
- retval = BMM150_OVERFLOW_OUTPUT;
- }
- } else {
-
- retval = BMM150_OVERFLOW_OUTPUT;
- }
- return retval;
- }
- static int16_t compensate_z(int16_t mag_data_z, uint16_t data_rhall, const struct bmm150_dev *dev)
- {
- int32_t retval;
- int16_t process_comp_z0;
- int32_t process_comp_z1;
- int32_t process_comp_z2;
- int32_t process_comp_z3;
- int16_t process_comp_z4;
- if (mag_data_z != BMM150_ZAXIS_HALL_OVERFLOW_ADCVAL) {
- if ((dev->trim_data.dig_z2 != 0) && (dev->trim_data.dig_z1 != 0)
- && (data_rhall != 0) && (dev->trim_data.dig_xyz1 != 0)) {
-
- process_comp_z0 = ((int16_t)data_rhall) - ((int16_t) dev->trim_data.dig_xyz1);
- process_comp_z1 = (((int32_t)dev->trim_data.dig_z3) * ((int32_t)(process_comp_z0))) / 4;
- process_comp_z2 = (((int32_t)(mag_data_z - dev->trim_data.dig_z4)) * 32768);
- process_comp_z3 = ((int32_t)dev->trim_data.dig_z1) * (((int16_t)data_rhall) * 2);
- process_comp_z4 = (int16_t)((process_comp_z3 + (32768)) / 65536);
- retval = ((process_comp_z2 - process_comp_z1) / (dev->trim_data.dig_z2 + process_comp_z4));
-
- if (retval > BMM150_POSITIVE_SATURATION_Z) {
- retval = BMM150_POSITIVE_SATURATION_Z;
- } else {
- if (retval < BMM150_NEGATIVE_SATURATION_Z)
- retval = BMM150_NEGATIVE_SATURATION_Z;
- }
-
- retval = retval / 16;
- } else {
- retval = BMM150_OVERFLOW_OUTPUT;
- }
- } else {
-
- retval = BMM150_OVERFLOW_OUTPUT;
- }
- return (int16_t)retval;
- }
- #endif
- static int8_t perform_normal_self_test(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t self_test_bit;
-
- rslt = enable_normal_self_test(&self_test_bit, dev);
-
- if ((rslt == BMM150_OK) && (self_test_bit == 0)) {
-
- rslt = validate_normal_self_test(dev);
- }
- return rslt;
- }
- static int8_t enable_normal_self_test(uint8_t *self_test_enable, const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
- uint8_t self_test_val;
-
- rslt = bmm150_get_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
-
- self_test_val = 1;
- reg_data = BMM150_SET_BITS_POS_0(reg_data, BMM150_SELF_TEST, self_test_val);
-
- rslt = bmm150_set_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- dev->delay_ms(BMM150_NORMAL_SELF_TEST_DELAY);
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_get_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
-
- *self_test_enable = BMM150_GET_BITS_POS_0(reg_data, BMM150_SELF_TEST);
- }
- }
- return rslt;
- }
- static int8_t validate_normal_self_test(const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t status;
- uint8_t self_test_rslt[5];
-
- rslt = bmm150_get_regs(BMM150_DATA_X_LSB, self_test_rslt, BMM150_SELF_TEST_LEN, dev);
- if (rslt == BMM150_OK) {
-
-
- self_test_rslt[0] = BMM150_GET_BITS_POS_0(self_test_rslt[0], BMM150_SELF_TEST);
-
- self_test_rslt[2] = BMM150_GET_BITS_POS_0(self_test_rslt[2], BMM150_SELF_TEST);
-
- self_test_rslt[4] = BMM150_GET_BITS_POS_0(self_test_rslt[4], BMM150_SELF_TEST);
-
- status = (uint8_t)((self_test_rslt[4] << 2) | (self_test_rslt[2] << 1) | self_test_rslt[0]);
-
- if (status == BMM150_SELF_TEST_STATUS_SUCCESS) {
-
- rslt = BMM150_OK;
- } else {
- if (status == BMM150_SELF_TEST_STATUS_XYZ_FAIL) {
-
- rslt = BMM150_W_NORMAL_SELF_TEST_XYZ_FAIL;
- } else {
-
- rslt = (int8_t)status;
- }
- }
- }
- return rslt;
- }
- static int8_t perform_adv_self_test(struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t self_test_current;
- int16_t positive_data_z;
- int16_t negative_data_z;
-
- rslt = adv_self_test_settings(dev);
- if (rslt == BMM150_OK) {
-
- self_test_current = BMM150_ENABLE_POSITIVE_CURRENT;
- rslt = adv_self_test_measurement(self_test_current, &positive_data_z, dev);
- if (rslt == BMM150_OK) {
-
- self_test_current = BMM150_ENABLE_NEGATIVE_CURRENT;
- rslt = adv_self_test_measurement(self_test_current, &negative_data_z, dev);
- if (rslt == BMM150_OK) {
-
- self_test_current = BMM150_DISABLE_SELF_TEST_CURRENT;
- rslt = set_adv_self_test_current(self_test_current, dev);
- if (rslt == BMM150_OK) {
-
- rslt = validate_adv_self_test(positive_data_z, negative_data_z);
- }
- }
- }
- }
- return rslt;
- }
- static int8_t adv_self_test_settings(struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- dev->settings.pwr_mode = BMM150_SLEEP_MODE;
- rslt = bmm150_set_op_mode(dev);
- if (rslt == BMM150_OK) {
-
- dev->settings.xyz_axes_control = BMM150_DISABLE_XY_AXIS;
- rslt = set_control_measurement_xyz(dev);
- if (rslt == BMM150_OK) {
-
- dev->settings.z_rep = BMM150_SELF_TEST_REP_Z;
- rslt = set_z_rep(dev);
- }
- }
- return rslt;
- }
- static int8_t adv_self_test_measurement(uint8_t self_test_current, int16_t *data_z, struct bmm150_dev *dev)
- {
- int8_t rslt;
-
- rslt = set_adv_self_test_current(self_test_current, dev);
- if (rslt == BMM150_OK) {
-
- dev->settings.pwr_mode = BMM150_FORCED_MODE;
- rslt = bmm150_set_op_mode(dev);
-
- dev->delay_ms(BMM150_ADV_SELF_TEST_DELAY);
- if (rslt == BMM150_OK) {
-
- rslt = bmm150_read_mag_data(dev);
- if (rslt == BMM150_OK) {
-
- *data_z = dev->data.z;
- }
- }
- }
- return rslt;
- }
- static int8_t validate_adv_self_test(int16_t positive_data_z, int16_t negative_data_z)
- {
- int32_t adv_self_test_rslt;
- int8_t rslt;
-
- adv_self_test_rslt = positive_data_z - negative_data_z;
-
-
- if ((adv_self_test_rslt > 180) && (adv_self_test_rslt < 240)) {
-
- rslt = BMM150_OK;
- } else {
-
- rslt = BMM150_W_ADV_SELF_TEST_FAIL;
- }
- return rslt;
- }
- static int8_t set_adv_self_test_current(uint8_t self_test_current, const struct bmm150_dev *dev)
- {
- int8_t rslt;
- uint8_t reg_data;
-
- rslt = bmm150_get_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- if (rslt == BMM150_OK) {
-
- reg_data = BMM150_SET_BITS(reg_data, BMM150_ADV_SELF_TEST, self_test_current);
- rslt = bmm150_set_regs(BMM150_OP_MODE_ADDR, ®_data, 1, dev);
- }
- return rslt;
- }
|