1*f0687c8aSRaman Tenneti#!/usr/bin/python3 2*f0687c8aSRaman Tenneti 3*f0687c8aSRaman Tennetiimport pykms 4*f0687c8aSRaman Tennetifrom enum import Enum 5*f0687c8aSRaman Tenneti 6*f0687c8aSRaman Tennetiimport termios, sys, os, tty 7*f0687c8aSRaman Tenneti 8*f0687c8aSRaman Tenneticard = pykms.OmapCard() 9*f0687c8aSRaman Tenneti 10*f0687c8aSRaman Tennetires = pykms.ResourceManager(card) 11*f0687c8aSRaman Tenneticonn = res.reserve_connector() 12*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn) 13*f0687c8aSRaman Tennetimode = conn.get_default_mode() 14*f0687c8aSRaman Tennetimodeb = mode.to_blob(card) 15*f0687c8aSRaman Tennetirootplane = res.reserve_primary_plane(crtc, pykms.PixelFormat.XRGB8888) 16*f0687c8aSRaman Tennetiplane = res.reserve_overlay_plane(crtc, pykms.PixelFormat.NV12) 17*f0687c8aSRaman Tenneti 18*f0687c8aSRaman Tenneticard.disable_planes() 19*f0687c8aSRaman Tenneti 20*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card) 21*f0687c8aSRaman Tenneti 22*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id) 23*f0687c8aSRaman Tenneti 24*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1, 25*f0687c8aSRaman Tenneti "MODE_ID": modeb.id}) 26*f0687c8aSRaman Tenneti 27*f0687c8aSRaman Tenneti# This enables the root plane 28*f0687c8aSRaman Tenneti 29*f0687c8aSRaman Tenneti#rootfb = pykms.OmapFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24"); 30*f0687c8aSRaman Tenneti#pykms.draw_test_pattern(rootfb); 31*f0687c8aSRaman Tenneti# 32*f0687c8aSRaman Tenneti#req.add(rootplane, {"FB_ID": rootfb.id, 33*f0687c8aSRaman Tenneti# "CRTC_ID": crtc.id, 34*f0687c8aSRaman Tenneti# "SRC_X": 0 << 16, 35*f0687c8aSRaman Tenneti# "SRC_Y": 0 << 16, 36*f0687c8aSRaman Tenneti# "SRC_W": mode.hdisplay << 16, 37*f0687c8aSRaman Tenneti# "SRC_H": mode.vdisplay << 16, 38*f0687c8aSRaman Tenneti# "CRTC_X": 0, 39*f0687c8aSRaman Tenneti# "CRTC_Y": 0, 40*f0687c8aSRaman Tenneti# "CRTC_W": mode.hdisplay, 41*f0687c8aSRaman Tenneti# "CRTC_H": mode.vdisplay, 42*f0687c8aSRaman Tenneti# "zpos": 0}) 43*f0687c8aSRaman Tenneti 44*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True) 45*f0687c8aSRaman Tenneti 46*f0687c8aSRaman Tennetidef show_rot_plane(crtc, plane, fb, rot, x_scale, y_scale): 47*f0687c8aSRaman Tenneti 48*f0687c8aSRaman Tenneti crtc_w = int(fb_w * x_scale) 49*f0687c8aSRaman Tenneti crtc_h = int(fb_h * y_scale) 50*f0687c8aSRaman Tenneti 51*f0687c8aSRaman Tenneti if (rot & pykms.Rotation.ROTATE_90) or (rot & pykms.Rotation.ROTATE_270): 52*f0687c8aSRaman Tenneti tmp = crtc_w 53*f0687c8aSRaman Tenneti crtc_w = crtc_h 54*f0687c8aSRaman Tenneti crtc_h = tmp 55*f0687c8aSRaman Tenneti 56*f0687c8aSRaman Tenneti crtc_x = int(mode.hdisplay / 2 - crtc_w / 2) 57*f0687c8aSRaman Tenneti crtc_y = int(mode.vdisplay / 2 - crtc_h / 2) 58*f0687c8aSRaman Tenneti 59*f0687c8aSRaman Tenneti req = pykms.AtomicReq(card) 60*f0687c8aSRaman Tenneti 61*f0687c8aSRaman Tenneti src_x = 0 62*f0687c8aSRaman Tenneti src_y = 0 63*f0687c8aSRaman Tenneti src_w = fb_w - src_x 64*f0687c8aSRaman Tenneti src_h = fb_h - src_y 65*f0687c8aSRaman Tenneti 66*f0687c8aSRaman Tenneti print("SRC {},{}-{}x{} DST {},{}-{}x{}".format( 67*f0687c8aSRaman Tenneti src_x, src_y, src_w, src_h, 68*f0687c8aSRaman Tenneti crtc_x, crtc_y, crtc_w, crtc_h)) 69*f0687c8aSRaman Tenneti 70*f0687c8aSRaman Tenneti angle_str = pykms.Rotation(rot & pykms.Rotation.ROTATE_MASK).name 71*f0687c8aSRaman Tenneti reflect_x_str = "REFLECT_X" if rot & pykms.Rotation.REFLECT_X else "" 72*f0687c8aSRaman Tenneti reflect_y_str = "REFLECT_Y" if rot & pykms.Rotation.REFLECT_Y else "" 73*f0687c8aSRaman Tenneti 74*f0687c8aSRaman Tenneti print("{} {} {}".format(angle_str, reflect_x_str, reflect_y_str)) 75*f0687c8aSRaman Tenneti 76*f0687c8aSRaman Tenneti sys.stdout.flush() 77*f0687c8aSRaman Tenneti 78*f0687c8aSRaman Tenneti req.add(plane, {"FB_ID": fb.id, 79*f0687c8aSRaman Tenneti "CRTC_ID": crtc.id, 80*f0687c8aSRaman Tenneti "SRC_X": src_x << 16, 81*f0687c8aSRaman Tenneti "SRC_Y": src_y << 16, 82*f0687c8aSRaman Tenneti "SRC_W": src_w << 16, 83*f0687c8aSRaman Tenneti "SRC_H": src_h << 16, 84*f0687c8aSRaman Tenneti "CRTC_X": crtc_x, 85*f0687c8aSRaman Tenneti "CRTC_Y": crtc_y, 86*f0687c8aSRaman Tenneti "CRTC_W": crtc_w, 87*f0687c8aSRaman Tenneti "CRTC_H": crtc_h, 88*f0687c8aSRaman Tenneti "rotation": rot, 89*f0687c8aSRaman Tenneti "zpos": 2}) 90*f0687c8aSRaman Tenneti 91*f0687c8aSRaman Tenneti req.commit_sync(allow_modeset = True) 92*f0687c8aSRaman Tenneti 93*f0687c8aSRaman Tenneti 94*f0687c8aSRaman Tennetifb_w = 480 95*f0687c8aSRaman Tennetifb_h = 150 96*f0687c8aSRaman Tennetix_scale = 1 97*f0687c8aSRaman Tennetiy_scale = 1 98*f0687c8aSRaman Tenneti 99*f0687c8aSRaman Tennetifb = pykms.OmapFramebuffer(card, fb_w, fb_h, "NV12", flags = pykms.OmapFramebuffer.Tiled); 100*f0687c8aSRaman Tenneti#fb = pykms.DumbFramebuffer(card, fb_w, fb_h, "NV12") 101*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb); 102*f0687c8aSRaman Tenneti 103*f0687c8aSRaman Tennetidef even(i): 104*f0687c8aSRaman Tenneti return i & ~1 105*f0687c8aSRaman Tenneti 106*f0687c8aSRaman Tennetipykms.draw_text(fb, even((fb_w // 2) - (8 * 3) // 2), 4, "TOP", pykms.white) 107*f0687c8aSRaman Tennetipykms.draw_text(fb, even((fb_w // 2) - (8 * 6) // 2), fb_h - 8 - 4, "BOTTOM", pykms.white) 108*f0687c8aSRaman Tennetipykms.draw_text(fb, 4, even(((fb_h // 2) - 4)), "L", pykms.white) 109*f0687c8aSRaman Tennetipykms.draw_text(fb, fb_w - 8 - 4, even(((fb_h // 2) - 4)), "R", pykms.white) 110*f0687c8aSRaman Tenneti 111*f0687c8aSRaman Tennetirots = [ pykms.Rotation.ROTATE_0, pykms.Rotation.ROTATE_90, pykms.Rotation.ROTATE_180, pykms.Rotation.ROTATE_270 ] 112*f0687c8aSRaman Tenneticursors = [ "A", "D", "B", "C" ] 113*f0687c8aSRaman Tenneti 114*f0687c8aSRaman Tennetiprint("Use the cursor keys, x and y to change rotation. Press q to quit.") 115*f0687c8aSRaman Tenneti 116*f0687c8aSRaman Tennetifd = sys.stdin.fileno() 117*f0687c8aSRaman Tennetioldterm = termios.tcgetattr(fd) 118*f0687c8aSRaman Tennetitty.setcbreak(fd) 119*f0687c8aSRaman Tenneti 120*f0687c8aSRaman Tennetitry: 121*f0687c8aSRaman Tenneti esc_seq = 0 122*f0687c8aSRaman Tenneti 123*f0687c8aSRaman Tenneti current_rot = pykms.Rotation.ROTATE_0 124*f0687c8aSRaman Tenneti 125*f0687c8aSRaman Tenneti show_rot_plane(crtc, plane, fb, current_rot, x_scale, y_scale) 126*f0687c8aSRaman Tenneti 127*f0687c8aSRaman Tenneti while True: 128*f0687c8aSRaman Tenneti c = sys.stdin.read(1) 129*f0687c8aSRaman Tenneti #print("Got character {}".format(repr(c))) 130*f0687c8aSRaman Tenneti 131*f0687c8aSRaman Tenneti changed = False 132*f0687c8aSRaman Tenneti handled = False 133*f0687c8aSRaman Tenneti 134*f0687c8aSRaman Tenneti if esc_seq == 0: 135*f0687c8aSRaman Tenneti if c == "\x1b": 136*f0687c8aSRaman Tenneti esc_seq = 1 137*f0687c8aSRaman Tenneti handled = True 138*f0687c8aSRaman Tenneti elif esc_seq == 1: 139*f0687c8aSRaman Tenneti if c == "[": 140*f0687c8aSRaman Tenneti esc_seq = 2 141*f0687c8aSRaman Tenneti handled = True 142*f0687c8aSRaman Tenneti else: 143*f0687c8aSRaman Tenneti esc_seq = 0 144*f0687c8aSRaman Tenneti elif esc_seq == 2: 145*f0687c8aSRaman Tenneti esc_seq = 0 146*f0687c8aSRaman Tenneti 147*f0687c8aSRaman Tenneti if c in cursors: 148*f0687c8aSRaman Tenneti handled = True 149*f0687c8aSRaman Tenneti 150*f0687c8aSRaman Tenneti rot = rots[cursors.index(c)] 151*f0687c8aSRaman Tenneti 152*f0687c8aSRaman Tenneti current_rot &= ~pykms.Rotation.ROTATE_MASK 153*f0687c8aSRaman Tenneti current_rot |= rot 154*f0687c8aSRaman Tenneti 155*f0687c8aSRaman Tenneti changed = True 156*f0687c8aSRaman Tenneti 157*f0687c8aSRaman Tenneti if not handled: 158*f0687c8aSRaman Tenneti if c == "q": 159*f0687c8aSRaman Tenneti break 160*f0687c8aSRaman Tenneti elif c == "x": 161*f0687c8aSRaman Tenneti current_rot ^= pykms.Rotation.REFLECT_X 162*f0687c8aSRaman Tenneti changed = True 163*f0687c8aSRaman Tenneti elif c == "y": 164*f0687c8aSRaman Tenneti current_rot ^= pykms.Rotation.REFLECT_Y 165*f0687c8aSRaman Tenneti changed = True 166*f0687c8aSRaman Tenneti 167*f0687c8aSRaman Tenneti if changed: 168*f0687c8aSRaman Tenneti show_rot_plane(crtc, plane, fb, current_rot, x_scale, y_scale) 169*f0687c8aSRaman Tenneti 170*f0687c8aSRaman Tennetifinally: 171*f0687c8aSRaman Tenneti termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 172