/*----------------------------------------------------------------------------*/ int mpu3050_i2c_read(unsigned char reg,unsigned char *buf,int length) { int status = 0; //status = mpu3050_read_reg_in_burst(mpu3050_i2c_client,reg,buf,length); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, reg, buf, length); return status; }
void mpu3050_read_gyro_xyz(unsigned char *data_xyz) { int status = 0; //status = mpu3050_read_reg_in_burst(mpu3050_i2c_client,MPU3050_GYRO_I2C_GYRO_XOUT_H,&data_xyz[0],6); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_GYRO_XOUT_H, &data_xyz[0], 6); }
void mpu3050_initialize(void) { unsigned char buf[3]={0,}; unsigned char value = 0; int status = 0; #if 0 // Read WHO AM I value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_WHO_AM_I,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_WHO_AM_I ,&value , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_WHO_AM_I : %x\n",value); // Read Product ID value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_PRODUCT_ID,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_PRODUCT_ID ,&value , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_PRODUCT_ID : %x\n",value); /*---------------------------------------------------------------------------------------*/ #endif }
void mpu3050_sleep_wake_up(void) { unsigned char value = 0; unsigned char buf[5] = {0,}; //mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_PWR_MGM,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_PWR_MGM ,&value , 1 ); if(value & 0x78) { value&= ~0x78; buf[0] = MPU3050_GYRO_I2C_PWR_MGM; buf[1] = value; //mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); } }
void mpu3050_i2c_through_pass(int benable) { unsigned char value; unsigned char buf[3]={0,}; int status = 0; value = 0; //printk("[MPU3050].......mpu3050_i2c_through_pass................\n"); //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_USER_CTRL,&value); printk("[MPU3050] [%s:%d]\n",__FUNCTION__, __LINE__); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_USER_CTRL ,&value , 1 ); if(status <0) { printk("[MPU3050] MPU3050_GYRO_I2C_USER_CTRL. i2c ERROR: 0x%x................................\n",value); return; } printk("[MPU3050]................................\n"); if(benable ==MPU3050_BYPASS_MODE_ON) { printk("[MPU3050] bypass on.....................................\n"); if(value & 0x20) value&= ~(0x20); } else // bypass off { printk("[MPU3050] bypass off.....................................\n"); if(!(value & 0x20)) value|= 0x20; } if(!(value & 0x08)) value|=0x08; buf[0] = MPU3050_GYRO_I2C_USER_CTRL; buf[1] = value; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); }
static int star_motion_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg) { void __user *argp = (void __user *)arg; unsigned char data[MAX_MOTION_DATA_LENGTH]={0,}; int buf[5] = {0,}; int flag = 0; int delay = 0; unsigned char tempbuf[200]={0,}; /* MPU3050 i2c MAX data length */ int ret = 0; unsigned char value; switch (cmd) { case MOTION_IOCTL_ENABLE_DISABLE: /* 0 : disable sensor 1: orientation (tilt) 2: accelerometer 3: tap 4: shake */ //printk(".............star_motion_ioctl................\n"); flag = STAR_SENSOR_NONE; if(atomic_read(&accel_flag)){ //printk(".............if(atomic_read(&snap_flag)){................\n"); flag |= STAR_ACCELEROMETER; } if(atomic_read(&tilt_flag)){ //printk(".............if(atomic_read(&tilt_flag)){................\n"); flag |= STAR_TILT; } if(atomic_read(&shake_flag)){ //printk(".............if(atomic_read(&shake_flag)){................\n"); flag |= STAR_SHAKE; } if(atomic_read(&tap_flag)){ //printk(".............if(atomic_read(&tap_flag)){................\n"); flag |= STAR_TAP; } if(atomic_read(&flip_flag)){ //printk(".............if(atomic_read(&flip_flag)){................\n"); flag |= STAR_FLIP; } if(atomic_read(&snap_flag)){ //printk(".............if(atomic_read(&snap_flag)){................\n"); flag |= STAR_SNAP; } if(atomic_read(&gyro_flag)){ //printk(".............if(atomic_read(&snap_flag)){................\n"); flag |= STAR_GYRO; } if (copy_to_user(argp,&flag, sizeof(flag))) { //printk(".............MOTION_IOCTL_SNAP................\n"); return -EFAULT; } break; case MOTION_IOCTL_ACCEL_RAW: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } /* buf[0], [1], [2] = accel_x, accel_y, accel_z; */ atomic_set(&accel_x,buf[0]); atomic_set(&accel_y,buf[1]); atomic_set(&accel_z,buf[2]); //motion_send_tilt_detection(buf[0],buf[1],buf[2]); //printk(".............MOTION_IOCTL_TILT................\n"); break; case MOTION_IOCTL_GYRO_RAW: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } /* buf[0], [1], [2] = gyro_x, gyro_y, gyro_z; */ atomic_set(&gyro_x,buf[0]); atomic_set(&gyro_y,buf[1]); atomic_set(&gyro_z,buf[2]); //motion_send_tilt_detection(buf[0],buf[1],buf[2]); //printk(".............MOTION_IOCTL_TILT................\n"); break; case MOTION_IOCTL_SENSOR_DELAY: delay = atomic_read(&tilt_delay); //printk("MOTION_IOCTL_SENSOR_DELAY[%d]",delay); if (copy_to_user(argp, &delay, sizeof(delay))) { return -EFAULT; } break; case MOTION_IOCTL_TILT: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } /* buf[0], [1], [2] = roll, pitch, yaw; */ atomic_set(&tilt_roll,buf[0]); atomic_set(&tilt_pitch,buf[1]); atomic_set(&tilt_yaw,buf[2]); //motion_send_tilt_detection(buf[0],buf[1],buf[2]); //printk(".............MOTION_IOCTL_TILT................\n"); break; case MOTION_IOCTL_SHAKE: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } /* buf[0] = event; */ //printk(".............MOTION_IOCTL_SHAKE................\n"); motion_send_shake_detection(buf[0]); break; case MOTION_IOCTL_FLIP: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } //printk(".............MOTION_IOCTL_FLIP................\n"); motion_send_flip_detection(buf[0]); break; case MOTION_IOCTL_TAP: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } /* buf[0] = type; buf[1] = direction; */ //printk(".............MOTION_IOCTL_TAP................\n"); motion_send_tap_detection(buf[0],buf[1]); break; case MOTION_IOCTL_SNAP: if (copy_from_user(&buf, argp, sizeof(buf))) { return -EFAULT; } /* buf[0] = direction; */ //printk(".............MOTION_IOCTL_SNAP................\n"); motion_send_snap_detection(buf[0]); break; case MOTION_IOCTL_MPU3050_SLEEP_MODE: //printk(".............MOTION_IOCTL_MPU3050_SLEEP_MODE................\n"); //motion_gyro_sensor_sleep_mode(); motion_sensor_power_off(); //twl4030_i2c_write_u8(0x13, 0x00,0x1b ); //msleep(100); break; case MOTION_IOCTL_MPU3050_SLEEP_WAKE_UP: //printk(".............MOTION_IOCTL_MPU3050_SLEEP_WAKE_UP................\n"); //motion_gyro_sensor_sleep_wake_up(); motion_sensor_power_on(); break; case MOTION_IOCTL_MPU3050_I2C_READ: //printk(".............MOTION_IOCTL_MPU3050_I2C_READ................\n"); if (copy_from_user(&rwbuf, argp, sizeof(rwbuf))) { //printk("FAIL!!!!!!copy_from_user.................MOTION_IOCTL_MPU3050_I2C_READ"); return -EFAULT; } write_lock(&getbuflock); memcpy(&accelrwbuf[0], rwbuf, sizeof(rwbuf)); write_unlock(&getbuflock); if (rwbuf[1] < 1) { printk("EINVAL ERROR......I2C SLAVE MOTION_IOCTL_I2C_READ : rwbuf[1] < 1...\n"); return -EINVAL; } if(rwbuf[0] == GYRO_I2C_SLAVE_ADDR) { //printk("############ (_0_)############ rwbuf[2]: %d(%x) / rwbuf[3]: %d(%x)/ rwbuf[1] : %d(%x)\n",rwbuf[2],rwbuf[2], rwbuf[3],rwbuf[3], rwbuf[1], rwbuf[1]); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, rwbuf[2] ,&rwbuf[3] , rwbuf[1]); if (ret < 0){ printk("MOTION_IOCTL_I2C_READ : GYRO_I2C_SLAVE_ADDR Address ERROR[%d]\n",rwbuf[0]); return -EINVAL; } if (copy_to_user(argp, &rwbuf, sizeof(rwbuf))) { printk("EINVAL ERROR.### GYRO ### I2C SLAVE MOTION_IOCTL_I2C_READ : rwbuf[1] < 1...\n"); return -EFAULT; } } else if(accelrwbuf[0] == 0x0F) { //printk("#### (_0_) #### accelrwbuf[2]: %d(%x) / accelrwbuf[3]: %d(%x)/ accelrwbuf[1] : %d(%x)\n",accelrwbuf[2],accelrwbuf[2], accelrwbuf[3],accelrwbuf[3], accelrwbuf[1], accelrwbuf[1]); //printk("######################## accel get(read) ##########################\n"); if ((!accelrwbuf)){ printk("### EEROR #### accelrwbuf is NULL pointer \n"); return -1; } else{ NvAccelerometerI2CGetRegsPassThrough (accelrwbuf[2] ,&accelrwbuf[3] , accelrwbuf[1]); } if (ret < 0){ printk("MOTION_IOCTL_I2C_READ : ACCEL_I2C_SLAVE_ADDR Address ERROR[%d]\n",accelrwbuf[0]); return -EINVAL; } if (copy_to_user(argp, &accelrwbuf, sizeof(accelrwbuf))) { printk("EINVAL ERROR ### ACCEL ## I2C SLAVE MOTION_IOCTL_I2C_READ : rwbuf[1] < 1...\n"); return -EFAULT; } } #if 0 /**/ else if(accelrwbuf[0] == 0x0e) { //printk("#### (_0_) #### accelrwbuf[2]: %d(%x) / accelrwbuf[3]: %d(%x)/ accelrwbuf[1] : %d(%x)\n",accelrwbuf[2],accelrwbuf[2], accelrwbuf[3],accelrwbuf[3], accelrwbuf[1], accelrwbuf[1]); //printk("######################## accel get(read) ##########################\n"); if ((!accelrwbuf)){ printk("### EEROR #### accelrwbuf is NULL pointer \n"); return -1; } else{ NvGyroAccelI2CGetRegs (accelrwbuf[2] ,&accelrwbuf[3] , accelrwbuf[1]); } if (ret < 0){ printk("MOTION_IOCTL_I2C_READ : ACCEL_I2C_SLAVE_ADDR Address ERROR[%d]\n",accelrwbuf[0]); return -EINVAL; } if (copy_to_user(argp, &accelrwbuf, sizeof(accelrwbuf))) { printk("EINVAL ERROR ### ACCEL ## I2C SLAVE MOTION_IOCTL_I2C_READ : rwbuf[1] < 1...\n"); return -EFAULT; } } #endif else { printk("......I2C SLAVE ADDRESS ERROR!!!...[0x%x]...\n",buf[0]); return -EINVAL; } break; case MOTION_IOCTL_MPU3050_I2C_WRITE: //printk(".............MOTION_IOCTL_MPU3050_I2C_WRITE................\n"); if (copy_from_user(&rwbuf, argp, sizeof(rwbuf))) { printk("EINVAL ERROR.....copy_from_user.I2C SLAVE MOTION_IOCTL_I2C_WRITE \n"); return -EFAULT; } /* rwbuf[0] = slave_addr; // slave addr - GYRO(0x68-MPU) rwbuf[1] = 2; // number of bytes to write +1 rwbuf[2] = reg; // register address rwbuf[3] = value; // register value */ if (rwbuf[1] < 2) { printk("MOTION_IOCTL_WRITE ..length ERROR!!![%d].....\n",rwbuf[1]); return -EINVAL; } if(rwbuf[0] == GYRO_I2C_SLAVE_ADDR) { //ret = mpu3050_i2c_write(&rwbuf[2],rwbuf[1]); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, rwbuf[2] ,&rwbuf[3] , rwbuf[1]-1); if (ret < 0){ printk("MOTION_IOCTL_WRITE : GYRO_I2C_SLAVE_ADDR Address ERROR[%d]\n",rwbuf[0]); return -EINVAL; } } else if(rwbuf[0] == 0x0F) { //ret = kxtf9_i2c_write(&rwbuf[2],rwbuf[1]); //printk("(_6_)rwbuf[2]: %d(%x) / rwbuf[1] : %d(%x)\n",rwbuf[2],rwbuf[2], rwbuf[1], rwbuf[1]); // printk("######################## accel set(write) ##########################\n"); NvAccelerometerI2CSetRegsPassThrough(rwbuf[2] ,&rwbuf[3] , rwbuf[1]-1); //printk("(_7_) rwbuf[3]: %d(%x) \n", rwbuf[3],rwbuf[3]); if (ret < 0){ printk("[KXTF9] MOTION_IOCTL_WRITE : ACCEL_I2C_SLAVE_ADDR ERROR[%d]\n",rwbuf[0]); return -EINVAL; } } #if 0 else if(rwbuf[0] == 0x0e) { //ret = kxtf9_i2c_write(&rwbuf[2],rwbuf[1]); //printk("(_6_)rwbuf[2]: %d(%x) / rwbuf[1] : %d(%x)\n",rwbuf[2],rwbuf[2], rwbuf[1], rwbuf[1]); // printk("######################## accel set(write) ##########################\n"); NvGyroAccelI2CSetRegs(rwbuf[2] ,&rwbuf[3] , rwbuf[1]-1); //printk("(_7_) rwbuf[3]: %d(%x) \n", rwbuf[3],rwbuf[3]); if (ret < 0){ printk("[KXTF9] MOTION_IOCTL_WRITE : ACCEL_I2C_SLAVE_ADDR ERROR[%d]\n",rwbuf[0]); return -EINVAL; } } #endif else { printk("......I2C SLAVE ADDRESS ERROR!!!...[0x%x]...\n",buf[0]); return -EINVAL; } break; default: break; } return 0; }
/*--------------------------------------------------------------------------- platform device ---------------------------------------------------------------------------*/ static int __init star_motion_probe(struct platform_device *pdev) { int err = 0; unsigned char value = 0; struct device *dev = &pdev->dev; struct star_motion_device *gyroscope_accel = NULL; struct input_dev *input_dev = NULL; printk("[MPU3050] ## [%s:%d]\n",__FUNCTION__, __LINE__); gyroscope_accel = kzalloc(sizeof(*gyroscope_accel), GFP_KERNEL); star_motion_dev = gyroscope_accel; printk(KERN_INFO"%s: probe start\n", __func__); /*--------------------------------------------------------------------------- register i2c driver ---------------------------------------------------------------------------*/ #if 0 /*Star Feature*/ err = i2c_add_driver(&gyro_i2c_driver); if(err < 0){ printk("************* LGE: gyro_i2c_test_client fail\n"); goto err_i2c_add_driver; } err = i2c_add_driver(&accel_i2c_driver); if(err < 0){ printk("************* LGE: accel_i2c_test_client fail\n"); goto err_i2c_add_driver; } #endif /*--------------------------------------------------------------------------- register misc device ---------------------------------------------------------------------------*/ err = misc_register(&star_motion_misc_device); if (err) { printk(KERN_ERR"star_motion_misc_device register failed\n"); goto exit_misc_device_register_failed; } /*--------------------------------------------------------------------------- register input device ---------------------------------------------------------------------------*/ star_motion_dev->input_dev = input_allocate_device(); if(star_motion_dev->input_dev == NULL) { printk(KERN_ERR"star_motion_sesnor_probe: input_allocate_device (1) failed\n"); goto err_input_allocate1; } star_motion_dev->input_dev->name = STAR_MOTION_INPUT_NAME; set_bit(EV_SYN,star_motion_dev->input_dev->evbit); set_bit(EV_REL,star_motion_dev->input_dev->evbit); set_bit(REL_X,star_motion_dev->input_dev->relbit); // TAP - Type set_bit(REL_Y,star_motion_dev->input_dev->relbit); // TAP - Direction set_bit(REL_RX,star_motion_dev->input_dev->relbit); // TILT - Roll set_bit(REL_RY,star_motion_dev->input_dev->relbit); // TILT - PITCH set_bit(REL_RZ,star_motion_dev->input_dev->relbit); // TILT - Yaw set_bit(REL_HWHEEL,star_motion_dev->input_dev->relbit); // SHAKE set_bit(REL_DIAL,star_motion_dev->input_dev->relbit); // SNAP - Direction set_bit(REL_WHEEL,star_motion_dev->input_dev->relbit); // FLIP err = input_register_device(star_motion_dev->input_dev); if(err){ printk(KERN_ERR"star_motion_sesnor_probe: input_allocate_device (1) failed \n"); goto err_input_allocate1; } /*--------------------------------------------------------------------------- init. sysfs ---------------------------------------------------------------------------*/ if ((err = sysfs_create_group(&dev->kobj, &star_motion_group))) { printk("[motion_sensor] sysfs_create_group FAIL \n"); goto err_sysfs_create; } /*--------------------------------------------------------------------------- INIT_WORK ---------------------------------------------------------------------------*/ #if 1 INIT_WORK(&star_motion_dev->tilt_work, motion_tilt_work_func); /*--------------------------------------------------------------------------- init. workqueue ---------------------------------------------------------------------------*/ star_motion_dev->timer_wq = create_singlethread_workqueue("motion_timer_wq"); if (!star_motion_dev->timer_wq) { printk("[motion_sensor] couldn't create timer queue\n"); goto err_motion_timer_wq; } /*--------------------------------------------------------------------------- init. timer ---------------------------------------------------------------------------*/ // TILT POLLING TIMER hrtimer_init(&star_motion_dev->timer[1], CLOCK_MONOTONIC, HRTIMER_MODE_REL); star_motion_dev->timer[1].function = motion_tilt_timer_func; #endif /*--------------------------------------------------------------------------- power ---------------------------------------------------------------------------*/ #if 0 #if defined(CONFIG_MACH_LGE_STAR_REV_C) star_gyro_vio_reg = regulator_get(&pdev->dev, "vaux2"); if (star_gyro_vio_reg == NULL) { printk(KERN_ERR": Failed to get motion power resources !! \n"); return -ENODEV; } #endif star_motion_reg = regulator_get(&pdev->dev, "vmmc2"); if (star_motion_reg == NULL) { printk(KERN_ERR": Failed to get motion power resources !! \n"); return -ENODEV; } #endif printk("[MPU3050] ## [%s:%d]\n",__FUNCTION__, __LINE__); err = open_def_odm_gyro_accel(); if (!err) { printk("open_def_odm_gyro_accel\n"); goto allocate_dev_fail; } printk("[MPU3050] ## [%s:%d]\n",__FUNCTION__, __LINE__); mdelay(50); // Read WHO AM I value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_WHO_AM_I,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_WHO_AM_I ,&value , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_WHO_AM_I : %x\n",value); // Read Product ID value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_PRODUCT_ID,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_PRODUCT_ID ,&value , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_PRODUCT_ID : %x\n",value); #if 0 err = open_def_odm_accl(); if (!err) { printk("open_def_odm_gyro_accel\n"); goto allocate_dev_fail; } printk("[MPU3050] ## [%s:%d]\n",__FUNCTION__, __LINE__); #endif // mpu3050_initialize(); //motion_sensor_power_on(); //twl4030_i2c_write_u8(0x13, 0x00,0x1b ); //msleep(100); return 0; #if 0 /*Star Feature*/ err_i2c_add_driver: i2c_del_driver(&gyro_i2c_driver); i2c_del_driver(&accel_i2c_driver); #endif allocate_dev_fail: printk("## sensor: allocated_device_failed\n"); close_odm_gyro_accel(); err_input_allocate1: printk("## sensor: input_device_failed\n"); input_unregister_device(star_motion_dev->input_dev); exit_misc_device_register_failed: err_sysfs_create: printk("## sensor: heaven motion misc_device_register_failed\n"); err_motion_timer_wq: printk("## sensor: timer_failed\n"); destroy_workqueue(star_motion_dev->timer_wq); return err; }
void mpu3050_initialize(void) { unsigned char buf[3]={0,}; unsigned char value = 0; int status = 0; // Read WHO AM I value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_WHO_AM_I,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_WHO_AM_I ,&value , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_WHO_AM_I : %x\n",value); // Read Product ID value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_PRODUCT_ID,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_PRODUCT_ID ,&value , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_PRODUCT_ID : %x\n",value); // Set to reset the MPU-3000 buf[0] = MPU3050_GYRO_I2C_PWR_MGM; buf[1] = 0x80; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk(" [MPU3050]Reset the MPU-3000 : %x\n",value); // Set ACCEL. slave address buf[0] = MPU3050_GYRO_I2C_ACCEL_SLAVE_ADDR; buf[1] = 0x0F;//KR3DH_ACCEL_I2C_SLAVE_ADDR; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] Set ACCEL. slave address \n"); // Set to reset IME interface value = 0; //status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_USER_CTRL,&value); NvGyroAccelI2CGetRegs(star_motion_dev->hOdmGyroAccel, MPU3050_GYRO_I2C_USER_CTRL ,&value[1] , 1 ); if(!(value & 0x08)) value |= 0x08; buf[0] = MPU3050_GYRO_I2C_USER_CTRL; buf[1] = value; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] Reset IME interface \n"); #if 0 //klp -- disable passthrough mode value = 0; status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_USER_CTRL,&value); buf[0] = MPU3050_GYRO_I2C_USER_CTRL; buf[1] = value | 0x20; mpu3050_write_reg(mpu3050_i2c_client,buf); #endif // Set to disable ISR buf[0] = MPU3050_GYRO_I2C_INT_CFG; buf[1] = 0x00;//0x83; //0xC1;//0xE1; //0x81 or 0x83; // Enable ISR //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] Disable ISR : MPU3050_GYRO_I2C_INT_CFG\n"); // Set to Cfg Sampling MPU buf[0] = MPU3050_GYRO_I2C_SMPLR_DIV; buf[1] = 0x04; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_SMPLR_DIV\n"); buf[0] = MPU3050_GYRO_I2C_DLPF_FS_SYNC; buf[1] =((0x3<<3)|0x3); //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_DLPF_FS_SYNC\n"); /*----------------------------------CLKSource------------------------------------------*/ value = 0; status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_PWR_MGM,&value); value &= ~(0x07); //clear clk_sel bits value |= 0x03; //set pll gyro z clk source buf[0] = MPU3050_GYRO_I2C_PWR_MGM; buf[1] = value; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_PWR_MGM --- clk source \n"); /*------------------------------ Set Accelerometer --------------------------------------*/ // Accel Data Start buf[0] = MPU3050_GYRO_I2C_ACCEL_BURST_ADDR; buf[1] = 0x28; /*0xA8*/; //status = mpu3050_write_reg(mpu3050_i2c_client,buf); NvGyroAccelI2CSetRegs(star_motion_dev->hOdmGyroAccel, buf[0] ,&buf[1] , 1 ); printk("[MPU3050] MPU3050_GYRO_I2C_ACCEL_BURST_ADDR --- clk source \n"); printk("[MPU3050] MPU3050_BYPASS_MODE_ON --- \n"); mpu3050_i2c_through_pass(MPU3050_BYPASS_MODE_ON); /*---------------------------------------------------------------------------------------*/ #if 0 value = 0; status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_ACCEL_BURST_ADDR,value); printk("[MPU3050_GYRO_I2C_ACCEL_BURST_ADDR] read value [0x%x]\n",value); if(value & 0x80) { value &= ~(0x80); } else { value |= 0x80; } printk("[MPU3050_GYRO_I2C_ACCEL_BURST_ADDR] setting value [0x%x]\n",value); buf[0] = MPU3050_GYRO_I2C_ACCEL_BURST_ADDR; buf[1] = value; status = mpu3050_write_reg(mpu3050_i2c_client,buf); mpu3050_i2c_through_pass(MPU3050_BYPASS_MODE_ON); #endif #if 1 // ACCEL i2c pass through on // mpu3050_i2c_through_pass(MPU3050_BYPASS_MODE_ON); // kr3dh_initialize(); //ACCEL i2c pass through off // mpu3050_i2c_through_pass(MPU3050_BYPASS_MODE_OFF); /* value = 0; status = mpu3050_read_reg(mpu3050_i2c_client,MPU3050_GYRO_I2C_USER_CTRL,&value); //value &= ~(0x09); if(!(value & 0x10)) value|=0x10; buf[0] = MPU3050_GYRO_I2C_USER_CTRL; //buf[1] = value; buf[1] = 0x30; status = mpu3050_write_reg(mpu3050_i2c_client,buf); */ #endif }