@ -205,12 +205,8 @@ static void edid_desc_dummy(uint8_t *desc)
static void edid_desc_timing ( uint8_t * desc ,
uint32_t xres , uint32_t yres ,
uint32_t dpi )
uint32_t xmm , uint32_t ymm )
{
/* physical display size */
uint32_t xmm = xres * 254 / 10 / dpi ;
uint32_t ymm = yres * 254 / 10 / dpi ;
/* pull some realistic looking timings out of thin air */
uint32_t xfront = xres * 25 / 100 ;
uint32_t xsync = xres * 3 / 100 ;
@ -290,12 +286,24 @@ static void edid_colorspace(uint8_t *edid,
edid [ 34 ] = white_y > > 2 ;
}
static uint32_t qemu_edid_dpi_from_mm ( uint32_t mm , uint32_t res )
{
return res * 254 / 10 / mm ;
}
uint32_t qemu_edid_dpi_to_mm ( uint32_t dpi , uint32_t res )
{
return res * 254 / 10 / dpi ;
}
void qemu_edid_generate ( uint8_t * edid , size_t size ,
qemu_edid_info * info )
{
uint32_t desc = 54 ;
uint8_t * xtra3 = NULL ;
uint8_t * dta = NULL ;
uint32_t width_mm , height_mm ;
uint32_t dpi = 100 ; /* if no width_mm/height_mm */
/* =============== set defaults =============== */
@ -305,15 +313,20 @@ void qemu_edid_generate(uint8_t *edid, size_t size,
if ( ! info - > name ) {
info - > name = " QEMU Monitor " ;
}
if ( ! info - > dpi ) {
info - > dpi = 100 ;
}
if ( ! info - > prefx ) {
info - > prefx = 1024 ;
}
if ( ! info - > prefy ) {
info - > prefy = 768 ;
}
if ( info - > width_mm & & info - > height_mm ) {
width_mm = info - > width_mm ;
height_mm = info - > height_mm ;
dpi = qemu_edid_dpi_from_mm ( width_mm , info - > prefx ) ;
} else {
width_mm = qemu_edid_dpi_to_mm ( dpi , info - > prefx ) ;
height_mm = qemu_edid_dpi_to_mm ( dpi , info - > prefy ) ;
}
/* =============== extensions =============== */
@ -360,8 +373,8 @@ void qemu_edid_generate(uint8_t *edid, size_t size,
edid [ 20 ] = 0xa5 ;
/* screen size: undefined */
edid [ 21 ] = info - > prefx * 254 / 100 / info - > dpi ;
edid [ 22 ] = info - > prefy * 254 / 100 / info - > dpi ;
edid [ 21 ] = width_mm / 10 ;
edid [ 22 ] = height_mm / 10 ;
/* display gamma: 2.2 */
edid [ 23 ] = 220 - 100 ;
@ -387,7 +400,8 @@ void qemu_edid_generate(uint8_t *edid, size_t size,
/* =============== descriptor blocks =============== */
edid_desc_timing ( edid + desc , info - > prefx , info - > prefy , info - > dpi ) ;
edid_desc_timing ( edid + desc , info - > prefx , info - > prefy ,
width_mm , height_mm ) ;
desc + = 18 ;
edid_desc_ranges ( edid + desc ) ;