Beispiel #1
0
/*----------------------------------------------------------------------------*/
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;
}
Beispiel #2
0
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);


}
Beispiel #3
0
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
	  
}
Beispiel #4
0
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 );
	}
}
Beispiel #5
0
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 );
      	
}
Beispiel #6
0
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;
	
}
Beispiel #7
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;	

}
Beispiel #8
0
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

}