1*f0687c8aSRaman Tenneti#!/usr/bin/python3 2*f0687c8aSRaman Tenneti 3*f0687c8aSRaman Tennetiimport pykms 4*f0687c8aSRaman Tennetiimport selectors 5*f0687c8aSRaman Tennetiimport sys 6*f0687c8aSRaman Tenneti 7*f0687c8aSRaman Tennetidef readdrm(fileobj, mask): 8*f0687c8aSRaman Tenneti for ev in card.read_events(): 9*f0687c8aSRaman Tenneti eventhandler(ev) 10*f0687c8aSRaman Tenneti 11*f0687c8aSRaman Tennetidef waitevent(sel): 12*f0687c8aSRaman Tenneti events = sel.select(1) 13*f0687c8aSRaman Tenneti if not events: 14*f0687c8aSRaman Tenneti print("Error: timeout receiving event") 15*f0687c8aSRaman Tenneti else: 16*f0687c8aSRaman Tenneti for key, mask in events: 17*f0687c8aSRaman Tenneti key.data(key.fileobj, mask) 18*f0687c8aSRaman Tenneti 19*f0687c8aSRaman Tennetidef eventhandler(event): 20*f0687c8aSRaman Tenneti print("Received %s event successfully (seq %d time %f)" % 21*f0687c8aSRaman Tenneti (event.type, event.seq, event.time)) 22*f0687c8aSRaman Tenneti 23*f0687c8aSRaman Tenneticard = pykms.Card() 24*f0687c8aSRaman Tennetisel = selectors.DefaultSelector() 25*f0687c8aSRaman Tennetisel.register(card.fd, selectors.EVENT_READ, readdrm) 26*f0687c8aSRaman Tenneti 27*f0687c8aSRaman Tennetires = pykms.ResourceManager(card) 28*f0687c8aSRaman Tenneticonn = res.reserve_connector() 29*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn) 30*f0687c8aSRaman Tennetipplane = res.reserve_primary_plane(crtc) 31*f0687c8aSRaman Tenneti 32*f0687c8aSRaman Tennetimode = conn.get_default_mode() 33*f0687c8aSRaman Tennetimodeb = mode.to_blob(card) 34*f0687c8aSRaman Tenneti 35*f0687c8aSRaman Tennetifor format in pplane.formats: 36*f0687c8aSRaman Tenneti if format == pykms.PixelFormat.XRGB8888: 37*f0687c8aSRaman Tenneti break 38*f0687c8aSRaman Tenneti if format == pykms.PixelFormat.RGB565: 39*f0687c8aSRaman Tenneti break 40*f0687c8aSRaman Tenneti 41*f0687c8aSRaman Tennetifb = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, format); 42*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb); 43*f0687c8aSRaman Tenneti 44*f0687c8aSRaman Tenneti# Disable request 45*f0687c8aSRaman Tenneticard.disable_planes() 46*f0687c8aSRaman Tenneti 47*f0687c8aSRaman Tennetiprint("Setting %s to %s using %s" % (conn.fullname, mode.name, format)) 48*f0687c8aSRaman Tenneti 49*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card) 50*f0687c8aSRaman Tenneti 51*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id) 52*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1, 53*f0687c8aSRaman Tenneti "MODE_ID": modeb.id}) 54*f0687c8aSRaman Tennetireq.add(pplane, {"FB_ID": fb.id, 55*f0687c8aSRaman Tenneti "CRTC_ID": crtc.id, 56*f0687c8aSRaman Tenneti "SRC_X": 0 << 16, 57*f0687c8aSRaman Tenneti "SRC_Y": 0 << 16, 58*f0687c8aSRaman Tenneti "SRC_W": mode.hdisplay << 16, 59*f0687c8aSRaman Tenneti "SRC_H": mode.vdisplay << 16, 60*f0687c8aSRaman Tenneti "CRTC_X": 0, 61*f0687c8aSRaman Tenneti "CRTC_Y": 0, 62*f0687c8aSRaman Tenneti "CRTC_W": mode.hdisplay, 63*f0687c8aSRaman Tenneti "CRTC_H": mode.vdisplay}) 64*f0687c8aSRaman Tenneti 65*f0687c8aSRaman Tennetiret = req.test(True) 66*f0687c8aSRaman Tennetiif ret != 0: 67*f0687c8aSRaman Tenneti print("Atomic test failed: %d" % ret) 68*f0687c8aSRaman Tenneti sys.exit() 69*f0687c8aSRaman Tenneti 70*f0687c8aSRaman Tennetireq.commit(0, allow_modeset = True) 71*f0687c8aSRaman Tennetiwaitevent(sel) 72*f0687c8aSRaman Tenneti 73*f0687c8aSRaman Tennetiinput("press enter to exit\n") 74