# 前言 我们常说工程的事情就是要有实事求是和日拱一卒精益求精的精神;大部分东西都很容易也没那么容易...
# 问题,工控机主板工作模式更改
我们很多产品工控机安装开源(定制)的linux系统,系统主板设置有AT和ATX两种工作模式,为了系统安全稳定,一般我们需要把主板工作模式变更为ATX模式,电源键更新为带Reset(回弹)功能的开关; 这样系统可以捕获电源按键关机信号,主动优雅关机(可以主动保存设备现场…关闭IO操作等,从而更好保护硬盘和系统.本文记录一次Ubuntu(16.04)系统下主板工作方式变更带来的小更改.
二、修改细节
去除系统自动设置的操作
更换主板模式(跳线)和电源按键后,按下电源键后,系统默认弹出…
熟悉ubuntu的都知道, 这个配置应该可以通过gsseting设置. 通过gsetting命令很容易得知如何屏蔽该设置…
cdw@ubuntu:~$
cdw@ubuntu:~$ gsettings list-schemas |grep powercom.canonical.indicator.power
org.gnome.power-manager
org.gnome.settings-daemon.plugins.power
cdw@ubuntu:~$ gsettings list-keys org.gnome.settings-daemon.plugins.power |grep power
button-power
power-button-action
cdw@ubuntu:~$ gsettings range org.gnome.settings-daemon.plugins.power button-power
enum
'blank'
'suspend'
'shutdown'
'hibernate'
'interactive'
'nothing'
'logout'
cdw@ubuntu:~$ gsettings get org.gnome.settings-daemon.plugins.power button-power
'interactive'
cdw@ubuntu:~$ gsettings set org.gnome.settings-daemon.plugins.power button-power nothing
cdw@ubuntu:~$
系统其他电源键设置
有时修改完系统依然自动关机,我们要检查是否系统还有其他地方有类似设置,比如HandlePowerKey in /etc/systemd/logind.conf
cdw@ubuntu:/etc/systemd$ grep -r -i "power"
logind.conf:**HandlePowerKey=poweroff**
logind.conf:#PowerKeyIgnoreInhibited=no
用户定制操作
现在短按电源键没有反应,我们可以自定义电源按键操作
- 首先找出电源键对应的文件
cat /proc/bus/input/devices |grep -i power
这个文件与目录/dev/input/event* 对应; 操作系统的驱动映射至该文件. 一般我们要查触摸屏触摸没有反应,首先检查触摸时,该文件有没有输出,定位问题在哪.cdw@ubuntu:/dev/input$ ls -rlt
total 0
crw-rw---- 1 root input 13, 63 Mar 26 20:20 mice
crw-rw---- 1 root input 13, 33 Mar 26 20:20 mouse1
crw-rw---- 1 root input 13, 32 Mar 26 20:20 mouse0
crw-rw---- 1 root input 13, 67 Mar 26 20:20 event3
crw-rw---- 1 root input 13, 65 Mar 26 20:20 event1
crw-rw---- 1 root input 13, 66 Mar 26 20:20 event2
crw-rw---- 1 root input 13, 64 Mar 26 20:20 event0
crw-rw---- 1 root input 13, 34 Mar 26 20:20 mouse2
crw-rw---- 1 root input 13, 68 Mar 26 20:20 event4
drwxr-xr-x 2 root root 140 Mar 26 20:20 by-path
drwxr-xr-x 2 root root 80 Mar 26 20:20 by-id
```
- 写程序响应event; 操作系统的input event 消息结构都是通用的.
可以利用struct input_event event; 来解析event事件,如果捕获power 按键release消息,执行用户动作…
sprintf(name, "/dev/input/event%d", atoi(argv[1]));
if ((fd = open(name, O_RDWR, 0)) >= 0) {
printf("%s: open, fd = %d\n", name, fd);
for (i = 0; i < LED_MAX; i++) {
event.time.tv_sec = time(0);
event.time.tv_usec = 0;
event.type = EV_LED;
event.code = i;
event.value = 0;
write(fd, &event, sizeof(event));
}
while ((rc = read(fd, &event, sizeof(event))) > 0) {
....
switch (event.type) {
case EV_KEY:
if (event.code > BTN_MISC) {
printf("Button %d %s",
event.code & 0xff,
event.value ? "press" : "release");
} else {
printf("Key %d (0x%x) %s",
event.code & 0xff,
event.code & 0xff,
**event.value ? "press" : "release");**
// execl running your command (scripts etc)......
}
break;
- 命令授权. 该命令需要sudo, 需要加入root授权: 加入以下代码,root用户权限编译 gcc -o powerbtn powerbtn.c ,然后chmod 4111 powerbtn…
struct passwd *srcc_pwd;
gid_t srcc_gid;
uid_t srcc_uid;
int gg,uu;
srcc_pwd=getpwnam("root");
srcc_gid=srcc_pwd->pw_gid;
srcc_uid=srcc_pwd->pw_uid;
gg=setgid(srcc_gid);
uu=setuid(srcc_uid);
- 把该命令加入后台自动运行… (可以.profile 也可以upstartup etc )…