static ssize_t bma2x2_value_show(struct device *dev, struct device_attribute *attr, char *buf) { struct input_dev *input = to_input_dev(dev); struct bma2x2_data *bma2x2 = input_get_drvdata(input); struct bma2x2acc acc_value; bma2x2_read_accel_xyz(bma2x2->bma2x2_client, bma2x2->sensor_type, &acc_value); return scnprintf(buf, buff_size, "%d %d %d\n", acc_value.x, acc_value.y, acc_value.z); }
static irqreturn_t bma2x2_interrupt_thread(int irq, void *handle) { struct bma2x2_data *bma2x2 = handle; static struct bma2x2acc acc; bma2x2_read_accel_xyz(bma2x2->bma2x2_client, bma2x2->sensor_type, &acc); input_event(bma2x2->input, EV_MSC, MSC_RX, acc.x); input_event(bma2x2->input, EV_MSC, MSC_RY, acc.y); input_event(bma2x2->input, EV_MSC, MSC_RZ, acc.z); input_sync(bma2x2->input); return IRQ_HANDLED; }
static void bma2x2_work_func(struct work_struct *work) { struct bma2x2_data *bma2x2 = container_of((struct delayed_work *)work, struct bma2x2_data, work); static struct bma2x2acc acc; unsigned long delay = msecs_to_jiffies(atomic_read(&bma2x2->delay)); bma2x2_read_accel_xyz(bma2x2->bma2x2_client, bma2x2->sensor_type, &acc); input_event(bma2x2->input, EV_MSC, MSC_RX, acc.x); input_event(bma2x2->input, EV_MSC, MSC_RY, acc.y); input_event(bma2x2->input, EV_MSC, MSC_RZ, acc.z); input_sync(bma2x2->input); mutex_lock(&bma2x2->value_mutex); bma2x2->value = acc; mutex_unlock(&bma2x2->value_mutex); schedule_delayed_work(&bma2x2->work, delay); }
/* This function is an example for reading sensor data * \param: None * \return: communication result */ s32 bma2x2_data_readout_template(void) { /*Local variables for reading accel x, y and z data*/ s16 accel_x_s16, accel_y_s16, accel_z_s16 = BMA2x2_INIT_VALUE; /* bma2x2acc_data structure used to read accel xyz data*/ struct bma2x2_accel_data sample_xyz; /* bma2x2acc_data_temp structure used to read accel xyz and temperature data*/ struct bma2x2_accel_data_temp sample_xyzt; /* Local variable used to assign the bandwidth value*/ u8 bw_value_u8 = BMA2x2_INIT_VALUE; /* Local variable used to set the bandwidth value*/ u8 banwid = BMA2x2_INIT_VALUE; /* status of communication*/ s32 com_rslt = ERROR; /*********************** START INITIALIZATION ************************ * Based on the user need configure I2C or SPI interface. * It is example code to explain how to use the bma2x2 API*/ #ifdef BMA2x2_API I2C_routine(); /*SPI_routine(); */ #endif /*--------------------------------------------------------------------------* * This function used to assign the value/reference of * the following parameters * I2C address * Bus Write * Bus read * Chip id *-------------------------------------------------------------------------*/ com_rslt = bma2x2_init(&bma2x2); /* For initialization it is required to set the mode of * the sensor as "NORMAL" * NORMAL mode is set from the register 0x11 and 0x12 * 0x11 -> bit 5,6,7 -> set value as 0 * 0x12 -> bit 5,6 -> set value as 0 * data acquisition/read/write is possible in this mode * by using the below API able to set the power mode as NORMAL * For the Normal/standby/Low power 2 mode Idle time of at least 2us(micro seconds) * required for read/write operations*/ /* Set the power mode as NORMAL*/ com_rslt += bma2x2_set_power_mode(BMA2x2_MODE_NORMAL); /* Note: * For the Suspend/Low power1 mode Idle time of at least 450us(micro seconds) * required for read/write operations*/ /************************* END INITIALIZATION *************************/ /*------------------------------------------------------------------------* ************************* START GET and SET FUNCTIONS DATA **************** *---------------------------------------------------------------------------*/ /* This API used to Write the bandwidth of the sensor input value have to be given bandwidth is set from the register 0x10 bits from 1 to 4*/ bw_value_u8 = 0x08;/* set bandwidth of 7.81Hz*/ com_rslt += bma2x2_set_bw(bw_value_u8); /* This API used to read back the written value of bandwidth*/ com_rslt += bma2x2_get_bw(&banwid); /*-----------------------------------------------------------------* ************************* END GET and SET FUNCTIONS **************** *-------------------------------------------------------------------*/ /*------------------------------------------------------------------* ************************* START READ SENSOR DATA(X,Y and Z axis) ******** *---------------------------------------------------------------------*/ /* Read the accel X data*/ com_rslt += bma2x2_read_accel_x(&accel_x_s16); /* Read the accel Y data*/ com_rslt += bma2x2_read_accel_y(&accel_y_s16); /* Read the accel Z data*/ com_rslt += bma2x2_read_accel_z(&accel_z_s16); /* accessing the bma2x2acc_data parameter by using sample_xyz*/ /* Read the accel XYZ data*/ com_rslt += bma2x2_read_accel_xyz(&sample_xyz); /* accessing the bma2x2acc_data_temp parameter by using sample_xyzt*/ /* Read the accel XYZT data*/ com_rslt += bma2x2_read_accel_xyzt(&sample_xyzt); /*--------------------------------------------------------------------* ************************* END READ SENSOR DATA(X,Y and Z axis) ************ *-------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------* ************************* START DE-INITIALIZATION *********************** *-------------------------------------------------------------------------*/ /* For de-initialization it is required to set the mode of * the sensor as "DEEP SUSPEND" * DEEP SUSPEND mode is set from the register 0x11 * 0x11 -> bit 5 -> set value as 1 * the device reaches the lowest power consumption only * interface selection is kept alive * No data acquisition is performed * by using the below API able to set the power mode as DEEPSUSPEND*/ /* Set the power mode as DEEPSUSPEND*/ com_rslt += bma2x2_set_power_mode(BMA2x2_MODE_DEEP_SUSPEND); /*---------------------------------------------------------------------* ************************* END DE-INITIALIZATION ********************** *---------------------------------------------------------------------*/ return com_rslt; }