逆向了部分MEIzu的内核模块,得到了部分信息,这些信息可用于类原生bug修复,也可用于部分第三方系统移植bug修复
此文章包含了 超声波指纹修复、光学指纹修复、灵动光环控制
mz_gesture_ts
手势节点
/sys/class/meizu/tp/gesture_control 或 /sys/devices/platform/mx-gs/gesture_control
写入格式
非字符串解析,读取 4 字节整数(小端)
位定义
bit31(0x80000000):总开关(Gesture master enable)bit24(0x01000000):FOD 开关(FOD_switch_enable)bit0~bit4(0x0000001f):基础手势组(Gesture_switch_enable低位)bit8(0x00000100):手势组额外位(包含在0x11f中)bit25(0x02000000):gesture 0x272对应位
FOD_switch_enable = mask & 0x01000000Gesture_switch_enable = mask & 0x0000011fbit31=0时会进入关闭分支
部分常用组合值
仅打开总开关:
0x80000000手势全开(当前已知常规位):
0x8000011f手势全开 + FOD 开关:
0x8100011f手势全开 +
0x272:0x8200011f手势全开 + FOD +
0x272:0x8300011f
写入速查
0x8000011f->\x1f\x01\x00\x800x8100011f->\x1f\x01\x00\x810x8200011f->\x1f\x01\x00\x820x8300011f->\x1f\x01\x00\x83
观察法补位
若日志内出现:
Ignore gesture 0xXYZ [mask:0x........]同时打印
pos N
则给 mask 增加 bitN:
新值 =
旧值 | (1 << N)
例如 pos 25:
增加位值
0x02000000
如何写入
printf '\x1f\x01\x00\x83' > /sys/devices/platform/mx-gs/gesture_control
cat /sys/devices/platform/mx-gs/gesture_control
推荐使用\x1f\x01\x00\x83 (0x8300011f)开启所有手势
此部分信息可用于修复魅族超声波指纹的识别(日志内容出现Ignore gesture 0x272时)
接下来为HBM节点的部分信息
mz_qbt_handler 模块本身不直接控制HBM,HBM由显示驱动msm_drm 负责
msm_drm
节点
/sys/kernel/display_drivers/hbm
关键链路
display_set_panel_hbmdisplay_set_panel_hbm_statusdisplay_panel_hbm_on/display_panel_hbm_offdisplay_panel_local_hbm_level/display_panel_local_hbm_off
值
当对 hbm 写值时,display_set_panel_hbm_status 内部按 bitmask 0x16e 分流:
display_panel_hbm_on:1,2,3,5,6,8display_panel_hbm_off:0,4,7
魅族21Note实测指纹位置高亮应该为hbm节点写6,关闭写7 ,1 为全屏高亮,其他值请自测
如何写入
echo 6 > /sys/kernel/display_drivers/hbm
cat /sys/kernel/display_drivers/hbm
此部分信息可用于修复魅族光学指纹的高亮,出现高亮后可配合mz_gesture_ts部分完成指纹的彻底修复
aw20072
aw20072 支持 16 组灯珠(每组 RGB 三通道),被魅族称为"灵动光环"
节点
/sys/class/leds/aw20072_led/effect/sys/class/leds/aw20072_led/light/sys/class/leds/aw20072_led/all_light/sys/class/leds/aw20072_led/alone_light/dev/aw20072_led
sysfs属性
reg->aw20072_reg_store/showhwen->aw20072_hwen_store/showeffect->aw20072_effect_store/showimax->aw20072_imax_store/showrgbcolor->aw20072_rgbcolor_storeallrgbcolor->aw20072_allrgbcolor_storergbbrightness->aw20072_rgbbrightness_storeallrgbbrightness->aw20072_allrgbbrightness_storelight->aw20072_light_storeall_light->aw20072_all_light_storealone_light->aw20072_alone_light_storei2c_log->aw20072_i2c_log_store
写入格式
reg
格式:
"%x %x"语义:
reg_addr reg_val
hwen
格式:
"%x"1-> 硬复位 (aw20072_hw_reset)其他 -> 拉低 reset GPIO + 延时
imax
格式:
"%x"范围强制裁剪到
0..0xF,写入寄存器0x03的高 4 bit
effect
格式:
"%d"模块逻辑允许
< 0x12(即 0…17),但实际固件名表只有 17 项(0…16),实测应按0..16用
rgbcolor
格式:
"%d %x"(light_number color)light_number选择单颗灯珠,颜色写 page0xC1通道寄存器每色使用 6bit(取
0xRRGGBB的位域[23:18] [15:10] [7:2])
allrgbcolor
格式:
"%x"(color)对所有灯珠批量写 6bit color
rgbbrightness
格式:
"%d %x"(light_number rgb)写 page
0xC2,每色 8bit(R=bits[23:16], G=bits[15:8], B=bits[7:0])
allrgbbrightness
格式:
"%x"批量写所有灯珠 8bit RGB 亮度
light
格式:
"%d %d %x"(light_number brightness color)light_number范围被裁剪到1..16(0直接退出)brightness范围被裁剪到1..63(0退出)会先
aw20072_light_off,再只点亮目标灯珠(其余清零)
all_light
格式:
"%d %x"(brightness color)brightness裁剪到1..63对所有灯珠批量设置
alone_light
格式:
"%d %d %x"(light_number brightness color)light_number=0-> 执行light_off1..16-> 只改该灯珠,不先清空其它灯珠(可叠加逐颗开)brightness仅上限裁剪到63,允许0
i2c_log
格式:
"%d"设置全局
i2c_log_flag
灯珠编号
1:
[0x00, 0x01, 0x02]2:
[0x03, 0x04, 0x05]3:
[0x06, 0x07, 0x08]4:
[0x09, 0x0A, 0x0B]5:
[0x0C, 0x0D, 0x0E]6:
[0x0F, 0x10, 0x11]7:
[0x12, 0x13, 0x14]8:
[0x15, 0x16, 0x17]9:
[0x18, 0x19, 0x1A]10:
[0x1B, 0x1C, 0x1D]11:
[0x1E, 0x1F, 0x20]12:
[0x21, 0x22, 0x23]13:
[0x24, 0x25, 0x26]14:
[0x27, 0x28, 0x29]15:
[0x2A, 0x2B, 0x2C]16:
[0x2D, 0x2E, 0x2F]
需要的固件
0:
aw20072_cfg_led_off.bin1:
aw20072_led_white_on.bin2:
aw20072_led_red_on.bin3:
aw20072_led_green_on.bin4:
aw20072_led_blue_on.bin5:
aw20072_led_half_white_on.bin6:
aw20072_led_breath_white.bin7:
aw20072_led_breath_red.bin8:
aw20072_led_breath_green.bin9:
aw20072_led_breath_blue.bin10:
aw20072_led_breath_orange.bin11:
aw20072_led_breath_yellow.bin12:
aw20072_led_breath_pink.bin13:
aw20072_led_breath_tender_green.bin14:
aw20072_led_breath_cyan.bin15:
aw20072_led_breath_purple.bin16:
test.bin
如何写入以及部分示例值
# 关灯
printf '0\n' > /sys/class/leds/aw20072_led/effect
# 单灯珠: 1号灯珠, 亮度63, 红色
printf '1 63 ff0000\n' > /sys/class/leds/aw20072_led/light
# 所有灯珠: 亮度32, 青色
printf '32 00ffff\n' > /sys/class/leds/aw20072_led/all_light
# 叠加点亮(不会清空其他灯珠)
printf '3 63 0000ff\n' > /sys/class/leds/aw20072_led/alone_light
printf '7 63 ff00ff\n' > /sys/class/leds/aw20072_led/alone_light
# 红色呼吸
printf '7\n' > /sys/class/leds/aw20072_led/effect感谢你的阅读,搬运需标明原作者