6、修改应用程序数码相框以支持自动关闭LCD

1. 修改数码相框以自动关闭LCD
关闭LCD : 在读取触摸屏的函数中判断:如果15S内无数据,执行: echo auto > /sys/devices/platform/mylcd/power/control
打开LCD : 如果有触触摸屏动作发生, 执行: echo on > /sys/devices/platform/mylcd/power/control

alarm(时间) : 若干秒后,内核会发出SIGALRM给APP, APP可以提供信号处理函数
思路:
a. 注册信号处理: signal(SIGALRM, function);
该函数用来关闭LCD
b. 在读取输入事件的进程里, 执行: alarm(15)
c. 如果一直没有读到触摸屏的数据, 定时器就会超时导致function被调用从而关闭LCD
d. 如果读到触摸屏数据, 再次执行alarm(15), 会更新超时时间为当前之后的15S
如果之前关闭过LCD, 还需要执行: 打开LCD

下面三个函数都在input_manager.c中

static void *InputEventThreadFunction(void *pVoid)
{
  T_InputEvent tInputEvent;

  /* 定义函数指针 */
  int (*GetInputEvent)(PT_InputEvent ptInputEvent);
  GetInputEvent = (int (*)(PT_InputEvent))pVoid;

  while (1)
  {
    alarm(15); /* 如果15秒内没有按压触摸屏,则超时 */
    if(0 == GetInputEvent(&tInputEvent))
    {
      /* 唤醒主线程, 把tInputEvent的值赋给一个全局变量 */
      /* 访问临界资源前,先获得互斥量 */
      pthread_mutex_lock(&g_tMutex);
      g_tInputEvent = tInputEvent;

      /* 唤醒主线程 */
      pthread_cond_signal(&g_tConVar);

      /* 释放互斥量 */
      pthread_mutex_unlock(&g_tMutex);

      alarm(15); /* 如果读到触摸屏事件,修改超时时间 */

      /* 如果LCD已经被关闭,则打开它 */
      if (!g_bLCDOn) {
      system("echo on > /sys/devices/platform/mylcd/power/control");
      g_bLCDOn = 1;
      }
    }
  }

  return NULL;
}

int InputInit(void)
{
  int iError = 0;

  signal(SIGALRM, SigAlrmFn);

  // iError = StdinInit();
  iError |= TouchScreenInit();
  return iError;
}

static void SigAlrmFn(int Sigal)
{
  /* 关闭LCD */
  system("echo auto > /sys/devices/platform/mylcd/power/control");
  g_bLCDOn = 0;
}


http://blog.csdn.net/dsg333/article/details/4870639

配置内核添加驱动:
a. drivers/input/touchscreen/Makefile
#obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c_ts.o

make menuconfig :
Device Drivers --->
  Input device support --->
    [*] Touchscreens --->
      <*> Samsung S3C2410/generic touchscreen input driver

b. drivers/video/Makefile
obj-$(CONFIG_FB_S3C2410) += lcd_4.3.o

make uImage

echo auto > /sys/devices/platform/mylcd/power/control 无法使用,(执行sysfs.c下的control_store函数,echo on也是执行该函数,里面根据on和auto走不同分支)
因为dev->power.runtime_auto初始值是1,

成功使用echo auto > /sys/devices/platform/mylcd/power/control命令来关LCD的前提是dev->power.runtime_auto等于0
可以执行: echo on > /sys/devices/platform/mylcd/power/control 使得它等于0
但是也不适用于我们的情况,因为:
open(/dev/fb0)会让LCD的使用计数加1
再 echo on会让LCD的使用计数也加1
然后执行echo auto只能让使用计数减1变为1,lcd屏幕还是不会休眠

要再次修改驱动

 在lcd的驱动中修改使用pm_runtime_forbid来增加计数,同时会把dev->power.runtime_auto设置为零

static int mylcd_open(struct fb_info *info, int user)
{
  //pm_runtime_get_sync(&lcd_dev.dev);
  pm_runtime_forbid(&lcd_dev.dev);//使用这个函数同样会导致增加计数,并且会使得dev->power.runtime_auto设置为零
return 0;
}

static int mylcd_release(struct fb_info *info, int user)
{
pm_runtime_mark_last_busy(&lcd_dev.dev);
//pm_runtime_put_sync_autosuspend(&lcd_dev.dev);
pm_runtime_allow(&lcd_dev.dev);
return 0;
}


2. 编写支持开关机(suspend)的应用程序
思路:
读按键, 得到某个值就执行 echo mem > /sys/power/state(休眠整个系统)

对于输入子系统,读到的数据是一个input_event结构体

struct input_event {
struct timeval time;//man gettimeofday 可以查看需要包含什么头文件
unsigned short type;//按键类型
unsigned short code;//按键值
int value;//按下还是松开
};

执行应用程序:./power /dev/event1

按下L按键,屏幕关闭;再次按下,屏幕打开

原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8982617.html