zoukankan      html  css  js  c++  java
  • 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按键,屏幕关闭;再次按下,屏幕打开

  • 相关阅读:
    商标查询网
    java: jsp:param中文乱码
    java:maven中webapp下的jsp不能访问web-inf下面的bean
    java:类集回顾
    java:类集操作,多对多的关系
    java:类集操作总结
    java:练习学校学生
    php发邮件:swiftmailer, php邮件库——swiftmailer
    java:练习超市卖场
    phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8982617.html
Copyright © 2011-2022 走看看