70 uint8_t reg, uint8_t *rxbuf,
size_t n) {
72 uint8_t txbuf = reg | LSM303AGR_MS;
73 return i2cMasterTransmitTimeout(i2cp, sad, &txbuf, 1, rxbuf, n,
90 uint8_t *txbuf,
size_t n) {
92 *txbuf |= LSM303AGR_MS;
93 return i2cMasterTransmitTimeout(i2cp, sad, txbuf, n + 1, NULL, 0,
132 osalDbgCheck((ip != NULL) && (axes != NULL));
138 "acc_read_raw(), invalid state");
139 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
140 "acc_read_raw(), channel not ready");
142 #if LSM303AGR_SHARED_I2C
143 i2cAcquireBus(devp->config->i2cp);
144 i2cStart(devp->config->i2cp,
145 devp->config->i2ccfg);
149 LSM303AGR_AD_OUT_X_L_A, buff,
152 #if LSM303AGR_SHARED_I2C
153 i2cReleaseBus(devp->config->i2cp);
158 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
159 axes[i] = (int32_t)tmp;
187 osalDbgCheck((ip != NULL) && (axes != NULL));
193 "acc_read_cooked(), invalid state");
197 axes[i] = (raw[i] * devp->accsensitivity[i]) - devp->accbias[i];
219 osalDbgCheck((ip != NULL) && (bp != NULL));
225 "acc_set_bias(), invalid state");
228 devp->accbias[i] = bp[i];
248 osalDbgCheck(ip != NULL);
254 "acc_reset_bias(), invalid state");
257 devp->accbias[i] = LSM303AGR_ACC_BIAS;
281 osalDbgCheck((ip != NULL) && (sp != NULL));
284 "acc_set_sensivity(), invalid state");
287 devp->accsensitivity[i] = sp[i];
307 osalDbgCheck(ip != NULL);
313 "acc_reset_sensivity(), invalid state");
317 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_2G;
322 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_4G;
327 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_8G;
332 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_16G;
336 osalDbgAssert(FALSE,
"reset_sensivity(), accelerometer full scale issue");
361 osalDbgCheck(devp != NULL);
364 "acc_set_full_scale(), invalid state");
365 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
366 "acc_set_full_scale(), channel not ready");
370 newfs = LSM303AGR_ACC_2G;
373 newfs = LSM303AGR_ACC_4G;
376 newfs = LSM303AGR_ACC_8G;
379 newfs = LSM303AGR_ACC_16G;
386 if(newfs != devp->accfullscale) {
388 scale = newfs / devp->accfullscale;
389 devp->accfullscale = newfs;
391 #if LSM303AGR_SHARED_I2C
392 i2cAcquireBus(devp->config->i2cp);
393 i2cStart(devp->config->i2cp,
394 devp->config->i2ccfg);
400 LSM303AGR_AD_CTRL_REG4_A,
403 #if LSM303AGR_SHARED_I2C
404 i2cReleaseBus(devp->config->i2cp);
410 buff[1] &= ~(LSM303AGR_CTRL_REG4_A_FS_MASK);
412 buff[0] = LSM303AGR_AD_CTRL_REG4_A;
414 #if LSM303AGR_SHARED_I2C
415 i2cAcquireBus(devp->config->i2cp);
416 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
422 #if LSM303AGR_SHARED_I2C
423 i2cReleaseBus(devp->config->i2cp);
431 devp->accsensitivity[i] *= scale;
432 devp->accbias[i] *= scale;
447 osalDbgCheck(ip != NULL);
473 osalDbgCheck((ip != NULL) && (axes != NULL));
479 "comp_read_raw(), invalid state");
480 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
481 "comp_read_raw(), channel not ready");
483 #if LSM303AGR_SHARED_I2C
484 i2cAcquireBus(devp->config->i2cp);
485 i2cStart(devp->config->i2cp,
486 devp->config->i2ccfg);
489 LSM303AGR_AD_OUTX_L_REG_M, buff,
492 #if LSM303AGR_SHARED_I2C
493 i2cReleaseBus(devp->config->i2cp);
498 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
499 axes[i] = (int32_t)tmp;
527 osalDbgCheck((ip != NULL) && (axes != NULL));
534 "comp_read_cooked(), invalid state");
538 axes[i] = (raw[i] * devp->compsensitivity[i]) - devp->compbias[i];
560 osalDbgCheck((ip != NULL) && (bp != NULL));
566 "comp_set_bias(), invalid state");
569 devp->compbias[i] = bp[i];
589 osalDbgCheck(ip != NULL);
595 "comp_reset_bias(), invalid state");
598 devp->compbias[i] = LSM303AGR_COMP_BIAS;
622 osalDbgCheck((ip != NULL) && (sp != NULL));
625 "comp_set_sensivity(), invalid state");
628 devp->compsensitivity[i] = sp[i];
648 osalDbgCheck(ip != NULL);
654 "comp_reset_sensivity(), invalid state");
657 devp->compsensitivity[i] = LSM303AGR_COMP_SENS_50GA;
691 devp->
vmt = &vmt_device;
714 osalDbgCheck((devp != NULL) && (config != NULL));
718 "lsm303agrStart(), invalid state");
720 devp->config = config;
725 cr[0] = LSM303AGR_AD_CTRL_REG1_A;
730 #if LSM303AGR_USE_ADVANCED || defined(__DOXYGEN__)
732 cr[1] |= LSM303AGR_CTRL_REG1_A_LPEN;
748 cr[4] = devp->config->accfullscale;
749 #if LSM303AGR_USE_ADVANCED || defined(__DOXYGEN__)
750 cr[4] |= devp->config->accendianess |
751 devp->config->accblockdataupdate;
753 cr[4] |= LSM303AGR_CTRL_REG4_A_HR;
759 devp->accfullscale = LSM303AGR_ACC_2G;
761 if(devp->config->accsensitivity == NULL)
762 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_2G;
764 devp->accsensitivity[i] = devp->config->accsensitivity[i];
768 devp->accfullscale = LSM303AGR_ACC_4G;
770 if(devp->config->accsensitivity == NULL)
771 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_4G;
773 devp->accsensitivity[i] = devp->config->accsensitivity[i];
777 devp->accfullscale = LSM303AGR_ACC_8G;
779 if(devp->config->accsensitivity == NULL)
780 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_8G;
782 devp->accsensitivity[i] = devp->config->accsensitivity[i];
786 devp->accfullscale = LSM303AGR_ACC_16G;
788 if(devp->config->accsensitivity == NULL)
789 devp->accsensitivity[i] = LSM303AGR_ACC_SENS_16G;
791 devp->accsensitivity[i] = devp->config->accsensitivity[i];
795 osalDbgAssert(FALSE,
"lsm303dlhcStart(), accelerometer full scale issue");
798 if(devp->config->accbias != NULL)
800 devp->accbias[i] = devp->config->accbias[i];
803 devp->accbias[i] = LSM303AGR_ACC_BIAS;
805 #if LSM303AGR_SHARED_I2C
806 i2cAcquireBus((devp)->config->
i2cp);
808 i2cStart((devp)->config->
i2cp, (devp)->config->i2ccfg);
812 #if LSM303AGR_SHARED_I2C
813 i2cReleaseBus((devp)->config->
i2cp);
818 cr[0] = LSM303AGR_AD_CFG_REG_A_M;
822 cr[1] = devp->config->compoutputdatarate;
823 #if LSM303AGR_USE_ADVANCED || defined(__DOXYGEN__)
824 cr[1] |= devp->config->compmode | devp->config->complp;
838 #if LSM303AGR_SHARED_I2C
839 i2cAcquireBus((devp)->config->
i2cp);
840 i2cStart((devp)->config->
i2cp, (devp)->config->i2ccfg);
846 #if LSM303AGR_SHARED_I2C
847 i2cReleaseBus((devp)->config->
i2cp);
850 devp->compfullscale = LSM303AGR_COMP_50GA;
852 if(devp->config->compsensitivity == NULL) {
853 devp->compsensitivity[i] = LSM303AGR_COMP_SENS_50GA;
856 devp->compsensitivity[i] = devp->config->compsensitivity[i];
861 osalThreadSleepMilliseconds(5);
875 osalDbgCheck(devp != NULL);
879 "lsm303agrStop(), invalid state");
882 #if LSM303AGR_SHARED_I2C
883 i2cAcquireBus((devp)->config->i2cp);
884 i2cStart((devp)->config->i2cp, (devp)->config->i2ccfg);
888 cr[0] = LSM303AGR_AD_CTRL_REG1_A;
894 cr[0] = LSM303AGR_AD_CFG_REG_A_M;
899 i2cStop((devp)->config->i2cp);
900 #if LSM303AGR_SHARED_I2C
901 i2cReleaseBus((devp)->config->i2cp);