From b91156db9be4984f32f808d7d3db13809ca1cbad Mon Sep 17 00:00:00 2001 From: "Peter D. Gray" Date: Mon, 11 Dec 2023 12:26:01 -0500 Subject: [PATCH] bus interlock ctrl --- misc/gpu/Makefile | 3 +- misc/gpu/README.md | 2 + misc/gpu/gpu_binary.py | 215 +++++++++++++++++++++-------------------- misc/gpu/lcd.c | 6 ++ misc/gpu/main.c | 11 +-- misc/gpu/main.h | 2 + misc/gpu/version.h | 2 +- 7 files changed, 126 insertions(+), 115 deletions(-) diff --git a/misc/gpu/Makefile b/misc/gpu/Makefile index 2ed558c8..0a318c4a 100644 --- a/misc/gpu/Makefile +++ b/misc/gpu/Makefile @@ -126,7 +126,6 @@ checksums.txt: $(DELIVERABLES) shasum -a 256 $(DELIVERABLES) > $@ lcd.o: barcode.h -#barcode.h: version.h make_barcode.py Makefile barcode.h: make_barcode.py Makefile python3 make_barcode.py @@ -157,7 +156,7 @@ BRANCH = $(shell git rev-parse --abbrev-ref HEAD) SHA_VERSION = $(shell git rev-parse --short HEAD) GIT_HASH = "$(BRANCH)@$(SHA_VERSION)" version.o: CFLAGS += -DBUILD_TIME='"$(BUILD_TIME)"' -DGIT_HASH='$(GIT_HASH)' -version.o: Makefile version.h +version.o main.o: Makefile version.h clean: $(RM) $(OBJS) diff --git a/misc/gpu/README.md b/misc/gpu/README.md index 65b5818c..ee3551e3 100644 --- a/misc/gpu/README.md +++ b/misc/gpu/README.md @@ -84,6 +84,8 @@ Set EMPTY bit, so goes into BL: - SPI bus to the display is shared by the GPU and main micro. - Main micro configures its pins as pull-up, open-drain outputs (there is no input except TEAR). - GPU does the same, but no pull-ups (so open drain). +- Later turns out we need push-pull I/O to get the SPI speeds involved (rise times too slow + with built-in resistors) ## Other References diff --git a/misc/gpu/gpu_binary.py b/misc/gpu/gpu_binary.py index 44231f39..c0c36306 100644 --- a/misc/gpu/gpu_binary.py +++ b/misc/gpu/gpu_binary.py @@ -4,113 +4,116 @@ # # see misc/gpu for source # -VERSION = '1.2.1' +VERSION = '1.3.0' -LENGTH = const(3484) # bytes (after decompression) +LENGTH = const(3524) # bytes (after decompression) -# len(BINARY) = 2565 -BINARY = (b'x\x9c\x8dW\x7fl\x1b\xf5\x15\x7f\xdf\xbbsb;I\xe3\xd4i\x9a\xdf9\xfb\x9b' - b"\x94P'\x8d\x93k\xb6\xfe\xa0\xf4\xf0un\xe2KKi)k\xe3\xc2.?\xa0\xe7\x06\xc6A" - b'Xe\x8d?f\xda\xb1\xb1N+PCi\xed\x96\x9a\x16\x06lLd\x91\xbci\xac\x11\x19l' - b'B\x03\x01>B\xb5\xae\xa9F\xa0\x9b<41\\4a\xb7%\xb9\xbdsS\xe4H\xd54[' - b'\xcf\xdf\xf7\xbe\xef\xd7\xe7\xde\xbd\xef\x0fC5\xf06\x02V\x9b\r\xac%H\xf0?' - b'>e\x05\xfar\xe4+\x90\xb6\x93\xabs\xe6x=\xfa\x7ft\xd7b^\xcf\xfez' - b'\xf3\x85\x98\x1c\xc9\xa2>\x1a\x06O\xb1n\x91\xc1\xc3\xa4\xb8\x1e\x98\x81' - b'\xd7\t\xa5\x9ac\x02\ry\xd3\xe6\x892\xb0r\xb2#\t\x1e6\xc5\xf6^\xb5pLL\xfaM' - b'])\xda\x98\xfa\xd2\x9eG\xfd\x90y\xec\x12\xb8\xd8\x19\xbb\x1c\xdc!m\xe1:m' - b'=v\xd9W\x1d\xf3}9e\x0b03@\x9d\n\xd7U,\xc7|\x97\xa6 \xf3\xbbKsi' - b'\xa8\xce\xc7\xcf\x93u\x9e6 \xa1\x06 \xf9\x93\xb1J7F{\t2\xaf\xcf\x12' - b'\xde\x16\xb8m\x84H\xb7\rm\x1ba^fE\x12%\xf1\xf5\xf4\x84\x97\x89NZ' - b'\xd6\xad\xe5\xa2\x90\xf9\xe3\x15\xdb\x18\x98\x98\x1c\x8c\xe8H2\xcd\xbc\xec' - b'\xea\xed\xbf\xef\xb11\xbb\xd8\x7fw\xff\x08\xb8\xdcR\xffPp\xa4\xd4ME\x88b' - b'\xcc8d\x9e\x9a\x9d\xa4$\xfa:z\x93\x97-BUOQ\x94y\n2\x89+\xf5\x98\x95`' - b'\xd6\x1f\xce.\x96\x9d}L\xf4m\xca\x03Z`\x0e:\x1b\xa1\x83j\x9csJC\xca\x05\xb5,' - b'\xe0\x14/\xe0X\x9a\x1f\xa9Z\x82#\xc5\xd1\x9e\x1f\xadc\x8e\t\x13\x8b\xf1\xbea' - b'\x00\x07[\x9c\x9c\x03\xe0v\x10I\xce0\x8c\x1f \x19Y\xa4Y#B\xd9@\x90\xa9PK$' - b'\xa7\xa2mD\xfc<#Zi69\xd47\x1cx.T\xe3s\xa4>\x0e\x95H\x11\xd7\x85\x81' - b'S\xa1^\xa6D\xac\x81\x9e\xc6Gn\xa9\xd0\xc0C\xf5]\xbd%\x9aI\xce\xf0s!\x12\xdd)' - b'7\x85w\xca\ra\x9e\xd6\xf8\xbaR\x9f\x84\x9c\xd2\x85\x01\x12\x07O\x9b~\xfbf' - b'A\x1b\xea\xd8\x99*?;\xd0qwj\xb0CN\xdd\xd1Q\x99\xda"o\t\xd4*V\xea\x9b' - b'\xa1\xea\xad\xbd%\x88\xf9\\\xfa\xa1\x8e\xbbR\x01yo\x87\x90\xd2:' - b'\xfe\xad\x07\x02\xdd\x1aZ\xcc@{P\xef\xe9\xd9 W+\x90!\xb3\xc4\xeb\xd5\x08' - b'=\x89\xf1O\r\x80\x9b\xa3\x15p\xccO\xf8{\xfc\xa7B\x82\xafO\x87\x1bI\xea' - b'\x1br\x93\x06\xcbI\xaa[n\xd0\x8c\x1b\xa0\x85Yv\xda/\xf4\xac\xece\xc3v' - b'\x95\x9c\x80\x0eY\x87v\x92b5\xbb\x92\x9d\x80\xf6v\xbd\x0bq\x14QA\x9bJ' - b'C\xfb2\xdd\xc8~\xcf\xe8\x90[\x03N\x85\xa5\xffI\xb3\xed\rzk\xa0M\xae' - b'\x08\x1f\xd5n\x0b\xffU\xb3\xb8\x0e\x85\xfb\xb5\xda\xf0\x01\xa9V\xfb=' - b'\xda/\xd2\x89\xbbY\xae\t\xdf\xa9\xd9qf\x1cg,:C\xf9@E\x18+\xaa\xfd"]%7bt\x1b' - b'}?=\xb4gz\x1c:\x8aS\xc5\xed/\x9d\xad\xdc\xbc\xa7~t\xfb\x99q\x06N\xa6\x9b\x80' - b'\xc0\x89\xf4n\xff\x8b\x83c\xe9\x17C\xdf\xf4\x8d\xa5\xc0\x93M-\t\x93\xb5/\x0c' - b'\x92.r|z\xfc\xf94\xbe\x17|w+\xb07\xdb\x91\x9a\x91V"y\x91Z\xb0\xf7\rc\xcehA^' - b'A\xbe\x1e\xc9\x8dt\x13\xca+p\x8c\xb8k\xe5\xc5\x96\x98\x12q\xd7\xc8[\xa1F' - b'E\x94\xc8\x7f\x80\\\x85\xef\xabT\xbfZ\xd9[!\xa2L\xecR\xbfR\xab.\xceK[\x89i' - b'\x15S\xcb{\xedb\xb1+\x86\xdc\x01)\xa6\xacr\x1fU\xad\xe0\x10+|\x97\xf5\x98jC]' - b'L\xb1\xc9\xb6@\xbfbq\x1fQj\xb1{\xe03\\\x99f\xcfE\xb0\xb5\xdeB\xca =n' - b'\x18\x8e\x19\x98\xf9\x08\xc1W\xcb\xa3\xc9\x9a{\xab{\x12\xcdD\xaa\x19' - b'~\xc4E\x96\xd5\xde\xdbkaDr\x88\xc4\xce\x8d\xfc\xddb\x97\xce\rM\x8f\x94' - b'\xe0\n\x81\xb8\x91\xbdy\x0e2\xa7sFv\xc7\\i\xa0\xac\xd7\xa9\x96\x88N\xc5' - b'\xc8\xfez\x8e\xe2{\xbe\xac\xf3-4\xe4\xf1}\x99\x82\xcc\xb3\x97L\xeeb\xca\xc8' - b'\x9e\x9a\xbb\x946\xf3\x13\x87\xb9\xa2\x11\x07\xd6%A\x1dn\xabk\xda' - b"\xe2H\xc6\x06\x8e\x0e\xc6\x06'i\x90\xd4\x835\xf0\xa4Z#>\xe7\xbb\x92r\x8c" - b'"\xe7\xfbJ7\xed\xa6-\xb1\x01\xeb\x9a\xd8@~o\xf1\x121A\xbdI\xf4n6\xe7\x8f\r' - b"\xa0\xaf\x1b\xa8\xado+9\xe2+>\x7fJu\x16xy'^P\x97\x88Oc\xbcww\x11" - b'\xa1e\xf4\xb3\xb4\xe9?\x9a\\\x04\r@\xd6\xec\x1f\x8fU\x93W\x0e' - b'\x8d\xd7\xd9\xa9\xa6hN\xfbr\xfe\x94\xf6\x89\x86\xcfb\xb8\x80\xe3\x8d' - b'\xec;\x06Y7>\xbe\xbd\xe6W\xe3\x8b\xedn\xcd\xc3/\xb7\x9f\xd4\xee\xd1\xfe\x81' - b'\x16\x89y\x8b\xd7\x8c6\xfc=j\x8cN$\xa8\xb6\x10\x13}o\xfcc\x11\x9aK\x02A\x92@' - b'\\\x0b\x9fF\x9bxZm\x10\x8f#\xae\xaa\xd1k\\\xc5(Y\xf9i\x1e\x9f\x96' - b'\xac\x07\xee\x97\x8d\x8fQX\x02F\xf6%\x83\x87NP%#\xfb\xae\xa1M8\x92' - b'\x07\xc6\xea\xe7\xf7\xbf\xf5W&i\x1d\x03\xd1}4\x08$:C\xa7\x81\x89F\xb0' - b'\x12!\x7f\x1c7Osg:rY\xa4n\xd5)Q\x85Pn\xbe\xf7\xedc\xd7\xeah\xf6b&\xf9\xe8X' - b'\x15\xb0QWk\xf7y\xdb\x8d\xc2y[\xb3"=\xef/[\xd9\'\x95S\x17,\xbe\xc1)\xfe' - b'\xa9\xa1\xbc\xf3\x8b"\xf8p\xb7\x9f}\xf6\xc1\xc6\xc3\xb74\x06\xf6\xfa' - b'\xaaD\xc6\xd3\xa4\xaf\x81V k\xe1\xb0\x91\xfd9\xd6\x83PSn\xeet\xac4' - b'g\x8e\x1b\x95\x94\xb8]8cJ\x87\xe7\xa5\x7f\xd6\x90U\xa6|\xd0\xb0\x8ce&' - b'\x88\xc7\x92b=\x97\xf4*\xca\xb9\xe1\xb0e\x86\xc5]\x89\xd3\xe1PU>\xd2\xbf' - b'\xd2\x80\x08 \xfaZ\xa3\xa3\xd3\xea\xad\x14.\xa4g\x15\x80l\xb2A\xde\xea\x82W' - b'\x8fo\xf8\xae\x1f\xdcE\xcd\xb5=F\xa7\x13\xa8x\xa7o\xe4\x96\xeaMA\x1f+' - b'\x06k\xb6\x03\xe9\x1a\xddv\xc0\xf7\x85\xce\xd2\x84\xfb3\x17\xf0A\xdfV\xac$k' - b'\xb0\xcd\x8eM\t\xde\xa3F\xe0a\xa5\x9c~_%7\x1d\xad\xed\x85\x07\xaa\x8d\xec' - b'\x999h\xcb\xe8\x0f\xab\xb6\x00\x11\x9c"w\xc6\xe1&k\xb7\xfa\x9c\x12\x11&\xfc' - b'\x1e\xdc\x8fv\xcc\x1a\x06{\x02wf\xc4 b\xdd\xca\x01"\xb9d\xa5l"\xb9' - b'\xd7\x1f\xe1\xdd\x00\xae"\xa8\x90\x83\xbbX\xb1\x01F\x10M\xd0\xe7\x8c' - b'\x88\xd6J\x9dt\xb6\xde\xe8\xd0\x13\xee0M,3QL\xce\x85[~\x03.\xf0\x02Y\x87\xbd' - b'3\x07\xed9}\xc2\x9f\x9b\xf0\x02\xd3\xf5\xb7t\x04\xf3\xac\xc2\xfdAK\xfeh\xac' - b't\xfe=\xcb\x97\x13|\x11e[\x98\xe6\x90\x7f\xd2\x02Q\xf2\x14\xf34d\xbe\x9d' - b'\xab\xa6\t\x1e\xa2K\xd7\x92(PS\xc3E\xd9\xa8%j\xeazs\x8d\x9b\x850' - b'\xf5q\xb8\xfa^1\x84\xf0)I\xd0\x84\xf0t19cd\xef2\x1e\x0c\xc3\xf2\xc6\xd4\xd2M' - b'm*\xb49t!|1\x1c,\x9e.\x1f\x0b\x1b\xd9\xdc\x1cq\x0b\xe1\x9d\xc5\x7f.? q' - b'\xaeC\xf0S\xc9\x89\x9ee\x81\xa1z\xb3&\xfc\xd75\xf1(\x95\xf3\xa7\xe1\xec\xa5' - b'\x04\xdfH\xaf\xe2\x82LY\xaehL\x9b0\xfbj\x15R\x13\xd6h.=\x97\xd66\x9a\xdfL' - b'\xf2\xc7c%*\xf3d\x93\x9b\xb8H\xd4\x02\xe4H\xd0\n\x9eF\xfd\t\x91\x17\xa0' - b'\x95I\x99g\xff\x9b\xe3l\x94\x89\xb3\xb1\xa0\x8a\xa7o|J\xac\xd2\xb98YK' - b'<\xd6\xb3#*\x89\x91\xa3Q\x89\x89}\xa0\x06\x10\xd5\x88\x02|1\xf6P=\xbe' - b'\x8dR\x91\x97\xc8\x9a\xa0\xf5/iB\xd9\x189\x16\x15I\xac^\xac\xf5\x81>5' - b's\x8f\x95\x07\x01\x9a\xdc\x1d*x\xb4\x82\\\xfb\xcd\\\xee \xc4D\x1e\x9e\x91L' - b'\x0b\xf0\xec.\xd0\x8f\xa2\x9e\x8b\x99z.\xbeT"k;\x14\xe2i>\xcb\xc4y\x88\xabMn' - b'KT\x80W1\xe2\xf6\x02\x8f\xfe\xebD\xec+\xd0\x07Po\xc9G\\*\xbd\xaa' - b'\x98\x91\xeaBW#}\x8e\x91n.\xb0\xec\xbeN\xa4\xee\x02}\xcb\xd7\x91Ll' - b'\x9f+\x8c\xe7;\xfa\xfcS\xce\x10\x97\x085\xa25_\x8fG\xd3\x85\xd2\xc1\x05R' - b'b\x81\xf4\xf2\x02\xe9\xb7\x0b\xa4\xc9\x05\x12\x9e\x81:\x13\x7fB\x0c\x86' - b'\xb8h7b\xf9(W\xdc\xday~>\xfb\x1e\xf04\x14\xe0\xd4so\x8e\x97\xbb' - b'\xe3\x88\xb3\x89>#\xc1\x8a*DyD\xe4\xe9U\xed\x1b9\xb3\xc2\xf1|=:\x06\xd98\x11' - b'`A\xa6\xb3i\xc2\x0f\x83W\xe4\xb0\xfa{\xad\x1f\xa5\x97\xd9\x87\xed' - b'^\xa0\x98\xe7~\xccSW\x90\xe7\xf8\xc2\xcd\xd4J\xfb\x14h\xe7R\x11\xba' - b'\x0f\xfd\x9c\xd2~\x85Q\xadr\xadX\xa2\x9a\xd6\x92\x1a@k\xa7$\xe1\x9a\xf1\xe2' - b'\xdeo\xcc\\\xbbk\xbeo\xd4\xbb\x08\xad\xe3\x8e\xf8\xc8\x14\x94:V' - b'\xd7\xd9\xf3\x9c\xdd\xba\xba\xce\x96\xe7l\xdcj\xe6\xa4c\x97Xm\xdeA9\x96a' - b'\x08~\xae\xfdG`a_u\x14W\x99\xb6\xb1F#\x02\x9e\xf1\xf4\rwweK\xb2\x13\xcb\x91c\xfc\xf6J\xd7\x0e&\xb2c\xd9' + b'\x1b\x97\xf0\xd8\xa8]\xec\xbd\xb7w\x08\\\xee|\xbc' + b'b7\x15!\x8a\x99\xe2\x9092}\x8a\x92\xe8k\xab\xb9(9a\x11\xca;\x0b\xa2\xccS\x90' + b'9~\xb5\x06\xb1\x10\xc4\xf2\xd3\xe9E\xb2\xb3\x9b\x89\xbeMy@\x0f' + b'\xcc\xe1\x99\x8e\xd0~5\xce9\xa5\x01\xe5\x82\xba \xe0\x14/\xe0X\x9c\x1f\xa9Z' + b'\x84#\xc5\xd1\x9e\x1f\xad\xa3\x8e<\x16\xe3}\xc3\x00\x0e6:9\x07\xc0] \x92' + b'\x9ca\x18\xdfG2\xb2H\xd3F\x84\xb2\x81 S\xaa\x16INE[\x8f\xb5\xe6\x19\xd1J\xb3' + b'\xc9\x81\xee\xc1\xc0s\xa1J\x9f#\xf5Q\xa8H\x8a\xb8.\xf4\x8d\x84\xba\x98"\xb1' + b'\x12:\xeb~p{\xa9\x06\x1e\xaao\xef*\xd2Lr\x86\x9f\x0b\x91\xe86\xb9>' + b'\xbcM\xae\r\xf3\xb4\xd2\xd7\x9e\xfa8\xe4\x94.\xf4\x918x\x9a\xf5\xbbz\x04m' + b'\xa0u[\xaa\xe4l_\xeb\xbd\xa9\xfeV9uwkYj\xa3\xbc1P\xa5X\xa9o\x8a\xaawt\x15!' + b'\xe6s\xe9\x87[\xbf\x99\n\xc8\xbbZ\x85\x94\xd6\xfa/=\x10\xe8\xd0\xd0c\nZ' + b'\x82zg\xe7:\xb9B\x81\x8cm\x9ax\xbd\x1a\xa1\xc70\xfeH\x1f\xb89Z\n' + b'G\xfc\x84\xbf\xcf?\x12\x12|\xdd:\xdcBR_\x93\xeb5XJR\x1dr\xadf\xdc\x0c\x8d' + b'\xcc\x92\x93~\xa1sy\x17\x1b\xb6\xab\xe4Yh\x95uh!)V\xb3+\xd9qhi\xd1\xdb' + b'\x11G\x01\x15\xb4\x894\xb4,\xd1\x8d\xecw\x8dV\xb9)\xe0TX\xfa\xef4\xdb' + b'R\xab7\x05\x9a\xe5\xd2\xf0a\xed\xce\xf0_5\x8bk\x7f\xb8W\xab\n\xef\x95\xaa' + b'\xb4\xdf\xa3\xffB\x9d\xb8\x1b\xe4\xca\xf0=\x9a\x1d5c\xa8\xb1\xe8\x0c' + b'\xe5\x03\xa5a\xac\xa8\xf6\xf3t\xb9\\\x87\xd1m\xf4\xfd\xf4\xc0\xce\xc91h-L' + b'\x15\xb6\x1c?[\xd6\xb3\xb3fx\xcb\x991\x06\x8e\xa5\xeb\x81\xc0\xb3' + b'\xe9\x1d\xfe\x97\xfaG\xd3/\x85n\xf5\x8d\xa6\xc0\x93M-\x0e\x93\xd5/\xf4\x93v' + b"rtr\xec\xf94\xae\x0b\xae\xdd2\xec\xd9\x16\xa4\x06\xa4\xe5H^\xa4\r\xb8'" + b'\x0cc\xc6hD\xfe1\xe4\xd7!\x05\x90nC\xf9n\x1c#\xee*y\x91%\xa6D\xdc\x95\xf2' + b'&\xa8T\x11%\xf2\xa7\x91+\xf5}\x99\xeaU\xcb\xbaJE\x94\x89]\xeaU\xaa\xd4Eyi' + b'\x131\xbdbjI\x97],t\xc5\x90\xdb+\xc5\x94\x15\xee\xc3\xaa\x15\x1cb\xa9' + b'\xef\x8a\x1eSmh\x8b)6\xd9\x16\xe8U,\xeeCJ\x15v\x0f\\\xc4\x1dk\xf6\\\x04[' + b'\xeb-\xa4\x0c\xd2\xe3\x86\xe1\x98\x82\xa9\x0f\x11|\x85<\x9c\xac\xbc\xbf' + b'\xa23\xd1@\xa4\xca\xc1\x1f\xb8\xc8\x92\xaa\xfb\xbb,\x8cH\xf6\x93\xd89\xdckv' + b'\xe9\xdc\xc0\xe4P\x11\xee\x10\x88\x1b\xd9\xf6\x19\xc8\x9c\xcc\x19\xd9\xad3' + b'\xc5\x81\x05]N\xb5Ht*F\xf6W3\x14\xd7\xf9\x8a\xce7\xd2\x90\xc7\xf7E\n2\xcf\\' + b"6\xb9K)#;2s9m\xe6'\x0es\xa7#\x0e\xacK\x82:\xdcV\xd7\xa4\xc5\x91\x8c" + b'\xf5\x1d\xee\x8f\xf5\x9f\xa2AR\x83%zR\xad\x14\x9f\xf3]M9\x86\x91\xf3}' + b'\xa9\x9b~\x93\x96X\x9fuU\xac/\x7f\xe6x\x89\x98\xa0\xde$\xcen0\xf5G' + b'\xfap\xae\x1b\xa8\xad{\x139\xe4+\xd2?\xd3\x80\x08 ' + b'\xfaj\x9d\xa3\xcd\xea-\x13.\xa4\xa7\x15\x80l\xb2V\xde\xe4\x82W' + b'\x8e\xae\xfb\xb6\x1f\xdc\x05\rU\x9dF\x9b\x13\xa8x\x8fo\xe8\xf6\x8a\rA\x1f+' + b'\x06+\xb7\x00i\x1f\xde\xbc\xd7\xf7\xb9\xce\xd2\x84\xfb\xa2\x0b\xf8\xa0o' + b'\x13V\x925\xd8\x06\xc7\x86\x04\xefQ#\xf0\x88RB\xbf\xa7\x92\xdb\x0eWu\xc1' + b'w*\x8c\xec\x99\x19h\xce\xe8\x8f\xa8\xb6\x00\x11\x9c"w\xc6\xe1&\xab7\xf9\x9c' + b'\x12\x11\xc6\xfd\x1e<\x8f\xb6N\x1b\x06\xfb,\x9e\xcc\x88A\xc4\xba\x95' + b'\x00Dr\xc92\xd9Dr\xbf?\xc2\xbb\x01\\\x05P*\x07\xb7\xb3b-\x0c!' + b"\x9a\xa0\xcf\x19\x11\xade:ik\xba\xc5\xa1'\xdca\x9aXb\xa285\x13n\xfc5\xb8\xc0" + b'\x0bd\r\xf6\xce\x0c\xb4\xe4\xf4q\x7fn\xdc\x0bL\xfb\xdf\xd2\x11\xcc' + b'\xa3\xe0\xf9\xa0%#4\xd1\xf8\xc3\xd1\x8b\x96IR\x8c\xeb\xfdr\x9f\xb9\xe2=W' + b'\xd8%\x05\x94i\x08\xf9\xb1\xaeQ\xe6\x00\xc1\x9b)\x98\xab\xa0\x10\xbd' + b'i5\x89\x025\xf5\xcc\x01.\xcaF\xcd\xd5\xef\xc9\xb9z\x840\xf5q\xb8\x07O\x18BxD' + b'\x124!+\x0f\x02\xd4\xbb[U\xf0hsr\xed1s\xb9\x83\x10\x13y8' + b'(\x99\x1e\xe0\xd91\xc7>\x8cv.f\xda\xb9\xf8M\x12Y\xdd\xaa\x10O\xc3Y&\xceC\\' + b'\xadw[\xa2\x02\xbc\x82\x11\xb7\xcc\x99\xd1{\x83\x88\xdds\xec\x01\xb4' + b'[\xf2\x11o\x92^Q\xccH\xd5\xa1k\x91>\xc3H_\x9f\xe3\xd9q\x83H\x1ds\xec\x8d_' + b"E2\xb1}\xa60\x9eo\xe9\xb3\xbfr\x8a\xb8D\xa8\x14\xad\xf9z<\x9a\x9e+\xed\x9b'%" + b"\xe6I'\xe6I\xbf\x99'\x9d\x9a'\xe1\x9d\xa83\xf1'\xc4`\x88\x8bv \x96\x0fs\x85M" + b'm\xe7g\xb3\xef\x04O\xed\x1c\x9cz\xee\x8d\xb1\x12w\x1cq\xd6\xd3\x83\x12,+' + b'G\x94\x87D\x9e^\xb3\xbe\x9e3+\x1c\xcf\xd7\xa3\xb5\x9f\x8d\x13\x01\xe6e:\x9b' + b'&\xfc xE\x0e\xab\xbf\xcb\xfaaz\x89}\xd0\xee\x05\x8ay\x1e\xc4<\xd5s' + b'\xf2\x1c\x9d\x9f\xa7\xb9L\xf7\xce\xc9\xb3oN\x9e\x07\xfb\xdf\x9e\x97\xe3' + b'\x1c\xe6\xd8\x05\xbcX\x809\x06\xad\x1f\xe1;\x94U\x19\xd0\x92\x84\x0f' + b'\x164\x7f\xd0\xa3\x16\xa9\x9d!AzO]\xac\n\xd2\xc2P\xf1NA\xda\x17b' + b'%\xd4\x84\xa0X\x90\x1c=T\xea\x10=\xf8b\xdb\xac\xfeL]\xd8\xd3$\tb' + b'\x85\x14\xa1\x1b\x95jr\xd4\xc7\x9d\x8e\xf0\x9bU\x91\xb0\xd2f%B\x81\x8f\x93#' + b'>F\x97w\xc6\xc7\x9c}\x13!\x16_Z\x13x/\x88`\x18W3\xd7\x9e\x81\xc4\xcd\xaa\xde' + b'dTb\x95w0^5\xc3\xa9\x1e\xa9lC\xb3HQ#\xab\xcen\xb6\x8fU\x17\x84\xaa$' + b'F\xd9\xa3\xee\rQq\x0f\x8eK\xa5I\xfb$S%\xedV\xa0\x85KE\xe8n\x9c\xe7\x94\xf6' + b'(\x8cj\x95\xab\xc4"\xd5\xf4\x96\xd4\x00z;%\t\xf7\x8c\x17\xf7\xa71u\xfd' + b'\xed\xf9\xbeQ\xe3"\xb4\x9a;\xe4#\x13P\xecXYm\xcfsv\xeb\xcaj[\x9e\xb3q+' + b'\x99c\x8e\xedb\x85\xf9&\xe5X\x86!\xf8\xb9\xfe\xbf\x04\x0b\xbb+' + b'\xa2\xb8\xcb\xb4\xf5\x95\x1a\x11\xf0\xce\xa7\xaf\xe3\xad\x0bK\xaf\xea[\xeb' + b'\xf0\x15\x02\xb9\xe4)\x7f\xee\xa4\xf5\xe43~m\xfd\\\xbem\x99\xb0\xcc\x0bw\xc8' + b'\xe0\xeb\x1b\xe4\x07\x1e\x18\\\x9bg\xfa\x1e\xda1\xbc\xf6z\xe8\xb55' + b'\x0b\xa1~\x1fL\x95\xe4\x8c\xc7\xdf\xba0\xb3\xf6\xc2\xa5\x9cq)\xc7' + b'\xce\xac\xf8r\xd6!\x1f\x83\x7f8\xf4\xc0\xbdk\xda\xbd\xedB[{[\xdb2\xef' + b'\xca\xf6va9\xbf#\xf4\xf0\x9a;\xc5AA\xf0\x0exW\xf2\xeb\xbeq\xf7\x9a\xb6ks>' + b'\x05\xb0\xfe\x01\xe9\xbf\xce\xd1bf') # EOF diff --git a/misc/gpu/lcd.c b/misc/gpu/lcd.c index 6b599060..e63b042d 100644 --- a/misc/gpu/lcd.c +++ b/misc/gpu/lcd.c @@ -222,10 +222,14 @@ lcd_setup(void) // take_control() // // Make the shared SPI bus ours. All push-pull, because we need the speed. +// - force PIN_G_CTRL low while we are in control, so CPU knows we are actively +// speaking to the LCD // static void take_control(void) { + LL_GPIO_SetOutputPin(GPIOA, PIN_GPU_BUSY); + LL_GPIO_InitTypeDef init = {0}; init.Pin = SPI_PINS; @@ -263,6 +267,8 @@ release_control(void) init.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOA, &init); + + LL_GPIO_ResetOutputPin(GPIOA, PIN_GPU_BUSY); } // send_window() diff --git a/misc/gpu/main.c b/misc/gpu/main.c index 640165e3..830082da 100644 --- a/misc/gpu/main.c +++ b/misc/gpu/main.c @@ -32,16 +32,15 @@ gpio_setup(void) LL_GPIO_Init(GPIOA, &init); -#if 0 - // setup shared open-drain pins - init.Pin = OUTPUT_OD_PINS; + // one output PIN: tells CPU we are controlling the bus + init.Pin = OUTPUT_PINS; init.Mode = LL_GPIO_MODE_OUTPUT; - init.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; init.Speed = LL_GPIO_SPEED_FREQ_HIGH; init.Pull = LL_GPIO_PULL_NO; - LL_GPIO_Init(GPIOA, &init); -#endif + + // clear output signal + LL_GPIO_ResetOutputPin(GPIOA, PIN_GPU_BUSY); } // i2c_setup() diff --git a/misc/gpu/main.h b/misc/gpu/main.h index 7326791e..45132008 100644 --- a/misc/gpu/main.h +++ b/misc/gpu/main.h @@ -23,8 +23,10 @@ #define PIN_DATA_CMD LL_GPIO_PIN_3 #define PIN_CS LL_GPIO_PIN_4 #define PIN_TEAR LL_GPIO_PIN_5 +#define PIN_GPU_BUSY LL_GPIO_PIN_14 // G_SWCLK_B0 pin to CPU #define INPUT_PINS (PIN_TEAR | PIN_G_CTRL) +#define OUTPUT_PINS (PIN_GPU_BUSY) #define SPI_PINS (PIN_MOSI | PIN_SCLK) #define SPI_CTRL_PINS (PIN_DATA_CMD | PIN_CS) diff --git a/misc/gpu/version.h b/misc/gpu/version.h index 87e0ec87..1ec4c412 100644 --- a/misc/gpu/version.h +++ b/misc/gpu/version.h @@ -5,7 +5,7 @@ #include // Public version number for humans. Lots more version data added by Makefile. -#define RELEASE_VERSION "1.2.1" +#define RELEASE_VERSION "1.3.0" extern const char version_string[];