• 如何给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设置开机启动
    大功告成

  • 相关阅读:
    TCP/IP面试要点浅析
    Mysql优化策略
    Mysql集群方案简介
    Mysql主从复制
    UML序列图总结(Loop、Opt、Par和Alt)
    Java之注解
    mac:查看端口号被占用情况
    C#监控U盘插拔
    QMap
    js统计对象的层数
  • 原文地址:https://www.cnblogs.com/Shimarin/p/13735803.html
Copyright © 2020-2023  润新知