Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
4038102c
Commit
4038102c
authored
May 27, 2002
by
James Simmons
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More drivers ported over to the new api. Also a bug fix in the software drawing image routine.
parent
4118216f
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
139 additions
and
390 deletions
+139
-390
drivers/video/Config.in
drivers/video/Config.in
+12
-14
drivers/video/cfbimgblt.c
drivers/video/cfbimgblt.c
+26
-5
drivers/video/clps711xfb.c
drivers/video/clps711xfb.c
+25
-133
drivers/video/hpfb.c
drivers/video/hpfb.c
+76
-238
No files found.
drivers/video/Config.in
View file @
4038102c
...
...
@@ -236,29 +236,25 @@ if [ "$CONFIG_FB" = "y" ]; then
if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_AMIGA" = "y" -o \
"$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_CYBER" = "y" -o \
"$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_RETINAZ3" = "y" -o \
"$CONFIG_FB_VIRGE" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \
"$CONFIG_FB_BWTWO" = "y" -o "$CONFIG_FB_CLGEN" = "y" -o \
"$CONFIG_FB_TX3912" = "y" ]; then
"$CONFIG_FB_VIRGE" = "y" -o "$CONFIG_FB_TX3912" = "y" -o \
"$CONFIG_FB_BWTWO" = "y" -o "$CONFIG_FB_CLGEN" = "y" ]; then
define_tristate CONFIG_FBCON_MFB y
else
if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_AMIGA" = "m" -o \
"$CONFIG_FB_ATARI" = "m" -o "$CONFIG_FB_CYBER" = "m" -o \
"$CONFIG_FB_MAC" = "m" -o "$CONFIG_FB_RETINAZ3" = "m" -o \
"$CONFIG_FB_VIRGE" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \
"$CONFIG_FB_BWTWO" = "m" -o "$CONFIG_FB_CLGEN" = "m" -o \
"$CONFIG_FB_TX3912" = "m" ]; then
"$CONFIG_FB_VIRGE" = "m" -o "$CONFIG_FB_TX3912" = "m" -o \
"$CONFIG_FB_BWTWO" = "m" -o "$CONFIG_FB_CLGEN" = "m" ]; then
define_tristate CONFIG_FBCON_MFB m
fi
fi
if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_MAC" = "y" -o \
"$CONFIG_FB_SA1100" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \
"$CONFIG_FB_TX3912" = "y" ]; then
"$CONFIG_FB_SA1100" = "y" -o "$CONFIG_FB_TX3912" = "y" ]; then
define_tristate CONFIG_FBCON_CFB2 y
define_tristate CONFIG_FBCON_CFB4 y
else
if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_MAC" = "m" -o \
"$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \
"$CONFIG_FB_TX3912" = "m" ]; then
"$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_TX3912" = "m" ]; then
define_tristate CONFIG_FBCON_CFB2 m
define_tristate CONFIG_FBCON_CFB4 m
fi
...
...
@@ -375,14 +371,16 @@ if [ "$CONFIG_FB" = "y" ]; then
define_tristate CONFIG_FBCON_CFB32 m
fi
fi
if [ "$CONFIG_FB_
VESA" = "y" -o "$CONFIG_FB_Q40
" = "y" -o \
if [ "$CONFIG_FB_
NEOMAGIC" = "y" -o "$CONFIG_FB_VESA
" = "y" -o \
"$CONFIG_FB_FM2" = "y" -o "$CONFIG_FB_HIT" = "y" -o \
"$CONFIG_FB_HP300" = "y" -o "$CONFIG_FB_Q40" = "y" -o \
"$CONFIG_FB_ANAKIN" = "y" -o "$CONFIG_FB_G364" = "y" -o \
"$CONFIG_FB_VIRTUAL" = "y" ]; then
"$CONFIG_FB_VIRTUAL" = "y"
-o "$CONFIG_FB_CLPS711X" = "y"
]; then
define_tristate CONFIG_FBCON_ACCEL y
else
if [ "$CONFIG_FB_HIT" = "m" -o "$CONFIG_FB_G364" = "m" -o \
"$CONFIG_FB_VIRTUAL" = "m" ]; then
if [ "$CONFIG_FB_NEOMAGIC" = "m" -o "$CONFIG_FB_HIT" = "m" -o \
"$CONFIG_FB_G364" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \
"$CONFIG_FB_CLPS711X" = "m" ]; then
define_tristate CONFIG_FBCON_ACCEL m
fi
fi
...
...
drivers/video/cfbimgblt.c
View file @
4038102c
...
...
@@ -46,7 +46,7 @@ void cfb_imageblit(struct fb_info *p, struct fb_image *image)
int
pad
,
ppw
,
shift
,
shift_right
,
shift_left
,
x2
,
y2
,
n
,
i
,
j
,
k
,
l
=
7
;
unsigned
long
tmp
=
~
0
<<
(
BITS_PER_LONG
-
p
->
var
.
bits_per_pixel
);
unsigned
long
fgx
,
bgx
,
fgcolor
,
bgcolor
,
eorx
;
unsigned
long
end_index
,
end_mask
,
mask
;
unsigned
long
end_index
,
end_mask
;
unsigned
long
*
dst
=
NULL
;
u8
*
dst1
,
*
src
;
...
...
@@ -89,24 +89,45 @@ void cfb_imageblit(struct fb_info *p, struct fb_image *image)
eorx
=
fgx
^
bgx
;
n
=
((
image
->
width
+
7
)
>>
3
);
pad
=
(
n
<<
3
)
-
image
->
width
;
n
=
image
->
width
%
ppw
;
for
(
i
=
0
;
i
<
image
->
height
;
i
++
)
{
dst
=
(
unsigned
long
*
)
dst1
;
for
(
j
=
image
->
width
/
ppw
;
j
>
0
;
j
--
)
{
mask
=
0
;
end_
mask
=
0
;
for
(
k
=
ppw
;
k
>
0
;
k
--
)
{
if
(
test_bit
(
l
,
src
))
mask
|=
(
tmp
>>
(
p
->
var
.
bits_per_pixel
*
(
k
-
1
)));
end_
mask
|=
(
tmp
>>
(
p
->
var
.
bits_per_pixel
*
(
k
-
1
)));
l
--
;
if
(
l
<
0
)
{
l
=
7
;
src
++
;
}
}
fb_writel
((
mask
&
eorx
)
^
bgx
,
dst
);
fb_writel
((
end_
mask
&
eorx
)
^
bgx
,
dst
);
dst
++
;
}
l
=-
pad
;
if
(
n
)
{
for
(
j
=
n
;
j
>
0
;
j
--
)
{
end_mask
=
0
;
if
(
test_bit
(
l
,
src
))
end_mask
|=
(
tmp
>>
(
p
->
var
.
bits_per_pixel
*
(
k
-
1
)));
l
--
;
if
(
l
<
0
)
{
l
=
7
;
src
++
;
}
}
fb_writel
((
end_mask
&
eorx
)
^
bgx
,
dst
);
dst
++
;
}
l
-=
pad
;
dst1
+=
p
->
fix
.
line_length
;
}
}
else
{
/* Draw the penguin */
n
=
((
image
->
width
*
p
->
var
.
bits_per_pixel
)
>>
3
);
//shift = ((unsigned long) dst1 & (bpl -1));
end_mask
=
0
;
// n = n/bpl;
}
}
drivers/video/clps711xfb.c
View file @
4038102c
...
...
@@ -27,7 +27,6 @@
#include <linux/proc_fs.h>
#include <video/fbcon.h>
#include <video/fbcon-cfb4.h>
#include <asm/hardware.h>
#include <asm/mach-types.h>
...
...
@@ -89,40 +88,11 @@ clps7111fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
}
/*
*
Set the User Defined Part of the Display
*
Validate the purposed mode.
*/
static
int
clps7111fb_set_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
clps7111fb_check_var
(
struct
fb_var_screeninfo
*
var
,
struct
fb_info
*
info
)
{
struct
display
*
display
;
unsigned
int
lcdcon
,
syscon
;
int
chgvar
=
0
;
if
(
var
->
activate
&
FB_ACTIVATE_TEST
)
return
0
;
if
((
var
->
activate
&
FB_ACTIVATE_MASK
)
!=
FB_ACTIVATE_NOW
)
return
-
EINVAL
;
if
(
info
->
var
.
xres
!=
var
->
xres
)
chgvar
=
1
;
if
(
info
->
var
.
yres
!=
var
->
yres
)
chgvar
=
1
;
if
(
info
->
var
.
xres_virtual
!=
var
->
xres_virtual
)
chgvar
=
1
;
if
(
info
->
var
.
yres_virtual
!=
var
->
yres_virtual
)
chgvar
=
1
;
if
(
info
->
var
.
bits_per_pixel
!=
var
->
bits_per_pixel
)
chgvar
=
1
;
if
(
con
<
0
)
{
display
=
info
->
disp
;
chgvar
=
0
;
}
else
{
display
=
fb_display
+
con
;
}
var
->
transp
.
msb_right
=
0
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
...
...
@@ -132,70 +102,37 @@ clps7111fb_set_var(struct fb_var_screeninfo *var, int con,
var
->
green
=
var
->
red
;
var
->
blue
=
var
->
red
;
if
(
var
->
bits_per_pixel
>
4
)
return
-
EINVAL
;
}
/*
* Set the hardware state.
*/
static
int
clps7111fb_set_par
(
struct
fb_info
*
info
)
{
unsigned
int
lcdcon
,
syscon
;
switch
(
var
->
bits_per_pixel
)
{
#ifdef FBCON_HAS_MFB
case
1
:
info
->
fix
.
visual
=
FB_VISUAL_MONO01
;
display
->
dispsw
=
&
fbcon_mfb
;
display
->
dispsw_data
=
NULL
;
break
;
#endif
#ifdef FBCON_HAS_CFB2
case
2
:
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
display
->
dispsw
=
&
fbcon_cfb2
;
display
->
dispsw_data
=
NULL
;
break
;
#endif
#ifdef FBCON_HAS_CFB4
case
4
:
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
display
->
dispsw
=
&
fbcon_cfb4
;
display
->
dispsw_data
=
NULL
;
break
;
#endif
default:
return
-
EINVAL
;
}
display
->
next_line
=
var
->
xres_virtual
*
var
->
bits_per_pixel
/
8
;
info
->
fix
.
line_length
=
display
->
next_line
;
display
->
line_length
=
info
->
fix
.
line_length
;
display
->
visual
=
info
->
fix
.
visual
;
display
->
type
=
info
->
fix
.
type
;
display
->
type_aux
=
info
->
fix
.
type_aux
;
display
->
ypanstep
=
info
->
fix
.
ypanstep
;
display
->
ywrapstep
=
info
->
fix
.
ywrapstep
;
display
->
can_soft_blank
=
1
;
display
->
inverse
=
0
;
info
->
var
=
*
var
;
info
->
var
.
activate
&=
~
FB_ACTIVATE_ALL
;
/*
* Update the old var. The fbcon drivers still use this.
* Once they are using cfb->var, this can be dropped.
* --rmk
*/
display
->
var
=
info
->
var
;
/*
* If we are setting all the virtual consoles, also set the
* defaults used to create new consoles.
*/
if
(
var
->
activate
&
FB_ACTIVATE_ALL
)
info
->
disp
->
var
=
info
->
var
;
if
(
chgvar
&&
info
&&
info
->
changevar
)
info
->
changevar
(
con
);
info
->
fix
.
line_length
=
info
->
var
.
xres_virtual
*
info
->
var
.
bits_per_pixel
/
8
;
/*
* LCDCON must only be changed while the LCD is disabled
*/
lcdcon
=
(
var
->
xres_virtual
*
var
->
yres_virtual
*
var
->
bits_per_pixel
)
/
128
-
1
;
lcdcon
|=
((
var
->
xres_virtual
/
16
)
-
1
)
<<
13
;
lcdcon
=
(
info
->
var
.
xres_virtual
*
info
->
var
.
yres_virtual
*
info
->
var
.
bits_per_pixel
)
/
128
-
1
;
lcdcon
|=
((
info
->
var
.
xres_virtual
/
16
)
-
1
)
<<
13
;
lcdcon
|=
2
<<
19
;
lcdcon
|=
13
<<
25
;
lcdcon
|=
LCDCON_GSEN
;
...
...
@@ -205,9 +142,6 @@ clps7111fb_set_var(struct fb_var_screeninfo *var, int con,
clps_writel
(
syscon
&
~
SYSCON1_LCDEN
,
SYSCON1
);
clps_writel
(
lcdcon
,
LCDCON
);
clps_writel
(
syscon
|
SYSCON1_LCDEN
,
SYSCON1
);
fb_set_cmap
(
&
info
->
cmap
,
1
,
info
);
return
0
;
}
...
...
@@ -260,7 +194,9 @@ static int clps7111fb_blank(int blank, struct fb_info *info)
static
struct
fb_ops
clps7111fb_ops
=
{
owner:
THIS_MODULE
,
fb_set_var:
clps7111fb_set_var
,
fb_check_var:
clps7111fb_check_var
,
fb_set_par:
clps7111fb_set_par
,
fb_set_var:
gen_set_var
,
fb_set_cmap:
gen_set_cmap
,
fb_get_fix:
gen_get_fix
,
fb_get_var:
gen_get_var
,
...
...
@@ -269,50 +205,6 @@ static struct fb_ops clps7111fb_ops = {
fb_blank:
clps7111fb_blank
,
};
static
int
clps7111fb_switch
(
int
con
,
struct
fb_info
*
info
)
{
struct
display
*
disp
;
struct
fb_cmap
*
cmap
;
if
(
info
->
currcon
>=
0
)
{
disp
=
fb_display
+
info
->
currcon
;
/*
* Save the old colormap and video mode.
*/
disp
->
var
=
info
->
var
;
if
(
disp
->
cmap
.
len
)
fb_copy_cmap
(
&
info
->
cmap
,
&
disp
->
cmap
,
0
);
}
info
->
currcon
=
con
;
disp
=
fb_display
+
con
;
/*
* Install the new colormap and change the video mode. By default,
* fbcon sets all the colormaps and video modes to the default
* values at bootup.
*/
if
(
disp
->
cmap
.
len
)
cmap
=
&
disp
->
cmap
;
else
cmap
=
fb_default_cmap
(
CMAP_SIZE
);
fb_copy_cmap
(
cmap
,
&
info
->
cmap
,
0
);
info
->
var
=
disp
->
var
;
info
->
var
.
activate
=
FB_ACTIVATE_NOW
;
clps7111fb_set_var
(
&
info
->
var
,
con
,
info
);
return
0
;
}
static
int
clps7111fb_updatevar
(
int
con
,
struct
fb_info
*
info
)
{
return
-
EINVAL
;
}
static
int
clps7111fb_proc_backlight_read
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
...
...
@@ -395,8 +287,8 @@ int __init clps711xfb_init(void)
cfb
->
fbops
=
&
clps7111fb_ops
;
cfb
->
changevar
=
NULL
;
cfb
->
switch_con
=
clps7111fb
_switch
;
cfb
->
updatevar
=
clps7111fb_update
var
;
cfb
->
switch_con
=
gen
_switch
;
cfb
->
updatevar
=
gen_update_
var
;
cfb
->
flags
=
FBINFO_FLAG_DEFAULT
;
cfb
->
disp
=
(
struct
display
*
)(
cfb
+
1
);
...
...
@@ -439,7 +331,7 @@ int __init clps711xfb_init(void)
clps_writeb
(
clps_readb
(
PDDR
)
|
EDB_PD3_LCDBL
,
PDDR
);
}
clps7111fb
_set_var
(
&
cfb
->
var
,
-
1
,
cfb
);
gen
_set_var
(
&
cfb
->
var
,
-
1
,
cfb
);
err
=
register_framebuffer
(
cfb
);
out:
return
err
;
...
...
drivers/video/hpfb.c
View file @
4038102c
/*
* HP300 Topcat framebuffer support (derived from macfb of all things)
* Phil Blundell <philb@gnu.org> 1998
*
* Should this be moved to drivers/dio/video/ ? -- Peter Maydell
* No! -- Jes
*/
#include <linux/module.h>
...
...
@@ -23,15 +20,9 @@
#include <asm/hwtest.h>
#include <video/fbcon.h>
#include <video/fbcon-mfb.h>
#include <video/fbcon-cfb2.h>
#include <video/fbcon-cfb4.h>
#include <video/fbcon-cfb8.h>
static
struct
display
disp
;
static
struct
fb_info
fb_info
;
unsigned
long
fb_start
,
fb_size
=
1024
*
768
,
fb_line_length
=
1024
;
unsigned
long
fb_regs
;
unsigned
char
fb_bitmask
;
...
...
@@ -51,216 +42,77 @@ unsigned char fb_bitmask;
#define WWIDTH 0x4102
#define WMOVE 0x409c
static
struct
fb_var_screeninfo
hpfb_defined
=
{
0
,
0
,
0
,
0
,
/* W,H, W, H (virtual) load xres,xres_virtual*/
0
,
0
,
/* virtual -> visible no offset */
0
,
/* depth -> load bits_per_pixel */
0
,
/* greyscale ? */
{
0
,
2
,
0
},
/* R */
{
0
,
2
,
0
},
/* G */
{
0
,
2
,
0
},
/* B */
{
0
,
0
,
0
},
/* transparency */
0
,
/* standard pixel format */
FB_ACTIVATE_NOW
,
274
,
195
,
/* 14" monitor */
FB_ACCEL_NONE
,
0L
,
0L
,
0L
,
0L
,
0L
,
0L
,
0L
,
0
,
/* No sync info */
FB_VMODE_NONINTERLACED
,
{
0
,
0
,
0
,
0
,
0
,
0
}
};
static
struct
fb_fix_screeninfo
hpfb_fix
__initdata
=
{
id:
"HP300 Topcat"
,
smem_len:
1024
*
768
,
type:
FB_TYPE_PACKED_PIXELS
,
visual:
FB_VISUAL_PSEUDOCOLOR
,
line_length:
1024
,
accel:
FB_ACCEL_NONE
,
struct
hpfb_par
{
static
struct
fb_var_screeninfo
hpfb_defined
=
{
xres:
1024
,
yres:
768
,
xres_virtual:
1024
,
yres_virtual:
786
,
bits_per_pixel:
1
,
red:
{
0
,
2
,
0
},
/* R */
green:
{
0
,
2
,
0
},
/* G */
blue:
{
0
,
2
,
0
},
/* B */
activate:
FB_ACTIVATE_NOW
,
height:
274
,
width:
195
,
/* 14" monitor */
accel_flags:
FB_ACCEL_NONE
,
vmode:
FB_VMODE_NONINTERLACED
,
};
struct
hpfb_par
current_par
;
static
void
hpfb_encode_var
(
struct
fb_var_screeninfo
*
var
,
struct
hpfb_par
*
par
)
{
int
i
=
0
;
var
->
xres
=
1024
;
var
->
yres
=
768
;
var
->
xres_virtual
=
1024
;
var
->
yres_virtual
=
768
;
var
->
xoffset
=
0
;
var
->
yoffset
=
0
;
var
->
bits_per_pixel
=
1
;
var
->
grayscale
=
0
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
var
->
transp
.
msb_right
=
0
;
var
->
nonstd
=
0
;
var
->
activate
=
0
;
var
->
height
=
-
1
;
var
->
width
=
-
1
;
var
->
vmode
=
FB_VMODE_NONINTERLACED
;
var
->
pixclock
=
0
;
var
->
sync
=
0
;
var
->
left_margin
=
0
;
var
->
right_margin
=
0
;
var
->
upper_margin
=
0
;
var
->
lower_margin
=
0
;
var
->
hsync_len
=
0
;
var
->
vsync_len
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
var
->
reserved
);
i
++
)
var
->
reserved
[
i
]
=
0
;
}
static
void
hpfb_get_par
(
struct
hpfb_par
*
par
)
{
*
par
=
current_par
;
}
static
int
fb_update_var
(
int
con
,
struct
fb_info
*
info
)
{
return
0
;
}
static
int
do_fb_set_var
(
struct
fb_var_screeninfo
*
var
,
int
isactive
)
{
struct
hpfb_par
par
;
hpfb_get_par
(
&
par
);
hpfb_encode_var
(
var
,
&
par
);
return
0
;
}
static
int
hpfb_get_cmap
(
struct
fb_cmap
*
cmap
,
int
kspc
,
int
con
,
struct
fb_info
*
info
)
{
return
0
;
}
static
struct
display
display
;
/*
* Set the palette. This may not work on all boards but only experimentation will tell.
* Set the palette. This may not work on all boards but only experimentation
* will tell.
* XXX Doesn't work at all.
*/
static
int
hpfb_set_cmap
(
struct
fb_cmap
*
cmap
,
int
kspc
,
int
con
,
static
int
hpfb_setcolreg
(
unsigned
regno
,
unsigned
red
,
unsigned
green
,
unsigned
blue
,
unsigned
transp
,
struct
fb_info
*
info
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
cmap
->
len
;
i
++
)
{
while
(
readw
(
fb_regs
+
0x6002
)
&
0x4
)
udelay
(
1
);
writew
(
0
,
fb_regs
+
0x60f0
);
writew
(
cmap
->
start
+
i
,
fb_regs
+
0x60b8
);
writew
(
cmap
->
red
[
i
]
,
fb_regs
+
0x60b2
);
writew
(
cmap
->
green
[
i
]
,
fb_regs
+
0x60b4
);
writew
(
cmap
->
blue
[
i
]
,
fb_regs
+
0x60b6
);
writew
(
regno
,
fb_regs
+
0x60b8
);
writew
(
red
,
fb_regs
+
0x60b2
);
writew
(
green
,
fb_regs
+
0x60b4
);
writew
(
blue
,
fb_regs
+
0x60b6
);
writew
(
0xff
,
fb_regs
+
0x60f0
);
udelay
(
100
);
}
writew
(
0xffff
,
fb_regs
+
0x60ba
);
return
0
;
}
static
int
hpfb_get_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
{
struct
hpfb_par
par
;
if
(
con
==-
1
)
{
hpfb_get_par
(
&
par
);
hpfb_encode_var
(
var
,
&
par
);
}
else
*
var
=
fb_display
[
con
].
var
;
return
0
;
}
static
int
hpfb_set_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
{
int
err
;
if
((
err
=
do_fb_set_var
(
var
,
1
)))
return
err
;
return
0
;
}
static
void
hpfb_encode_fix
(
struct
fb_fix_screeninfo
*
fix
,
struct
hpfb_par
*
par
)
{
memset
(
fix
,
0
,
sizeof
(
struct
fb_fix_screeninfo
));
strcpy
(
fix
->
id
,
"HP300 Topcat"
);
/*
* X works, but screen wraps ...
*/
fix
->
smem_start
=
fb_start
;
fix
->
smem_len
=
fb_size
;
fix
->
type
=
FB_TYPE_PACKED_PIXELS
;
fix
->
visual
=
FB_VISUAL_PSEUDOCOLOR
;
fix
->
xpanstep
=
0
;
fix
->
ypanstep
=
0
;
fix
->
ywrapstep
=
0
;
fix
->
line_length
=
fb_line_length
;
}
static
int
hpfb_get_fix
(
struct
fb_fix_screeninfo
*
fix
,
int
con
,
struct
fb_info
*
info
)
{
struct
hpfb_par
par
;
hpfb_get_par
(
&
par
);
hpfb_encode_fix
(
fix
,
&
par
);
return
0
;
}
static
void
topcat_blit
(
int
x0
,
int
y0
,
int
x1
,
int
y1
,
int
w
,
int
h
)
void
hpfb_copyarea
(
struct
fb_info
*
info
,
struct
fb_copyarea
*
area
)
{
while
(
readb
(
fb_regs
+
BUSY
)
&
fb_bitmask
);
writeb
(
0x3
,
fb_regs
+
WMRR
);
writew
(
x0
,
fb_regs
+
SOURCE_X
);
writew
(
y0
,
fb_regs
+
SOURCE_Y
);
writew
(
x1
,
fb_regs
+
DEST_X
);
writew
(
y1
,
fb_regs
+
DEST_Y
);
writew
(
h
,
fb_regs
+
WHEIGHT
);
writew
(
w
,
fb_regs
+
WWIDTH
);
writew
(
area
->
sx
,
fb_regs
+
SOURCE_X
);
writew
(
area
->
sy
,
fb_regs
+
SOURCE_Y
);
writew
(
area
->
dx
,
fb_regs
+
DEST_X
);
writew
(
area
->
dy
,
fb_regs
+
DEST_Y
);
writew
(
area
->
height
,
fb_regs
+
WHEIGHT
);
writew
(
area
->
width
,
fb_regs
+
WWIDTH
);
writeb
(
fb_bitmask
,
fb_regs
+
WMOVE
);
}
static
int
hpfb_switch
(
int
con
,
struct
fb_info
*
info
)
{
do_fb_set_var
(
&
fb_display
[
con
].
var
,
1
);
info
->
currcon
=
con
;
return
0
;
}
static
void
hpfb_set_disp
(
int
con
)
{
struct
fb_fix_screeninfo
fix
;
struct
display
*
display
;
if
(
con
>=
0
)
display
=
&
fb_display
[
con
];
else
display
=
&
disp
;
/* used during initialization */
hpfb_get_fix
(
&
fix
,
con
,
0
);
display
->
visual
=
fix
.
visual
;
display
->
type
=
fix
.
type
;
display
->
type_aux
=
fix
.
type_aux
;
display
->
ypanstep
=
fix
.
ypanstep
;
display
->
ywrapstep
=
fix
.
ywrapstep
;
display
->
line_length
=
fix
.
line_length
;
display
->
next_line
=
fix
.
line_length
;
display
->
can_soft_blank
=
0
;
display
->
inverse
=
0
;
display
->
dispsw
=
&
fbcon_cfb8
;
}
static
struct
fb_ops
hpfb_ops
=
{
owner:
THIS_MODULE
,
fb_get_fix:
hpfb_get_fix
,
fb_get_var:
hpfb_get_var
,
fb_set_var:
hpfb_set_var
,
fb_get_cmap:
hpfb_get_cmap
,
fb_set_cmap:
hpfb_set_cmap
,
fb_get_fix:
gen_get_fix
,
fb_get_var:
gen_get_var
,
fb_set_var:
gen_set_var
,
fb_get_cmap:
gen_get_cmap
,
fb_set_cmap:
gen_set_cmap
,
fb_setcolreg:
hpfb_setcolreg
,
fb_fillrect:
cfb_fillrect
,
fb_copyarea:
hpfb_copyarea
,
fb_imageblit:
cfb_imageblit
,
};
#define TOPCAT_FBOMSB 0x5d
...
...
@@ -273,7 +125,7 @@ int __init hpfb_init_one(unsigned long base)
fboff
=
(
readb
(
base
+
TOPCAT_FBOMSB
)
<<
8
)
|
readb
(
base
+
TOPCAT_FBOLSB
);
fb
_start
=
0xf0000000
|
(
readb
(
base
+
fboff
)
<<
16
);
hpfb_fix
.
smem
_start
=
0xf0000000
|
(
readb
(
base
+
fboff
)
<<
16
);
fb_regs
=
base
;
#if 0
...
...
@@ -285,17 +137,6 @@ int __init hpfb_init_one(unsigned long base)
writeb(0, base+0x4516);
writeb(0x90, base+0x4206);
#endif
/*
* Fill in the available video resolution
*/
hpfb_defined
.
xres
=
1024
;
hpfb_defined
.
yres
=
768
;
hpfb_defined
.
xres_virtual
=
1024
;
hpfb_defined
.
yres_virtual
=
768
;
hpfb_defined
.
bits_per_pixel
=
8
;
/*
* Give the hardware a bit of a prod and work out how many bits per
* pixel are supported.
...
...
@@ -303,8 +144,8 @@ int __init hpfb_init_one(unsigned long base)
writeb
(
0xff
,
base
+
TC_WEN
);
writeb
(
0xff
,
base
+
TC_FBEN
);
writeb
(
0xff
,
fb
_start
);
fb_bitmask
=
readb
(
fb
_start
);
writeb
(
0xff
,
hpfb_fix
.
smem
_start
);
fb_bitmask
=
readb
(
hpfb_fix
.
smem
_start
);
/*
* Enable reading/writing of all the planes.
...
...
@@ -317,24 +158,25 @@ int __init hpfb_init_one(unsigned long base)
/*
* Let there be consoles..
*/
strcpy
(
fb_info
.
modename
,
"Topcat"
);
fb_info
.
changevar
=
NULL
;
fb_info
.
node
=
NODEV
;
fb_info
.
fbops
=
&
hpfb_ops
;
fb_info
.
screen_base
=
fb_start
;
fb_info
.
disp
=
&
disp
;
fb_info
.
currcon
=
-
1
;
fb_info
.
switch_con
=
&
hpfb_switch
;
fb_info
.
updatevar
=
&
fb_update_var
;
fb_info
.
flags
=
FBINFO_FLAG_DEFAULT
;
do_fb_set_var
(
&
hpfb_defined
,
1
);
fb_info
.
var
=
hpfb_defined
;
fb_info
.
fix
=
hpfb_fix
;
fb_info
.
screen_base
=
hpfb_fix
.
smem_start
;
/* The below feilds will go away !!!! */
fb_info
.
currcon
=
-
1
;
strcpy
(
fb_info
.
modename
,
fb_info
.
fix
.
id
);
fb_info
.
disp
=
&
display
;
fb_info
.
switch_con
=
gen_switch
;
fb_info
.
updatevar
=
gen_update_var
;
fb_alloc_cmap
(
&
fb_info
.
cmap
,
256
,
0
);
hpfb_get_var
(
&
disp
.
var
,
-
1
,
&
fb_info
);
hpfb_set_disp
(
-
1
);
gen_set_disp
(
-
1
,
&
fb_info
);
if
(
register_framebuffer
(
&
fb_info
)
<
0
)
return
1
;
return
0
;
}
...
...
@@ -364,29 +206,25 @@ int __init hpfb_init(void)
*/
#define INTFBADDR 0xf0560000
if
(
hwreg_present
((
void
*
)
INTFBADDR
)
&&
(
DIO_ID
(
INTFBADDR
)
==
DIO_ID_FBUFFER
)
&&
topcat_sid_ok
(
sid
=
DIO_SECID
(
INTFBADDR
)))
{
if
(
hwreg_present
((
void
*
)
INTFBADDR
)
&&
(
DIO_ID
(
INTFBADDR
)
==
DIO_ID_FBUFFER
)
&&
topcat_sid_ok
(
sid
=
DIO_SECID
(
INTFBADDR
)))
{
printk
(
"Internal Topcat found (secondary id %02x)
\n
"
,
sid
);
hpfb_init_one
(
INTFBADDR
);
}
else
{
}
else
{
int
sc
=
dio_find
(
DIO_ID_FBUFFER
);
if
(
sc
)
{
if
(
sc
)
{
unsigned
long
addr
=
(
unsigned
long
)
dio_scodetoviraddr
(
sc
);
unsigned
int
sid
=
DIO_SECID
(
addr
);
if
(
topcat_sid_ok
(
sid
))
{
if
(
topcat_sid_ok
(
sid
))
{
printk
(
"Topcat found at DIO select code %02x "
"(secondary id %02x)
\n
"
,
sc
,
sid
);
hpfb_init_one
(
addr
);
}
}
}
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment