#include "hi_led.h"
#include <common.h>
static int led_init_flag = 0;
static int led_contrl = LED_CONTROL_PWM;
#ifdef CONFIG_HI_LED
static int PWM_DRV_Disable(unsigned char pwm_num)
{
if (pwm_num >= PWM_NUM_MAX)
{
printf("The pwm number is big than the max value!\n");
return -1;
}
switch (pwm_num)
{
case 0:
PWM_WRITE_REG(PWM0_CTRL_REG, PWM_DISABLE);
break;
case 1:
PWM_WRITE_REG(PWM1_CTRL_REG, PWM_DISABLE);
break;
case 2:
PWM_WRITE_REG(PWM2_CTRL_REG, PWM_DISABLE);
break;
case 3:
PWM_WRITE_REG(PWM3_CTRL_REG, PWM_DISABLE);
break;
case 4:
PWM_WRITE_REG(PWM4_CTRL_REG, PWM_DISABLE);
break;
case 5:
PWM_WRITE_REG(PWM5_CTRL_REG, PWM_DISABLE);
break;
case 6:
PWM_WRITE_REG(PWM6_CTRL_REG, PWM_DISABLE);
break;
case 7:
PWM_WRITE_REG(PWM7_CTRL_REG, PWM_DISABLE);
break;
default:
break;
}
return 0;
}
static int PWM_DRV_Write(unsigned char pwm_num, unsigned int duty, unsigned int period, unsigned char enable)
{
if (pwm_num >= PWM_NUM_MAX)
{
printf("The pwm number is big than the max value!\n");
return -1;
}
if (enable)
{
switch (pwm_num)
{
case 4:
PWM_WRITE_REG(PWM4_CTRL_REG, PWM_DISABLE);
PWM_WRITE_REG(PWM4_CFG_REG0, period);
PWM_WRITE_REG(PWM4_CFG_REG1, duty);
PWM_WRITE_REG(PWM4_CFG_REG2, 10); //pwm output number
PWM_WRITE_REG(PWM4_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output;
//printk("The PWMI4 state %x\n",PWM_READ_REG(PWM4_STATE_REG));
break;
case 6:
PWM_WRITE_REG(PWM5_CTRL_REG, PWM_DISABLE);
PWM_WRITE_REG(PWM5_CFG_REG0, period);
PWM_WRITE_REG(PWM5_CFG_REG1, duty);
PWM_WRITE_REG(PWM5_CFG_REG2, 10); //pwm output number
PWM_WRITE_REG(PWM5_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output;
//printk("The PWMI6 state %x\n",PWM_READ_REG(PWM6_STATE_REG));
break;
case 7:
PWM_WRITE_REG(PWM7_CTRL_REG, PWM_DISABLE);
PWM_WRITE_REG(PWM7_CFG_REG0, period);
PWM_WRITE_REG(PWM7_CFG_REG1, duty);
PWM_WRITE_REG(PWM7_CFG_REG2, 10); //pwm output number
PWM_WRITE_REG(PWM7_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output;
//printk("The PWMI7 state %x\n",PWM_READ_REG(PWM7_STATE_REG));
break;
default:
PWM_WRITE_REG(PWM0_CTRL_REG, PWM_DISABLE);
PWM_WRITE_REG(PWM0_CFG_REG0, period);
PWM_WRITE_REG(PWM0_CFG_REG1, duty);
PWM_WRITE_REG(PWM0_CFG_REG2, 10); //pwm output number
PWM_WRITE_REG(PWM0_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output;
//printk("The PWMII0 state %x\n",PWM_READ_REG(PWM0_STATE_REG));
break;
}
}
else
{
PWM_DRV_Disable(pwm_num);
}
return 0;
}
static int hiled_init()
{
if (LED_CONTROL_PWM == led_contrl) {
/* reg mux config to pwm */
PWM_WRITE_REG(PWM4_MUXCTL_REG, PWM_MUXCTL_PWM);
PWM_WRITE_REG(PWM5_MUXCTL_REG, PWM_MUXCTL_PWM);
PWM_WRITE_REG(PWM7_MUXCTL_REG, PWM_MUXCTL_PWM);
PWM_WRITE_REG(PERI_CRG55, 0x2); /* enable pwm clock */
} else {
/* reg mux config to gpio */
PWM_WRITE_REG(PWM4_MUXCTL_REG, PWM_MUXCTL_GPIO);
PWM_WRITE_REG(PWM5_MUXCTL_REG, PWM_MUXCTL_GPIO);
PWM_WRITE_REG(PWM7_MUXCTL_REG, PWM_MUXCTL_GPIO);
/* config gpio direction to out */
HI_GPIO_DIR(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_DIR_OUT);
HI_GPIO_DIR(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_DIR_OUT);
HI_GPIO_DIR(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_DIR_OUT);
}
led_init_flag = 1;
return 0;
}
static int pwd_led_on(HI_LED_COLOR led)
{
switch (led)
{
case HI_LED_RED:
PWM_DRV_Write(4,255,255,1);
PWM_DRV_Write(5,255,255,0);
PWM_DRV_Write(7,255,255,0);
break;
case HI_LED_GREEN:
PWM_DRV_Write(5,255,255,1);
PWM_DRV_Write(4,255,255,0);
PWM_DRV_Write(7,255,255,0);
break;
case HI_LED_BLUE:
PWM_DRV_Write(7,255,255,1);
PWM_DRV_Write(5,255,255,0);
PWM_DRV_Write(4,255,255,0);
break;
case HI_LED_PURPLE:
PWM_DRV_Write(4,255,255,1);
PWM_DRV_Write(7,255,255,1);
PWM_DRV_Write(5,255,255,0);
break;
case HI_LED_YELLOW:
PWM_DRV_Write(4,255,255,1);
PWM_DRV_Write(5,255,255,1);
PWM_DRV_Write(7,255,255,0);
break;
case HI_LED_WHITE:
PWM_DRV_Write(4,255,255,1);
PWM_DRV_Write(5,255,255,1);
PWM_DRV_Write(7,255,255,1);
break;
case HI_LED_LIGHT_BLUE:
PWM_DRV_Write(5,255,255,1);
PWM_DRV_Write(7,255,255,1);
PWM_DRV_Write(4,255,255,0);
break;
default:
break;
}
return 0;
}
static int gpio_led_on(HI_LED_COLOR led)
{
//debug printf
//printf("LED: %d\n", led);
switch (led)
{
case HI_LED_RED:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_LOW);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_LOW);
break;
case HI_LED_GREEN:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_LOW);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_LOW);
break;
case HI_LED_BLUE:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_LOW);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_LOW);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_HIGH);
break;
case HI_LED_PURPLE:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_LOW);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_HIGH);
break;
case HI_LED_YELLOW:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_LOW);
break;
case HI_LED_WHITE:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_HIGH);
break;
case HI_LED_LIGHT_BLUE:
HI_GPIO_VAL(HI_RED_GPIO_GROUP, HI_RED_GPIO_INDEX, HI_GPIO_VAL_LOW);
HI_GPIO_VAL(HI_GREEN_GPIO_GROUP, HI_GREEN_GPIO_INDEX, HI_GPIO_VAL_HIGH);
HI_GPIO_VAL(HI_BLUE_GPIO_GROUP, HI_BLUE_GPIO_INDEX, HI_GPIO_VAL_HIGH);
break;
default:
break;
}
return 0;
}
int rgbled_on(HI_LED_COLOR led)
{
if (led_init_flag == 0) {
hiled_init();
}
if (led_contrl == LED_CONTROL_GPIO)
gpio_led_on(led);
else
pwd_led_on(led);
return 0 ;
}
int rgbled_off(void)
{
if (led_init_flag == 0) {
hiled_init();
}
PWM_DRV_Disable(4);
PWM_DRV_Disable(5);
PWM_DRV_Disable(7);
return 0 ;
}
#endif /* CONFIG_HI_LED */