add debug draw routines.

This commit is contained in:
uch 2000-01-06 18:10:42 +00:00
parent f0d09739ad
commit 6c7f28e845
2 changed files with 229 additions and 14 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: tx3912video.c,v 1.5 2000/01/03 18:29:04 uch Exp $ */
/* $NetBSD: tx3912video.c,v 1.6 2000/01/06 18:10:42 uch Exp $ */
/*
* Copyright (c) 1999, 2000, by UCHIYAMA Yasushi
@ -46,6 +46,8 @@
#include <arch/hpcmips/dev/fbvar.h>
#endif
#undef TX3912VIDEO_DEBUG
void tx3912video_framebuffer_init __P((tx_chipset_tag_t, u_int32_t,
u_int32_t));
int tx3912video_framebuffer_alloc __P((tx_chipset_tag_t, u_int32_t,
@ -55,16 +57,25 @@ void tx3912video_reset __P((tx_chipset_tag_t));
void tx3912video_resolution_init __P((tx_chipset_tag_t, int, int));
int tx3912video_fbdepth __P((tx_chipset_tag_t, int));
static u_int32_t framebuffer, framebuffersize;
int tx3912video_match __P((struct device*, struct cfdata*, void*));
void tx3912video_attach __P((struct device*, struct device*, void*));
int tx3912video_print __P((void*, const char*));
struct tx3912video_chip {
u_int32_t vc_fbaddr;
u_int32_t vc_fbsize;
int vc_fbdepth;
int vc_fbwidth;
int vc_fbheight;
void (*vc_drawline) __P((int, int, int, int));
void (*vc_drawdot) __P((int, int));
};
struct tx3912video_softc {
struct device sc_dev;
u_int32_t sc_fbaddr;
u_int32_t sc_fbsize;
struct tx3912video_chip *sc_chip;
};
struct fb_attach_args {
@ -76,6 +87,11 @@ struct cfattach tx3912video_ca = {
tx3912video_attach
};
/* console */
struct tx3912video_chip tx3912video_chip;
void tx3912video_attach_drawfunc __P((struct tx3912video_chip*));
int
tx3912video_match(parent, cf, aux)
struct device *parent;
@ -97,16 +113,16 @@ tx3912video_attach(parent, self, aux)
struct fb_attach_args fba;
txreg_t reg;
sc->sc_fbaddr = framebuffer;
sc->sc_fbsize = framebuffersize;
sc->sc_chip = &tx3912video_chip;
printf(": ");
tx3912video_fbdepth(tc, 1);
printf(", frame buffer 0x%08x-0x%08x", sc->sc_fbaddr,
sc->sc_fbaddr + sc->sc_fbsize);
printf(", frame buffer 0x%08x-0x%08x", sc->sc_chip->vc_fbaddr,
sc->sc_chip->vc_fbaddr + sc->sc_chip->vc_fbsize);
printf("\n");
#ifndef TX3912VIDEO_DEBUG
if (bootinfo->bi_cnuse & BI_CNUSE_SERIAL) {
printf("%s: power off\n", sc->sc_dev.dv_xname);
reg = tx_conf_read(tc, TX3912_VIDEOCTRL1_REG);
@ -114,6 +130,10 @@ tx3912video_attach(parent, self, aux)
TX3912_VIDEOCTRL1_ENVID);
tx_conf_write(tc, TX3912_VIDEOCTRL1_REG, reg);
}
#endif /* TX3912VIDEO_DEBUG */
/* attach debug draw routine */
tx3912video_attach_drawfunc(sc->sc_chip);
/* Attach frame buffer device */
#if NFB > 0
@ -149,6 +169,9 @@ tx3912video_init(tc, fb_start, fb_width, fb_height, fb_addr, fb_size,
/* Inquire bit depth */
fb_depth = tx3912video_fbdepth(tc, 0);
tx3912video_chip.vc_fbdepth = fb_depth;
tx3912video_chip.vc_fbwidth = fb_width;
tx3912video_chip.vc_fbheight= fb_height;
/* Allocate framebuffer area */
if (tx3912video_framebuffer_alloc(tc, fb_start, fb_width, fb_height,
@ -201,8 +224,9 @@ tx3912video_framebuffer_alloc(tc, start, h, v, depth, fb_addr, fb_size)
EX_FAST|EX_NOWAIT, &addr))) {
return 1;
}
framebuffer = addr;
framebuffersize = size;
tx3912video_chip.vc_fbaddr = addr;
tx3912video_chip.vc_fbsize = size;
*fb_addr = addr;
*fb_size = size;
@ -284,7 +308,7 @@ tx3912video_resolution_init(tc, h, v)
tx_conf_write(tc, TX3912_VIDEOCTRL2_REG, reg);
}
int
int
tx3912video_fbdepth(tc, verbose)
tx_chipset_tag_t tc;
int verbose;
@ -343,4 +367,188 @@ tx3912video_reset(tc)
delay(1000);
}
/*
* Debug routines.
*/
void
tx3912video_calibration_pattern()
{
struct tx3912video_chip *vc = &tx3912video_chip;
int x, y;
x = vc->vc_fbwidth - 40;
y = vc->vc_fbheight - 40;
tx3912video_line(40, 40, x , 40);
tx3912video_line(x , 40, x , y );
tx3912video_line(x , y , 40, y );
tx3912video_line(40, y , 40, 40);
tx3912video_line(40, 40, x , y );
tx3912video_line(x, 40, 40, y );
}
#define BPP2 ({ \
u_int8_t bitmap; \
bitmap = *(volatile u_int8_t*)MIPS_PHYS_TO_KSEG1(addr); \
*(volatile u_int8_t*)MIPS_PHYS_TO_KSEG1(addr) = \
(bitmap & ~(0x3 << ((3 - (x % 4)) * 2))); \
})
#define BPP4 ({ \
u_int8_t bitmap; \
bitmap = *(volatile u_int8_t*)MIPS_PHYS_TO_KSEG1(addr); \
*(volatile u_int8_t*)MIPS_PHYS_TO_KSEG1(addr) = \
(bitmap & ~(0xf << ((1 - (x % 2)) * 4))); \
})
#define BPP8 ({ \
*(volatile u_int8_t*)MIPS_PHYS_TO_KSEG1(addr) = 0xff; \
})
#define BRESENHAM(a, b, c, d, func) ({ \
u_int32_t fbaddr = vc->vc_fbaddr; \
u_int32_t fbwidth = vc->vc_fbwidth; \
u_int32_t fbdepth = vc->vc_fbdepth; \
len = a, step = b -1; \
if (step == 0) \
return; \
kstep = len == 0 ? 0 : 1; \
for (i = k = 0, j = step / 2; i <= step; i++) { \
x = xbase c; \
y = ybase d; \
addr = fbaddr + (((y * fbwidth + x) * fbdepth) >> 3); \
func; \
j -= len; \
while (j < 0) { \
j += step; \
k += kstep; \
} \
} \
})
#define DRAWLINE(func) ({ \
if (x < 0) { \
if (y < 0) { \
if (_y < _x) { \
BRESENHAM(_y, _x, -i, -k, func); \
} else { \
BRESENHAM(_x, _y, -k, -i, func); \
} \
} else { \
if (_y < _x) { \
BRESENHAM(_y, _x, -i, +k, func); \
} else { \
BRESENHAM(_x, _y, -k, +i, func); \
} \
} \
} else { \
if (y < 0) { \
if (_y < _x) { \
BRESENHAM(_y, _x, +i, -k, func); \
} else { \
BRESENHAM(_x, _y, +k, -i, func); \
} \
} else { \
if (_y < _x) { \
BRESENHAM(_y, _x, +i, +k, func); \
} else { \
BRESENHAM(_x, _y, +k, +i, func); \
} \
} \
} \
})
#define LINEFUNC(b) \
static void linebpp##b __P((int, int, int, int)); \
static void \
linebpp##b##(x0, y0, x1, y1) \
int x0, y0, x1, y1; \
{ \
struct tx3912video_chip *vc = &tx3912video_chip; \
u_int32_t addr; \
int i, j, k, len, step, kstep; \
int x, _x, y, _y; \
int xbase, ybase; \
x = x1 - x0; \
y = y1 - y0; \
_x = abs(x); \
_y = abs(y); \
xbase = x0; \
ybase = y0; \
DRAWLINE(BPP##b##); \
}
#define DOTFUNC(b) \
static void dotbpp##b __P((int, int)); \
static void \
dotbpp##b##(x, y) \
int x, y; \
{ \
struct tx3912video_chip *vc = &tx3912video_chip; \
u_int32_t addr; \
addr = vc->vc_fbaddr + (((y * vc->vc_fbwidth + x) * \
vc->vc_fbdepth) >> 3); \
BPP##b; \
}
static void linebpp_unimpl __P((int, int, int, int));
static void dotbpp_unimpl __P((int, int));
static
void linebpp_unimpl(x0, y0, x1, y1)
int x0, y0, x1, y1;
{
return;
}
static
void dotbpp_unimpl(x, y)
int x, y;
{
return;
}
LINEFUNC(2)
LINEFUNC(4)
LINEFUNC(8)
DOTFUNC(2)
DOTFUNC(4)
DOTFUNC(8)
void
tx3912video_attach_drawfunc(vc)
struct tx3912video_chip *vc;
{
switch (vc->vc_fbdepth) {
default:
vc->vc_drawline = linebpp_unimpl;
vc->vc_drawdot = dotbpp_unimpl;
break;
case 8:
vc->vc_drawline = linebpp8;
vc->vc_drawdot = dotbpp8;
break;
case 4:
vc->vc_drawline = linebpp4;
vc->vc_drawdot = dotbpp4;
break;
case 2:
vc->vc_drawline = linebpp2;
vc->vc_drawdot = dotbpp2;
break;
}
}
void
tx3912video_line(x0, y0, x1, y1)
int x0, y0, x1, y1;
{
struct tx3912video_chip *vc = &tx3912video_chip;
vc->vc_drawline(x0, y0, x1, y1);
}
void
tx3912video_dot(x, y)
int x, y;
{
struct tx3912video_chip *vc = &tx3912video_chip;
vc->vc_drawdot(x, y);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: tx3912videovar.h,v 1.2 1999/12/12 17:04:55 uch Exp $ */
/* $NetBSD: tx3912videovar.h,v 1.3 2000/01/06 18:10:42 uch Exp $ */
/*
* Copyright (c) 1999, by UCHIYAMA Yasushi
@ -26,5 +26,12 @@
*
*/
int tx3912video_init __P((tx_chipset_tag_t, u_int32_t, int, int,
int tx3912video_init __P((tx_chipset_tag_t, u_int32_t, int, int,
u_int32_t*, u_int32_t*, int*));
/*
* debug functions.
*/
void tx3912video_calibration_pattern __P((void));
void tx3912video_line __P((int, int, int, int));
void tx3912video_dot __P((int, int));