如何给LG gram写一个Linux下的驱动?
其实就是实现一下几个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下的驱动?的更多相关文章
- 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)
目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...
- Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?
上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取 ...
- 推荐一个linux下的web压力测试工具神器webbench
推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29 来源: 评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...
- Remmina:一个 Linux 下功能丰富的远程桌面共享工具(转载)
Remmina:一个 Linux 下功能丰富的远程桌面共享工具 作者: Aaron Kili 译者: LCTT geekpi | 2017-05-10 09:05 评论: 2 收藏: 4 Remm ...
- 【驱动】linux下I2C驱动架构全面分析
I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...
- linux下I2C驱动架构全面分析【转】
本文转载自:http://blog.csdn.net/wangpengqi/article/details/17711165 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...
- linux下i2c驱动笔记 转
1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...
- Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
- Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?
在 <Cordova webapp实战开发:(4)Android环境搭建>中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个And ...
随机推荐
- Apache Jmter 压力测试教程
1.官网下载安装包,地址:http://jmeter.apache.org/download_jmeter. 2.下载得到解压包,双击解压. 3.点击/bin目录下面的jmeter.bat 启动软件 ...
- pytest allure 生成html测试报告
前提:需要 java 1.8 以上.python3环境 一.下载pytest pip install pytest 二.下载Allure Pytest Adaptor插件 pip install py ...
- python 小脚本/自动重复访问网站(快速提高网页访问量)
来到csdn也快两个月了,前前后后写了20篇博客,但才1800+的访问量,其中恐怕还有300多是我自己点的 有点桑心(┬_┬) 于是打算另辟蹊径,自己刷访问量代码如下,需要自取 import urll ...
- spring boot环境配置以及开发工具选择(Spring一)
首先安装java jdk jdk的安装参考:https://blog.csdn.net/zhys0902/article/details/79499329配置效果如下: 接下来是maven的相关配置 ...
- JVM直接内存(Direct Memory)
直接内存 1.直接内存不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 2.直接内存是Java堆外的.直接向系统申请的内存区间. 3.简单理解: java p ...
- NoSuchMethodError: org.springframework.beans.factory.config.BeanDefinition.getResolvableType
spring整合Mybatis报错: 解决方法: 检查maven依赖中的spring-jdbc和spring-webmvc是否版本一致 以下均为5.2.0.RELEASE版本 除此之外再检查是否有其他 ...
- 分布式系统监视zabbix讲解六之自定义监控项
概述 Zabbix支持许多在多种情况下使用宏.宏是一个变量,由如下特殊语法标识: {MACRO} 根据在上下文中, 宏解析为一个特殊的值. 有效地使用宏可以节省时间,并使Zabbix变地更加高效. 在 ...
- python实例文本进度条
简单的文本进度条代码 解析 引入time库 打印一行作为开始 最后也打印一个结束的标签 定义变量等于10,文本进度条大概的宽度是10 使用for循环来模拟进度,for i in range()能够不断 ...
- SpringBoot-02-原理初探之主启动类
2. 原理初探 2.1 pom.xml 父依赖 主要依赖一个父项目,主要管理项目的资源过滤和插件 <parent> <groupId>org.springframework.b ...
- Eclipse安装AmaterasUML插件问题
为了画UML图,我想在Eclipse(版本Version: Oxygen Release (4.7.0))安装AmaterasUML,第一步,安装GEF - http://download.eclip ...