blob: 184a7593cbe3bf6990f6bbb4328477435ce0e783 [file] [log] [blame]
[ifdef] cl4
\ This value has the same effect as the value below. The
\ difference is that the SCLK_SOURCE_SELECT field added a
\ low-order bit (bit 29), so the high nibble changed from
\ 2 to 4 even though the field value is still 1.
h# 20001102 value clkdiv \ Display Clock 1 / 2 -> 56.93 MHz
[else]
h# 40001102 value clkdiv \ Display Clock 1 / 2 -> 56.93 MHz
[then]
h# 00000700 value pmua-disp-clk-sel \ PLL1 / 7 -> 113.86 MHz
d# 8 value hsync \ Sync width
d# 1200 value hdisp \ Display width
d# 1256 value htotal \ Display + FP + Sync + BP
d# 24 value hbp \ Back porch
d# 3 value vsync \ Sync width
d# 900 value vdisp \ Display width
d# 912 value vtotal \ Display + FP + Sync + BP
d# 5 value vbp \ Back porch
: hfp ( -- n ) htotal hdisp - hsync - hbp - ; \ 24
: vfp ( -- n ) vtotal vdisp - vsync - vbp - ; \ 4
0 [if]
3 constant #lanes
3 constant bytes/pixel
d# 24 constant bpp
[else]
2 constant #lanes
2 constant bytes/pixel
d# 16 constant bpp
[then]
: >bytes ( pixels -- chunks ) bytes/pixel * ;
: >chunks ( pixels -- chunks ) >bytes #lanes / ;
: lcd@ ( offset -- l ) lcd-pa + io@ ;
: lcd! ( l offset -- ) lcd-pa + io! ;
: init-lcd ( -- )
\ Turn on clocks
\ New: d12bf
h# 08 pmua-disp-clk-sel + h# 28284c io!
h# 09 pmua-disp-clk-sel + h# 28284c io!
h# 19 pmua-disp-clk-sel + h# 28284c io!
h# 1b pmua-disp-clk-sel + h# 28284c io!
\ New: d12bf h# 282910 io!
0 h# 190 lcd! \ Disable LCD DMA controller
diagfb-pa h# f4 lcd! \ Frame buffer area 0
0 h# f8 lcd! \ Frame buffer area 1
hdisp bytes/pixel * h# fc lcd! \ Pitch in bytes
hdisp vdisp wljoin dup h# 104 lcd! dup h# 108 lcd! h# 118 lcd! \ size, size after zoom, disp
htotal >chunks vtotal wljoin h# 114 lcd! \ SPUT_V_H_TOTAL
htotal >chunks hdisp - hbp >chunks - 6 - ( low )
hbp >chunks wljoin h# 11c lcd!
vfp vbp wljoin h# 120 lcd!
h# 2000FF00 h# 194 lcd! \ DMA CTRL 1 \ New: NOT
\ New: d not 2000000d
h# 2000000d h# 1b8 lcd! \ Dumb panel controller - 18 bit RGB666 on LDD[17:0]
\ New: a000a not 01330133
h# 01330133 h# 13c lcd! \ Panel VSYNC Pulse Pixel Edge Control
clkdiv h# 1a8 lcd! \ Clock divider
\ h# 08021100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 24 bpp mode
h# 08001100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 16 bpp mode
;
: normal-hsv ( -- )
\ The brightness range is from ffff (-255) to 00ff (255) - 8 bits sign-extended
\ 0 is the median value
h# 0000.4000 h# 1ac lcd! \ Brightness.contrast 0 is normal brightness, 4000 is 1.0 contrast
h# 2000.4000 h# 1b0 lcd! \ Multiplier(1).Saturation(1)
h# 0000.4000 h# 1b4 lcd! \ HueSine(0).HueCosine(1)
;
: clear-unused-regs ( -- )
0 h# 0c4 lcd! \ Frame 0 U
0 h# 0c8 lcd! \ Frame 0 V
0 h# 0cc lcd! \ Frame 0 Command
0 h# 0d0 lcd! \ Frame 1 Y
0 h# 0d4 lcd! \ Frame 1 U
0 h# 0d8 lcd! \ Frame 1 V
0 h# 0dc lcd! \ Frame 1 Command
0 h# 0e4 lcd! \ U and V pitch
0 h# 130 lcd! \ Color key Y
0 h# 134 lcd! \ Color key U
0 h# 138 lcd! \ Color key V
;
: centered ( w h -- )
hdisp third - 2/ ( w h x ) \ X centering offset
vdisp third - 2/ ( w h x y ) \ Y centering offset
wljoin h# 0e8 lcd! ( w h )
wljoin dup h# 0ec lcd! ( h.w ) \ Source size
h# 0f0 lcd! ( ) \ Zoomed size
;
: zoomed ( w h -- )
0 h# 0e8 lcd! ( w h ) \ No offset when zooming
wljoin h# 0ec lcd! ( ) \ Source size
hdisp vdisp wljoin h# 0f0 lcd! ( ) \ Zoom to fill screen
;
defer placement ' zoomed is placement
: set-video-alpha ( 0..ff -- )
8 lshift ( xx00 )
h# 194 lcd@ ( xx00 regval )
h# ff00 invert and ( xx00 regval' )
or ( regval' )
h# 194 lcd! ( )
;
\ 0:RBG565 1:RGB1555 2:RGB888packed 3:RGB888unpacked 4:RGBA888
\ 5:YUV422packed 6:YUV422planar 7:YUV420planar 8:SmartPanelCmd
\ 9:Palette4bpp A:Palette8bpp B:RGB888A
: set-video-mode ( mode -- )
d# 20 lshift ( x00000 )
h# 190 lcd@ ( x00000 regval )
h# f00000 invert and ( x00000 regval' )
or ( regval' )
h# 190 lcd! ( )
;
: video-on ( -- ) h# 190 lcd@ 1 or h# 190 lcd! ;
: video-off ( -- ) h# 190 lcd@ 1 invert and h# 190 lcd! ;
: set-video-dma-adr ( adr -- ) h# 0c0 lcd! ;
\ Assumes RGB565
: start-video ( adr w h -- )
clear-unused-regs normal-hsv ( adr w h )
over 2* h# 0e0 lcd! ( adr w h ) \ Pitch - width * 2 bytes/pixel
placement ( adr )
set-video-dma-adr ( ) \ Video buffer
0 set-video-mode ( ) \ RGB565
d# 255 set-video-alpha ( ) \ Opaque video
video-on
;
: stop-video ( -- ) video-off ;