Nothing Phone(2)的灯带驱动研究笔记
最近整了部Nothing Phone(2),bl秒解的设定是真的舒服,所以买来第一时间就透了一遍(指root了)。
然后半夜睡不着,就打算研究一下这个灯带是怎么调用的。
然后就开始了,
一段孤独的旅程充满烦恼~
内核源码:
很不幸,除了知道了灯带型号是aw20036之外没啥收获,原因无他,单纯看不懂代码,注释都不怎么写这不欺负萌新吗。。。
仓库里相关代码文件甚至具有可执行权限,看来开发者也是和咱一样只知道无脑777的杂鱼呢。
在leds目录下有个TODO文件(这是忘了配置gitignore吗?),然后看到一段离谱的留言:
1 | * Command line utility to manipulate the LEDs? |
好家伙,你还有脸说呢!!!
你倒是说说具体怎么用啊!!!
正式尝试:
找到接口位置:
好吧内核源码看不懂,咱来到user-space(笑)。
首先find|grep找到sysfs接口在/sys/bus/i2c/drivers/aw20036_led/0-003a/leds/led_strips/
(我不管我就要find配grep!!!)
我们进去:
1 | .../leds/led_strips # cd /sys/bus/i2c/drivers/aw20036_led/0-003a/leds/led_strips/ |
好吧这不是我熟悉的灯带驱动。
跟一代一点也不一样,或许不是同一个人写的。。。
尝试调用:
最后找到的方法不是一般人能想出来的,所以略过。
比较有意思的是factory_test
这个文件,看名字用于工厂测试?不记得这灯品控差啊。不过和all_brightness
作用几乎没太大差距。
查找系统中的调用方式:
ps -A
大法没任何发现,遂使用logcat
大法。
1 | .../leds/led_strips # logcat|grep aw20036 |
开关了下Glyph torch发现新增上述日志,看来灯带是pid 1481管的。
至于这个1481是什么呢?
1 | .../leds/led_strips # cat /proc/1481/cmdline |
看来是和高通py的~
《和高通联合调教的灯带》
(所以发布会为啥不吹一吹。。。)
然后直接上strace,去Glyph composer里随便点一下,反正让灯闪一下就是了,得到如下日志:
1 | .../leds/led_strips |
strace默认会折叠代码为省略号,所以需要手动设置最大长度(众所周知114514是一个经典大幻数)。
这样一来灯的调用方式一目了然了:
1 | echo 1 > /sys/devices/platform/soc/994000.i2c/i2c-0/0-003a/leds/led_strips/operating_mode |
果然,摄像头左下角的灯亮了。
大胆假设:
点灯时先把operating_mode
设置成1
这一串编码一样的东西代表了每个灯的亮度,更改每一位的数值可修改相应灯的亮度。
最大亮度依旧是max_brightness
(255)
代码验证:
C语言,启动!
1 |
|
代码还是非常简单的,运行也没啥问题,但是跑完一遍发现又有了新的问题:视频指示灯还没亮过啊!
继续研究:
strace追踪1481进程,发现居然不是这个进程调用的灯带:
1 | .../files/home |
那就logcat一下:
1 | .../files/home # logcat|grep 1481 |
看来是进程1521在调用,我们追踪它:
1 | .../files/home |
然后无语的事来了,居然是和一代一样的接口。。。
原来之前尝试的时候是没有更改operating_mode的值,导致操作不生效。
继续写代码:
1 |
|
在接口single_brightness下,灯带的编号居然是乱的!!!
Nothing:我去除了大部分上一代的代码,但是我保留了一部分,只有这样你才知道自己品鉴的是雪。
已经品鉴的够多的了,快点端下去罢(悲)。
总结:
总结就是没啥好总结的,下期再见吧。