Apply DWO screen calibration on boot (#513)

* calib apply service

* bump kernel

* needs this too

* print

---------

Co-authored-by: Maxime Desroches <desroches.maxime@gmail.com>
This commit is contained in:
Robbe Derks
2025-12-18 10:25:59 +08:00
committed by GitHub
parent 16d5e5f621
commit e42442a296
4 changed files with 58 additions and 1 deletions

View File

@@ -0,0 +1,11 @@
[Unit]
After=multi-user.target
Description=Set screen calibration
[Service]
Type=oneshot
User=root
ExecStart=/usr/comma/screen_calibration.py
[Install]
WantedBy=multi-user.target

View File

@@ -27,6 +27,7 @@ systemctl enable adb-param-watcher.service
systemctl enable logrotate-hourly.timer
systemctl enable avahi-daemon
systemctl enable avahi-ssh-publish.service
systemctl enable screen_calibration.service
# Disable some of our services
systemctl disable agnos-tests.service

View File

@@ -0,0 +1,45 @@
#!/usr/bin/env python3
import os
import struct
GAMMA_CURVES_FILE = "/persist/comma/dwo_gamma_curves"
COMMAND_FILE = "/sys/kernel/debug/dsi_dwo_video_display/mipi_command"
GAMMA_ADDR = [
[(0x00, 0x01), (0x02, 0x03), (0x04, 0x05), (0x06, 0x07), (0x08, 0x09), (0x0A, 0x0B), (0x0C, 0x0D), (0x0E, 0x0F), (0x10, 0x11), (0x12, 0x13), (0x14, 0x15), (0x16, 0x17), (0x18, 0x19), (0x1A, 0x1B), (0x1C, 0x1D), (0x1E, 0x1F), (0x20, 0x21), (0x22, 0x23), (0x24, 0x25), (0x26, 0x27), (0x28, 0x29), (0x2A, 0x2B), (0x2D, 0x2F), (0x30, 0x31), (0x32, 0x33)],
[(0x34, 0x35), (0x36, 0x37), (0x38, 0x39), (0x3A, 0x3B), (0x3D, 0x3F), (0x40, 0x41), (0x42, 0x43), (0x44, 0x45), (0x46, 0x47), (0x48, 0x49), (0x4A, 0x4B), (0x4C, 0x4D), (0x4E, 0x4F), (0x50, 0x51), (0x52, 0x53), (0x54, 0x55), (0x56, 0x58), (0x59, 0x5A), (0x5B, 0x5C), (0x5D, 0x5E), (0x5F, 0x60), (0x61, 0x62), (0x63, 0x64), (0x65, 0x66), (0x67, 0x68)],
[(0x69, 0x6A), (0x6B, 0x6C), (0x6D, 0x6E), (0x6F, 0x70), (0x71, 0x72), (0x73, 0x74), (0x75, 0x76), (0x77, 0x78), (0x79, 0x7A), (0x7B, 0x7C), (0x7D, 0x7E), (0x7F, 0x80), (0x81, 0x82), (0x83, 0x84), (0x85, 0x86), (0x87, 0x88), (0x89, 0x8A), (0x8B, 0x8C), (0x8D, 0x8E), (0x8F, 0x90), (0x91, 0x92), (0x93, 0x94), (0x95, 0x96), (0x97, 0x98), (0x99, 0x9A)],
]
def command_mode(mode):
return f"39 01 00 00 0A 00 02 FE {((0b1010 << 4) | mode):02X}"
def send_command(command_str):
command_buf = bytes(map(lambda x: int(x, base=16), command_str.strip().split()))
data = struct.pack(f"i{len(command_buf)}s", len(command_buf), command_buf)
with open(COMMAND_FILE, "wb") as f:
f.write(data)
def set_gamma(gamma):
send_command(command_mode(2))
for color_idx in range(3):
for i, val in reversed(list(enumerate(gamma[color_idx]))):
msb, lsb = GAMMA_ADDR[color_idx][i]
send_command(f"39 0F 00 00 0A 00 02 {msb:02X} {(val >> 8) & 0xFF:02X}")
send_command(f"39 {'01' if i % 10 == 0 else '0F'} 00 00 0A 00 02 {lsb:02X} {val & 0xFF:02X}")
send_command(command_mode(0))
print("Successfully setup screen calibration")
if __name__ == "__main__":
if not os.path.exists(GAMMA_CURVES_FILE):
print("No gamma curves found")
exit(0)
assert os.path.exists(COMMAND_FILE), "MIPI command interface not found"
with open(GAMMA_CURVES_FILE, "r") as f:
gamma = [[int(x, 16) for x in l.strip().split()] for l in f]
set_gamma(gamma)