Skip to content

Instantly share code, notes, and snippets.

@jigpu
Last active June 27, 2022 06:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jigpu/e05b17e24a60825c6f3bf59fe9638736 to your computer and use it in GitHub Desktop.
Save jigpu/e05b17e24a60825c6f3bf59fe9638736 to your computer and use it in GitHub Desktop.
Control brightness and contrast of a monitor exposing DDC over an FTDI F232H.
#!/usr/bin/python3
"""Control brightness and contrast of a monitor exposing DDC over an FTDI F232H.
Usage:
ddc-ftdi.py [<brightness> <contrast>]
Arguments:
<brightness> Brightness value to set (0..100)
<contrast> Contrast value to set (0..100)
"""
from pyftdi.i2c import I2cController
import pyftdi.misc
import time
import sys
def checksum(data, addr):
sum = addr
for c in data:
sum = sum ^ c
return sum
def ftdi_init():
i2c = I2cController()
i2c.configure('ftdi://ftdi:232h/1', frequency=100000.0)
print("Opened i2c connection at {}Hz".format(i2c.frequency))
return i2c.get_port(0x37)
def ddc_write(slave, message, sleep=0.04):
x = message + bytes({checksum(message, 0x6E)})
print("Writing: {}".format(pyftdi.misc.hexline(x)))
slave.write(x)
time.sleep(sleep)
def ddc_read(slave):
data = slave.read(2)
if data[0] != 0x6E:
raise IOError("Unexpected reply from address {}".format(data[0]))
data = data + slave.read((data[1] & 0x7F) + 1)
x = checksum(data, 0x50)
print("Read: {}".format(pyftdi.misc.hexline(data)))
if x != 0:
print("BAD checksum: got {})".format(x))
return data
def ddc_query(slave, message, sleep=0.04):
ddc_write(slave, message, sleep)
return ddc_read(slave)
# http://www.boichat.ch/nicolas/ddcci/specs.html
controls = {
'brightness': 0x10,
'contrast': 0x12
}
def get_value(slave, control):
message = b'\x51\x82\x01' + bytes({control})
data = ddc_query(slave, message)
print("Maximum: {}, Current: {}".format(data[7], data[9]))
def set_value(slave, control, value):
message = b'\x51\x84\x03' + bytes({control}) + b'\x00' + bytes({value})
data = ddc_write(slave, message)
def main():
if len(sys.argv) != 3:
brightness = 75
contrast = 50
else:
brightness = int(sys.argv[1])
contrast = int(sys.argv[2])
slave = ftdi_init()
get_value(slave, controls['brightness'])
set_value(slave, controls['brightness'], brightness)
get_value(slave, controls['contrast'])
set_value(slave, controls['contrast'], contrast)
if __name__=="__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment