Toradex模块背光控制

2014年6月25日星期三

Windows在Windows CE系统中,背光调节可以在驱动程序之外控制。但有一点需要注意,如果控制背光引脚的寄存器和显示引脚的寄存器是同一个,那么当背光发生变化时,显示驱动状态也会发生相应的变化。详细的信息请参考显示寄存器设置。需要强调的是,这个应用只适用于 Colibri PXA 模块系列。

 

自动背光控制

默认情况下,在一定时间内当系统中没有用户操作活动,背光将会自动关闭。同样地,一旦发现有用户操作活动,背光将会立即启动。

背光超时的时间可以在控制面板中配置:

Control Panel -> Display

这些配置信息存储在注册表的以下键值中:

 

 
[HKCU\ControlPanel\Backlight]
ACTimeout     =dword:0x00000258 ;Time[seconds] before Backlight is turned off when on external power
BatteryTimeout=dword:0x00000258 ;Time[seconds] before Backlight is turned off when on battery power
 




为了避免彻底关闭背光,可以增加以下注册表配置:

 
; never turn off backlight
[HKCU\ControlPanel\Backlight]
UseExt            =dword:0x00000000 ; 0: don't switch off backlight when on external power
UseBattery        =dword:0x00000000 ; 0: don't switch off backlight when on battery power
 

.

在应用程序中控制背光

需要指出的是,您可以使用 ExtEscape() 函数,在应用程序中控制背光。该功能将使用户操作活动/超时检测功能不再起作用。下面的代码展示了 ExtEscape() 函数的基本结构。该函数设置背光状态为 new_backlight, 同时返回之前背光状态值 old_backlight.

 
DWORD old_backlight;
DWORD new_backlight=0;
ExtEscape(GetDC(NULL), BACKLIGHT, 4, (char*)&new_backlight, 4, (char*)&old_backlight);
 



变量r new_backlight 可以使用以下这些数值:

  • (NULL) 读取当前背光状态值
  • 0 在超时检测之前,立即关闭背光
  • 255 开启背光,并重置超时检测定时器,不进行用户操作活动检测
  • 256 强制关闭背光,不进行超时检测和用户操作活动检测
  • 511 强制开启背光,不进行超时检测和用户操作活动检测

以下代码演示ExtEscape()函数的使用方法:

 
#define ESCAPECODEBASE 100000
#define MOUSECURSOR (ESCAPECODEBASE + 20)
#define BACKLIGHT (ESCAPECODEBASE + 21)
#define BACKLIGHT_FORCE_STATE 256
 
DWORD old_backlight;
DWORD new_backlight=0;
 
 
//Get Backlight Status
ExtEscape(GetDC(NULL), BACKLIGHT, 0, NULL, 4, (char*)&old_backlight);
 
//Disable Backlight until user activity
new_backlight=0;
ExtEscape(GetDC(NULL), BACKLIGHT, 4, (char*)&new_backlight, 4, (char*)&old_backlight);
 
//Enable Backlight until timeout
new_backlight=255;
ExtEscape(GetDC(NULL), BACKLIGHT, 4, (char*)&new_backlight, 4, (char*)&old_backlight);
 
//Force Backlight OFF
new_backlight=0|BACKLIGHT_FORCE_STATE ;
ExtEscape(GetDC(NULL), BACKLIGHT, 4, (char*)&new_backlight, 4, (char*)&old_backlight);
 
//Force Backlight ON
new_backlight=255|BACKLIGHT_FORCE_STATE ;
ExtEscape(GetDC(NULL), BACKLIGHT, 4, (char*)&new_backlight, 4, (char*)&old_backlight);
 

Display On/Off Events

以下两个手动重置事件用于指示显示器处于打开或者关闭状态:

  • DisplayOnEvent
  • DisplayOffEvent

 WaitForSingleObject() 函数用于获取显示器状态或者等待以上事件。

 

Apalis, Colibri, WindowsLinux中PWM背光控制

在我们的载板上,PWM<A> 用于调节LCD亮度。

 

PWM背光亮度可以通过以下系统文件调节(1代表最亮,255代表最暗):

root@colibri_t20:~# cat /sys/class/backlight/pwm-backlight/bl_power
0
root@colibri_t20:~# echo 1 > /sys/class/backlight/pwm-backlight/bl_power
root@colibri_t20:~# echo 0 > /sys/class/backlight/pwm-backlight/bl_power
root@colibri_t20:~# cat /sys/class/backlight/pwm-backlight/brightness
224
root@colibri_t20:~# echo 1 > /sys/class/backlight/pwm-backlight/brightness

需要注意的是,Ampire 5.7" LED VGA触摸TFT显示器连接了MECS Tellurium,背光调节的值正好相反(例如255为最亮,1为最暗)。

如果需要将背光自动设置到一个指定的值,你可以创建一个systemd服务。首先,创建文件 /etc/systemd/system/backlight.service.

注意: 在 Vybrid 模块中,PWM背光有一个实例数字(例如/sys/class/backlight/pwm-backlight.0)

[Unit]
Description=Backlight brightness service, set and store display brightness setting
After=multi-user.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/sh -c 'cat /etc/brightness > /sys/class/backlight/pwm-backlight/brightness'
ExecStop=/bin/sh -c 'cat /sys/class/backlight/pwm-backlight/brightness > /etc/brightness'
         
[Install]                 
WantedBy=multi-user.target

重新加载并使能服务。

$ systemctl --system daemon-reload
$ systemctl enable backlight
#Computer on Module #Embedded Computing #Windows Embedded Compact