コード例 #1
0
ファイル: mmc328x.c プロジェクト: amuxtux/exynos4210
int memsic_api_read
(
  void *mlsl_handle,
  struct ext_slave_platform_data *pdata,
  unsigned char* raw_data,
  int *accuracy
)
{
  unsigned char data[6] = {0};
  int MD_times = 0;
      
  data[0] = MMC328X_REG_CTRL;
  data[1] = MMC328X_CTRL_TM;
  mmc328x_i2c_tx_data(mlsl_handle,pdata,data, 2);
  msleep(MMC328X_DELAY_TM);

  data[0] = MMC328X_REG_DS;
  if (mmc328x_i2c_rx_data(mlsl_handle,pdata,data, 1) < 0) {
    return -EFAULT;
  }
  while (!(data[0] & 0x01)) {
      msleep(1);
    data[0] = MMC328X_REG_DS;
    if (mmc328x_i2c_rx_data(mlsl_handle,pdata,data, 1) < 0) {
      return -EFAULT;
    }
    if (data[0] & 0x01) break;
    MD_times++;
    if (MD_times > 2) {
     return -EFAULT;
    }
  }
		
  data[0] = MMC328X_REG_DATA;
  if (mmc328x_i2c_rx_data(mlsl_handle,pdata,data, 6) < 0) {
      return -EFAULT;
  }

  memcpy(raw_data, data, sizeof(unsigned char)*6);

  *accuracy = 0;

  return 0;
}
コード例 #2
0
static ssize_t mmc328x_readxyz(struct device *dev, struct device_attribute *attr, char *buf)
{
	int count;
	int vec[3] = {0};
	unsigned char data[16] = {0};
	int MD_times = 0;
	/* do RM every MMC328X_RRM_INTV times read */
	if (!(read_idx % MMC328X_RRM_INTV)) {
#ifdef CONFIG_SENSORS_MMC328X 
		data[0] = MMC328X_REG_CTRL;
		data[1] = MMC328X_CTRL_RRM;
		mmc328x_i2c_tx_data(data, 2);
		msleep(MMC328X_DELAY_RRM);
#endif
		/* RM */
		data[0] = MMC328X_REG_CTRL;
		data[1] = MMC328X_CTRL_RM;
		/* not check return value here, assume it always OK */
		mmc328x_i2c_tx_data(data, 2);
		/* wait external capacitor charging done for next RM */
		msleep(MMC328X_DELAY_RM);
	}
	/* send TM cmd before read */
	data[0] = MMC328X_REG_CTRL;
	data[1] = MMC328X_CTRL_TM;
	/* not check return value here, assume it always OK */
	mmc328x_i2c_tx_data(data, 2);
	/* wait TM done for coming data read */
	msleep(MMC328X_DELAY_TM);
#if READMD
	/* Read MD */
	data[0] = MMC328X_REG_DS;
	if (mmc328x_i2c_rx_data(data, 1) < 0) {
		sprintf(buf,"%d,%d,%d\n", -1, -1, -1 );
		return -EFAULT;
	}
	while (!(data[0] & 0x01)) {
		msleep(1);
		/* Read MD again*/
		data[0] = MMC328X_REG_DS;
		if (mmc328x_i2c_rx_data(data, 1) < 0) {
			sprintf(buf,"%d,%d,%d\n", -1, -1, -1 );
			return -EFAULT;
		}

		if (data[0] & 0x01) break;
		MD_times++;
		if (MD_times > 2) {
#ifdef MMC328X_SENSOR_DEBUG
			printk("TM not work!!");
#endif
			sprintf(buf,"%d,%d,%d\n", -1, -1, -1 );
			return -EFAULT;
		}
	}
#endif		
	/* read xyz raw data */
	read_idx++;
	data[0] = MMC328X_REG_DATA;
	if (mmc328x_i2c_rx_data(data, 6) < 0) {
		sprintf(buf,"%d,%d,%d\n", -1, -1, -1 );
		return -EFAULT;
	}
	vec[0] = data[1] << 8 | data[0];
	vec[1] = data[3] << 8 | data[2];
	vec[2] = data[5] << 8 | data[4];
#ifdef MMC328X_SENSOR_DEBUG
	printk("[X - %04x] [Y - %04x] [Z - %04x]\n", 
			vec[0], vec[1], vec[2]);
#endif

	count = sprintf(buf,"%d,%d,%d\n", vec[0], vec[1], vec[2] );
	return count;
}
コード例 #3
0
static int mmc328x_ioctl(struct inode *inode, struct file *file, 
	unsigned int cmd, unsigned long arg)
{
	void __user *pa = (void __user *)arg;
	unsigned char data[16] = {0};
	int vec[3] = {0};
	int MD_times = 0;
	short flag;

	switch (cmd) {
		case MMC328X_IOC_TM:
			data[0] = MMC328X_REG_CTRL;
			data[1] = MMC328X_CTRL_TM;
			if (mmc328x_i2c_tx_data(data, 2) < 0) {
				return -EFAULT;
			}
			/* wait TM done for coming data read */
			msleep(MMC328X_DELAY_TM);
			break;
		case MMC328X_IOC_RM:
			data[0] = MMC328X_REG_CTRL;
			data[1] = MMC328X_CTRL_RM;
			if (mmc328x_i2c_tx_data(data, 2) < 0) {
				return -EFAULT;
			}
			/* wait external capacitor charging done for next SET*/
			msleep(MMC328X_DELAY_RM);
			break;
		case MMC328X_IOC_RRM:
			data[0] = MMC328X_REG_CTRL;
			data[1] = MMC328X_CTRL_RRM;
			if (mmc328x_i2c_tx_data(data, 2) < 0) {
				return -EFAULT;
			}
			/* wait external capacitor charging done for next RRM */
			msleep(MMC328X_DELAY_RM);
			break;
		case MMC328X_IOC_READ:
			data[0] = MMC328X_REG_DATA;
			if (mmc328x_i2c_rx_data(data, 6) < 0) {
				return -EFAULT;
			}
			vec[0] = data[1] << 8 | data[0];
			vec[1] = data[3] << 8 | data[2];
			vec[2] = 8192 - (data[5] << 8 | data[4]);
			//vec[2] = data[5] << 8 | data[4];
#ifdef MMC328X_SENSOR_DEBUG
			printk("[X - %04x] [Y - %04x] [Z - %04x]\n", 
					vec[0], vec[1], vec[2]);
#endif
			if (copy_to_user(pa, vec, sizeof(vec))) {
				return -EFAULT;
			}
			break;
		case MMC328X_IOC_READXYZ:
			/* do RM every MMC328X_RRM_INTV times read */
			if (!(read_idx % MMC328X_RRM_INTV)) {
#ifdef CONFIG_SENSORS_MMC328X 
				data[0] = MMC328X_REG_CTRL;
				data[1] = MMC328X_CTRL_RRM;
				mmc328x_i2c_tx_data(data, 2);
				msleep(MMC328X_DELAY_RRM);
#endif
				/* RM */
				data[0] = MMC328X_REG_CTRL;
				data[1] = MMC328X_CTRL_RM;
				/* not check return value here, assume it always OK */
				mmc328x_i2c_tx_data(data, 2);
				/* wait external capacitor charging done for next RM */
				msleep(MMC328X_DELAY_RM);
			}
			/* send TM cmd before read */
			data[0] = MMC328X_REG_CTRL;
			data[1] = MMC328X_CTRL_TM;
			/* not check return value here, assume it always OK */
			mmc328x_i2c_tx_data(data, 2);
			/* wait TM done for coming data read */
			msleep(MMC328X_DELAY_TM);
#if READMD
			/* Read MD */
			data[0] = MMC328X_REG_DS;
			if (mmc328x_i2c_rx_data(data, 1) < 0) {
				return -EFAULT;
			}
			while (!(data[0] & 0x01)) {
				msleep(1);
				/* Read MD again*/
				data[0] = MMC328X_REG_DS;
				if (mmc328x_i2c_rx_data(data, 1) < 0) {
					return -EFAULT;
				}

				if (data[0] & 0x01) break;
				MD_times++;
				if (MD_times > 2) {
#ifdef MMC328X_SENSOR_DEBUG
					printk("TM not work!!");
#endif
					return -EFAULT;
				}
			}
#endif		
			/* read xyz raw data */
			read_idx++;
			data[0] = MMC328X_REG_DATA;
			if (mmc328x_i2c_rx_data(data, 6) < 0) {
				return -EFAULT;
			}
			vec[0] = data[1] << 8 | data[0];
			vec[1] = data[3] << 8 | data[2];
			vec[2] = 8192 - (data[5] << 8 | data[4]);
			//vec[2] = data[5] << 8 | data[4];
#ifdef MMC328X_SENSOR_DEBUG
			printk("[X - %04x] [Y - %04x] [Z - %04x]\n", 
					vec[0], vec[1], vec[2]);
#endif
			if (copy_to_user(pa, vec, sizeof(vec))) {
				return -EFAULT;
			}

			break;
		case MMC328X_IOC_READSUSPEND:
			flag = atomic_read(&suspend_flag);
			if (copy_to_user(pa, &flag, sizeof(flag)))
				return -EFAULT;
			break;
		default:
			break;
	}

	return 0;
}