Esempio n. 1
0
pwm_driver2_t* pwm_driver2_open(pwm_driver2_descriptor_ptr driver) {
  if (!pwm_driver2_prepare_device(driver)) {
    printf("Cannot prepare driver %d\n", driver->id);
    return NULL;
  }
  pwm_driver2_t* pwm_driver2 = malloc(sizeof(pwm_driver2_t));
  pwm_driver2->pwm = pwm_open(driver->pwm, 50000);
  if (!pwm_driver2->pwm) {
    free(pwm_driver2);
    return NULL;
  }
  pwm_driver2->direction = gpio_open(driver->direction, GPIO_OUT);
  if (!pwm_driver2->direction) {
    pwm_close(pwm_driver2->pwm);
    free(pwm_driver2);
    return NULL;
  }
  pwm_driver2->enable = driver->enable;
  if (!gpio_write_direction_file(pwm_driver2->enable, GPIO_OUT)) {
    pwm_close(pwm_driver2->pwm);
    gpio_close(pwm_driver2->direction);
    free(pwm_driver2);
    return NULL;
  }
  pwm_driver2->pwm->zero = 0;
  pwm_set_duty(pwm_driver2->pwm, pwm_driver2->pwm->zero);
  gpio_write_value_file(pwm_driver2->enable, 0);
  return pwm_driver2;
}
Esempio n. 2
0
void pwm_driver2_close(pwm_driver2_t* pwm_driver2) {
  if (pwm_driver2 == NULL)
    return;
  gpio_write_value_file(pwm_driver2->enable, 0);
  gpio_close(pwm_driver2->direction);
  pwm_close(pwm_driver2->pwm);
  free(pwm_driver2);
}
Esempio n. 3
0
/**
  Turn off LCD backlight

  Turn off LCD backlight.

  @param void
  @return void
*/
void GPIOMap_TurnOffLCDBacklight(void)
{
    DBG_IND("GPIOMap_TurnOffLCDBacklight: Adjust value %d\r\n", g_LCDBacklightLvl);

    if (g_LCDBacklightEn == TRUE)
    {
#if (LCD_BACKLIGHT_CTRL == LCD_BACKLIGHT_BY_PWM)
        pwm_pwmDisable(PWMID_BLG_PCTL);
        pwm_close(PWMID_BLG_PCTL, TRUE);
#elif (LCD_BACKLIGHT_CTRL == LCD_BACKLIGHT_BY_GPIO)
        gpio_clearPin(GPIO_LCD_BLG_PCTL);
#endif
        g_LCDBacklightEn = FALSE;
    }
}
Esempio n. 4
0
/**
  Turn on LED

  Turn on LED.

  @param UINT32 uiLED: Which LED, could be the following
    GPIOMAP_LED_GREEN
    GPIOMAP_LED_RED
    GPIOMAP_LED_FCS //FOCUS
  @return void
*/
void LED_TurnOnLED(UINT32 uiLED)
{

    DBG_IND("LED_TurnOnLED %d\r\n",uiLED);
    switch (uiLED)
    {
    case GPIOMAP_LED_GREEN:
    #if (LED_GREEN_CTRL == LED_GREEN_BY_GPIO)
        gpio_setPin(GPIO_GREEN_LED);
    #endif
    break;

    case GPIOMAP_LED_RED:
    #if (LED_RED_CTRL == LED_RED_BY_GPIO)
        gpio_setPin(GPIO_RED_LED);
    #endif
    break;

    case GPIOMAP_LED_FCS:
    #if (LED_FOCUS_CTRL == LED_FOCUS_BY_GPIO)
        gpio_setPin(GPIO_FOCUS_LED);
    #endif
    #if (LED_FOCUS_CTRL == LED_FOCUS_BY_PWM)
    {
        //set FOCUS LED brightness level
        PWM_CFG PWMInfo;
        if(pwm_open(PWMID_FOCUS_LED)!=E_OK)
        {
            pwm_stop(PWMID_FOCUS_LED);
            pwm_close(PWMID_FOCUS_LED, TRUE);
            pwm_open(PWMID_FOCUS_LED);
        }
        PWMInfo.uiDiv=220;
        PWMInfo.uiPrd=22;
        PWMInfo.uiFall=FcsLedPrdVal[FcsLedLvl];
        PWMInfo.uiOnCycle=0;
        PWMInfo.uiInv=0;
        PWMInfo.uiRise=0;
        pwm_set(PWMID_FOCUS_LED, &PWMInfo);
        pwm_reload(PWMID_FOCUS_LED);
    }
    #endif

    default:
    break;
    }
}
Esempio n. 5
0
/***********************************************************************
 *
 * Function: c_entry
 *
 * Purpose: Application entry point from the startup code
 *
 * Processing:
 *     See function.
 *
 * Parameters: None
 *
 * Outputs: None
 *
 * Returns: Nothing
 *
 * Notes: None
 *
 **********************************************************************/
void c_entry(void)
{
  static PWM_CHANNEL_SETUP_T pwm_channel_setup[2][7];
  static PWM_SYSTEM_SETUP_T pwm_system_setup[2];
  static PWM_UPDATE_CONTROL_T pwm_update_control[2];

  /* Disable interrupts in ARM core */
  disable_irq();

  /* Setup miscellaneous board functions */
  phy3250_board_init();

  /* Set virtual address of MMU table */
  cp15_set_vmmu_addr((void *)
                     (IRAM_BASE + (256 * 1024) - (16 * 1024)));

  /* Initialize interrupt system */
  int_initialize(0xFFFFFFFF);

  /* Install standard IRQ dispatcher at ARM IRQ vector */
  int_install_arm_vec_handler(IRQ_VEC, (PFV) lpc32xx_irq_handler);

  /* Enable IRQ interrupts in the ARM core */
  enable_irq();

  /* Enable PWM3/4 clocks */
  clkpwr_clk_en_dis(CLKPWR_PWM3_CLK, 1);
  clkpwr_clk_en_dis(CLKPWR_PWM4_CLK, 1);

  /* Install PWM3 and PWM4 interrupt handlers as a IRQ interrupts */
  int_install_ext_irq_handler(IRQ_PWM3,
                              (PFV) pwm3_user_interrupt, ACTIVE_LOW, 1);
  int_install_ext_irq_handler(IRQ_PWM4,
                              (PFV) pwm4_user_interrupt, ACTIVE_LOW, 1);

  /* Disable SD/MMC output and select PWM3.x on the SD/MMC pins */
  CLKPWR->clkpwr_ms_ctrl = CLKPWR_MSCARD_MSDIO_PIN_DIS;
  GPIO->p_mux_set = P_MAT21 | P_MAT20 |
                    P_MAT03 | P_MAT02 |
                    P_MAT01 | P_MAT00;

  /* Select PWM3.x on the LCD pins */
  GPIO->p3_mux_set = P3_GPO10_MC2B | P3_GPO12_MC2A |
                     P3_GPO13_MC1B | P3_GPO15_MC1A |
                     P3_GPO16_MC0B | P3_GPO18_MC0A;

  /* Select PWM4.x on the LCD pins */
  GPIO->p3_mux_set = P3_GPO6 | P3_GPO8 |
                     P3_GPO9;

  /* Loop forever and let the demo syscle thru different steps */
  while (1)
  {

    /* PWM3/4 clock is the Peripheral clock (13 MHz)           */
    /* PWM3 and PWM4 are not synchronized                      */
    /*                                                         */
    /* Seven single edge independently controlled outputs      */
    /*                                                         */
    /* PWM3 prescaler: 2, period: 10000 ticks => fout = 650 Hz */
    /* channel 1: single edge, duty cycle 14%                  */
    /* channel 2: single edge, duty cycle 28%                  */
    /* channel 3: single edge, duty cycle 42%                  */
    /* channel 4: single edge, duty cycle 56%                  */
    /* channel 5: single edge, duty cycle 70%                  */
    /* channel 6: single edge, duty cycle 84%                  */
    /*                                                         */
    /* PWM4 prescaler: 2, period: 5000 ticks => fout = 1300 Hz */
    /* channel 1: single edge, toggle @ 2000                   */
    /* channel 2: single edge, toggle @ 3000                   */
    /* channel 3: single edge, toggle @ 4000                   */


    /* open PWM3 */
    pwmdev1 = pwm_open(PWM3, 0);

    pwm_ioctl(pwmdev1, PWM_SYSTEM_CONTROL, PWM_TIMER_RESET);

    pwm_system_setup[0].clock = PWM_CLOCK_PERIPHERAL;
    pwm_system_setup[0].prescale = 2;
    pwm_system_setup[0].period = 10000;
    pwm_system_setup[0].update = PWM_NO_UPDATE;
    pwm_ioctl(pwmdev1, PWM_SYSTEM_SETUP,
              (INT_32) &pwm_system_setup[0]);

    pwm_channel_setup[0][1].channel     = 1;
    pwm_channel_setup[0][1].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[0][1].duty_option = PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][1].duty        = 14;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][1]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 1);

    pwm_channel_setup[0][2].channel     = 2;
    pwm_channel_setup[0][2].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[0][2].duty_option = PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][2].duty        = 28;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][2]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 2);

    pwm_channel_setup[0][3].channel     = 3;
    pwm_channel_setup[0][3].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[0][3].duty_option = PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][3].duty        = 42;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][3]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 3);

    pwm_channel_setup[0][4].channel     = 4;
    pwm_channel_setup[0][4].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[0][4].duty_option = PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][4].duty        = 56;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][4]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 4);

    pwm_channel_setup[0][5].channel     = 5;
    pwm_channel_setup[0][5].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[0][5].duty_option = PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][5].duty        = 70;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][5]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 5);

    pwm_channel_setup[0][6].channel     = 6;
    pwm_channel_setup[0][6].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[0][6].duty_option = PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][6].duty        = 84;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][6]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 6);

    pwm_update_control[0].update    = PWM_UPDATE;
    pwm_update_control[0].channels  = 0x7E;
    pwm_ioctl(pwmdev1, PWM_UPDATE_CONTROL,
              (INT_32) &pwm_update_control[0]);
    pwm_ioctl(pwmdev1, PWM_SYSTEM_CONTROL, PWM_TIMER_RESTART);

    /* open PWM4 */
    pwmdev2 = pwm_open(PWM4, 0);

    pwm_system_setup[1].clock = PWM_CLOCK_PERIPHERAL;
    pwm_system_setup[1].prescale = 2;
    pwm_system_setup[1].period = 5000;
    pwm_system_setup[1].update = PWM_NO_UPDATE;
    pwm_ioctl(pwmdev2, PWM_SYSTEM_SETUP, (INT_32) &pwm_system_setup[1]);

    pwm_channel_setup[1][1].channel     = 1;
    pwm_channel_setup[1][1].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[1][1].duty_option = PWM_WAV_DUTY_ABS;
    pwm_channel_setup[1][1].duty        = 2000;
    pwm_ioctl(pwmdev2, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[1][1]);
    pwm_ioctl(pwmdev2, PWM_CHANNEL_OUT_ENABLE, 1);

    pwm_channel_setup[1][2].channel     = 2;
    pwm_channel_setup[1][2].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[1][2].duty_option = PWM_WAV_DUTY_ABS;
    pwm_channel_setup[1][2].duty        = 3000;
    pwm_ioctl(pwmdev2, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[1][2]);
    pwm_ioctl(pwmdev2, PWM_CHANNEL_OUT_ENABLE, 2);

    pwm_channel_setup[1][3].channel     = 3;
    pwm_channel_setup[1][3].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[1][3].duty_option = PWM_WAV_DUTY_ABS;
    pwm_channel_setup[1][3].duty        = 4000;
    pwm_ioctl(pwmdev2, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[1][3]);
    pwm_ioctl(pwmdev2, PWM_CHANNEL_OUT_ENABLE, 3);

    pwm_update_control[1].update    = PWM_UPDATE;
    pwm_update_control[1].channels  = 0x0E;
    pwm_ioctl(pwmdev2, PWM_UPDATE_CONTROL,
              (INT_32) &pwm_update_control[1]);
    pwm_ioctl(pwmdev2, PWM_SYSTEM_CONTROL, PWM_TIMER_RESTART);

    delay(2500000);

    /* close PWM3 & PWM4 */
    pwm_close(pwmdev1);
    pwm_close(pwmdev2);
    delay(2500000);


    /* PWM3/4 clock is the Peripheral clock (13 MHz)                */
    /* PWM3 and PWM4 are synchronized                               */
    /*                                                              */
    /* Four dual edge controlled outputs PWM3.2/4/6 and PWM4.2      */
    /* (as in a stepper motor control application) and a single     */
    /* edge independently controlled output PWM4.3                  */
    /* PWM3.1/3/5 are disabled                                      */
    /*                                                              */
    /* PWM3 prescaler: 5, period: 10000 ticks => fout = 260 Hz      */
    /* channel 1: disabled                                          */
    /* channel 2: dual edge, duty cycle 80%, offset 5%              */
    /* channel 3: disabled                                          */
    /* channel 4: dual edge, duty cycle 80%  offset 30%             */
    /* channel 5: disabled                                          */
    /* channel 6: dual edge, duty cycle 80%  offset 55%             */
    /*                                                              */
    /* PWM4 prescaler: 5, period: 10000 ticks => fout = 260 Hz      */
    /* channel 1: disabled                                          */
    /* channel 2: dual edge, duty cycle 80%  offset 80%             */
    /* channel 3: single edge, toggle @ 500                         */

    /* open PWM3 */
    pwmdev1 = pwm_open(PWM3, 0);

    pwm_ioctl(pwmdev1, PWM_SYSTEM_CONTROL, PWM_TIMER_RESET);

    pwm_system_setup[0].clock = PWM_CLOCK_PERIPHERAL;
    pwm_system_setup[0].prescale = 5;
    pwm_system_setup[0].period = 10000;
    pwm_system_setup[0].update = PWM_NO_UPDATE;
    pwm_ioctl(pwmdev1, PWM_SYSTEM_SETUP, (INT_32) &pwm_system_setup[0]);

    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_DISABLE, 1);

    pwm_channel_setup[0][2].channel     	= 2;
    pwm_channel_setup[0][2].mode        	= PWM_DUAL_EDGE;
    pwm_channel_setup[0][2].duty_option 	= PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][2].duty        	= 80;
    pwm_channel_setup[0][2].offset_option	= PWM_WAV_OFFSET_PER;
    pwm_channel_setup[0][2].offset        	= 5;
    pwm_channel_setup[0][2].ini_state      	= 1;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][2]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 2);

    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_DISABLE, 3);

    pwm_channel_setup[0][4].channel     	= 4;
    pwm_channel_setup[0][4].mode        	= PWM_DUAL_EDGE;
    pwm_channel_setup[0][4].duty_option 	= PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][4].duty        	= 80;
    pwm_channel_setup[0][4].offset_option	= PWM_WAV_OFFSET_PER;
    pwm_channel_setup[0][4].offset        	= 30;
    pwm_channel_setup[0][4].ini_state      	= 1;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][4]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 4);

    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_DISABLE, 5);

    pwm_channel_setup[0][6].channel     	= 6;
    pwm_channel_setup[0][6].mode        	= PWM_DUAL_EDGE;
    pwm_channel_setup[0][6].duty_option 	= PWM_WAV_DUTY_PER;
    pwm_channel_setup[0][6].duty        	= 80;
    pwm_channel_setup[0][6].offset_option	= PWM_WAV_OFFSET_PER;
    pwm_channel_setup[0][6].offset        	= 55;
    pwm_channel_setup[0][6].ini_state      	= 1;
    pwm_ioctl(pwmdev1, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[0][6]);
    pwm_ioctl(pwmdev1, PWM_CHANNEL_OUT_ENABLE, 6);

    pwm_update_control[0].update    = PWM_UPDATE;
    pwm_update_control[0].channels  = 0x7E;
    pwm_ioctl(pwmdev1, PWM_UPDATE_CONTROL,
              (INT_32) &pwm_update_control[0]);

    /* open PWM4 */
    pwmdev2 = pwm_open(PWM4, 0);

    pwm_system_setup[1].clock = PWM_CLOCK_PERIPHERAL;
    pwm_system_setup[1].prescale = 5;
    pwm_system_setup[1].period = 10000;
    pwm_system_setup[1].update = PWM_NO_UPDATE;
    pwm_ioctl(pwmdev2, PWM_SYSTEM_SETUP, (INT_32) &pwm_system_setup[1]);

    pwm_channel_setup[1][2].channel     	= 2;
    pwm_channel_setup[1][2].mode        	= PWM_DUAL_EDGE;
    pwm_channel_setup[1][2].duty_option 	= PWM_WAV_DUTY_PER;
    pwm_channel_setup[1][2].duty        	= 80;
    pwm_channel_setup[1][2].offset_option	= PWM_WAV_OFFSET_PER;
    pwm_channel_setup[1][2].offset        	= 80;
    pwm_channel_setup[1][2].ini_state      	= 1;
    pwm_ioctl(pwmdev2, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[1][2]);
    pwm_ioctl(pwmdev2, PWM_CHANNEL_OUT_ENABLE, 2);

    pwm_channel_setup[1][3].channel     = 3;
    pwm_channel_setup[1][3].mode        = PWM_SINGLE_EDGE;
    pwm_channel_setup[1][3].duty_option = PWM_WAV_DUTY_ABS;
    pwm_channel_setup[1][3].duty        = 500;
    pwm_ioctl(pwmdev2, PWM_CHANNEL_SETUP,
              (INT_32) &pwm_channel_setup[1][3]);
    pwm_ioctl(pwmdev2, PWM_CHANNEL_OUT_ENABLE, 3);

    pwm_update_control[1].update    = PWM_UPDATE;
    pwm_update_control[1].channels  = 0x0E;
    pwm_ioctl(pwmdev2, PWM_UPDATE_CONTROL,
              (INT_32) &pwm_update_control[1]);

    pwm_ioctl(pwmdev1, PWM_SYSTEM_CONTROL, PWM_TIMER_SYNC);
    pwm_ioctl(pwmdev2, PWM_SYSTEM_CONTROL, PWM_TIMER_RESTART);
    pwm_ioctl(pwmdev1, PWM_SYSTEM_CONTROL, PWM_TIMER_GO);

    delay(2500000);

    /* close PWM3 & PWM4 */
    pwm_close(pwmdev1);
    pwm_close(pwmdev2);
    delay(2500000);
  }
}