[RK3128][Android7.1] android端強制使用固定分辨率顯示内容
Platform: Rockchip
OS: Android 7.1.2
Kernel: 3.10
最近使用480P小螢幕開發時,碰到某些第三方APP的螢幕适配有BUG,如果直接修改配置檔案會導緻螢幕顯示異常,因些隻能直接在android顯示端做分辨率調整。
修改路徑:kernel\drivers\video\rockchip\rk_fb.c
第一步:修改成需要的顯示分辨率
int rk_fb_prase_timing_dt(struct device_node *np, struct rk_screen *screen)
{
struct display_timings *disp_timing;
struct display_timing *dt;
disp_timing = of_get_display_timings(np);
if (!disp_timing) {
pr_err("parse display timing err\n");
return -EINVAL;
}
dt = display_timings_get(disp_timing, disp_timing->native_mode);
/* 修改螢幕顯示分辨率*/
+ dt->hactive.typ = 1280;
+ dt->vactive.typ = 720;
rk_fb_video_mode_from_timing(dt, screen);
return 0;
}
第二步:修改顯示分辨率後,會導緻顯示區域也被相對縮放,是以需要修改顯示視窗縮放規則
static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
struct rk_lcdc_win *win,
struct rk_fb_reg_win_data *reg_win_data)
{
...
} else {
/* 對小于720P的螢幕不做縮放處理 */
+ if (reg_win_data->reg_area_data[i].xsize >= 1280 && reg_win_data->reg_area_data[i].ysize >= 720){
win->area[i].xpos =
reg_win_data->reg_area_data[i].xpos *
cur_screen->mode.xres /
primary_screen.mode.xres;
win->area[i].ypos =
reg_win_data->reg_area_data[i].ypos *
cur_screen->mode.yres /
primary_screen.mode.yres;
win->area[i].xsize =
reg_win_data->reg_area_data[i].xsize *
cur_screen->mode.xres /
primary_screen.mode.xres;
win->area[i].ysize =
reg_win_data->reg_area_data[i].ysize *
cur_screen->mode.yres /
primary_screen.mode.yres;
+ }
/* recalc display size if set hdmi scaler when at ONE_DUAL mode */
if (inf->disp_mode == ONE_DUAL && hdmi_switch_state) {
if (cur_screen->xsize > 0 &&
cur_screen->xsize <= cur_screen->mode.xres) {
win->area[i].xpos =
((cur_screen->mode.xres - cur_screen->xsize) >> 1) +
cur_screen->xsize * win->area[i].xpos / cur_screen->mode.xres;
win->area[i].xsize =
win->area[i].xsize * cur_screen->xsize / cur_screen->mode.xres;
}
if (cur_screen->ysize > 0 && cur_screen->ysize <= cur_screen->mode.yres) {
win->area[i].ypos =
((cur_screen->mode.yres - cur_screen->ysize) >> 1) +
cur_screen->ysize * win->area[i].ypos / cur_screen->mode.yres;
win->area[i].ysize =
win->area[i].ysize * cur_screen->ysize / cur_screen->mode.yres;
}
}
}
...
}
目前螢幕顯示正常,無觸摸屏,觸摸屏觸摸效果是否會有異常暫時未知