Example #1
0
static void xen_net_read_rate(struct xenbus_device *dev,
			      unsigned long *bytes, unsigned long *usec)
{
	char *s, *e;
	unsigned long b, u;
	char *ratestr;

	/* Default to unlimited bandwidth. */
	*bytes = ~0UL;
	*usec = 0;

	ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
	if (IS_ERR(ratestr))
		return;

	s = ratestr;
	b = simple_strtoul(s, &e, 10);
	if ((s == e) || (*e != ','))
		goto fail;

	s = e + 1;
	u = simple_strtoul(s, &e, 10);
	if ((s == e) || (*e != '\0'))
		goto fail;

	*bytes = b;
	*usec = u;

	kfree(ratestr);
	return;

 fail:
	WPRINTK("Failed to parse network rate limit. Traffic unlimited.\n");
	kfree(ratestr);
}
Example #2
0
static int mma7660_early_suspend(struct early_suspend *h)
{
	struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev);
	WPRINTK("Gsensor mma7760 enter early suspend\n");
	struct mma7660_data *mma7660  =  i2c_get_clientdata(client);
	hrtimer_cancel(&mma7660->timer);
	return mma7660_close_dev(client);
}
Example #3
0
static int mma7660_suspend(struct i2c_client *client, pm_message_t mesg)
{
	WPRINTK("Gsensor mma7760 enter 2 level  suspend\n");
	struct mma7660_data *mma7660  =  i2c_get_clientdata(client);
	hrtimer_cancel(&mma7660->timer);
	return mma7660_close_dev(client);
	
}
Example #4
0
static int mma7660_resume(struct i2c_client *client)
{
	int ret = 0;
	struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
	WPRINTK("Gsensor mma7760 2 level resume!!\n");
	ret = mma7660_start_dev(client, mma7660->curr_tate);
	hrtimer_start(&mma7660->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
	return ret;
}
Example #5
0
static void mma7660_late_resume(struct early_suspend *h)
{
	int ret = 0;
	struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev);
    struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
	WPRINTK("Gsensor mma7760 resume!!\n");
	ret = mma7660_start_dev(client, mma7660->curr_tate);
	hrtimer_start(&mma7660->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
	return  ret ;
}
Example #6
0
static void mma7660_work_func(struct work_struct *work)
{
	struct mma7660_data *mma7660 = container_of(work, struct mma7660_data, work);
	struct i2c_client *client = mma7660->client;

	if (mma7660_get_data(client) < 0) 
		WPRINTK(KERN_ERR "MMA7660 mma_work_func: Get data failed\n");
		
	//enable_irq(client->irq);		
}
Example #7
0
static int rk29_hw_params(struct snd_pcm_substream *substream,
                          struct snd_pcm_hw_params *params)
{
    struct snd_soc_pcm_runtime *rtd = substream->private_data;
    struct snd_soc_dai *codec_dai = rtd->codec_dai;
    struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
    unsigned int pll_out = 0;
    int ret;

    WPRINTK("Enter::%s----%d\n",__FUNCTION__,__LINE__);
    /*by Vincent Hsiung for EQ Vol Change*/
#define HW_PARAMS_FLAG_EQVOL_ON 0x21
#define HW_PARAMS_FLAG_EQVOL_OFF 0x22
    if ((params->flags == HW_PARAMS_FLAG_EQVOL_ON)||(params->flags == HW_PARAMS_FLAG_EQVOL_OFF)) {
        ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai);
        WPRINTK("Enter::%s----%d\n",__FUNCTION__,__LINE__);
    } else {
        /* set codec DAI configuration */
#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
        ret =  snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
                                   SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
#endif
#if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER)
        ret =  snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
                                   SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM );
#endif
        if (ret < 0)
            return ret;
        /* set cpu DAI configuration */
#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
        ret =  snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
                                   SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
#endif
#if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER)
        ret =  snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
                                   SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
#endif
        if (ret < 0)
            return ret;
    }

    return 0;
}
Example #8
0
static int __init balloon_init(void)
{
#if defined(CONFIG_X86) && defined(CONFIG_XEN) 
	unsigned long pfn;
	struct page *page;
#endif

	if (!is_running_on_xen())
		return -ENODEV;

	IPRINTK("Initialising balloon driver.\n");

#ifdef CONFIG_XEN
	current_pages = min(xen_start_info->nr_pages, max_pfn);
	totalram_pages = current_pages;
#else
	current_pages = totalram_pages;
#endif
	target_pages  = current_pages;
	balloon_low   = 0;
	balloon_high  = 0;
	driver_pages  = 0UL;
	hard_limit    = ~0UL;

	init_timer(&balloon_timer);
	balloon_timer.data = 0;
	balloon_timer.function = balloon_alarm;
    
/* don't include on bare-metal & FV guest */
#if defined(CONFIG_PROC_FS) && defined(CONFIG_XEN)
	if ((balloon_pde = create_xen_proc_entry("balloon", 0644)) == NULL) {
		WPRINTK("Unable to create /proc/xen/balloon.\n");
		return -1;
	}

	balloon_pde->read_proc  = balloon_read;
	balloon_pde->write_proc = balloon_write;
#endif
    
#if defined(CONFIG_X86) && defined(CONFIG_XEN) 
	/* Initialise the balloon with excess memory space. */
	for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
		page = pfn_to_page(pfn);
		balloon_append(page);
	}
#endif

	target_watch.callback = watch_target;
	xenstore_notifier.notifier_call = balloon_init_watcher;

	register_xenstore_notifier(&xenstore_notifier);
    
	return 0;
}
Example #9
0
static int __init audio_card_init(void)
{
    int ret =0;

    WPRINTK("Enter::%s----%d\n",__FUNCTION__,__LINE__);
    rk29_snd_device = platform_device_alloc("soc-audio", -1);
    if (!rk29_snd_device) {
        printk("platform device allocation failed\n");
        ret = -ENOMEM;
        return ret;
    }
    platform_set_drvdata(rk29_snd_device, &snd_soc_card_rk29);
    ret = platform_device_add(rk29_snd_device);
    if (ret) {
        printk("platform device add failed\n");
        platform_device_put(rk29_snd_device);
        return ret;
    }
    return ret;
}
Example #10
0
static void mma7660_report_value(struct i2c_client *client, struct mma7660_axis *axis)
{
	struct mma7660_data *mma7660 = i2c_get_clientdata(client);
	//struct mma7660_axis *axis = (struct mma7660_axis *)rbuf;
#ifdef MMA7660_DATA_FILTER
	int i = 0, axis_x=0, axis_y=0, axis_z=0;
#endif

#ifdef MMA7660_DATA_FILTER	
	for(i = 0; i < MMA7660_TEMP_SIZE; i++){
		if((MMA7660_TEMP_SIZE-1) == i){
			mma7660_adjust.axis_x[i] = axis->x;
			mma7660_adjust.axis_y[i] = axis->y;
			mma7660_adjust.axis_z[i] = axis->z;
		}else{
			mma7660_adjust.axis_x[i] = mma7660_adjust.axis_x[i+1];
			mma7660_adjust.axis_y[i] = mma7660_adjust.axis_y[i+1];
			mma7660_adjust.axis_z[i] = mma7660_adjust.axis_z[i+1];
		}
	}
	for(i = 0; i < MMA7660_TEMP_SIZE; i++){
		axis_x += mma7660_adjust.axis_x[i];
		axis_y += mma7660_adjust.axis_y[i];
		axis_z += mma7660_adjust.axis_z[i];
	}

	if(++mma7660_adjust.count > MMA7660_TEMP_SIZE){
		axis->x = axis_x/MMA7660_TEMP_SIZE;
		axis->y = axis_y/MMA7660_TEMP_SIZE;
		axis->z = axis_z/MMA7660_TEMP_SIZE;
	}
#endif

	/* Report acceleration sensor information */
	input_report_abs(mma7660->input_dev, ABS_X, axis->x);
	input_report_abs(mma7660->input_dev, ABS_Y, axis->y);
	input_report_abs(mma7660->input_dev, ABS_Z, axis->z);
	input_sync(mma7660->input_dev);
	WPRINTK("%s,x=%d,y=%d,z=%d\n",__func__,axis->x,axis->y,axis->z);
}
Example #11
0
static int mma7660_init_client(struct i2c_client *client)
{
	struct mma7660_data *mma7660;
	int ret;
	mma7660 = i2c_get_clientdata(client);
	
	WPRINTK("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq));
	if ( !gpio_is_valid(client->irq)) {
		WPRINTK("+++++++++++gpio_is_invalid\n");
		return -EINVAL;
	}
	
	ret = gpio_request(client->irq, "mma7660_int");
	if (ret) {
		WPRINTK( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(client->irq));
		return ret;
	}
	
	ret = gpio_direction_input(client->irq);
	if (ret) {
		WPRINTK("failed to set mma7990_trig GPIO gpio input\n");
		return ret;
	}
	
	gpio_pull_updown(client->irq, GPIOPullUp);
	client->irq = gpio_to_irq(client->irq);
	ret = request_irq(client->irq, mma7660_interrupt, IRQF_TRIGGER_LOW, client->dev.driver->name, mma7660);
	WPRINTK("request irq is %d,ret is  0x%x\n",client->irq,ret);
	if (ret ) {
		WPRINTK(KERN_ERR "mma7660_init_client: request irq failed,ret is %d\n",ret);
        return ret;
	}
	
	disable_irq(client->irq);

	init_waitqueue_head(&data_ready_wq);

 
	return 0;
}
Example #12
0
int __init wisky_boot_charge_main(void)
{
	#if 0	//for test ...Lee
	printk("here... ...wulala... wisky_boot_charge_main\n");
	wisky_charger_logo_display(LOGO_BLANK);
	wisky_charger_logo_display(LOGO_BOOTUP);
	return 0;
	#endif
	int charge_full_cnt = 0;
	int full_display_times = 1;//充电满后提示次数	

	boot_charge_mode = 0;
	if(1 == usb_otg_op_state){
		//do not enter charge mode when USB OTG insert
		return 0;
	}

	WPRINTK("--------dc_adaptor_status=%d\n", dc_adaptor_status);
	//WPRINTK("--------battery_adc_value=%d\n", battery_adc_value);
	pr_info("--------battery_capacity=%d\n", battery_capacity);
	
	if(dc_adaptor_status == 0){
		//no DC adaptor insert, do not display charge
		//#if defined(WISKY_BATTERY_OZ8806)
		//电量低于阀值时显示低电logo
		if(battery_capacity < BATT_LEVEL_POOR){
		//#else
		//电量低于阀值时显示低电logo
		//if((battery_adc_value < BAT_DISCHARGE_ADC_MIN) || (battery_adc_value -BATTERY_ADC_ADJUST < BAT_DISCHARGE_ADC_MIN)){
		//#endif
			//clear lcd before show charge logo
			wisky_charger_logo_display(LOGO_BLANK);
			msleep(100);
			wisky_boot_charge_bl(1);			
			wisky_charger_logo_display(LOGO_POOR);
			
			mdelay(1000);
			wisky_boot_charge_bl(0);
			mdelay(500);
			pr_info("%s:low battery, shut down...\n", __FUNCTION__);
			wisky_boot_charge_poweroff();
			while(1);
		}else{

			wisky_charger_logo_display(LOGO_BLANK);
			msleep(100);
			//wisky_boot_charge_bl(1);			
			wisky_charger_logo_display(LOGO_BOOTUP);
			return 0;
		}
	}

	pr_info("------>Charge mode enter\n");
	//clear lcd before show charge logo
	wisky_charger_logo_display(LOGO_BLANK);
	printk("wisky_charger_logo_display(LOGO_BLANK);\n");
	msleep(100);//延时防止闪白屏
	wisky_boot_charge_bl(1);	
	while(1){
		if(battery_capacity == BATT_LEVEL_FULL){
			dc_adaptor_check_and_poweroff();
			wisky_charger_logo_display(LOGO_BLANK);
			if(wisky_boot_charge_show_full_logo() == 1){
				goto exit;
			}
		}else{
			dc_adaptor_check_and_poweroff();
			wisky_charger_logo_display(LOGO_BLANK);
			if(wisky_boot_charge_show_logos(3, battery_capacity) == 1){
				goto exit;
			}
		}
		#if defined (CONFIG_AXP_PEKINFO)
		if(axp_pwr_pressshort){
			axp_pwr_pressshort = 0;
		}
		#endif

		dc_adaptor_check_and_poweroff();
		wisky_boot_charge_suspend();

		while(1){
			if(battery_capacity == BATT_LEVEL_FULL && full_display_times > 0){
				if(charge_full_cnt++ > 10/*FULL_SHOW_LOGO_TIME*/){
					charge_full_cnt = 0;
					full_display_times--;
					break;
				}
			}
			dc_adaptor_check_and_poweroff();
			if(power_key_check()){
				break;
			}

			dc_adaptor_check_and_poweroff();
			mdelay(10);
		}
		
		dc_adaptor_check_and_poweroff();		
		wisky_boot_charge_resume();		
	}
exit:
	pr_info("------>Charge mode exit\n");
	rk30_mux_api_set(LCD_BL_PWM_MUX_NAME, LCD_BL_PWM_MUX_MODE);
	//lcd backlight off here, will be backlight on in backlihgt driver init
	if(LCD_BL_EN_PIN != INVALID_GPIO){
		gpio_set_value(LCD_BL_EN_PIN, !LCD_BL_EN_VALUE);
	}
	//
	
	boot_charge_mode = 1;
	wisky_charger_logo_display(LOGO_BLANK);
	wisky_charger_logo_display(LOGO_BOOTUP);
	gpio_request(KEY_SHUTDOWN_PIN, "poweronpin");
	gpio_direction_output(KEY_SHUTDOWN_PIN, GPIO_HIGH);
	gpio_set_value(KEY_SHUTDOWN_PIN, GPIO_HIGH);

	return 0;
}
Example #13
0
int init(void)
{
	WPRINTK("------------>%s-%d\n", __FUNCTION__, __LINE__);

	return 0;
}
Example #14
0
static int  mma7660_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	struct mma7660_data *mma7660;
	int err;
	
	mma7660 = kzalloc(sizeof(struct mma7660_data), GFP_KERNEL);
	if (!mma7660) {
		WPRINTK("[mma7660]:alloc data failed.\n");
		err = -ENOMEM;
		goto exit_alloc_data_failed;
	}
    
	mma7660->mma7660_wq = create_singlethread_workqueue("mma7660_wq");
	if (!mma7660->mma7660_wq )
	{
		err = -ENOMEM;
		goto err_create_workqueue_failed;
	}
	INIT_WORK(&mma7660->work, mma7660_work_func);
//	INIT_DELAYED_WORK(&mma7660->delaywork, mma7660_delaywork_func);

	mma7660->client = client;

	i2c_set_clientdata(client, mma7660);

	this_client = client;

/*
	err = mma7660_init_client(client);
	if (err < 0) {
		WPRINTK(KERN_ERR
		       "mma7660_probe: mma7660_init_client failed\n");
		goto exit_request_gpio_irq_failed;
	}
*/		
	mma7660->input_dev = input_allocate_device();
	if (!mma7660->input_dev) {
		err = -ENOMEM;
		WPRINTK(KERN_ERR
		       "mma7660_probe: Failed to allocate input device\n");
		goto exit_input_allocate_device_failed;
	}

	set_bit(EV_ABS, mma7660->input_dev->evbit);

	/* x-axis acceleration */
	input_set_abs_params(mma7660->input_dev, ABS_X, -MMA7660_RANGE, MMA7660_RANGE, 0, 0);
	/* y-axis acceleration */
	input_set_abs_params(mma7660->input_dev, ABS_Y, -MMA7660_RANGE, MMA7660_RANGE, 0, 0);
	/* z-axis acceleration */
	input_set_abs_params(mma7660->input_dev, ABS_Z, -MMA7660_RANGE, MMA7660_RANGE, 0, 0);

	mma7660->input_dev->name = "gsensor";
	mma7660->input_dev->dev.parent = &client->dev;

	err = input_register_device(mma7660->input_dev);
	if (err < 0) {
		WPRINTK(KERN_ERR
		       "mma7660_probe: Unable to register input device: %s\n",
		       mma7660->input_dev->name);
		goto exit_input_register_device_failed;
	}

	mma7660_device.parent = &client->dev;
	err = misc_register(&mma7660_device);
	if (err < 0) {
		pr_err("mma7660_probe: misc device register failed\n");
		goto exit_misc_device_register_mma7660_device_failed;
	}

	err = gsensor_sysfs_init();
	if (err < 0) {
		pr_err("mma7660_probe: gsensor sysfs init failed\n");
		goto exit_gsensor_sysfs_init_failed;
	}
	
	hrtimer_init(&mma7660->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	mma7660->timer.function = mma7660_timer_func;
	hrtimer_start(&mma7660->timer, ktime_set(10, 0), HRTIMER_MODE_REL);
	
#ifdef CONFIG_HAS_EARLYSUSPEND
	mma7660->early_suspend.level = 50 + 1;
	mma7660->early_suspend.suspend = mma7660_early_suspend;
	mma7660->early_suspend.resume = mma7660_late_resume;
	register_early_suspend(&mma7660->early_suspend);
#endif

	pr_info("mma7660 probe ok\n");
	mma7660->status = -1;
	
#if 0	
	mma7660_start(client, MMA7660_RATE_32);
#endif

	return 0;

exit_gsensor_sysfs_init_failed:
    misc_deregister(&mma7660_device);
exit_misc_device_register_mma7660_device_failed:
    input_unregister_device(mma7660->input_dev);
exit_input_register_device_failed:
	input_free_device(mma7660->input_dev);
exit_input_allocate_device_failed:
	destroy_workqueue(mma7660->mma7660_wq);	
    //free_irq(client->irq, mma7660);
//exit_request_gpio_irq_failed:
//	kfree(mma7660);	
err_create_workqueue_failed:
	kfree(mma7660);	
exit_alloc_data_failed:
	pr_info("mma7660 probe failed!\n");
	return err;
}
Example #15
0
static long mma7660_ioctl( struct file *file, unsigned int cmd,unsigned long arg)
{

	void __user *argp = (void __user *)arg;
//	char msg[RBUFF_SIZE + 1];
	int ret = -1;
	char rate;
	struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev);

	WPRINTK("%s-%d: cmd = %d\n", __FUNCTION__, __LINE__, cmd);
	switch (cmd) {
	case MMA_IOCTL_APP_SET_RATE:
		if (copy_from_user(&rate, argp, sizeof(rate)))
			return -EFAULT;
		break;
	default:
		break;
	}

	switch (cmd) {
	case MMA_IOCTL_START:
		WPRINTK("%s-%d: start\n", __FUNCTION__, __LINE__);
		ret = mma7660_start(client, MMA7660_RATE_32);
		if (ret < 0)
			return ret;
		break;
	case MMA_IOCTL_CLOSE:
		WPRINTK("%s-%d: close\n", __FUNCTION__, __LINE__);
		ret = mma7660_close(client);
		if (ret < 0)
			return ret;
		break;
	case MMA_IOCTL_APP_SET_RATE:
		WPRINTK("%s-%d: set rate = %d\n", __FUNCTION__, __LINE__, rate);
		ret = mma7660_reset_rate(client, rate);
		if (ret < 0)
			return ret;
		break;
    /*
	case MMA_IOCTL_GETDATA:
		ret = mma7660_trans_buff(msg, RBUFF_SIZE);
		if (ret < 0)
			return ret;
		break;
	*/	
	default:
		return -ENOTTY;
	}
/*
	switch (cmd) {
	case MMA_IOCTL_GETDATA:
		WPRINTK("%s-%d: get data\n", __FUNCTION__, __LINE__);
		if (copy_to_user(argp, &msg, sizeof(msg)))
			return -EFAULT;
		break;
	default:
		break;
	}*/

	return 0;
}
Example #16
0
static int mma7660_get_data(struct i2c_client *client)
{
	char buffer[3];
	int ret;
	struct mma7660_axis axis;
//    struct mma7660_platform_data *pdata = client->dev.platform_data;
	
	do {
		memset(buffer, 0, 3);
		buffer[0] = MMA7660_REG_X_OUT;
		ret = mma7660_rx_data(client, &buffer[0], 3);
		if (ret < 0)
			return ret;
	} while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40));
	WPRINTK("raw x=%d,y=%d,z=%d\n",buffer[0],buffer[1],buffer[2]);
#if defined(WISKY_GSENSOR_NX_PY_PZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NX_PZ_PY)
    axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
    axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
    axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
#elif defined(WISKY_GSENSOR_NX_PY_NZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PX_PY_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NX_NY_PZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NX_NY_NZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NY_NX_NZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PY_PX_NZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PY_PX_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);	
#elif defined(WISKY_GSENSOR_NY_NX_PZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]); 
#elif defined(WISKY_GSENSOR_PX_NY_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PY_NX_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);	
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PX_NY_NZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#else
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#endif

	#ifdef MMA7660_DATA_FILTER
	axis.x += GSENSOR_ADJUST_X;
	axis.y += GSENSOR_ADJUST_Y;
	axis.z += GSENSOR_ADJUST_Z;
	#endif
	WPRINTK("x=%d,y=%d,z=%d\n",axis.x,axis.y,axis.z);
	mma7660_report_value(client, &axis);

	return 0;
}
Example #17
0
/***********************************************************************
  [function]:
callback:            gather the finger information and calculate the X,Y
coordinate then report them to the input system;
[parameters]:
null;
[return]:
null;
 ************************************************************************/
static int fts_read_data(void)
{
    struct FTS_TS_DATA_T *data = i2c_get_clientdata(this_client);
    u8 buf[6*CFG_MAX_POINT_NUM+2] = {0};
    int id, i_count, cur_touch_release, i, ret = -1;
    int touch_point_num = 0, touch_event, x, y, swap_x, swap_y;
    int report_id_index[CFG_MAX_POINT_NUM] = {false};

    buf[0] = 2;//ADDR
    ret = fts_i2c_rxdata(buf, 1);
    if (ret > 0)
        touch_point_num = buf[0]&0xf;
    else
        printk(KERN_ERR "get fingers failed!\n");

    //printk("touch_point_num=%d\n", touch_point_num);

    if(touch_point_num > CFG_MAX_POINT_NUM) {
        //printk("Touch number [%d] readed is larger than max point number\n", touch_point_num);
        touch_point_num = 0;
    }

    i_count = 0;
    cur_touch_release = 0;
    if(touch_point_num != 0) {
        buf[0] = 3;//ADDR
        ret=fts_i2c_rxdata(buf, 6*touch_point_num);
        if(ret >= 0) {
            do {
                id = buf[2+i_count*6]>>4;
                if(id <0 || id>CFG_MAX_POINT_NUM) {
                    printk("[ERROR] Touch ID readed is illegal!!\n");
                }

                _st_finger_infos[i_count].id = id;
                touch_event = buf[i_count*6]>>6;
                swap_x =((buf[i_count*6]& 0x0f)<<8) |buf[i_count*6+1];
                swap_y =( (buf[i_count*6+2]& 0x0f)<<8) | buf[i_count*6+3];

                WPRINTK("touch id[%d], raw point(%d, %d), touch_event=%d\n", id, swap_x, swap_y, touch_event);

#if defined(TS_SWAP_PX_PY)
                x = swap_x;
                y = swap_y;
#elif defined(TS_SWAP_PY_PX)
                x = swap_y;
                y = swap_x;
#elif defined(TS_SWAP_PX_NY)
                x = swap_x;
                y = WISKY_TOUCH_HEIGHT-swap_y;
#elif defined(TS_SWAP_NX_PY)
                x = WISKY_TOUCH_WIDTH-swap_x;
                y = swap_y;
#elif defined(TS_SWAP_NX_NY)
                x = WISKY_TOUCH_WIDTH-swap_x;
                y = WISKY_TOUCH_HEIGHT-swap_y;
#else
                x = swap_x;
                y = swap_y;
#endif

                //printk("touch id[%d], swap point(%d, %d)\n", id, x, y);

                if (touch_event == 0) //down
                {
                    _st_finger_infos[i_count].u2_pressure= 1;//pressure;
                    _st_finger_infos[i_count].i2_x= (int16_t)x;
                    _st_finger_infos[i_count].i2_y= (int16_t)y;
                }
                else if (touch_event == 1) //up event
                {
                    //report up key
                    input_mt_slot(data->input_dev, id);
                    input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false);
                    _st_finger_infos[i_count].u2_pressure= 0;
                    _st_finger_infos[i_count].id = -1;
                    cur_touch_release++;
                }
                else if (touch_event == 2) //move
                {
                    _st_finger_infos[i_count].u2_pressure= 1;//pressure;
                    _st_finger_infos[i_count].i2_x= (int16_t)x;
                    _st_finger_infos[i_count].i2_y= (int16_t)y;
                }
                else	/*bad event, ignore*/
                {
                    printk("Bad event, ignore!!!\n");
                    i_count++;
                    continue;
                }

                i_count++;
            } while(i_count < touch_point_num);

            if(0 == cur_touch_release) {
                for(i = touch_point_num; i < CFG_MAX_POINT_NUM; i++) {
                    _st_finger_infos[i].id = -1;
                    _st_finger_infos[i].u2_pressure = 0;
                    _st_finger_infos[i].i2_x = 0;
                    _st_finger_infos[i].i2_y = 0;
                }
            }
            for(i = 0; i < CFG_MAX_POINT_NUM; i++) {
                //report all down key
                if(_st_finger_infos[i].id >= 0 && _st_finger_infos[i].u2_pressure > 0) {
                    WPRINTK("--->DOWN: id(%d)\n", _st_finger_infos[i].id);
                    report_id_index[_st_finger_infos[i].id] = true;
                    input_mt_slot(data->input_dev, _st_finger_infos[i].id);
                    input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true);
                    input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 1);
#if defined(WISKY_BOARD_U7PLUS_TV10)
                    input_report_abs(data->input_dev, ABS_MT_POSITION_X,   1280- (_st_finger_infos[i].i2_x));
                    input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  800 - (_st_finger_infos[i].i2_y));
#else
                    input_report_abs(data->input_dev, ABS_MT_POSITION_X,   _st_finger_infos[i].i2_x);
                    input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  _st_finger_infos[i].i2_y);
#endif
                }
            }

            for(i = 0; i < CFG_MAX_POINT_NUM; i++) {
                if(false == report_id_index[i]) {
                    WPRINTK("--->UP: id(%d)\n", i);
                    //report all up key
                    input_mt_slot(data->input_dev, i);
                    input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false);
                }
            }
            input_sync(data->input_dev);
            cur_touch_release = 0;

            /*for(i = 0; i < CFG_MAX_POINT_NUM; i++){
            	WPRINTK("ID:%d (%d, %d), Presure[%d]", _st_finger_infos[i].id, _st_finger_infos[i].i2_x, _st_finger_infos[i].i2_y, _st_finger_infos[i].u2_pressure);
            }*/
        } else {