艾为背光16步线性调光驱动:
kal_uint8 g_pre_lcd_level=LED_LIGHT_LEVEL0;
kal_uint8 g_Led_Impulse = 0;
kal_uint8 g_LCD_power_off=1;
kal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level )
{
volatile kal_uint16 j, iDelay;
kal_uint8 iPulse = 0, BL_Port = 21, BL_Port2;
kal_uint32 savedMask;
int i;
//NOKE 1: 脉冲累积, 需要计算新的等级需要送的脉冲数量
kal_uint8 temp_IPulse = 16 - 3*(gpio_dev_level - g_pre_lcd_level);
switch(gpio_dev_type)
{
case GPIO_DEV_LED_MAINLCD:
//NOTE 2: 如果背光等级一样,并且屏没有休眠, 就不要设了
if(g_pre_lcd_level==gpio_dev_level && g_LCD_power_off==0)
break;
BL_Port2 = gpio_led_mainbl_en_pin & ~(0x80);
GPIO_ModeSetup(gpio_led_mainbl_en_pin,0);
switch(gpio_dev_level)
{
case LED_LIGHT_LEVEL0:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL0)
{
GPIO_WriteIO(GPIO_OFF, gpio_led_mainbl_en_pin);
GPIO_WriteIO(GPIO_OFF, gpio_led_mainbl_en_pin);
savedMask = SaveAndSetIRQMask();
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
RestoreIRQMask(savedMask);
g_pre_lcd_level= LED_LIGHT_LEVEL0;
}
break;
case LED_LIGHT_LEVEL1:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL1)
{
if(g_LCD_power_off==1)
{
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
// NOTE 3 : 休眠以后, 第一次亮屏,要保证第一个脉冲的时间大于20us。 下同
// 请根据平台实现
delay(>20us);
}
g_LCD_power_off = 0;
savedMask = SaveAndSetIRQMask();
for(iPulse=0;iPulse<temp_IPulse;iPulse++)
{
// NOTE 4 : 脉冲脉宽比为1:1, 脉宽大于0.5us, 但不可太大,建议2uS左右。 下同
// 请根据平台实现
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
delay(>0.5us);
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
delay(>0.5us);
}
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
RestoreIRQMask(savedMask);
// NOTE 5 : 最后送的高电平持续时间大于2ms。 下同
// 请根据平台实现
delay(>2ms);
g_pre_lcd_level=LED_LIGHT_LEVEL1;
}
break;
case LED_LIGHT_LEVEL2:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL2)
{
if(g_LCD_power_off==1)
{
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
delay(>20us);
}
g_LCD_power_off = 0;
savedMask = SaveAndSetIRQMask();
for(iPulse=0;iPulse<temp_IPulse;iPulse++)
{
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
delay(>0.5us);
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
delay(>0.5us);
}
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
RestoreIRQMask(savedMask);
delay(>2ms);
g_pre_lcd_level=LED_LIGHT_LEVEL2;
}
break;
case LED_LIGHT_LEVEL3:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL3)
{
if(g_LCD_power_off==1)
{
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
delay(>20us);
}
g_LCD_power_off = 0;
savedMask = SaveAndSetIRQMask();
for(iPulse=0;iPulse<temp_IPulse;iPulse++)
{
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
delay(>0.5us);
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
delay(>0.5us);
}
GPIO_WriteIO_FAST(GPIO_ON, BL_Port2);
RestoreIRQMask(savedMask);
delay(>2ms);
g_pre_lcd_level=LED_LIGHT_LEVEL3;
}
break;
case LED_LIGHT_LEVEL4:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL4)
{
if(g_LCD_power_off==1)
{
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
delay(>20us);
}
g_LCD_power_off = 0;
savedMask = SaveAndSetIRQMask();
for(iPulse=0;iPulse<temp_IPulse;iPulse++)
{
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
delay(>0.5us);
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
delay(>0.5us);
}
GPIO_WriteIO_FAST(GPIO_ON, BL_Port2);
RestoreIRQMask(savedMask);
delay(>2ms);
g_pre_lcd_level=LED_LIGHT_LEVEL4;
}
break;
case LED_LIGHT_LEVEL5:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL5)
{
if(g_LCD_power_off==1)
{
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
delay(>20us);
}
g_LCD_power_off = 0;
savedMask = SaveAndSetIRQMask();
for(iPulse=0;iPulse<temp_IPulse;iPulse++)
{
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
delay(>0.5us);
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
delay(>0.5us);
}
GPIO_WriteIO_FAST(GPIO_ON, BL_Port2);
RestoreIRQMask(savedMask);
delay(>2ms);
g_pre_lcd_level=LED_LIGHT_LEVEL5;
}
break;
case LED_LIGHT_LEVEL_MAX:
if(g_pre_lcd_level!=LED_LIGHT_LEVEL_MAX)
{
g_LCD_power_off = 0;
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
savedMask = SaveAndSetIRQMask();
GPIO_WriteIO_FAST(GPIO_ON, BL_Port2);
RestoreIRQMask(savedMask);
g_pre_lcd_level=LED_LIGHT_LEVEL_MAX;
}
break;
}
break;
... ...
以下省略。
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
void Led_delay(kal_uint32 time)
{
kal_uint16 i;
for(i=0;i<time;i++);
}
void Led_Start(void)
{
Led_delay(400);
}
void Led_Down(void)
{
Led_delay(40000);
}
kal_uint8 g_LCD_level=LED_LIGHT_LEVEL0;
kal_uint8 g_Led_Impulse = 0;
kal_uint8 g_LCD_power_off=1;
void noke_drv_cfg_aw9364(kal_uint8 gpio_dev_level, int pulse_count)
{
kal_uint32 savedMask;
kal_uint8 iPulse = 0, BL_Port = 21, BL_Port2;
BL_Port2 = gpio_led_mainbl_en_pin & ~(0x80);
GPIO_ModeSetup(gpio_led_mainbl_en_pin,0);
switch(gpio_dev_level)
{
case LED_LIGHT_LEVEL0:
g_LCD_power_off = 1;
GPIO_WriteIO(GPIO_OFF, gpio_led_mainbl_en_pin);
GPIO_WriteIO(GPIO_OFF, gpio_led_mainbl_en_pin);
savedMask = SaveAndSetIRQMask(); //disable interrupt
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
RestoreIRQMask(savedMask); // turn on interrupt
break;
case LED_LIGHT_LEVEL1:
case LED_LIGHT_LEVEL2:
case LED_LIGHT_LEVEL3:
case LED_LIGHT_LEVEL4:
case LED_LIGHT_LEVEL5:
if(g_LCD_power_off==1)
{
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
Led_Start();
}
g_LCD_power_off = 0;
savedMask = SaveAndSetIRQMask(); //disable interrupt
for(iPulse=0;iPulse<pulse_count;iPulse++)
{
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
Led_delay(10);
GPIO_WriteIO_FAST(GPIO_OFF, BL_Port2);
Led_delay(10);
}
GPIO_WriteIO_FAST(GPIO_ON ,BL_Port2);
RestoreIRQMask(savedMask); // turn on interrupt
break;
case LED_LIGHT_LEVEL_MAX:
g_LCD_power_off = 0;
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
GPIO_WriteIO(GPIO_ON, gpio_led_mainbl_en_pin);
savedMask = SaveAndSetIRQMask(); //disable interrupt
GPIO_WriteIO_FAST(GPIO_ON, BL_Port2);
RestoreIRQMask(savedMask); // turn on interrupt
break;
}
}
kal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level )
{
static kal_uint8 is_first = 1;
volatile kal_uint16 j, iDelay;
kal_uint8 iPulse = 0, BL_Port = 21, BL_Port2;
kal_uint32 savedMask;
kal_uint8 temp_IPulse = 0;
switch(gpio_dev_type)
{
case GPIO_DEV_LED_MAINLCD:
if( is_first == 1)
{
Led_Down();
Led_Down();
Led_Down();
Led_Down();
is_first = 0;
}
BL_Port2 = gpio_led_mainbl_en_pin & ~(0x80);
GPIO_ModeSetup(gpio_led_mainbl_en_pin,0);
if(g_LCD_level!=gpio_dev_level)
{
temp_IPulse = 16 - 3*(gpio_dev_level - g_LCD_level);
noke_drv_cfg_aw9364(gpio_dev_level, temp_IPulse);
}
g_LCD_level=gpio_dev_level;
break;
.............................................
default:
/* error undefine */
return KAL_FALSE;
}
return KAL_TRUE;