背光驱动:我的背光驱动解决方案 2024-05-04 11:21:27 0 0 陈德胜,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*/ } } } 收藏(0)