153893Smckusick /*
2*63260Sbostic * Copyright (c) 1992, 1993
3*63260Sbostic * The Regents of the University of California. All rights reserved.
453893Smckusick *
553893Smckusick * This code is derived from software contributed to Berkeley by
653893Smckusick * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753893Smckusick *
853893Smckusick * %sccs.include.redist.c%
953893Smckusick *
1053893Smckusick * from: $Hdr: fbbm_lcdm.c,v 4.300 91/06/09 06:33:38 root Rel41 $ SONY
1153893Smckusick *
12*63260Sbostic * @(#)fbbm_lcdm.c 8.1 (Berkeley) 06/11/93
1353893Smckusick */
1453893Smckusick
1553893Smckusick /*
1653893Smckusick * LCD frame buffer driver
1753893Smckusick */
1853893Smckusick
1953893Smckusick #include "lfbm.h"
2053893Smckusick
2153893Smckusick #if NLFBM > 0
2253893Smckusick
2357178Sutashiro #include <sys/param.h>
2457178Sutashiro #include <news3400/iop/framebuf.h>
2557178Sutashiro #include <news3400/iop/fbreg.h>
2653893Smckusick
2757178Sutashiro #include <news3400/fb/fbdefs.h>
2853893Smckusick
2953893Smckusick extern int nofunc();
3053893Smckusick extern int error();
3153893Smckusick extern char *ext_fnt24_addr[];
3253893Smckusick extern char *ext_fnt_addr[];
3353893Smckusick
3453893Smckusick extern short zero[];
3553893Smckusick
3653893Smckusick extern unsigned int mfbmask32[];
3753893Smckusick extern unsigned int mfbrmask32[];
3853893Smckusick
3953893Smckusick #define NOP for (j = 0; j < 40; j++)
4053893Smckusick
4153893Smckusick #ifdef news3200
4253893Smckusick #define LCD_PORT (volatile unsigned long *)(0xb0000000)
4353893Smckusick #define DIMMER_PORT (volatile unsigned long *)(0xb0100000)
4453893Smckusick #define LCD_CRTC (volatile unsigned char *)(0xbff60000)
4553893Smckusick #define KROM_START (char *)(0x90000000)
4653893Smckusick #define VRAM_START (unsigned long *)(0x90200000)
4753893Smckusick #define VRAM_WIDTH (1120/32)
4853893Smckusick #endif
4953893Smckusick
5060002Sutashiro void
lfbmattach(i)5160002Sutashiro lfbmattach(i)
5260002Sutashiro {
5360002Sutashiro /* temporary hack for pseudo-device initialization */;
5460002Sutashiro }
5560002Sutashiro
5653893Smckusick #ifdef news3200
5753893Smckusick static caddr_t
fblfbm_Krom_addr(fb,c,sr)5853893Smckusick fblfbm_Krom_addr(fb, c, sr)
5953893Smckusick struct fbdev *fb;
6053893Smckusick register int c;
6153893Smckusick lRectangle *sr;
6253893Smckusick {
6353893Smckusick register int i;
6453893Smckusick register u_short *tmp;
6553893Smckusick static int tmpfnt[24];
6653893Smckusick
6753893Smckusick if ((c >= 0x20) && (c <= 0x7e)) {
6853893Smckusick /*
6953893Smckusick * ASCII char
7053893Smckusick */
7153893Smckusick c -= ' ';
7253893Smckusick c = ((c & 0x1f) | ((c & 0xe0) << 2)) << 7;
7353893Smckusick tmp = (u_short *)(fb->Krom_base + (c + (sr->extent.y > 16 ? 0 : 96)) * 2);
7453893Smckusick } else if ((c >= 0xa1) && (c <= 0xdf)) {
7553893Smckusick /*
7653893Smckusick * KANA char
7753893Smckusick */
7853893Smckusick if (sr->extent.y > 16)
7953893Smckusick tmp = (u_short *)ext_fnt24_addr[c + 64];
8053893Smckusick else
8153893Smckusick tmp = (u_short *)ext_fnt_addr[c + 64];
8253893Smckusick } else if ((c >= 0x2020) && (c <= 0x7e7e)) {
8353893Smckusick /*
8453893Smckusick * KANJI char
8553893Smckusick */
8653893Smckusick switch (c & 0x7000) {
8753893Smckusick case 0x2000:
8853893Smckusick c = ((c & 0x1f) | ((c & 0x60) << 5) | ((c & 0x700) >> 1)) << 7;
8953893Smckusick break;
9053893Smckusick case 0x3000:
9153893Smckusick case 0x4000:
9253893Smckusick c = ((c & 0x7f) | ((c & 0xf00) >> 1) | ((c & 0x4000) >> 3)) << 7;
9353893Smckusick break;
9453893Smckusick case 0x5000:
9553893Smckusick case 0x6000:
9653893Smckusick c = ((c & 0x7f) | ((c & 0xf00) >> 1) | ((c & 0x2000) >> 2)
9753893Smckusick | 0x1000) << 7;
9853893Smckusick break;
9953893Smckusick case 0x7000:
10053893Smckusick c = ((c & 0x1f) | ((c & 0x60) << 5) | ((c & 0x700) >> 1)
10153893Smckusick | 0x1000) << 7;
10253893Smckusick break;
10353893Smckusick }
10453893Smckusick tmp = (u_short *)(fb->Krom_base + (c + (sr->extent.y > 16 ? 0 : 96)) * 2);
10553893Smckusick } else {
10653893Smckusick /*
10753893Smckusick * UNKNOWN char
10853893Smckusick */
10953893Smckusick return ((caddr_t)zero);
11053893Smckusick }
11153893Smckusick
11253893Smckusick if (sr->extent.y > 16) {
11353893Smckusick for (i = 0; i < 24; i++) {
11453893Smckusick tmpfnt[i] = (*tmp << 16) | *(tmp + 2);
11553893Smckusick tmp += 4;
11653893Smckusick }
11753893Smckusick } else {
11853893Smckusick for (i = 0; i < 16; i++) {
11953893Smckusick tmpfnt[i] = (*tmp << 16) | *(tmp + 2);
12053893Smckusick tmp += 4;
12153893Smckusick }
12253893Smckusick }
12353893Smckusick
12453893Smckusick return ((caddr_t)tmpfnt);
12553893Smckusick }
12653893Smckusick #endif /* news3200 */
12753893Smckusick
12853893Smckusick static int
fblfbm_set_dimmer(fb,dim)12953893Smckusick fblfbm_set_dimmer(fb, dim)
13053893Smckusick struct fbdev *fb;
13153893Smckusick int dim;
13253893Smckusick {
13353893Smckusick int s;
13453893Smckusick
13553893Smckusick fb->status_flag = dim ? 0xf1: 0xf0;
13653893Smckusick #ifdef news3200
13753893Smckusick *DIMMER_PORT = fb->status_flag;
13853893Smckusick #endif
13953893Smckusick return (FB_ROK);
14053893Smckusick }
14153893Smckusick
14253893Smckusick static int
fblfbm_get_dimmer(fb)14353893Smckusick fblfbm_get_dimmer(fb)
14453893Smckusick struct fbdev *fb;
14553893Smckusick {
14653893Smckusick return (fb->status_flag & 0x1);
14753893Smckusick }
14853893Smckusick
14953893Smckusick int
fblfbm_get_pixel(fb,pixel)15053893Smckusick fblfbm_get_pixel(fb, pixel)
15153893Smckusick struct fbdev *fb;
15253893Smckusick register int pixel;
15353893Smckusick {
15453893Smckusick return (pixel);
15553893Smckusick }
15653893Smckusick
15753893Smckusick int
fblfbm_get_page(fb,off)15853893Smckusick fblfbm_get_page(fb, off)
15953893Smckusick struct fbdev *fb;
16053893Smckusick off_t off;
16153893Smckusick {
16253893Smckusick if (off < 1120/8 * 930) { /* X/8 * Y */
16353893Smckusick #ifdef news3200
16453893Smckusick return (((unsigned int)0x10200000 + off) >> PGSHIFT);
16553893Smckusick #endif
16653893Smckusick } else
16753893Smckusick return (-1);
16853893Smckusick }
16953893Smckusick
17053893Smckusick int
fblfbm_probe(unit)17153893Smckusick fblfbm_probe(unit)
17253893Smckusick int unit;
17353893Smckusick {
17453893Smckusick #ifdef news3200
17553893Smckusick if (unit < NLFBM) {
17653893Smckusick if (badaddr(0xbff50000, 1))
17753893Smckusick return 0;
17853893Smckusick else {
17953893Smckusick if (*(volatile u_char *)(0xbff50000) == 0xff)
18053893Smckusick return FB_LCDM;
18153893Smckusick else
18253893Smckusick return 0;
18353893Smckusick }
18453893Smckusick }
18553893Smckusick #endif /* news3200 */
18653893Smckusick return 0;
18753893Smckusick }
18853893Smckusick
18953893Smckusick void fbmem_rop_init();
19053893Smckusick void fbmem_rop_copy();
19153893Smckusick void fbmem_rop_winit();
19253893Smckusick void fbmem_rop_write();
19353893Smckusick void fbmem_rop_read();
19453893Smckusick void fbmem_rop_cinit();
19553893Smckusick void fbmem_rop_clear();
19653893Smckusick void fbmem_rop_vect();
19753893Smckusick void fbmem_rop_dot();
19853893Smckusick
19953893Smckusick struct fbdev_ops fblfbm_ops = {
20053893Smckusick fbmem_rop_init, /* (*fb_rop_init)() */
20153893Smckusick fbmem_rop_copy, /* (*fb_rop_copy)() */
20253893Smckusick fbmem_rop_winit, /* (*fb_rop_winit)() */
20353893Smckusick fbmem_rop_write, /* (*fb_rop_write)() */
20453893Smckusick fbmem_rop_read, /* (*fb_rop_read)() */
20553893Smckusick fbmem_rop_cinit, /* (*fb_rop_cinit)() */
20653893Smckusick fbmem_rop_clear, /* (*fb_rop_clear)() */
20753893Smckusick fbmem_rop_vect, /* (*fb_rop_vect)() */
20853893Smckusick fbmem_rop_dot, /* (*fb_rop_dot)() */
20953893Smckusick (void (*)())nofunc, /* (*fb_rop_fillscan)() */
21053893Smckusick (void (*)())error, /* (*fb_rop_wait)() */
21153893Smckusick (void (*)())error, /* (*fb_rop_reset)() */
21253893Smckusick fblfbm_Krom_addr, /* *(*fb_Krom_addr)() */
21353893Smckusick (void (*)())error, /* (*fb_init_palette)() */
21453893Smckusick error, /* (*fb_set_palette)() */
21553893Smckusick error, /* (*fb_get_palette)() */
21653893Smckusick fblfbm_get_pixel, /* (*fb_get_pixel)() */
21753893Smckusick fblfbm_set_dimmer, /* (*fb_set_dimmer)() */
21853893Smckusick fblfbm_get_dimmer, /* (*fb_get_dimmer)() */
21953893Smckusick nofunc, /* (*fb_open)() */
22053893Smckusick nofunc, /* (*fb_close)() */
22153893Smckusick nofunc, /* (*fb_ioctl)() */
22253893Smckusick fblfbm_get_page, /* (*fb_get_page)() */
22353893Smckusick (void (*)())nofunc, /* (*fb_cursor_set)() */
22453893Smckusick (void (*)())nofunc, /* (*fb_cursor_on)() */
22553893Smckusick (void (*)())nofunc, /* (*fb_cursor_off)() */
22653893Smckusick (void (*)())nofunc, /* (*fb_cursor_move)() */
22753893Smckusick };
22853893Smckusick
22953893Smckusick static char lctc_data[] = {
23053893Smckusick 0, 47,
23153893Smckusick 1, 35,
23253893Smckusick 9, 0,
23353893Smckusick 10, 0,
23453893Smckusick 11, 0,
23553893Smckusick 12, 0,
23653893Smckusick 13, 0,
23753893Smckusick 14, 0,
23853893Smckusick 15, 0,
23953893Smckusick 18, 35,
24053893Smckusick 19, 0x01,
24153893Smckusick 20, 0x85,
24253893Smckusick 21, 0,
24353893Smckusick 22, 0x10
24453893Smckusick };
24553893Smckusick
24653893Smckusick struct mfbdev fblcd = { (caddr_t)VRAM_START, VRAM_WIDTH };
24753893Smckusick
24853893Smckusick void
fblfbm_setup(fb)24953893Smckusick fblfbm_setup(fb)
25053893Smckusick register struct fbdev *fb;
25153893Smckusick {
25253893Smckusick register int i;
25353893Smckusick register volatile unsigned char *lctreg = LCD_CRTC;
25453893Smckusick
25553893Smckusick if (fb->type) {
25653893Smckusick fb->Mono = 1;
25753893Smckusick fb->Colorwidth = 1;
25853893Smckusick fb->fbNplane = 1;
25953893Smckusick fb->planemask = 0x1;
26053893Smckusick fb->Dimmer = 1;
26153893Smckusick
26253893Smckusick fb->FrameRect.origin.x = 0;
26353893Smckusick fb->FrameRect.origin.y = 0;
26453893Smckusick fb->FrameRect.extent.x = 1120;
26553893Smckusick fb->FrameRect.extent.y = 930;
26653893Smckusick fb->VisRect.origin.x = 0;
26753893Smckusick fb->VisRect.origin.y = 0;
26853893Smckusick fb->VisRect.extent.x = 1120;
26953893Smckusick fb->VisRect.extent.y = 780;
27053893Smckusick fb->Krom_BM0.type = BM_MEM;
27153893Smckusick fb->Krom_BM0.depth = 1;
27253893Smckusick fb->Krom_BM0.width = 1;
27353893Smckusick fb->Krom_BM0.rect.origin.x = 0;
27453893Smckusick fb->Krom_BM0.rect.origin.y = 0;
27553893Smckusick fb->Krom_BM0.rect.extent.x = 16;
27653893Smckusick fb->Krom_BM0.rect.extent.y = 16;
27753893Smckusick fb->Krom_BM1.type = BM_MEM;
27853893Smckusick fb->Krom_BM1.depth = 1;
27953893Smckusick fb->Krom_BM1.width = 2;
28053893Smckusick fb->Krom_BM1.rect.origin.x = 0;
28153893Smckusick fb->Krom_BM1.rect.origin.y = 0;
28253893Smckusick fb->Krom_BM1.rect.extent.x = 32;
28353893Smckusick fb->Krom_BM1.rect.extent.y = 32;
28453893Smckusick fb->Krom_base = KROM_START;
28553893Smckusick fb->Krom_font_extent0.x = 16;
28653893Smckusick fb->Krom_font_extent0.y = 16;
28753893Smckusick fb->Krom_font_extent1.x = 24;
28853893Smckusick fb->Krom_font_extent1.y = 24;
28953893Smckusick fb->font_w = 12;
29053893Smckusick fb->font_h = 24;
29153893Smckusick fb->char_w = 12;
29253893Smckusick fb->char_h = 26;
29353893Smckusick fb->scr_w = 1120;
29453893Smckusick fb->scr_h = 780;
29553893Smckusick fb->ch_pos = 0;
29653893Smckusick fb->ul_pos = 24;
29753893Smckusick fb->x_offset = (1120 - (80 * 12)) / 2;
29853893Smckusick fb->y_offset = ( 780 - (29 * 26)) / 2;
29953893Smckusick fb->rit_m = 80;
30053893Smckusick fb->btm_m = 29;
30153893Smckusick fb->cursorSet = 0;
30253893Smckusick fb->cursorVis = 0;
30353893Smckusick fb->cursorShow = 0;
30453893Smckusick fb->cursorP.x = 1120/2;
30553893Smckusick fb->cursorP.y = 780/2;
30653893Smckusick fb->status_flag = 1;
30753893Smckusick fb->run_flag = 0;
30853893Smckusick fb->hard_cursor = 0;
30953893Smckusick
31053893Smckusick fb->fbbm_op = &fblfbm_ops;
31153893Smckusick
31253893Smckusick fb->private = (caddr_t)&fblcd;
31353893Smckusick
31453893Smckusick for (i = 0; i < 28; i++)
31553893Smckusick *lctreg++ = lctc_data[i];
31653893Smckusick for (i = 0; i < 500000; i ++)
31753893Smckusick ;
31853893Smckusick *LCD_PORT = 1;
31953893Smckusick }
32053893Smckusick }
32153893Smckusick #endif /* NLFBM > 0 */
322