Example #1
0
UBYTE pwm_monitor()
{
	UBYTE data[60];
	UBYTE ret;
	UBYTE i;

	printf("Pwm monitor\n\r");
	printf("Hit any key to stop\n\r");

	while(!kbhit())
	{
		disable_interrupts(GLOBAL);
		ret=pwm_get(data,60,4000);
		enable_interrupts(GLOBAL);
		printf("Return %u\n\r",ret);
		for(i=0; i<ret; i++)
		{
			printf("%X ",data[i]);
		}
		printf("\n\r\n\r");
	}
	while(kbhit())
	{
		getch2();
	}
	return 0;
}
Example #2
0
static void wobble(void) {
	uint8_t cur = pwm_get();
	int8_t delta = (cur > WOBBLE_DELTA) ? (-WOBBLE_DELTA) : WOBBLE_DELTA;

	for(uint8_t i = 0; i < 3; i++) {
		fade_to(cur + delta, WOBBLE_DELAY);
		fade_to(cur, WOBBLE_DELAY);
	}
}
Example #3
0
static void fade_to(uint8_t target, uint8_t delay) {
	uint8_t cur = pwm_get();
	int8_t delta = (target > cur) ? 1 : -1;

	for(; cur != target; cur += delta) {
		pwm_set(cur);
		delay_ticks(delay);
	}

	pwm_set(target);
}
void    vex_default_routine(void)

{
    pwm_write(RIGHT_DRIVE_PORT, rc_read_data(1));
    pwm_write(LEFT_DRIVE_PORT, rc_read_data(2));
    /* Drive motors face opposite directions, so reverse left side. */
    pwm_write(3, -rc_read_data(3));
    pwm_write(4, rc_read_data(4));

    /* Handle Channel 5 receiver button */
    if (rc_read_data(5) < BUTTON_REV_THRESH)
	pwm_write(5, MOTOR_FULL_FWD);
    else if (rc_read_data(5) > BUTTON_FWD_THRESH)
	pwm_write(5, MOTOR_STOP);
    else
	pwm_write(5, MOTOR_STOP);
	
    /* Handle Channel 6 receiver button */
    if (rc_read_data(6) < BUTTON_REV_THRESH)
	pwm_write(6, MOTOR_FULL_FWD);
    else if (rc_read_data(6) > BUTTON_FWD_THRESH)
	pwm_write(6, MOTOR_STOP);
    else
	pwm_write(6, MOTOR_STOP);

    /* When Jumper 15 is on CONFIGURATION C is selected */
    if (io_read_digital(15) == DIGITAL_IN_CLOSED)
    {
	/* CONFIGURATION C */
	pwm_write(7, pwm_get(2));
	pwm_write(8, pwm_get(3));
    }
    else
    {
	/* CONFIGURATION A & B */
	pwm_write(7, ~pwm_get(5));
	pwm_write(8, ~pwm_get(6));
    } 
}
static ssize_t pwm_test_store_request(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	int rc;
	struct pwm_test *pwm_test = dev_get_drvdata(dev);

	rc = kstrtoul(buf, 0, &pwm_test->requested_s);
	if (rc)
		return rc;

	if (pwm_test->requested_s) {
		if(pwm_test->requested) // Allready requested
			return count;

		pwm_test->pwm = pwm_get(dev, NULL);

		if (IS_ERR(pwm_test->pwm)) {
			dev_err(dev, "%s() %d %ld\n", __func__, __LINE__,
				PTR_ERR(pwm_test->pwm));
			rc = -EINVAL;
		}
	} else {
		pwm_free(pwm_test->pwm);
		pwm_test->polarity = 0;
		pwm_test->run = 0;
		pwm_test->duty = 0;
		pwm_test->period = 0;
		pwm_test->polarity_s = 0;
		pwm_test->run_s = 0;
		pwm_test->duty_s = 0;
		pwm_test->period_s = 0;
		rc = 0;
	}

	if (rc) {
		pr_err("operation failed %d\n", rc);
		pwm_test->requested_s = pwm_test->requested;
		return rc;
	}

	pwm_test->requested = pwm_test->requested_s;
	return count;
}
Example #6
0
static int pwm_beeper_probe(struct platform_device *pdev)
{
	unsigned long pwm_id = (unsigned long)pdev->dev.platform_data;
	struct pwm_beeper *beeper;
	int error;

	beeper = kzalloc(sizeof(*beeper), GFP_KERNEL);
	if (!beeper)
		return -ENOMEM;

	beeper->pwm = pwm_get(&pdev->dev, NULL);
	if (IS_ERR(beeper->pwm)) {
		dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n");
		beeper->pwm = pwm_request(pwm_id, "pwm beeper");
	}

	if (IS_ERR(beeper->pwm)) {
		error = PTR_ERR(beeper->pwm);
		dev_err(&pdev->dev, "Failed to request pwm device: %d\n", error);
		goto err_free;
	}

	beeper->input = input_allocate_device();
	if (!beeper->input) {
		dev_err(&pdev->dev, "Failed to allocate input device\n");
		error = -ENOMEM;
		goto err_pwm_free;
	}
	beeper->input->dev.parent = &pdev->dev;

	beeper->input->name = "pwm-beeper";
	beeper->input->phys = "pwm/input0";
	beeper->input->id.bustype = BUS_HOST;
	beeper->input->id.vendor = 0x001f;
	beeper->input->id.product = 0x0001;
	beeper->input->id.version = 0x0100;

	beeper->input->evbit[0] = BIT(EV_SND);
	beeper->input->sndbit[0] = BIT(SND_TONE) | BIT(SND_BELL);

	beeper->input->event = pwm_beeper_event;

	input_set_drvdata(beeper->input, beeper);

	error = input_register_device(beeper->input);
	if (error) {
		dev_err(&pdev->dev, "Failed to register input device: %d\n", error);
		goto err_input_free;
	}

	platform_set_drvdata(pdev, beeper);

	return 0;

err_input_free:
	input_free_device(beeper->input);
err_pwm_free:
	pwm_free(beeper->pwm);
err_free:
	kfree(beeper);

	return error;
}
struct lego_port_device
*ev3_output_port_register(struct ev3_output_port_platform_data *pdata,
			  struct device *parent)
{
	struct ev3_output_port_data *data;
	struct pwm_device *pwm;
	int err;

	if (WARN(!pdata, "Platform data is required."))
		return ERR_PTR(-EINVAL);

	data = kzalloc(sizeof(struct ev3_output_port_data), GFP_KERNEL);
	if (!data)
		return ERR_PTR(-ENOMEM);

	data->id = pdata->id;
	data->analog = get_legoev3_analog();
	if (IS_ERR(data->analog)) {
		dev_err(parent, "Could not get legoev3-analog device.\n");
		err = PTR_ERR(data->analog);
		goto err_request_legoev3_analog;
	}

	data->gpio[GPIO_PIN1].gpio	= pdata->pin1_gpio;
	data->gpio[GPIO_PIN1].flags	= GPIOF_IN;
	data->gpio[GPIO_PIN1].label	= "pin1";

	data->gpio[GPIO_PIN2].gpio	= pdata->pin2_gpio;
	data->gpio[GPIO_PIN2].flags	= GPIOF_IN;
	data->gpio[GPIO_PIN2].label	= "pin2";

	data->gpio[GPIO_PIN5].gpio	= pdata->pin5_gpio;
	data->gpio[GPIO_PIN5].flags	= GPIOF_IN;
	data->gpio[GPIO_PIN5].label	= "pin5";

	data->gpio[GPIO_PIN5_INT].gpio	= pdata->pin5_int_gpio;
	data->gpio[GPIO_PIN5_INT].flags	= GPIOF_IN;
	data->gpio[GPIO_PIN5_INT].label	= "pin5_tacho";

	data->gpio[GPIO_PIN6_DIR].gpio	= pdata->pin6_dir_gpio;
	data->gpio[GPIO_PIN6_DIR].flags	= GPIOF_IN;
	data->gpio[GPIO_PIN6_DIR].label	= "pin6";

	err = gpio_request_array(data->gpio, ARRAY_SIZE(data->gpio));
	if (err) {
		dev_err(parent, "Requesting GPIOs failed.\n");
		goto err_gpio_request_array;
	}

	data->out_port.name = ev3_output_port_type.name;
	snprintf(data->out_port.port_name, LEGO_PORT_NAME_SIZE, "out%c",
		 data->id + 'A');
	pwm = pwm_get(NULL, data->out_port.port_name);
	if (IS_ERR(pwm)) {
		dev_err(parent, "Could not get pwm! (%ld)\n", PTR_ERR(pwm));
		err = PTR_ERR(pwm);
		goto err_pwm_get;
	}

	err = pwm_config(pwm, 0, NSEC_PER_SEC / 10000);
	if (err) {
		dev_err(parent,
			"Failed to set pwm duty percent and frequency! (%d)\n",
			err);
		goto err_pwm_config;
	}

	err = pwm_enable(pwm);
	if (err) {
		dev_err(parent, "Failed to start pwm! (%d)\n", err);
		goto err_pwm_start;
	}
	/* This lets us set the pwm duty cycle in an atomic context */
	pm_runtime_irq_safe(pwm->chip->dev);
	data->pwm = pwm;

	data->out_port.num_modes = NUM_EV3_OUTPUT_PORT_MODE;
	data->out_port.mode_info = legoev3_output_port_mode_info;
	data->out_port.set_mode = ev3_output_port_set_mode;
	data->out_port.set_device = ev3_output_port_set_device;
	data->out_port.get_status = ev3_output_port_get_status;
	data->out_port.dc_motor_ops = &ev3_output_port_motor_ops;
	data->out_port.context = data;
	err = lego_port_register(&data->out_port, &ev3_output_port_type, parent);
	if (err) {
		dev_err(parent, "Failed to register lego_port_device. (%d)\n",
			err);
		goto err_lego_port_register;
	}

	INIT_WORK(&data->change_uevent_work, ev3_output_port_change_uevent_work);
	INIT_WORK(&data->work, NULL);

	data->con_state = CON_STATE_INIT;

	hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	data->timer.function = ev3_output_port_timer_callback;
	hrtimer_start(&data->timer, ktime_set(0, OUTPUT_PORT_POLL_NS),
		      HRTIMER_MODE_REL);

	return &data->out_port;

err_lego_port_register:
	pwm_disable(pwm);
err_pwm_start:
err_pwm_config:
	pwm_put(pwm);
err_pwm_get:
	gpio_free_array(data->gpio, ARRAY_SIZE(data->gpio));
err_gpio_request_array:
	put_legoev3_analog(data->analog);
err_request_legoev3_analog:
	kfree(data);

	return ERR_PTR(err);
}
Example #8
0
static void dualLedProcess(struct kfish_led_info * led1, struct kfish_led_info * led2)
{
#define PWM_INC(pwm, inc) do{if(255 - pwm < inc){pwm = 255;}else{pwm=pwm+inc;}}while(0)
#define PWM_DEC(pwm, dec) do{			\
	if(pwm < dec){				\
	    pwm = 0;				\
	}else{					\
	    pwm=pwm-dec;			\
	}					\
    }while(0)
#define LED_PWM_SET(id, pwm) pwm_set(id+1, pwm)
#define LED_PWM_GET(id) pwm_get(id+1)
    UINT8 beginVal, endVal;
    UINT8 fan_pwm, led_pwm;
    INT16 temperature;
    UINT8 i;
    struct rtc_time time;
    INT16 diff;
    temperature = local_max_temperature_get();
    /* 每2秒检查一次 */
    if(local_time_diff_ms(led1->lastTime) < 2000){
	return;
    }
    led1->lastTime = local_ms_get();
    
    local_time_get(&time);
    
    /* led需要时刻检查温度是否正常,需要动态调整风扇转速度
     * 如果温度超高,还需要降低led功率
     */
    
    
    /* 计算新的风扇PWM值 */
    fan_pwm = pwm_get(0);
    if(temperature > 60){ /* 大于60度,风扇全速 */
	fan_pwm = 255;
	
    }else if(temperature < 30){ /* 35度以下停止转动 */
	fan_pwm = 0;
    }else if(temperature < 40){/* 40度以下开始降低转速 */
	PWM_DEC(fan_pwm, 5);
    }else if(temperature > 50){/* 50度以下开始增加转速 */
	PWM_INC(fan_pwm, 5);
    }
    for(i=0; i<2; i++){
	if(temperature > 65){	/* 温度失控,降低灯亮度 */
	    if(__local_ctrl[i].ctrl.led.pwm_now > 50)
	      PWM_DEC(__local_ctrl[i].ctrl.led.pwm_now, 30);
	}else if(get_pause_value(i, &diff) > 0){ /* 暂停状态,使用暂停的配置 */
	    __local_ctrl[i].ctrl.led.pwm_now = (UINT8)diff;
	}else{		/* 根据分钟数算一个pwm值 */
	    beginVal = __local_ctrl[i].ctrl.led.pwm[time.hour];
	    endVal = __local_ctrl[i].ctrl.led.pwm[(time.hour + 1) % 24];
	    diff = (INT16)endVal - (INT16)beginVal;
	    
	    diff = diff * time.min / 60;
	    diff += (INT16)beginVal;
	    /* 渐变,不一下子亮度跳变 */
	    beginVal = LED_PWM_GET(i);
	    DBG_PRINT("led %d %d->%d\n", i, beginVal, diff);
	    if(beginVal > diff){
		__local_ctrl[i].ctrl.led.pwm_now = beginVal - 1;
	    }else if(beginVal < diff){
		__local_ctrl[i].ctrl.led.pwm_now = beginVal + 1;
	    }else{
		/* 相同,不处理 */
		__local_ctrl[i].ctrl.led.pwm_now = beginVal;
	    }
	}
	LED_PWM_SET(i, __local_ctrl[i].ctrl.led.pwm_now);
	DBG_PRINT("led %d pwm %d fan %d temp %d\n", i, LED_PWM_GET(i), fan_pwm, temperature);
    }
    pwm_set(0, fan_pwm);	/* 设置风扇 */
    printk("%x %x %x\n", pwm_get(0), pwm_get(1), pwm_get(2));
}
Example #9
0
static void toggle(void) {
	if(pwm_get())
		pwm_set(0);
	else
		pwm_set(PWM_MAX);
}