内容
默认如下:
QVGA | 240x320 | 2.6 - 3.0 | Small screen | Low density (120) | ldpi |
WQVGA | 240x400 | 3.2 - 3.5 | Normal screen | Low density (120) | ldpi |
FWQVGA | 240x432 | 3.5 - 3.8 | Normal screen | Low density (120) | ldpi |
HVGA | 320x480 | 3.0 - 3.5 | Normal screen | Mediumdensity(160) | mdpi |
WVGA | 480x800 | 3.3 - 4.0 | Normal screen | High density (240) | hdpi |
FWVGA | 480x854 | 3.5 - 4.0 | Normal screen | High density (240) | hdpi |
WVGA | 480x800 | 4.8 - 5.5 | Large screen | Medium density(160) | mdpi |
FWVGA | 480x854 | 5.0 - 5.8 | Large screen | Medium density(160) | mdpi |

1. 实际的xdpi,ydpi的计算公式如下:
disp_data->xdpi = info.physicalWidth == 0 ? density :
(info.displayWidth * 25.4f / info.physicalWidth);
disp_data->ydpi = info.physicalHeight == 0 ? density :
(info.displayHeight * 25.4f / info.physicalHeight);
说明一下上面公式的各个参数:
density的值是ro.sf.lcd_density的值。
info.displayWidth是屏幕的width (如果480p的lcm,width*height=480*800)
info.displayHeight是屏幕的height
info.physicalWidth是需要在lcm_get_params函数里面设置。
info.physicalHeight是需要在lcm_get_params函数里面设置
从上面公式可以看到,如果在display driver里面有设置info.physicalWidth和
info.physicalHeight,就会根据上面的公式计算出实际的xdpi,ydpi;否则,就会直
接使用ro.sf.lcd_density的值赋值给xdpi,ydpi。
2. info.physicalWidth和info.physicalHeight在lcm driver里面对应到
lcm_get_params里面的params->physical_width和params->physical_height这两个值。
所以客户需要在lcm_get_params里面设置
params->physical_width和params->physical_height。
举例说明:
假设lcm的分辨率是480×800,然后需要设置的实际的Xdpi是239.05,Ydpi是236.27。
套用上面的公式可以得到:info.physicalWidth=51;info.physicalHeight=86.
所以直接在lcm_get_params里面如下设置,然后android就会根据上面的公式计算出实际的xdpi和ydpi:
params->physical_width=51
params->physical_height=86



params->physical_height = xxx;
typedef struct
{
LCM_TYPE type;
LCM_CTRL ctrl; //! how to control LCM registers
unsigned int width;
unsigned int height;
unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec
/* particular parameters */
LCM_DBI_PARAMS dbi;
LCM_DPI_PARAMS dpi;
LCM_DSI_PARAMS dsi;
unsigned int active_width;
unsigned int active_height;
//MTK end
UINT32 DISP_GetActiveHeight(void)
{
disp_drv_init_context();
if(lcm_params)
{
printk("[wwy]lcm_parms->active_height = %d\n",lcm_params->active_height);
return lcm_params->active_height;
}
else
{
printk("WARNING!! get active_height before display driver inited!\n");
return 0;
}
}
{
disp_drv_init_context();
if(lcm_params)
{
printk("[wwy]lcm_parms->active_width = %d\n",lcm_params->active_width);
return lcm_params->active_width;
}
else
{
printk("WARNING!! get active_width before display driver inited!\n");
return 0;
}
}
//MTK end
UINT32 DISP_GetActiveWidth(void);
UINT32 DISP_GetActiveHeight(void);
//MTK end
{
.............
var->blue.msb_right = var->transp.msb_right = 0;
//MTK begin
if(var->height <= 0)
{
var->height = UINT_MAX;
}
if(var->width <= 0)
{
var->width = UINT_MAX;
}
//MTK end
var->nonstd = 0;
var->left_margin = UINT_MAX;
var->right_margin = UINT_MAX;
var->upper_margin = UINT_MAX;
var->lower_margin = UINT_MAX;
var->hsync_len = UINT_MAX;
var->vsync_len = UINT_MAX;
}
{
struct mtkfb_device *fbdev = (struct mtkfb_device *)info->par;
struct fb_var_screeninfo var;
int r = 0;
info->fbops = &mtkfb_ops;
info->flags = FBINFO_FLAG_DEFAULT;
info->screen_base = (char *) fbdev->fb_va_base;
info->screen_size = fbdev->fb_size_in_byte;
info->pseudo_palette = fbdev->pseudo_palette;
if (r != 0)
PRNERR("unable to allocate color map memory\n");
var.xres = MTK_FB_XRES;
var.yres = MTK_FB_YRES;
var.xres_virtual = MTK_FB_XRESV;
var.yres_virtual = MTK_FB_YRESV;
var.green.offset = 5; var.green.length = 6;
var.blue.offset = 0; var.blue.length = 5;
var.width = DISP_GetActiveWidth();
var.height = DISP_GetActiveHeight();
//MTK end
if (r != 0)
PRNERR("failed to mtkfb_check_var\n");
if (r != 0)
PRNERR("failed to mtkfb_set_par\n");
return r;
}
5.在实际用到的屏的.c文件中(类似这样nt35516_qhd_dsi_cmd_ipsboe.c的文件)
params->active_width = active_width;
params->active_height = active_height;
而不是resolution.. 請從panel spec找出對應的physical size.
– var->active_width = 90 (mm)
– var->active_height = 154 (mm)
– And we can get
– X DPI = 600 * 25.4 / 90 = 169.33
– Y DPI = 1024 * 25.4 / 153 = 169.99