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
nexedi
linux
Commits
936fc428
Commit
936fc428
authored
Nov 16, 2010
by
Paul Mundt
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fbdev/edid'
parents
12ddf374
0ad83f68
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
134 additions
and
0 deletions
+134
-0
drivers/video/fbmon.c
drivers/video/fbmon.c
+88
-0
drivers/video/modedb.c
drivers/video/modedb.c
+43
-0
include/linux/fb.h
include/linux/fb.h
+3
-0
No files found.
drivers/video/fbmon.c
View file @
936fc428
...
...
@@ -973,6 +973,90 @@ void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs)
DPRINTK
(
"========================================
\n
"
);
}
/**
* fb_edid_add_monspecs() - add monitor video modes from E-EDID data
* @edid: 128 byte array with an E-EDID block
* @spacs: monitor specs to be extended
*/
void
fb_edid_add_monspecs
(
unsigned
char
*
edid
,
struct
fb_monspecs
*
specs
)
{
unsigned
char
*
block
;
struct
fb_videomode
*
m
;
int
num
=
0
,
i
;
u8
svd
[
64
],
edt
[(
128
-
4
)
/
DETAILED_TIMING_DESCRIPTION_SIZE
];
u8
pos
=
4
,
svd_n
=
0
;
if
(
!
edid
)
return
;
if
(
!
edid_checksum
(
edid
))
return
;
if
(
edid
[
0
]
!=
0x2
||
edid
[
2
]
<
4
||
edid
[
2
]
>
128
-
DETAILED_TIMING_DESCRIPTION_SIZE
)
return
;
DPRINTK
(
" Short Video Descriptors
\n
"
);
while
(
pos
<
edid
[
2
])
{
u8
len
=
edid
[
pos
]
&
0x1f
,
type
=
(
edid
[
pos
]
>>
5
)
&
7
;
pr_debug
(
"Data block %u of %u bytes
\n
"
,
type
,
len
);
if
(
type
==
2
)
for
(
i
=
pos
;
i
<
pos
+
len
;
i
++
)
{
u8
idx
=
edid
[
pos
+
i
]
&
0x7f
;
svd
[
svd_n
++
]
=
idx
;
pr_debug
(
"N%sative mode #%d
\n
"
,
edid
[
pos
+
i
]
&
0x80
?
""
:
"on-n"
,
idx
);
}
pos
+=
len
+
1
;
}
block
=
edid
+
edid
[
2
];
DPRINTK
(
" Extended Detailed Timings
\n
"
);
for
(
i
=
0
;
i
<
(
128
-
edid
[
2
])
/
DETAILED_TIMING_DESCRIPTION_SIZE
;
i
++
,
block
+=
DETAILED_TIMING_DESCRIPTION_SIZE
)
if
(
PIXEL_CLOCK
)
edt
[
num
++
]
=
block
-
edid
;
/* Yikes, EDID data is totally useless */
if
(
!
(
num
+
svd_n
))
return
;
m
=
kzalloc
((
specs
->
modedb_len
+
num
+
svd_n
)
*
sizeof
(
struct
fb_videomode
),
GFP_KERNEL
);
if
(
!
m
)
return
;
memcpy
(
m
,
specs
->
modedb
,
specs
->
modedb_len
*
sizeof
(
struct
fb_videomode
));
for
(
i
=
specs
->
modedb_len
;
i
<
specs
->
modedb_len
+
num
;
i
++
)
{
get_detailed_timing
(
edid
+
edt
[
i
-
specs
->
modedb_len
],
&
m
[
i
]);
if
(
i
==
specs
->
modedb_len
)
m
[
i
].
flag
|=
FB_MODE_IS_FIRST
;
pr_debug
(
"Adding %ux%u@%u
\n
"
,
m
[
i
].
xres
,
m
[
i
].
yres
,
m
[
i
].
refresh
);
}
for
(
i
=
specs
->
modedb_len
+
num
;
i
<
specs
->
modedb_len
+
num
+
svd_n
;
i
++
)
{
int
idx
=
svd
[
i
-
specs
->
modedb_len
-
num
];
if
(
!
idx
||
idx
>
63
)
{
pr_warning
(
"Reserved SVD code %d
\n
"
,
idx
);
}
else
if
(
idx
>
ARRAY_SIZE
(
cea_modes
)
||
!
cea_modes
[
idx
].
xres
)
{
pr_warning
(
"Unimplemented SVD code %d
\n
"
,
idx
);
}
else
{
memcpy
(
&
m
[
i
],
cea_modes
+
idx
,
sizeof
(
m
[
i
]));
pr_debug
(
"Adding SVD #%d: %ux%u@%u
\n
"
,
idx
,
m
[
i
].
xres
,
m
[
i
].
yres
,
m
[
i
].
refresh
);
}
}
kfree
(
specs
->
modedb
);
specs
->
modedb
=
m
;
specs
->
modedb_len
=
specs
->
modedb_len
+
num
+
svd_n
;
}
/*
* VESA Generalized Timing Formula (GTF)
*/
...
...
@@ -1289,6 +1373,9 @@ void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs)
{
specs
=
NULL
;
}
void
fb_edid_add_monspecs
(
unsigned
char
*
edid
,
struct
fb_monspecs
*
specs
)
{
}
void
fb_destroy_modedb
(
struct
fb_videomode
*
modedb
)
{
}
...
...
@@ -1396,6 +1483,7 @@ EXPORT_SYMBOL(fb_firmware_edid);
EXPORT_SYMBOL
(
fb_parse_edid
);
EXPORT_SYMBOL
(
fb_edid_to_monspecs
);
EXPORT_SYMBOL
(
fb_edid_add_monspecs
);
EXPORT_SYMBOL
(
fb_get_mode
);
EXPORT_SYMBOL
(
fb_validate_mode
);
EXPORT_SYMBOL
(
fb_destroy_modedb
);
drivers/video/modedb.c
View file @
936fc428
...
...
@@ -278,6 +278,49 @@ static const struct fb_videomode modedb[] = {
};
#ifdef CONFIG_FB_MODE_HELPERS
const
struct
fb_videomode
cea_modes
[
64
]
=
{
/* #1: 640x480p@59.94/60Hz */
[
1
]
=
{
NULL
,
60
,
640
,
480
,
39722
,
48
,
16
,
33
,
10
,
96
,
2
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
/* #3: 720x480p@59.94/60Hz */
[
3
]
=
{
NULL
,
60
,
720
,
480
,
37037
,
60
,
16
,
30
,
9
,
62
,
6
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
/* #5: 1920x1080i@59.94/60Hz */
[
5
]
=
{
NULL
,
60
,
1920
,
1080
,
13763
,
148
,
88
,
15
,
2
,
44
,
5
,
0
,
FB_VMODE_INTERLACED
,
0
,
},
/* #7: 720(1440)x480iH@59.94/60Hz */
[
7
]
=
{
NULL
,
60
,
1440
,
480
,
18554
/*37108*/
,
114
,
38
,
15
,
4
,
124
,
3
,
0
,
FB_VMODE_INTERLACED
,
0
,
},
/* #9: 720(1440)x240pH@59.94/60Hz */
[
9
]
=
{
NULL
,
60
,
1440
,
240
,
18554
,
114
,
38
,
16
,
4
,
124
,
3
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
/* #18: 720x576pH@50Hz */
[
18
]
=
{
NULL
,
50
,
720
,
576
,
37037
,
68
,
12
,
39
,
5
,
64
,
5
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
/* #19: 1280x720p@50Hz */
[
19
]
=
{
NULL
,
50
,
1280
,
720
,
13468
,
220
,
440
,
20
,
5
,
40
,
5
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
/* #20: 1920x1080i@50Hz */
[
20
]
=
{
NULL
,
50
,
1920
,
1080
,
13480
,
148
,
528
,
15
,
5
,
528
,
5
,
0
,
FB_VMODE_INTERLACED
,
0
,
},
/* #32: 1920x1080p@23.98/24Hz */
[
32
]
=
{
NULL
,
24
,
1920
,
1080
,
13468
,
148
,
638
,
36
,
4
,
44
,
5
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
/* #35: (2880)x480p4x@59.94/60Hz */
[
35
]
=
{
NULL
,
50
,
2880
,
480
,
11100
,
240
,
64
,
30
,
9
,
248
,
6
,
0
,
FB_VMODE_NONINTERLACED
,
0
,
},
};
const
struct
fb_videomode
vesa_modes
[]
=
{
/* 0 640x350-85 VESA */
{
NULL
,
85
,
640
,
350
,
31746
,
96
,
32
,
60
,
32
,
64
,
3
,
...
...
include/linux/fb.h
View file @
936fc428
...
...
@@ -1092,6 +1092,8 @@ extern int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var);
extern
const
unsigned
char
*
fb_firmware_edid
(
struct
device
*
device
);
extern
void
fb_edid_to_monspecs
(
unsigned
char
*
edid
,
struct
fb_monspecs
*
specs
);
extern
void
fb_edid_add_monspecs
(
unsigned
char
*
edid
,
struct
fb_monspecs
*
specs
);
extern
void
fb_destroy_modedb
(
struct
fb_videomode
*
modedb
);
extern
int
fb_find_mode_cvt
(
struct
fb_videomode
*
mode
,
int
margins
,
int
rb
);
extern
unsigned
char
*
fb_ddc_read
(
struct
i2c_adapter
*
adapter
);
...
...
@@ -1149,6 +1151,7 @@ struct fb_videomode {
extern
const
char
*
fb_mode_option
;
extern
const
struct
fb_videomode
vesa_modes
[];
extern
const
struct
fb_videomode
cea_modes
[
64
];
struct
fb_modelist
{
struct
list_head
list
;
...
...
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