mirror of
https://github.com/AsahiLinux/m1n1
synced 2024-12-24 20:33:10 +00:00
22890f3ba1
Let ffmpeg rotate, align to stride and convert to RGBA. Do not allocate a framebuffer for every frame. Signed-off-by: Janne Grunau <j@jannau.net>
96 lines
2.1 KiB
Python
Executable file
96 lines
2.1 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import sys, pathlib
|
|
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
|
|
|
|
from m1n1.setup import *
|
|
from m1n1.hw.dart import DART
|
|
from m1n1.utils import *
|
|
|
|
dart = DART.from_adt(u, "arm-io/dart-dispdfr")
|
|
|
|
width = 2040
|
|
height = 60
|
|
stride = 64
|
|
|
|
def make_fb():
|
|
width = 2040
|
|
fb_size = align_up(width * stride * 4, 8 * 0x4000)
|
|
buf = u.memalign(0x4000, fb_size)
|
|
return (dart.iomap(0, buf, fb_size), buf)
|
|
|
|
|
|
width = 2040
|
|
fb_size = align_up(width * stride * 4, 8 * 0x4000)
|
|
buf_mask = u.memalign(0x4000, fb_size)
|
|
p.memset32(buf_mask, 0, fb_size)
|
|
p.memset32(buf_mask, 0xFFFFFFFF, 10*stride)
|
|
iova_mask = dart.iomap(0, buf_mask, fb_size)
|
|
p.write32(0x228202200, iova_mask)
|
|
|
|
dart.dump_device(0)
|
|
|
|
#enable backlight
|
|
p.write32(0x228600070,0x8051)
|
|
p.write32(0x22860006c,0x229)
|
|
|
|
#enable fifo and vblank
|
|
p.write32(0x228400100, 0x613)
|
|
|
|
# Color correction magic (idk why but it makes colors actually work)
|
|
p.write32(0x228202074, 0x1)
|
|
p.write32(0x228202028, 0x10)
|
|
p.write32(0x22820202c, 0x1)
|
|
p.write32(0x228202020, 0x1)
|
|
p.write32(0x228202034, 0x1)
|
|
|
|
|
|
#layer enable
|
|
p.write32(0x228204020, 0x1)
|
|
p.write32(0x228204068, 0x1)
|
|
p.write32(0x2282040b4, 0x1)
|
|
p.write32(0x2282040f4, 0x1)
|
|
p.write32(0x2282040ac, 0x100000)
|
|
p.write32(0x228201038, 0x10001)
|
|
|
|
#layer size
|
|
p.write32(0x228204048, height << 16 | width)
|
|
p.write32(0x22820404c, height << 16 | width)
|
|
p.write32(0x22820407c, height << 16 | width)
|
|
p.write32(0x228204054, height << 16 | width)
|
|
|
|
#global size
|
|
p.write32(0x228201030, height << 16 | width)
|
|
|
|
#some more color correction
|
|
p.write32(0x22820402c, 0x53e4001)
|
|
|
|
def make_pipe(iova):
|
|
pipe = [
|
|
0x20014038,
|
|
0x2a | (stride * 4),
|
|
0x20014030,
|
|
0x2a | iova,
|
|
]
|
|
pipe = [0xc0000001 | (len(pipe) << 16)] + pipe
|
|
return pipe
|
|
|
|
def flush(pipe):
|
|
for i in pipe:
|
|
p.write32(0x2282010c0, i)
|
|
|
|
def play(f):
|
|
frame = 0
|
|
iova, base = make_fb()
|
|
while True:
|
|
data = f.read(80 * 64 * 4)
|
|
if not data:
|
|
break
|
|
for i in range(25):
|
|
iface.writemem(base + i * 80 * 64 * 4, data)
|
|
flush(make_pipe(iova))
|
|
time.sleep(0.033)
|
|
frame += 1
|
|
|
|
with open('out.bin', 'rb') as f:
|
|
play(f)
|