背光驱动:我的背光驱动解决方案

陈德胜,2013年12月1日,工作小记。这里将我自己在按键驱动上修改的背光驱动部分贴出来。供大家参考。

问题描述:

CPU:PXA270,背光显示控制芯片LT1937ES5。要求实现空闲状态下关闭LED背光灯,工作时,第一次按键点亮LED灯,后面的按键才是工作。

其中LCD_SW为LED使能端,接的是PXA270的GPIO46口,LCD_PWM是背光明暗控制,接的是GPIO14口。

 

本驱动实现的方法是:使用GPIO46口,当监测到按键在一定时间内(比如1.5min)无操作,即电平不发生变化,让GPIO46口变为低电平;当监测到其发生变化时,则进行相应的按键操作。未使用PWM功能来调节明暗,所以属于难度非常小的驱动写法。

 

实现的具体步骤:

1)  借助目前已有的按键驱动,在里面添加相关GPIO口设置;

2)  GPIO设置如下:设置GPIO46为GPIO模式;设置GPIO46为output模式;设置GPIO初始状态为高电平,即初始点亮屏幕;

3)  在按键驱动的工作线程里,判断WaitForSingleObject的状态,如果为WAIT_OBJECT_0,则表明有按键操作;如果为WAIT_TIMEOUT,则表明等待超时,此时设置GPIO46为低电平,关闭LED灯;

4)  在WAIT_OBJECT_0的循环里,首先判断GPIO46目前的状态,如果为高电平,说明此时LED是点亮状态,此时按键的作用是其本来的操作,本驱动是发送按键消息给应用程序,如果为低电平,说明此时LED灯是熄灭状态,则此时按键的作用即点亮LED,那么此时设置GPIO46为高电平,不进行发送消息的操作;

5)  在实践过程中,出现一个问题,就是按键消息未发送出去,或许发送阻塞,为了解决这个问题,在4)步骤中的点亮LED灯时顺便对按键的GPIO16口进行了初始化工作,尝试这样的方法后,没有发生阻塞情况。

 

具体程序:

1)  相关定义

UINT32 delaytime = 90000;

#define GPIO_PIN_46   //1125

#ifdef GPIO_PIN_46

       v_pIOPregs->GAFR1_L &= ~(0x3 << 28); /*Set GPIO46 as GPIO */

       v_pIOPregs->GPDR1 |= (0x1 << 14);  /* Configure GPIO46 as output Mode*/

       v_pIOPregs->GPSR1  |= (0x1 << 14);  /*set GPIO46 to high*/

#endif

2)处理线程如下:(红色部分是我修改的)

DWORD IntProcessThread(void)

{

       IntEvent = CreateEvent(NULL, FALSE, FALSE, NULL);   

       if (!IntEvent)

       {

              RETAILMSG(1, (TEXT("ERROR: FunButton: Failed to create event.\r\n")));

              return FALSE;

       }

       #ifdef GPIO_PIN_16

              g_SysIntr = SYSINTR_FUN;

       #endif

       if (!InterruptInitialize(g_SysIntr, IntEvent, NULL, 0))

       {

              RETAILMSG(1,(TEXT("ERROR: FunButton: Fail to initialize userkey interrupt event\r\n")));

              return FALSE;

       }

       v_pIOPregs->GFER0   &= ~(0x1 << 16);

       v_pIOPregs->GRER0   &= ~(0x1 << 16);

       while(1)

       {

              //WaitForSingleObject(IntEvent, INFINITE);

              DWORD Status = WaitForSingleObject(IntEvent, delaytime);  //1125

              if(WAIT_OBJECT_0 == Status){

                     Sleep(30);   //延时去抖动

 

              if(v_pIOPregs->GPLR0 & 0x1<<16) //gpio16为高电平

              {

                     //RETAILMSG(1,(TEXT("[FunButton - UP]\r\n")));

                     InterruptDone(g_SysIntr);

                     continue;

              }

              else

              {

                  if(v_pIOPregs->GPLR1 & 0x1<<14)  

                     {

                     SendMessage();

                     //v_pIOPregs->GPSR1  |= (0x1 << 14);  /*set GPIO46 to high*/

                     //RETAILMSG(1,(TEXT("[FunButton - DOWN]\r\n")));

                     InterruptDone(g_SysIntr);

                   }

                     else{

                            v_pIOPregs->GPSR1  |= (0x1 << 14);  /*set GPIO46 to high*/

                            //初始化按键的GPIO口

                            v_pIOPregs->GFER0   |= (0x1 << 16);

                   v_pIOPregs->GEDR0   |= (0x1 << 16);

                            }

              }           

              }

              else if(WAIT_TIMEOUT == Status){

                     v_pIOPregs->GPCR1  |= (0x1 << 14);  /*set GPIO46 to zero*/

                     }

       }

}

 

 

相关推荐

相关文章