逆向了部分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~bit40x0000001f):基础手势组(Gesture_switch_enable低位)

  • bit8 (0x00000100):手势组额外位(包含在 0x11f 中)

  • bit25 (0x02000000):gesture 0x272 对应位

  • FOD_switch_enable = mask & 0x01000000

  • Gesture_switch_enable = mask & 0x0000011f

  • bit31=0 时会进入关闭分支

部分常用组合值

  • 仅打开总开关:0x80000000

  • 手势全开(当前已知常规位):0x8000011f

  • 手势全开 + FOD 开关:0x8100011f

  • 手势全开 + 0x2720x8200011f

  • 手势全开 + FOD + 0x2720x8300011f

写入速查

  • 0x8000011f -> \x1f\x01\x00\x80

  • 0x8100011f -> \x1f\x01\x00\x81

  • 0x8200011f -> \x1f\x01\x00\x82

  • 0x8300011f -> \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_hbm

  • display_set_panel_hbm_status

  • display_panel_hbm_on / display_panel_hbm_off

  • display_panel_local_hbm_level / display_panel_local_hbm_off

当对 hbm 写值时,display_set_panel_hbm_status 内部按 bitmask 0x16e 分流:

  • display_panel_hbm_on1,2,3,5,6,8

  • display_panel_hbm_off0,4,7

魅族21Note实测指纹位置高亮应该为hbm节点写6,关闭写71 为全屏高亮,其他值请自测

如何写入

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/show

  • hwen -> aw20072_hwen_store/show

  • effect -> aw20072_effect_store/show

  • imax -> aw20072_imax_store/show

  • rgbcolor -> aw20072_rgbcolor_store

  • allrgbcolor -> aw20072_allrgbcolor_store

  • rgbbrightness -> aw20072_rgbbrightness_store

  • allrgbbrightness -> aw20072_allrgbbrightness_store

  • light -> aw20072_light_store

  • all_light -> aw20072_all_light_store

  • alone_light -> aw20072_alone_light_store

  • i2c_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 选择单颗灯珠,颜色写 page 0xC1 通道寄存器

  • 每色使用 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..160 直接退出)

  • brightness 范围被裁剪到 1..630 退出)

  • 会先 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_off

  • 1..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.bin

  • 1: aw20072_led_white_on.bin

  • 2: aw20072_led_red_on.bin

  • 3: aw20072_led_green_on.bin

  • 4: aw20072_led_blue_on.bin

  • 5: aw20072_led_half_white_on.bin

  • 6: aw20072_led_breath_white.bin

  • 7: aw20072_led_breath_red.bin

  • 8: aw20072_led_breath_green.bin

  • 9: aw20072_led_breath_blue.bin

  • 10: aw20072_led_breath_orange.bin

  • 11: aw20072_led_breath_yellow.bin

  • 12: aw20072_led_breath_pink.bin

  • 13: aw20072_led_breath_tender_green.bin

  • 14: aw20072_led_breath_cyan.bin

  • 15: aw20072_led_breath_purple.bin

  • 16: 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

感谢你的阅读,搬运需标明原作者