157172Sutashiro /*
2*63260Sbostic * Copyright (c) 1992, 1993
3*63260Sbostic * The Regents of the University of California. All rights reserved.
457172Sutashiro *
557172Sutashiro * This code is derived from software contributed to Berkeley by
657172Sutashiro * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
757172Sutashiro *
857172Sutashiro * %sccs.include.redist.c%
957172Sutashiro *
1057605Sutashiro * from: $Hdr: fbbm_253.c,v 4.300 91/06/09 06:33:12 root Rel41 $ SONY;
1157172Sutashiro *
12*63260Sbostic * @(#)fbbm_253.c 8.1 (Berkeley) 06/11/93
1357172Sutashiro */
1457172Sutashiro
1557172Sutashiro /*
1657172Sutashiro * NWB-253 frame buffer driver
1757172Sutashiro */
1857172Sutashiro
1957172Sutashiro #include "nwb253.h"
2057172Sutashiro
2157172Sutashiro #if NNWB253 > 0
2257178Sutashiro #include <sys/param.h>
2357178Sutashiro #include <news3400/iop/framebuf.h>
2457178Sutashiro #include <news3400/iop/fbreg.h>
2557172Sutashiro
2657178Sutashiro #include <news3400/fb/fbdefs.h>
2757172Sutashiro
2857172Sutashiro extern int error();
2957172Sutashiro extern int nofunc();
3057172Sutashiro extern char *ext_fnt24_addr[];
3157172Sutashiro extern char *ext_fnt_addr[];
3257172Sutashiro
3357172Sutashiro extern short zero[];
3457172Sutashiro
3557172Sutashiro #define NOP { int j; for (j = 0; j < 40; j++); }
3657172Sutashiro
3757172Sutashiro #define VRAM_START (unsigned int *)(0x88000000)
3857172Sutashiro #define VRAM_WIDTH (2048/32)
3957172Sutashiro
4060002Sutashiro void
nwb253attach(i)4160002Sutashiro nwb253attach(i)
4260002Sutashiro {
4360002Sutashiro /* temporary hack for pseudo-device initialization */;
4460002Sutashiro }
4560002Sutashiro
4657172Sutashiro static caddr_t
fb253_Krom_addr(fb,c,sr)4757172Sutashiro fb253_Krom_addr(fb, c, sr)
4857172Sutashiro struct fbdev *fb;
4957172Sutashiro register int c;
5057172Sutashiro lRectangle *sr;
5157172Sutashiro {
5257172Sutashiro unsigned int cvcode16();
5357172Sutashiro
5457172Sutashiro if ((c >= 0x20) && (c <= 0x7e)) {
5557172Sutashiro /*
5657172Sutashiro * ASCII char
5757172Sutashiro */
5857172Sutashiro c -= ' ';
5957172Sutashiro c = ((c & 0x1f) | ((c & 0xe0) << 2)) << 7;
6057172Sutashiro return (caddr_t)(c + fb->Krom_base + (sr->extent.y > 16 ? 0 : 96));
6157172Sutashiro } else if ((c >= 0xa1) && (c <= 0xdf)) {
6257172Sutashiro /*
6357172Sutashiro * KANA char
6457172Sutashiro */
6557172Sutashiro if (sr->extent.y > 16)
6657172Sutashiro return ((caddr_t)ext_fnt24_addr[c + 64]);
6757172Sutashiro else
6857172Sutashiro return ((caddr_t)ext_fnt_addr[c + 64]);
6957172Sutashiro } else if ((c >= 0x2020) && (c <= 0x7e7e)) {
7057172Sutashiro /*
7157172Sutashiro * KANJI char
7257172Sutashiro */
7357172Sutashiro switch (c & 0x7000) {
7457172Sutashiro case 0x2000:
7557172Sutashiro c = ((c&0x1f)|((c&0x60)<<5)|((c&0x700)>>1))<<7;
7657172Sutashiro break;
7757172Sutashiro case 0x3000:
7857172Sutashiro case 0x4000:
7957172Sutashiro c = ((c&0x7f)|((c&0xf00)>>1)|((c&0x4000)>>3))<<7;
8057172Sutashiro break;
8157172Sutashiro case 0x5000:
8257172Sutashiro case 0x6000:
8357172Sutashiro c = ((c&0x7f)|((c&0xf00)>>1)|((c&0x2000)>>2)|0x1000)<<7;
8457172Sutashiro break;
8557172Sutashiro case 0x7000:
8657172Sutashiro c = ((c&0x1f)|((c&0x60)<<5)|((c&0x700)>>1)|0x1000)<<7;
8757172Sutashiro break;
8857172Sutashiro }
8957172Sutashiro return (caddr_t)(c + fb->Krom_base + (sr->extent.y > 16 ? 0 : 96));
9057172Sutashiro } else {
9157172Sutashiro /*
9257172Sutashiro * UNKNOWN char
9357172Sutashiro */
9457172Sutashiro return (caddr_t)zero;
9557172Sutashiro }
9657172Sutashiro }
9757172Sutashiro
9857172Sutashiro static int
fb253_set_dimmer(fb,dim)9957172Sutashiro fb253_set_dimmer(fb, dim)
10057172Sutashiro struct fbdev *fb;
10157172Sutashiro int dim;
10257172Sutashiro {
10357172Sutashiro int s;
10457172Sutashiro
10557172Sutashiro fb->status_flag = (fb->status_flag & 0xf3) | ((dim & 3) << 2);
10657172Sutashiro *(volatile u_short *)(0xb8ff0000) = fb->status_flag;
10757172Sutashiro
10857172Sutashiro return (FB_ROK);
10957172Sutashiro }
11057172Sutashiro
11157172Sutashiro static int
fb253_get_dimmer(fb)11257172Sutashiro fb253_get_dimmer(fb)
11357172Sutashiro struct fbdev *fb;
11457172Sutashiro {
11557172Sutashiro int dim;
11657172Sutashiro
11757172Sutashiro dim = (fb->status_flag >> 2) & 3;
11857172Sutashiro return (dim);
11957172Sutashiro }
12057172Sutashiro
12157172Sutashiro int
fb253_get_pixel(fb,pixel)12257172Sutashiro fb253_get_pixel(fb, pixel)
12357172Sutashiro struct fbdev *fb;
12457172Sutashiro register int pixel;
12557172Sutashiro {
12657172Sutashiro return (pixel);
12757172Sutashiro }
12857172Sutashiro
12957172Sutashiro fb253_ioctl(fb, cmd, data)
13057172Sutashiro struct fbdev *fb;
13157172Sutashiro int cmd;
13257172Sutashiro int *data;
13357172Sutashiro {
13457172Sutashiro register int result = 0;
13557172Sutashiro
13657172Sutashiro switch (cmd) {
13757172Sutashiro case FB_INTCHECK:
13857172Sutashiro if (*(volatile u_short *)(0xb8ff0000) & 0x08)
13957172Sutashiro result |= FB_INT_VSYNC;
14057172Sutashiro break;
14157172Sutashiro case FB_INTENABLE:
14257172Sutashiro if (*data & FB_INT_VSYNC) {
14357172Sutashiro fb->status_flag |= 1;
14457172Sutashiro *(volatile u_short *)(0xb8ff0000) = fb->status_flag;
14557172Sutashiro WB_FLUSH;
14657172Sutashiro }
14757172Sutashiro break;
14857172Sutashiro case FB_INTCLEAR:
14957172Sutashiro if (*data & FB_INT_VSYNC) {
15057172Sutashiro fb->status_flag &= ~1;
15157172Sutashiro *(volatile u_short *)(0xb8ff0000) = fb->status_flag;
15257172Sutashiro WB_FLUSH;
15357172Sutashiro }
15457172Sutashiro break;
15557172Sutashiro case FB_STATUSCHECK:
15657172Sutashiro break;
15757172Sutashiro default:
15857172Sutashiro result = -1;
15957172Sutashiro }
16057172Sutashiro return (result);
16157172Sutashiro }
16257172Sutashiro
16357172Sutashiro int
fb253_get_page(fb,off)16457172Sutashiro fb253_get_page(fb, off)
16557172Sutashiro struct fbdev *fb;
16657172Sutashiro off_t off;
16757172Sutashiro {
16857172Sutashiro if (off < 2048/8 * 2048) /* X/8 * Y */
16957172Sutashiro return (((unsigned int)0x8000000 + off) >> PGSHIFT);
17057172Sutashiro else
17157172Sutashiro return (-1);
17257172Sutashiro }
17357172Sutashiro
17457172Sutashiro int
fb253_probe(unit)17557172Sutashiro fb253_probe(unit)
17657172Sutashiro int unit;
17757172Sutashiro {
17857172Sutashiro if (unit >= NNWB253)
17957172Sutashiro return 0;
18057172Sutashiro if (badaddr(0xb8ff0000, 2) || badaddr(0xb8e00000, 2))
18157172Sutashiro return 0;
18257172Sutashiro if ((*(volatile u_short *)(0xb8ff0000) & 7) == 4)
18357172Sutashiro return FB_NWB253;
18457172Sutashiro return 0;
18557172Sutashiro }
18657172Sutashiro
18757172Sutashiro void fbmem_rop_init();
18857172Sutashiro void fbmem_rop_copy();
18957172Sutashiro void fbmem_rop_winit();
19057172Sutashiro void fbmem_rop_write();
19157172Sutashiro void fbmem_rop_read();
19257172Sutashiro void fbmem_rop_cinit();
19357172Sutashiro void fbmem_rop_clear();
19457172Sutashiro void fbmem_rop_vect();
19557172Sutashiro void fbmem_rop_dot();
19657172Sutashiro
19757172Sutashiro static struct fbdev_ops
19857172Sutashiro fb253_ops = {
19957172Sutashiro fbmem_rop_init,
20057172Sutashiro fbmem_rop_copy,
20157172Sutashiro fbmem_rop_winit,
20257172Sutashiro fbmem_rop_write,
20357172Sutashiro fbmem_rop_read,
20457172Sutashiro fbmem_rop_cinit,
20557172Sutashiro fbmem_rop_clear,
20657172Sutashiro fbmem_rop_vect,
20757172Sutashiro fbmem_rop_dot,
20857172Sutashiro (void (*)())nofunc,
20957172Sutashiro (void (*)())error,
21057172Sutashiro (void (*)())error,
21157172Sutashiro fb253_Krom_addr,
21257172Sutashiro (void (*)())error,
21357172Sutashiro error,
21457172Sutashiro error,
21557172Sutashiro fb253_get_pixel,
21657172Sutashiro fb253_set_dimmer,
21757172Sutashiro fb253_get_dimmer,
21857172Sutashiro nofunc,
21957172Sutashiro nofunc,
22057172Sutashiro fb253_ioctl,
22157172Sutashiro fb253_get_page,
22257172Sutashiro (void (*)())nofunc,
22357172Sutashiro (void (*)())nofunc,
22457172Sutashiro (void (*)())nofunc,
22557172Sutashiro (void (*)())nofunc,
22657172Sutashiro };
22757172Sutashiro
22857172Sutashiro static u_short
22957172Sutashiro nwp512_data1[] = {
23057172Sutashiro 0x00, 0x44,
23157172Sutashiro 0x01, 0x33,
23257172Sutashiro 0x02, 0x3c,
23357172Sutashiro 0x03, 0x38,
23457172Sutashiro 0x04, 0x84,
23557172Sutashiro 0x05, 0x03,
23657172Sutashiro 0x06, 0x80,
23757172Sutashiro 0x07, 0x80,
23857172Sutashiro 0x08, 0x10,
23957172Sutashiro 0x09, 0x07,
24057172Sutashiro 0x0a, 0x20,
24157172Sutashiro 0x0c, 0x00,
24257172Sutashiro 0x0d, 0x00,
24357172Sutashiro 0x1b, 0x03
24457172Sutashiro };
24557172Sutashiro
24657172Sutashiro static u_short
24757172Sutashiro nwp512_data2[] = {
24857172Sutashiro 0x1e, 0x08,
24957172Sutashiro 0x20, 0x08,
25057172Sutashiro 0x21, 0x0d
25157172Sutashiro };
25257172Sutashiro
25357172Sutashiro static u_short
25457172Sutashiro nwp518_data1[] = {
25557172Sutashiro 0x00, 0x52,
25657172Sutashiro 0x01, 0x40,
25757172Sutashiro 0x02, 0x4a,
25857172Sutashiro 0x03, 0x49,
25957172Sutashiro 0x04, 0x63,
26057172Sutashiro 0x05, 0x02,
26157172Sutashiro 0x06, 0x60,
26257172Sutashiro 0x07, 0x60,
26357172Sutashiro 0x08, 0x10,
26457172Sutashiro 0x09, 0x07,
26557172Sutashiro 0x0a, 0x20,
26657172Sutashiro 0x0c, 0x00,
26757172Sutashiro 0x0d, 0x00,
26857172Sutashiro 0x1b, 0x04
26957172Sutashiro };
27057172Sutashiro
27157172Sutashiro static u_short
27257172Sutashiro nwp518_data2[] = {
27357172Sutashiro 0x1e, 0x08,
27457172Sutashiro 0x20, 0x00,
27557172Sutashiro 0x21, 0x00
27657172Sutashiro };
27757172Sutashiro
27857172Sutashiro static u_short
27957172Sutashiro nwe501_data1[] = {
28057172Sutashiro 0x00, 0x4b,
28157172Sutashiro 0x01, 0x40,
28257172Sutashiro 0x02, 0x4a,
28357172Sutashiro 0x03, 0x43,
28457172Sutashiro 0x04, 0x64,
28557172Sutashiro 0x05, 0x02,
28657172Sutashiro 0x06, 0x60,
28757172Sutashiro 0x07, 0x60,
28857172Sutashiro 0x08, 0x10,
28957172Sutashiro 0x09, 0x07,
29057172Sutashiro 0x0a, 0x20,
29157172Sutashiro 0x0c, 0x00,
29257172Sutashiro 0x0d, 0x00,
29357172Sutashiro 0x1b, 0x04
29457172Sutashiro };
29557172Sutashiro
29657172Sutashiro static u_short
29757172Sutashiro nwe501_data2[] = {
29857172Sutashiro 0x1e, 0x08,
29957172Sutashiro 0x20, 0x00,
30057172Sutashiro 0x21, 0x00
30157172Sutashiro };
30257172Sutashiro
30357172Sutashiro static u_short
30457172Sutashiro *crtc_data[3][2] = {
30557172Sutashiro nwp512_data1, nwp512_data2,
30657172Sutashiro nwp518_data1, nwp518_data2,
30757172Sutashiro nwe501_data1, nwe501_data2,
30857172Sutashiro };
30957172Sutashiro
31057172Sutashiro static void
fb253_init(fb,id)31157172Sutashiro fb253_init(fb, id)
31257172Sutashiro struct fbdev *fb;
31357172Sutashiro int id;
31457172Sutashiro {
31557172Sutashiro register int i;
31657172Sutashiro register volatile u_short *ctlreg = (u_short *)(0xb8ff0000);
31757172Sutashiro register volatile u_short *crtreg = (u_short *)(0xb8fe0000);
31857172Sutashiro register volatile u_short *p;
31957172Sutashiro u_short dummy;
32057172Sutashiro
32157172Sutashiro *ctlreg = 0; /* stop crtc */
32257172Sutashiro NOP;
32357172Sutashiro
32457172Sutashiro /* initialize crtc without R3{0,1,2} */
32557172Sutashiro p = crtc_data[id][0];
32657172Sutashiro for (i = 0; i < 28; i++) {
32757172Sutashiro *crtreg++ = *p++;
32857172Sutashiro NOP;
32957172Sutashiro }
33057172Sutashiro
33157172Sutashiro *ctlreg = 0x02; /* start crtc */
33257172Sutashiro NOP;
33357172Sutashiro
33457172Sutashiro /* set crtc control reg */
33557172Sutashiro p = crtc_data[id][1];
33657172Sutashiro for (i = 0; i < 6; i++) {
33757172Sutashiro *crtreg++ = *p++;
33857172Sutashiro NOP;
33957172Sutashiro }
34057172Sutashiro }
34157172Sutashiro
34257172Sutashiro struct mfbdev fb253 = { (caddr_t)VRAM_START, VRAM_WIDTH };
34357172Sutashiro
34457172Sutashiro void
fb253_setup(fb)34557172Sutashiro fb253_setup(fb)
34657172Sutashiro struct fbdev *fb;
34757172Sutashiro {
34857172Sutashiro int id;
34957172Sutashiro
35057172Sutashiro if (fb->type) {
35157172Sutashiro fb->Mono = 1;
35257172Sutashiro fb->Colorwidth = 1;
35357172Sutashiro fb->fbNplane = 1;
35457172Sutashiro fb->planemask = 0x1;
35557172Sutashiro fb->Dimmer = 1;
35657172Sutashiro
35757172Sutashiro id = ((*(volatile u_short *)(0xb8ff0000)) >> 8) & 0xf;
35857172Sutashiro
35957172Sutashiro switch (id) {
36057172Sutashiro case 0:
36157172Sutashiro fb->FrameRect.extent.x = 2048;
36257172Sutashiro fb->FrameRect.extent.y = 2048;
36357172Sutashiro fb->VisRect.extent.x = 816;
36457172Sutashiro fb->VisRect.extent.y = 1024;
36557172Sutashiro fb->cursorP.x = 816/2;
36657172Sutashiro fb->cursorP.y = 1024/2;
36757172Sutashiro fb->font_w = 8;
36857172Sutashiro fb->font_h = 16;
36957172Sutashiro fb->char_w = 10;
37057172Sutashiro fb->char_h = 24;
37157172Sutashiro fb->scr_w = 816;
37257172Sutashiro fb->scr_h = 1024;
37357172Sutashiro fb->ch_pos = 5;
37457172Sutashiro fb->ul_pos = 22;
37557172Sutashiro fb->x_offset = 8;
37657172Sutashiro fb->y_offset = 8;
37757172Sutashiro fb->rit_m = 80;
37857172Sutashiro fb->btm_m = 42;
37957172Sutashiro break;
38057172Sutashiro case 1:
38157172Sutashiro case 2:
38257172Sutashiro fb->FrameRect.extent.x = 2048;
38357172Sutashiro fb->FrameRect.extent.y = 2048;
38457172Sutashiro fb->VisRect.extent.x = 1024;
38557172Sutashiro fb->VisRect.extent.y = 768;
38657172Sutashiro fb->cursorP.x = 1024/2;
38757172Sutashiro fb->cursorP.y = 768/2;
38857172Sutashiro fb->font_w = 8;
38957172Sutashiro fb->font_h = 16;
39057172Sutashiro fb->char_w = 12;
39157172Sutashiro fb->char_h = 22;
39257172Sutashiro fb->scr_w = 1024;
39357172Sutashiro fb->scr_h = 768;
39457172Sutashiro fb->ch_pos = 2;
39557172Sutashiro fb->ul_pos = 20;
39657172Sutashiro fb->x_offset = 32;
39757172Sutashiro fb->y_offset = 21;
39857172Sutashiro fb->rit_m = 80;
39957172Sutashiro fb->btm_m = 33;
40057172Sutashiro break;
40157172Sutashiro }
40257172Sutashiro fb->FrameRect.origin.x = 0;
40357172Sutashiro fb->FrameRect.origin.y = 0;
40457172Sutashiro fb->VisRect.origin.x = 0;
40557172Sutashiro fb->VisRect.origin.y = 0;
40657172Sutashiro fb->Krom_BM0.type = BM_MEM;
40757172Sutashiro fb->Krom_BM0.depth = 1;
40857172Sutashiro fb->Krom_BM0.width = 1;
40957172Sutashiro fb->Krom_BM0.rect.origin.x = 0;
41057172Sutashiro fb->Krom_BM0.rect.origin.y = 0;
41157172Sutashiro fb->Krom_BM0.rect.extent.x = 16;
41257172Sutashiro fb->Krom_BM0.rect.extent.y = 16;
41357172Sutashiro fb->Krom_BM1.type = BM_MEM;
41457172Sutashiro fb->Krom_BM1.depth = 1;
41557172Sutashiro fb->Krom_BM1.width = 2;
41657172Sutashiro fb->Krom_BM1.rect.origin.x = 0;
41757172Sutashiro fb->Krom_BM1.rect.origin.y = 0;
41857172Sutashiro fb->Krom_BM1.rect.extent.x = 24;
41957172Sutashiro fb->Krom_BM1.rect.extent.y = 24;
42057172Sutashiro fb->Krom_base = (char *)(0xb8e00000);
42157172Sutashiro fb->Krom_font_extent0.x = 16;
42257172Sutashiro fb->Krom_font_extent0.y = 16;
42357172Sutashiro fb->Krom_font_extent1.x = 24;
42457172Sutashiro fb->Krom_font_extent1.y = 24;
42557172Sutashiro fb->cursorSet = 0;
42657172Sutashiro fb->cursorVis = 0;
42757172Sutashiro fb->cursorShow = 0;
42857172Sutashiro fb->status_flag = 2;
42957172Sutashiro fb->run_flag = 0;
43057172Sutashiro fb->hard_cursor = 0;
43157172Sutashiro
43257172Sutashiro fb->fbbm_op = &fb253_ops;
43357172Sutashiro
43457172Sutashiro fb->private = (caddr_t)&fb253;
43557172Sutashiro
43657172Sutashiro fb253_init(fb, id);
43757172Sutashiro }
43857172Sutashiro }
43957172Sutashiro #endif /* NNWB253 > 0 */
440