static int
aconfigure(int type, int v)
{
  uint8_t buf[2];

  switch (type) {
  case SENSORS_HW_INIT:
  case SENSORS_ACTIVE:
    if (v) {
      /* normal mode, 100Hz output rate, enable all axes */
      if (!I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,0x2f))
        return false; /* see if we get an ack */

      /* +-2g, block update enabled */
      I2CW(LSM303_ADDR_A,LSM303_CTRL_REG4,0x80);

      acc_active = true;
      acc_startsample(true);
      return true;
    }
    else {
      acc_active = false;
      return I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,0x00);
    }
  case ACC_LSM303_RANGE:
    I2CW(LSM303_ADDR_A,LSM303_CTRL_REG4,(1<<7)|((v&3)<<4));
    break;

  case ACC_LSM303_DRATE:
    if (v<ACC_LSM303VAL_0_5HZ || v>ACC_LSM303VAL_1KHZ)
      return 1;
    else if (v<ACC_LSM303VAL_50HZ)  /* low-power mode */
      I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,(v<<5)|0x07);
    else if (v>=ACC_LSM303VAL_50HZ) /* normal mode    */
      I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,(1<<5)|((v-ACC_LSM303VAL_50HZ)<<3)|0x07);
    break;

  case ACC_LSM303_HIGHPASS:
    buf[0]=LSM303_CTRL_REG2;
    i2cb(LSM303_ADDR_A,1,1,buf);
    buf[1]&=~(0x02);
    buf[1]|=v|(1<<5);
    i2cb(LSM303_ADDR_A,2,0,buf);
    break;

  case ACC_LSM303_FILTER:
    buf[0]=LSM303_CTRL_REG2;
    i2cb(LSM303_ADDR_A,1,1,buf);

    if (v==ACC_LSM303VAL_NONE)
      buf[1]&=~(1<<4); // unset FDS bit
    else if (v==ACC_LSM303VAL_BOTH)
      buf[1]|=(1<<4);  // set FDS bit

    i2cb(LSM303_ADDR_A,2,0,buf);
    break;
  }

  return 0;
}
Exemple #2
0
bool
i2cs(u8_t addr, char *wrbuf)
{
  return i2cb(addr, strlen(wrbuf), 0, wrbuf);
}