diff --git a/agnos-kernel-sdm845 b/agnos-kernel-sdm845 index 80b1ca2..2d910ca 160000 --- a/agnos-kernel-sdm845 +++ b/agnos-kernel-sdm845 @@ -1 +1 @@ -Subproject commit 80b1ca22dc623d4b17f99e412dad427dbbfaa7a4 +Subproject commit 2d910ca2ddc67ee52525bac2224565360733e3d0 diff --git a/userspace/files/screen_calibration.service b/userspace/files/screen_calibration.service new file mode 100644 index 0000000..c78705b --- /dev/null +++ b/userspace/files/screen_calibration.service @@ -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 diff --git a/userspace/services.sh b/userspace/services.sh index feb06d3..9483593 100755 --- a/userspace/services.sh +++ b/userspace/services.sh @@ -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 diff --git a/userspace/usr/comma/screen_calibration.py b/userspace/usr/comma/screen_calibration.py new file mode 100755 index 0000000..27015c3 --- /dev/null +++ b/userspace/usr/comma/screen_calibration.py @@ -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)