其实就是实现一下几个Fn键的功能,没有标题吹得那么牛。

不知道为啥,LG gram这本子意外的小众。

就因为这个,装Linux遇到的硬件问题就没法在网上直接搜到解决办法了。

Fn + F9 实现阅读模式

设计上是:按一下屏幕蓝光减少,F9键上的LED亮;再按一下恢复原样。

具体实现我们直接读文档:



Kernel 4.2.0的时候更新了一个module 叫 lg-laptop,手册如上

现在kernel都5.9.0了,这文档好像没变过的样子……

按文档说的,/sys/devices/platform/reader_mode的值控制了F9上led的亮与灭。

至于减少蓝光,我们可以用Ubuntu的夜灯功能近似实现。

依据这样一篇文章:



就可以写代码了。

但是我实在不会用shell读入文件里的boolean,于是写了C++:

#include<bits/stdc++.h>
using namespace std; int main()
{
string path = "/sys/devices/platform/lg-laptop/reader_mode";
string ope = "dconf write /org/gnome/settings-daemon/plugins/color/night-light-enabled "; ifstream fin(path);
bool flag; fin >> flag;
if(flag)
{
system(("bash -c \"echo 0 > " + path + "\"").c_str());
system((ope + "false").c_str());
}
else
{
system(("bash -c \"echo 1 > " + path + "\"").c_str());
system((ope + "true").c_str());
}
return 0;
}

这代码很丑陋,但是还算直接。

编译后放到/bin底下,给一下权限:

$cd /bin
$sudo chown root Fn9
$sudo chmod u+s Fn9

最后加一下快捷键:

使用体验非常良好,不过仍然存在一个问题:

显然地,你手动开启/关闭Night Light的时候F9键上的指示灯并不会变化……


Fn + F5实现触摸板控制

其实这功能对我来说不很必要,但是Fn键里就剩下这个没用了,还是写一下吧。

设计上是按一下触摸板启用时led亮,否则熄灭,按Fn + F5可以切换状态。

禁用触摸板用xinput就可以了,之前电脑进水的时候学过一次。

文档上没写F5上那个灯要怎么控制,我经摸索发现,可以修改/sys/devices/platform/lg-laptop/leds/tpad_led/brightness的值完成。

观察发现,

出于某种奇异的理由,把brightness的值改成1之后,LED会变亮;

但与此同时,brightness的值就会自动变成0,LED却不会熄;

再点进去保存一次,LED熄了。

???

究竟是怎么回事、应该如何正面解决是需要读文档才能明白的。

可是没找到文档啊(

这里我的解决思路是这样:在github上搜索lg-laptop(逃

github上找到这个:https://github.com/leoomi/LinuxLGGramScripts

我试着clone了他写的lgtouchpadled.sh。结果发现了同样的问题,PREV_VAL毫无作用。

我想到可以通过xinput获取触摸板的工作状态,避开brightness文件,在这个脚本外面套一层自己写的东西。

这里结合grep命令,可以这样写:

xinput --list-props '04CA00A0:00 04CA:00A0 Touchpad' | grep Device\ Enabled

最后写成了这样就能用了:

#include<bits/stdc++.h>
using namespace std; int main()
{
string key;
string path = "/sys/devices/platform/lg-laptop/leds/tpad_led/brightness \"";
string ope = "xinput set-prop '04CA00A0:00 04CA:00A0 Touchpad' 'Device Enabled' ";
system("rm .touchpadstate");
system("xinput --list-props '04CA00A0:00 04CA:00A0 Touchpad' | grep Device\\ Enabled >> .touchpadstate");
ifstream fin(".touchpadstate");
getline(fin, key);
if(key.back() == '1')
{
system(("bash -c \"echo 0 > " + path).c_str());
system((ope + "0").c_str());
}
else
{
system(("bash -c \"echo 1 > " + path).c_str());
system((ope + "1").c_str());
}
return 0;
}

同样编译给权限之后,接下来设置快捷键。

尽管文档上说Fn + F5是映射成F13的,其实并不是。

Fn + F5实际上是映射成工具键的,按了就会弹出设置窗口。

令人无语的是,这个弹出窗口的逻辑是在设置快捷键之前的,于是根本没法在图形界面下设置。

找到这个:



之后,我试着用dconf-editor新建了一个tool => /bin/Fn5的快捷键,但是没有用。

那个按下工具键弹出设置的逻辑的优先级似乎非常高。

dconf里找了半天我也没找到相应的binding。

于是使用xev | grep keycode试着查找Fn + F5对应的keycode,

我绝望地发现,其他的Fn键都会映射向一个形如XF86Launch7的东西,

唯独Fn + F5,它并不指向某个确定的keyword,我获得的是这样一些东西:

request MappingKeyboard, first_keycode 8, count 248
request MappingKeyboard, first_keycode 8, count 248
state 0x40, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
state 0x44, keycode 93 (keysym 0x0, NoSymbol), same_screen YES,
state 0x44, keycode 93 (keysym 0x0, NoSymbol), same_screen YES,
state 0x44, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,

于是我就没招了,选择了一个妥协的解决办法:

把快捷键设置成Super + F5,换一个键按。

确实可以解决问题,不过这可比我的代码丑多了……

另外,由于多指触控我是在软件层用fusuma解决的,所以xinput禁用触摸板并不同时禁用多指手势

大家禁用触摸板就是为了避免误触,和我多指手势有什么关系呢?

某种意义上也挺便利的,就不特别加入禁用fusuma的功能了。

Update:

重启一下发现权限没了,我们得另搞个开机启动的脚本

这里写一个 ~/.Fuckfn/Fninit.sh

export SUDO_ASKPASS=~/.Fuckfn/_PWD_TEMP_
sudo -A chown USERNAME /sys/devices/platform/lg-laptop/reader_mode
sudo -A chown USERNAME /sys/devices/platform/lg-laptop/leds/tpad_led/brightness

同时写一个~/.Fuckfn/_PWD_TEMP_

#! /bin/bash
echo PASSWORD

大概就是一个自动输入密码的玩意

这里再给两个脚本加运行权限

sudo chmod +x ~/.Fuckfn/Fninit.sh
sudo chmod +x ~/.Fuckfn/_PWD_TEMP_

最后用gnome-session-properties~/.Fuckfn/Fninit.sh设置开机启动

大功告成

如何给LG gram写一个Linux下的驱动?的更多相关文章

  1. 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

    目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...

  2. Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?

    上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取 ...

  3. 推荐一个linux下的web压力测试工具神器webbench

    推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29   来源:   评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...

  4. Remmina:一个 Linux 下功能丰富的远程桌面共享工具(转载)

    Remmina:一个 Linux 下功能丰富的远程桌面共享工具 作者: Aaron Kili 译者: LCTT geekpi | 2017-05-10 09:05   评论: 2 收藏: 4 Remm ...

  5. 【驱动】linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  6. linux下I2C驱动架构全面分析【转】

    本文转载自:http://blog.csdn.net/wangpengqi/article/details/17711165 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...

  7. linux下i2c驱动笔记 转

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  8. Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

    源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

  9. Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?

    在 <Cordova webapp实战开发:(4)Android环境搭建>中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个And ...

随机推荐

  1. linux 用户、用户组的操作

    1.查看linux系统下的所有用户 方式一:grep bash /etc/passwd 方式二:查看etc/passwd文件,其他第三个参数大于500的都是用户自己新增的 vim /etc/passw ...

  2. TP6.0 获取请求对象的五种方式

    目录 1. 门面类 2. 依赖注入 3. 框架提供的基础控制器的 request 属性 4. request() 助手函数 5. app() 超级助手函数 think\Request.think\fa ...

  3. 2020云栖大会智慧出行专场:聚焦高精地图/算法、智能模型、自动驾驶、AR导航

    2020云栖大会将于9月17日-18日在线举行,届时将通过官网为全球科技人带来前沿科技.技术产品.产业应用等领域的系列重要分享.   阿里巴巴高德地图携手合作伙伴精心筹备了“智慧出行”专场.我们将为大 ...

  4. 【原创】解BUG-xenomai内核与linux内核时间子系统之间存在漂移

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 一.问题起源 何为漂移?举个例子两颗32.768kH ...

  5. IDEA中配置Tomcat中的Artifact

    IDEA中配置Tomcat中的Artifact 我在配置Tomcat时,要设置deployment中的Artifact时,却总是无法显示出当前项目的war包,针对这个问题,如下图展示, 当我点击Art ...

  6. 不再用上官网,自己部署一套ElementUI官方最新文档

    ElementUI官方的访问速度一直很慢,公司内网也无法进行外网访问.故研究了下最新的ElementUI API(2.13.2)部署教程. 先上效果图 ElementUI文档部署过程 到github下 ...

  7. 初学 React native | 环境搭建(在模拟器上运行)

    我的电脑是windows 所以就以 windows上+Android 配置React native 环境 网上的安装教程非常多,我总结了一下,配置环境时出错原因主要是node java python ...

  8. 被喷了!聊聊我开源的RPC框架那些事

    前段时间利用业余时间写了一个简单的 RPC 框架,花费了不少精力.开源出来之后,少部分不太友好的技术人站在上帝视角说了风凉话.就很难受,兄弟,谁还没有一个玻璃心. 简单吐槽一波,给大家聊聊关于 gui ...

  9. Dell服务器R710修改iDRAC密码

    此方法需重启,重启之前记住保存 重要数据,停止服务器相关服务.所以此操作最好在还未装系统前先设置好. 开机(重启)持续按CTRL+E进入iDRAC设置界面,选择意思为恢复默认的选项,风扇会非常的响,之 ...

  10. RXJAVA源码之多线程

    在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件:在哪个线程生产事件,就在哪个线程消费事件.如果需要切换线程,就需要用到 ...