#include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "ureg.h" #include "../port/error.h" #define Image IMAGE #include #include #include #include "screen.h" enum { Wid = 320, Ht = 240, Pal0 = 0x2000, /* 16-bit pixel data in active mode (12 in passive) */ hsw = 0x4, elw = 0x11, blw = 0xc, vsw = 0x3, efw = 0x1, bfw = 0xa, pcd = 0x10, }; struct sa1110fb { /* Frame buffer for 16-bit active color */ short palette[16]; /* entry 0 set to Pal0, the rest to 0 */ ushort pixel[Wid*Ht]; /* Pixel data */ } *framebuf; enum { /* LCD Control Register 0, lcd->lccr0 */ LEN = 0, /* 1 bit */ CMS = 1, /* 1 bit */ SDS = 2, /* 1 bit */ LDM = 3, /* 1 bit */ BAM = 4, /* 1 bit */ ERM = 5, /* 1 bit */ PAS = 7, /* 1 bit */ BLE = 8, /* 1 bit */ DPD = 9, /* 1 bit */ PDD = 12, /* 8 bits */ }; enum { /* LCD Control Register 1, lcd->lccr1 */ PPL = 0, /* 10 bits */ HSW = 10, /* 6 bits */ ELW = 16, /* 8 bits */ BLW = 24, /* 8 bits */ }; enum { /* LCD Control Register 2, lcd->lccr2 */ LPP = 0, /* 10 bits */ VSW = 10, /* 6 bits */ EFW = 16, /* 8 bits */ BFW = 24, /* 8 bits */ }; enum { /* LCD Control Register 3, lcd->lccr3 */ PCD = 0, /* 8 bits */ ACB = 8, /* 8 bits */ API = 16, /* 4 bits */ VSP = 20, /* 1 bit */ HSP = 21, /* 1 bit */ PCP = 22, /* 1 bit */ OEP = 23, /* 1 bit */ }; enum { /* LCD Status Register, lcd->lcsr */ LFD = 0, /* 1 bit */ BAU = 1, /* 1 bit */ BER = 2, /* 1 bit */ ABC = 3, /* 1 bit */ IOL = 4, /* 1 bit */ IUL = 5, /* 1 bit */ OIU = 6, /* 1 bit */ IUU = 7, /* 1 bit */ OOL = 8, /* 1 bit */ OUL = 9, /* 1 bit */ OOU = 10, /* 1 bit */ OUU = 11, /* 1 bit */ }; struct sa1110regs { ulong lccr0; /* 0xb0100000 */ ulong lcsr; /* 0xb0100004 */ ulong dummies[2]; /* unused 0xb0100008 and 0xb010000c */ short* dbar1; /* 0xb0100010 */ ulong dcar1; /* 0xb0100014 */ ulong dbar2; /* 0xb0100018 */ ulong dcar2; /* 0xb010001c */ ulong lccr1; /* 0xb0100020 */ ulong lccr2; /* 0xb0100024 */ ulong lccr3; /* 0xb0100028 */ } *lcd; Point ZP = {0, 0}; static Memimage xgscreen = { { 0, 0, Wid, Ht }, /* r */ { 0, 0, Wid, Ht }, /* clipr */ 16, /* depth */ 1, /* nchan */ RGB16, /* chan */ nil, /* cmap */ nil, /* data */ 0, /* zero */ Wid/2, /* width */ 0, /* layer */ Frepl, /* flags */ }; Memimage *gscreen; Memimage *conscol; Memimage *back; Memimage *hwcursor; static void lcdinit(void) { lcd = (struct sa1110regs*)0xb0100000; lcd->dbar1 = framebuf->palette; lcd->lccr3 = (pcd << PCD) | (0 << ACB) | (0 << API) | (1 << VSP) | (1 << HSP); lcd->lccr2 = ((Ht-1) << LPP) | (vsw << VSW) | (efw << EFW) | (bfw << BFW); lcd->lccr1 = (Wid << PPL) | (hsw << HSW) | (elw << ELW) | (blw << BLW); lcd->lccr0 = 1<palette, 0, sizeof framebuf->palette); framebuf->palette[0] = Pal0; lcdinit(); gscreen = &xgscreen; gscreen->data = (struct Memdata *)framebuf->pixel; } void flushmemscreen(Rectangle) { } /* * export screen to devdraw */ uchar* attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) { *r = gscreen->r; *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; *softscreen = 0; return (uchar*)gscreen->data; } void getcolor(ulong p, ulong* pr, ulong* pg, ulong* pb) { USED(p, pr, pg, pb); } int setcolor(ulong p, ulong r, ulong g, ulong b) { USED(p,r,g,b); return 0; } void blankscreen(int blank) { USED(blank); } void screenputs(char *s, int n) { USED(s, n); }