Example #1
0
static void omap_pwm_led_set_pwm_cycle(struct omap_pwm_led *led, int cycle)
{
	int n;

	pr_debug("%s%s: \n", PASS1,__func__);
	
	if (cycle == 0)
		n = 0xff;
	else	n = cycle - 1;

	if (cycle == LED_FULL) {
		printk("!!!!!!!!!!cycle == LED_FULL \n");
		omap_dm_timer_start(led->intensity_timer);
		omap_dm_timer_set_pwm(led->intensity_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_set_match(led->intensity_timer, 1,
					0xffffff00);
	} else {
		printk("!!!!!!!!!!cycle != LED_FULL, cycle=%i \n", cycle);
		omap_dm_timer_start(led->intensity_timer);
		omap_dm_timer_set_pwm(led->intensity_timer, 0, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_set_match(led->intensity_timer, 1,
					(0xffffff00) | cycle);
	}
}
static void pwm_set_speed(struct omap_dm_timer *gpt,
		int frequency, int duty_cycle)
{
	u32 val;
	u32 period;
	struct clk *timer_fclk;

	/* and you will have an overflow in 1 sec         */
	/* so,                              */
	/* freq_timer     -> 1s             */
	/* carrier_period -> 1/carrier_freq */
	/* => carrier_period = freq_timer/carrier_freq */

	timer_fclk = omap_dm_timer_get_fclk(gpt);
	period = clk_get_rate(timer_fclk) / frequency;

	val = 0xFFFFFFFF+1-period;
	omap_dm_timer_set_load(gpt, 1, val);

	val = 0xFFFFFFFF+1-(period*duty_cycle/256);
	omap_dm_timer_set_match(gpt, 1, val);

	/* assume overflow first: no toogle if first trig is match */
	omap_dm_timer_write_counter(gpt, 0xFFFFFFFE);
}
Example #3
0
static void omap_pwm_led_set_blink(struct omap_pwm_led *led)
{
	pr_debug("%s%s: \n", PASS1,__func__);
	if (!led->powered)
		return;

	if (led->on_period != 0 && led->off_period != 0) {
		unsigned long load_reg, cmp_reg;

		load_reg = 32768 * (led->on_period + led->off_period) / 1000;
		cmp_reg = 32768 * led->on_period / 1000;

		omap_dm_timer_stop(led->blink_timer);
		omap_dm_timer_set_load(led->blink_timer, 1, -load_reg);
		omap_dm_timer_set_match(led->blink_timer, 1, -cmp_reg);
		omap_dm_timer_set_pwm(led->blink_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_write_counter(led->blink_timer, -2);
		omap_dm_timer_start(led->blink_timer);
	} else {
		omap_dm_timer_set_pwm(led->blink_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_stop(led->blink_timer);
	}
}
Example #4
0
static void set_gptimer_pwm_vibrator(int on)
{
    unsigned long	flags;

    if (pwm_timer == NULL) {
        pr_err(KERN_ERR "vibrator pwm timer is NULL\n");
        return;
    }

    spin_lock_irqsave(&vibe__timer_lock, flags);
    if (on) {
        if(!vibe_timer_state) {
            gpio_set_value(GPIO_VIB_EN, 1);
            omap_dm_timer_enable(pwm_timer);
            omap_dm_timer_set_match(pwm_timer, 1, 0xFFFFFFFE);
            omap_dm_timer_set_pwm(pwm_timer, 0, 1, OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
            omap_dm_timer_set_load_start(pwm_timer, 1, MOTOR_RESONANCE_COUTER_VALUE);
            vibe_timer_state = 1;
        }
    } else {
        if(vibe_timer_state) {
            omap_dm_timer_stop(pwm_timer);
            omap_dm_timer_disable(pwm_timer);
            gpio_set_value(GPIO_VIB_EN, 0);
            vibe_timer_state = 0;
        }
    }
    spin_unlock_irqrestore(&vibe__timer_lock, flags);
}
Example #5
0
// set the pwm duty cycle
static int set_pwm_dutycycle(uint32_t pin,int dutycycle) {
	
	//uint32_t val = TIMER_MAX+1 - (256*dutycycle/pwm_data_ptr.frequency);
	uint32_t val = 	TIMER_MAX+1 - 2*pwm_data_ptr.load;
	omap_dm_timer_set_match(timer_ptr,1,pwm_data_ptr.load-0x100);
	pwm_data_ptr.dutycycle = dutycycle;

	return 0;
}
Example #6
0
/*
 * For setting the values in registers for varying the duty cycle and time period
 */
static void vibtonz_GPTimerSetValue(unsigned long load,unsigned long cmp)
{
	unsigned long load_reg, cmp_reg;
//	printk("[VIBRATOR] %s \n",__func__);

	load_reg =  load;	/* For setting the frequency=22.2Khz */
	cmp_reg =  cmp;		/* For varying the duty cycle */

	omap_dm_timer_enable(gptimer);
	omap_dm_timer_set_load(gptimer, 1, -load_reg);
	omap_dm_timer_set_match(gptimer, 1, -cmp_reg);
	omap_dm_timer_set_pwm(gptimer, 0, 1,OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_write_counter(gptimer, -2);
	omap_dm_timer_save_context(gptimer);
}
Example #7
0
static void backlight_gptimer_update(struct omap_dss_device *dssdev)
{
	struct ltn101al03 *lcd = dev_get_drvdata(&dssdev->dev);

	omap_dm_timer_set_load(lcd->gptimer, 1, -PWM_DUTY_MAX);
	omap_dm_timer_set_match(lcd->gptimer, 1,	/* 0~25 */
				-PWM_DUTY_MAX + lcd->current_brightness);
	omap_dm_timer_set_pwm(lcd->gptimer, 0, 1,
			      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_enable(lcd->gptimer);
	omap_dm_timer_write_counter(lcd->gptimer, -2);
	omap_dm_timer_disable(lcd->gptimer);

	omap_dm_timer_start(lcd->gptimer);
}
Example #8
0
static int init_timing_params(struct lirc_rx51 *lirc_rx51)
{
	u32 load, match;

	load = -(lirc_rx51->fclk_khz * 1000 / lirc_rx51->freq);
	match = -(lirc_rx51->duty_cycle * -load / 100);
	omap_dm_timer_set_load(lirc_rx51->pwm_timer, 1, load);
	omap_dm_timer_set_match(lirc_rx51->pwm_timer, 1, match);
	omap_dm_timer_write_counter(lirc_rx51->pwm_timer, TIMER_MAX_VALUE - 2);
	omap_dm_timer_start(lirc_rx51->pwm_timer);
	omap_dm_timer_set_int_enable(lirc_rx51->pulse_timer, 0);
	omap_dm_timer_start(lirc_rx51->pulse_timer);

	lirc_rx51->match = 0;

	return 0;
}
Example #9
0
static void omap_pwm_led_set_pwm_cycle(struct omap_pwm_led *led, int cycle)
{
	int n;

	if (cycle == 0)
		n = 0xff;
	else	n = cycle - 1;

	if (cycle == LED_FULL) {
		omap_dm_timer_set_pwm(led->intensity_timer, 0, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_stop(led->intensity_timer);
	} else {
		omap_dm_timer_set_pwm(led->intensity_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_set_match(led->intensity_timer, 1,
					(0xffffff00) | cycle);
		omap_dm_timer_start(led->intensity_timer);
	}
}
static int sholest_lvibrator_initialization(void)
{
	unsigned long load_reg, cmp_reg;
	uint32_t timer_rate = 0;
	int ret = 0;
	vib_pwm_timer = omap_dm_timer_request_specific(11);
	if (vib_pwm_timer == NULL)
		ret = -ENODEV;
	timer_rate = clk_get_rate(omap_dm_timer_get_fclk(vib_pwm_timer));
	load_reg = timer_rate * SHOLEST_LVIBRATOR_PERIOD / 1000000;
	cmp_reg = timer_rate * (SHOLEST_LVIBRATOR_PERIOD -
				SHOLEST_LVIBRATOR_DUTY) / 1000000;
	omap_dm_timer_set_source(vib_pwm_timer, OMAP_TIMER_SRC_32_KHZ);
	omap_dm_timer_set_load(vib_pwm_timer, 1, -load_reg);
	omap_dm_timer_set_match(vib_pwm_timer, 1, -cmp_reg);
	omap_dm_timer_set_pwm(vib_pwm_timer, 0, 1,
			      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_write_counter(vib_pwm_timer, -2);
	return 0;
}
Example #11
0
static int pulse_timer_set_timeout(struct lirc_rx51 *lirc_rx51, int usec)
{
	int counter;

	BUG_ON(usec < 0);

	if (lirc_rx51->match == 0)
		counter = omap_dm_timer_read_counter(lirc_rx51->pulse_timer);
	else
		counter = lirc_rx51->match;

	counter += (u32)(lirc_rx51->fclk_khz * usec / (1000));
	omap_dm_timer_set_match(lirc_rx51->pulse_timer, 1, counter);
	omap_dm_timer_set_int_enable(lirc_rx51->pulse_timer,
				     OMAP_TIMER_INT_MATCH);
	if (tics_after(omap_dm_timer_read_counter(lirc_rx51->pulse_timer),
		       counter)) {
		return 1;
	}
	return 0;
}
Example #12
0
static void _set_innotech_speed(int id, int frequency, int duty_cycle) 
{
	u32 val;
	u32 period;

	/* and you will have an overflow in 1 sec         */
	/* so,                              */
	/* freq_timer     -> 1s             */
	/* carrier_period -> 1/carrier_freq */
	/* => carrier_period = freq_timer/carrier_freq */
	period = _get_innotech_period(gpt_pwm_list[id].rate, frequency);
	gpt_pwm_list[id].period = period;
	val = 0xFFFFFFFF+1-period;
	
	omap_dm_timer_set_load(gpt_pwm_list[id].timer, 1, val);

	val = 0xFFFFFFFF+1-(period*duty_cycle/256);
	omap_dm_timer_set_match(gpt_pwm_list[id].timer, 1, val);

	/* set overflow first: pwm will not toggle if first trig is match */
	omap_dm_timer_write_counter(gpt_pwm_list[id].timer,0xFFFFFFFE);
}
Example #13
0
static void gp_irblaster_init(int carrier_frequency, int no_carrier, unsigned short *pt_cycles_list) 
{
	u32 val;
	u32 period;
	int min_cycle=0x70000000; /* this min cycle can be set to another minimum: but which value ? */
	unsigned short *pt = pt_cycles_list;

	irb_over = 0;

	//_select_irb_config();

	/* find min cycle */
	while ( *pt != 0) {
		if ( *pt < min_cycle )
			min_cycle = *pt;
		pt++;
	}

	/* enable timer clock */
	omap_dm_timer_enable(gpt_pwm_list[IRBLASTER_PWM].timer);
	omap_dm_timer_enable(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer);

	irq_irblaster_cycles = pt_cycles_list;

	if ( no_carrier ) {
		/* set the callback irq function */
		_callback_irblaster_timer_interrupt = omap2_irblaster_timer_interrupt_no_carrier;

		/* set IRBLASTER TIMER PWM */
		/* default output is 0 */
		/* toogle */
		/* trigger on overflow */
		omap_dm_timer_set_pwm(gpt_pwm_list[IRBLASTER_PWM].timer,0,1,1);
		/* set frequency */
		period = _get_innotech_period(gpt_pwm_list[IRBLASTER_PWM].rate,carrier_frequency);
		gpt_pwm_list[IRBLASTER_PWM].period = period;

		/* at init, nothing to do during few cycles */
		/* and let say, during min cycle */
		val = 0xFFFFFFFF+1-(period*min_cycle);
		omap_dm_timer_set_load(gpt_pwm_list[IRBLASTER_PWM].timer, 1, val);


		/* set IRBLASTER TIMER CTRL */
		/* timer freq is the same as the carrier */
		period = _get_innotech_period(gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate,carrier_frequency);
		gpt_pwm_list[IRBLASTER_TIMER_CTRL].period = period;

		/* at init, nothing to do during few cycles */
		/* and let say, during min cycle */
		val = 0xFFFFFFFF+1-(period*min_cycle);
		omap_dm_timer_set_load(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1, val);

		/* prepare the irblaster match condition */
		/* irblaster timer run twice time faster than the pwm */
		/* so this match is set on the middle of the min cycle time */
		val = 0xFFFFFFFF+1-(period*min_cycle/2);
		omap_dm_timer_set_match(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1, val);

	} else {
		/* set the callback irq function */
		_callback_irblaster_timer_interrupt = omap2_irblaster_timer_interrupt_carrier;

		/* set IRBLASTER TIMER PWM */
		/* default output is 0 */
		/* toogle */
		/* trigger on match and overflow */
		omap_dm_timer_set_pwm(gpt_pwm_list[IRBLASTER_PWM].timer,0,1,2);
		/* set waveform frequency and duty cycle 1/2 = 128/256 */
		_set_innotech_speed(IRBLASTER_PWM,carrier_frequency,128);

		/* at init, no trigger = default output on pin */
	 	irq_irblaster_pwm_ctrl_reg = omap_dm_timer_read_reg(gpt_pwm_list[IRBLASTER_PWM].timer, OMAP_TIMER_CTRL_REG);
		irq_irblaster_pwm_ctrl_reg &= ~(3<<10);
		omap_dm_timer_write_reg(gpt_pwm_list[IRBLASTER_PWM].timer, OMAP_TIMER_CTRL_REG, irq_irblaster_pwm_ctrl_reg);

		/* make the start readuy */
		irq_irblaster_pwm_ctrl_reg |= OMAP_TIMER_CTRL_ST;

		/* set IRBLASTER TIMER CTRL */
		/* timer freq is the same as the carrier */
		period = _get_innotech_period(gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate,carrier_frequency);
		gpt_pwm_list[IRBLASTER_TIMER_CTRL].period = period;
	
		/* at init, nothing to do during few cycles */
		/* and let say, during min cycle */
		val = 0xFFFFFFFF+1-(period*(*irq_irblaster_cycles));
		omap_dm_timer_set_load(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1, val);
	
		/* set the irblaster ctrl timer match condition */
		/* to the middle of min cycle */
		/* from (end_of_cycle - min_cycle/2) to end_of_cycle, */
		/* the timer ctrl irq will pool ...*/
//		val = 0xFFFFFFFF+1-(period*min_cycle/2);
		val =  0xFFFFFFFF+1-_get_best_match_timing_int(min_cycle,gpt_pwm_list[IRBLASTER_TIMER_CTRL].period,gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate);
		omap_dm_timer_set_match(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1,val );

	}

	omap_dm_timer_start(gpt_pwm_list[ IRBLASTER_TIMER_CTRL].timer);
	omap_dm_timer_start(gpt_pwm_list[ IRBLASTER_PWM].timer);
}