/** * @brief BMA220 ioctl control entry point * * @param hal Address of an initialized sensor hardware descriptor. * @param cmd Command to execute * @param arg Argument for command (varies) * @return bool true if the call succeeds, else false is returned. */ static bool bma220_ioctl(sensor_t *sensor, sensor_command_t cmd, void *arg) { sensor_hal_t *const hal = sensor->hal; sensor_data_t sample = {.scaled = true}; switch (cmd) { default: sensor->err = SENSOR_ERR_UNSUPPORTED; return false; case SENSOR_SET_STATE: { sensor_state_t const mode = *((sensor_state_t *)arg); if ((mode != sensor->mod) && bma220_set_state(sensor, mode)) { sensor->mod = (mode == SENSOR_STATE_RESET) ? SENSOR_STATE_NORMAL : mode; return true; } else { return false; } } case SENSOR_SET_RANGE: return bma220_set_range(hal, (uint16_t)*((int *)arg)); case SENSOR_SET_BANDWIDTH: return bma220_set_bandwidth(hal, (uint16_t)*((int *)arg)); case SENSOR_ENABLE_EVENT: return bma220_event(sensor, *((sensor_event_t *)arg), 0, true); case SENSOR_DISABLE_EVENT: return bma220_event(sensor, *((sensor_event_t *)arg), 0, false); case SENSOR_SET_THRESHOLD: return bma220_set_threshold(hal, (sensor_threshold_desc_t *)arg); case SENSOR_GET_THRESHOLD: return bma220_get_threshold(hal, (sensor_threshold_desc_t *)arg); case SENSOR_SET_TAP: return bma220_set_tap(hal, (sensor_tap_params_t *)arg); case SENSOR_READ_VECTOR: if (bma220_get_accel(hal, &sample)) { vector3_t *const pvec = (vector3_t *)arg; pvec->x = sample.axis.x; pvec->y = sample.axis.y; pvec->z = sample.axis.z; return true; } else { return false; } } }
int tcc_sensor_set_range(struct i2c_client *client,char range) { return bma220_set_range(client,range); }
/* ioctl command for BMA accel device file */ static int bma_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int err = 0; unsigned char data[6]; /* check cmd */ if(_IOC_TYPE(cmd) != BMA220_IOC_MAGIC) { #ifdef BMA_DEBUG printk("cmd magic type error\n"); #endif return -ENOTTY; } if(_IOC_NR(cmd) > BMA220_IOC_MAXNR) { #ifdef BMA_DEBUG printk("cmd number error\n"); #endif return -ENOTTY; } if(_IOC_DIR(cmd) & _IOC_READ) err = !access_ok(VERIFY_WRITE,(void __user*)arg, _IOC_SIZE(cmd)); else if(_IOC_DIR(cmd) & _IOC_WRITE) err = !access_ok(VERIFY_READ, (void __user*)arg, _IOC_SIZE(cmd)); if(err) { #ifdef BMA_DEBUG printk("cmd access_ok error\n"); #endif return -EFAULT; } /* check bam120_client */ if( bma_client == NULL) { #ifdef BMA_DEBUG printk("I2C driver not install\n"); #endif return -EFAULT; } /* cmd mapping */ switch(cmd) { case BMA220_SOFT_RESET: err = bma220_soft_reset(); return err; case BMA220_SET_SUSPEND: err = bma220_set_suspend(); return err; case BMA220_SET_OFFSET_TARGET_X: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_offset_target_x(*data); return err; case BMA220_SET_OFFSET_TARGET_Y: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_offset_target_y(*data); return err; case BMA220_SET_OFFSET_TARGET_Z: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_offset_target_z(*data); return err; case BMA220_SET_RANGE: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_range(*data); return err; case BMA220_GET_RANGE: err = bma220_get_range(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_SET_MODE: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_mode(*data); return err; case BMA220_GET_MODE: err = bma220_get_mode(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_SET_BANDWIDTH: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_bandwidth(*data); return err; case BMA220_GET_BANDWIDTH: err = bma220_get_bandwidth(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_SET_LOW_TH: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_low_th(*data); return err; case BMA220_SET_LOW_DUR: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_low_dur(*data); return err; case BMA220_SET_HIGH_TH: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_high_th(*data); return err; case BMA220_SET_HIGH_DUR: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_high_dur(*data); return err; case BMA220_RESET_INTERRUPT: err = bma220_reset_int(); return err; case BMA220_READ_ACCEL_X: err = bma220_read_accel_x((signed char*)data); if(copy_to_user((signed char*)arg,(signed char*)data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_READ_ACCEL_Y: err = bma220_read_accel_y((signed char*)data); if(copy_to_user((signed char*)arg,(signed char*)data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_READ_ACCEL_Z: err = bma220_read_accel_z((signed char*)data); if(copy_to_user((signed char*)arg,(signed char*)data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_SET_EN_LOW: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_en_low(*data); return err; case BMA220_SET_EN_HIGH_XYZ: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_en_high_xyz(*data); return err; case BMA220_SET_LATCH_INT: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_latch_int(*data); return err; case BMA220_SET_LOW_HY: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_low_hy(*data); return err; case BMA220_SET_HIGH_HY: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_high_hy(*data); return err; case BMA220_READ_ACCEL_XYZ: if(sensor_type == BMA220) { err = bma220_read_accel_xyz((bma220acc_t*)data); if(copy_to_user((bma220acc_t*)arg,(bma220acc_t*)data,3)!=0) { #ifdef BMA_DEBUG printk("copy_to error\n"); #endif return -EFAULT; } }else if(sensor_type == BMA023) { err = bma023_read_accel_xyz((bma023acc_t*)data); //printk("[%s] read accel x = %d, y = %d, z = %d\n", __func__, ((bma023acc_t*)data)->x, ((bma023acc_t*)data)->y, ((bma023acc_t*)data)->z); if(copy_to_user((bma023acc_t*)arg,(bma023acc_t*)data,3*sizeof(short))!=0) { #ifdef BMA_DEBUG printk("copy_to error\n"); #endif return -EFAULT; } } return err; case BMA220_GET_OFFSET_XYZ: err = bma220_get_offset_xyz((bma220acc_t*)data); if(copy_to_user((bma220acc_t*)arg,(bma220acc_t*)data,3)!=0) { #ifdef BMA_DEBUG printk("copy_to error\n"); #endif return -EFAULT; } return err; case BMA220_SET_OFFSET_XYZ: if(copy_from_user((bma220acc_t*)data,(bma220acc_t*)arg,3)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_offset_xyz(*(bma220acc_t *)data); return err; case BMA220_SET_SLEEP_EN: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_sleep_en(*data); return err; case BMA220_SET_SC_FILT_CONFIG: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_sc_filt_config(*data); return err; case BMA220_SET_SERIAL_HIGH_BW: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_serial_high_bw(*data); return err; case BMA220_SET_EN_ORIENT: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_en_orient(*data); return err; case BMA220_SET_ORIENT_EX: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_orient_ex(*data); return err; case BMA220_SET_ORIENT_BLOCKING: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_orient_blocking(*data); return err; case BMA220_SET_EN_TT_XYZ: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_en_tt_xyz(*data); return err; case BMA220_SET_TT_TH: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_tt_th(*data); return err; case BMA220_SET_TT_DUR: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_tt_dur(*data); return err; case BMA220_SET_TT_FILT: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_tt_filt(*data); return err; case BMA220_SET_EN_SLOPE_XYZ: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_en_slope_xyz(*data); return err; case BMA220_SET_EN_DATA: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_en_data(*data); return err; case BMA220_SET_SLOPE_TH: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_slope_th(*data); return err; case BMA220_SET_SLOPE_DUR: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_slope_dur(*data); return err; case BMA220_SET_SLOPE_FILT: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_slope_filt(*data); return err; case BMA220_SET_CAL_TRIGGER: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_cal_trigger(*data); return err; case BMA220_SET_HP_XYZ_EN: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_hp_xyz_en(*data); return err; case BMA220_SET_SLEEP_DUR: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_sleep_dur(*data); return err; case BMA220_SET_OFFSET_RESET: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_offset_reset(*data); return err; case BMA220_SET_CUT_OFF_SPEED: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_cut_off_speed(*data); return err; case BMA220_SET_CAL_MANUAL: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_cal_manual(*data); return err; case BMA220_SET_SBIST: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_sbist(*data); return err; case BMA220_SET_INTERRUPT_REGISTER: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_interrupt_register(*data); return err; case BMA220_SET_DIRECTION_INTERRUPT_REGISTER: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_direction_interrupt_register(*data); return err; case BMA220_GET_DIRECTION_STATUS_REGISTER: err = bma220_get_direction_status_register(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_INTERRUPT_STATUS_REGISTER: err = bma220_get_interrupt_status_register(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_ORIENTATION: err = bma220_get_orientation(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_ORIENT_INT: err = bma220_get_orient_int(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_CHIP_ID: err = bma220_get_chip_id(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SC_FILT_CONFIG: err = bma220_get_sc_filt_config(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SLEEP_EN: err = bma220_get_sleep_en(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SERIAL_HIGH_BW: err = bma220_get_serial_high_bw(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_LATCH_INT: err = bma220_get_latch_int(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_EN_DATA: err = bma220_get_en_data(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_EN_HIGH_XYZ: err = bma220_get_en_high_xyz(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_HIGH_TH: err = bma220_get_high_th(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_HIGH_HY: err = bma220_get_high_hy(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_HIGH_DUR: err = bma220_get_high_g_dur(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_EN_LOW: err = bma220_get_en_low(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_LOW_TH: err = bma220_get_low_th(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_LOW_HY: err = bma220_get_low_hy(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_LOW_DUR: err = bma220_get_low_g_dur(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_EN_ORIENT: err = bma220_get_en_orient(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_ORIENT_EX: err = bma220_get_orient_ex(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_ORIENT_BLOCKING: err = bma220_get_orient_blocking(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_EN_TT_XYZ: err = bma220_get_en_tt_xyz(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_TT_TH: err = bma220_get_tt_th(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_TT_DUR: err = bma220_get_tt_dur(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_TT_FILT: err = bma220_get_tt_filt(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_SET_TT_SAMP: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_tt_samp(*data); return err; case BMA220_SET_TIP_EN: if(copy_from_user(data,(unsigned char*)arg,1)!=0) { #ifdef BMA_DEBUG printk("copy_from_user error\n"); #endif return -EFAULT; } err = bma220_set_tip_en(*data); return err; case BMA220_GET_TT_SAMP: err = bma220_get_tt_samp(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_TIP_EN: err = bma220_get_tip_en(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_EN_SLOPE_XYZ: err = bma220_get_en_slope_xyz(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SLOPE_TH: err = bma220_get_slope_th(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SLOPE_DUR: err = bma220_get_slope_dur(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SLOPE_FILT: err = bma220_get_slope_filt(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_HP_XYZ_EN: err = bma220_get_hp_xyz_en(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_OFFSET_TARGET_X: err = bma220_get_offset_target_x(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_OFFSET_TARGET_Y: err = bma220_get_offset_target_y(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_OFFSET_TARGET_Z: err = bma220_get_offset_target_z(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_CUT_OFF_SPEED: err = bma220_get_cut_off_speed(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_CAL_MANUAL: err = bma220_get_cal_manual(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_CAL_RDY: err = bma220_get_cal_rdy(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SLEEP_DUR: err = bma220_get_sleep_dur(data); if(copy_to_user((unsigned char*)arg,data,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; case BMA220_GET_SENSOR_TYPE: printk("[%s] Get Sensor Type = %d\n", __func__, sensor_type); if(copy_to_user((char*)arg,&sensor_type,1)!=0) { #ifdef BMA_DEBUG printk("copy_to_user error\n"); #endif return -EFAULT; } return err; default: return 0; } }
static int bma_probe(struct i2c_client *client, const struct i2c_device_id *id) { int err = 0; int tempvalue; struct bma_data *data; #ifdef BMA_DEBUG printk(KERN_INFO "%s\n",__FUNCTION__); #endif if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { printk(KERN_INFO "i2c_check_functionality error\n"); goto exit; } data = kzalloc(sizeof(struct bma_data), GFP_KERNEL); if (!data) { err = -ENOMEM; goto exit; } printk("[%s] slave addr = %x\n", __func__, client->addr); /* read chip id */ tempvalue = 0; #if 1//BMA220_SMBUS tempvalue = i2c_smbus_read_word_data(client, 0x00); #else i2c_master_send(client, (char*)&tempvalue, 1); i2c_master_recv(client, (char*)&tempvalue, 1); #endif if((tempvalue&0x0007) == 0x0002) { printk(KERN_INFO "Bosch Sensortec Device detected!\nBMA023 registered I2C driver!\n"); bma_client = client; sensor_type = BMA023; } else { client->addr = BMA220_I2C_ADDR; tempvalue = 0; tempvalue = i2c_smbus_read_word_data(client, 0x00); if((tempvalue&0x00FF) == 0x00dd) { printk(KERN_INFO "Bosch Sensortec Device detected!\nBMA220 registered I2C driver!\n"); bma_client = client; sensor_type= BMA220; } else { printk(KERN_ERR "Bosch Sensortec Device not found, i2c error %d \n", tempvalue); // i2c_detach_client(client); bma_client = NULL; err = -1; goto kfree_exit; } } i2c_set_clientdata(bma_client, data); err = misc_register(&bma_device); if (err) { printk(KERN_ERR "bma accel device register failed\n"); goto kfree_exit; } printk(KERN_INFO "bma accel device create ok\n"); if(sensor_type == BMA220) { /* bma220 sensor initial */ data->bma220.bus_write = bma220_i2c_write; data->bma220.bus_read = bma220_i2c_read; data->bma220.delay_msec = bma220_i2c_delay; bma220_init(&(data->bma220)); bma220_set_bandwidth(2); //bandwidth 250Hz bma220_set_range(0); //range +/- 2G /* register interrupt */ bma220_set_en_tt_xyz(0); bma220_set_en_slope_xyz(0); bma220_set_en_high_xyz(0); bma220_set_en_low(0); bma220_set_en_orient(0); bma220_reset_int(); } else if(sensor_type == BMA023) { data->bma023.bma023_bus_write = i2c_acc_bma023_write; data->bma023.bma023_bus_read = i2c_acc_bma023_read; /*call init function to set read write functions, read registers */ bma023_init( &(data->bma023) ); /* from this point everything is prepared for sensor communication */ /* set range to 2G mode, other constants: * 4G: bma023_RANGE_4G, * 8G: bma023_RANGE_8G */ bma023_set_range(bma023_RANGE_2G); /* set bandwidth to 25 HZ */ bma023_set_bandwidth(bma023_BW_25HZ); } return 0; // misc_deregister(&bma_device); kfree_exit: kfree(data); exit: return err; }