1、顯示幀資料
mdp和su***ceflinger之間通過hal層來鏈結
hwcomposer便是兩者之間的橋梁。
hwcomposer顯示前,要開啟framebuffer裝置
hardware/qcom/display/libhwcomposer/hwc_utils.cpp檔案:
static int openframebufferdevice(hwc_context_t *ctx)
開啟裝置之後,傳送 msmfb_metadata_get獲取到memory data;
之後通過hwc_vsync_control函式,傳送msmfb_overlay_vsync_ctrl,來獲得vsync 的控制。
傳送msmfb_mdp_pp,來設定mdp 的pipe型別。
最後傳送msmfb_display_commit,呼叫到mdp的mdss_fb_display_commit
flush 第一幀畫面,則此時第一幀畫面顯示出現。
傳送msmfb_overlay_prepare,來準備overlay machine。呼叫mdp 的__handle_ioctl_overlay_prepare 函式。實現例如z_order, pipesetup相關的設定。
傳送msmfb_buffer_sync,呼叫mdp的mdss_fb_handle_buf_sync_ioctl來實現buffer 的同步控制。
傳送msmfb_overlay_play,呼叫mdss_mdp_overlay_play,mdss_mdp_overlay_start,來開啟overlay machine。
傳送msmfb_display_commit,呼叫mdss_fb_display_commit,繼續顯示下一幀畫面。
2、實現顯示mode切換
首先,需要mdp 的dsi 介面支援video mode 和 commandmode,顯示屏也可以支援video mode 和 command mode。
在kernel/arch/arm/boot/dts/msm89***.dts中
&dsi_sharp_1080_vid
需要新增dynamic-mode-switch-enabled,使能動態切換的開關。
新增cmd-to-video-mode-switch-commands, video-to-cmd-mode-switch-commands 的命令也就是是panel on 的command序列。
新增 mdss-dsi-cmd-reset-sequence, mdss-dsi-video-reset-sequence。
新增mdss-dsi-te-pin-select,mdss-dsi-te-v-sync-rd-ptr-irq-line,mdss-dsi-te-v-sync-continues-lines,mdss-dsi-te-dcs-command, mdss-dsi-te-check-enable,
mdss-dsi-te-using-te-pin,在probe初始化的時候,這些資源就應該提前申請。
則此時在dtsi檔案中所需求的內容就已經準備好了。
接下來,在kernel/drivers/video/msm/mdss/mdss_fb.c中,mdss_fb_blank函式中,做如下修改:
if((mfd->switch_en == 1) && (blank_mode == fb_blank_unblank))
}當切換被使能,且在亮屏的時候,如果顯示模式有變化,則進行切換。
切換時主要的執行函式是 configure_panel 也就是mdss_mdp_update_panel_info函式。
staticint mdss_mdp_update_panel_info(struct msm_fb_data_type *mfd, int mode)
首先傳送mdss_event_dsi_dynamic_switch ,當dsi_event_handler接收到這個命令後,會執行mdss_dsi_update_panel_config這個函式。在這個函式中,
staticint mdss_dsi_update_panel_config(struct mdss_dsi_ctrl_pdata *ctrl_pdata,
int mode)
else
ctrl_pdata->panel_mode = pinfo->mipi.mode;
mdss_panel_get_dst_fmt(pinfo->bpp, pinfo->mipi.mode,
pinfo->mipi.pixel_packing, &(pinfo->mipi.dst_format));
pinfo->cont_splash_enabled = 0;
pr_info("%s: switching to %s mode\n", __func__,
(pinfo->mipi.mode ? "command" : "video"));
if (pinfo->type == mipi_cmd_panel) else if (pinfo->type == mipi_video_panel)
------------
}在這個函式中我們要把所有和顯示模式有關的引數都做修改。例如:pinfo->mipi。
switch_mode = mdss_dsi_panel_switch_mode;
在mdss_dsi_panel_switch_mode函式中,需要根據顯示模式去-mdss_dsi_parse_reset_seq 更新顯示的序列。
回到 mdss_mdp_update_panel_info ,mdss_mdp_ctl_destroy(mdp5_data->ctl);mdp5_data->ctl= null; 會把mdp5_data->ctl之前
註冊的函式銷毀掉,當執行mdss_mdp_overlay_on 的時候 mdp5_data->ctl 會被重新註冊。之後執行過程都會按著目標panel type 來執行。
高通平台LCD開發
lcd除錯主要有三個任務 1.供電 2.背光 3.lcd驅動 vdd 2.8v 給ic內部供電 vddio 1.8v 給gpio供電 mdss dsi0 qcom,mdss dsi mdss dsi0 qcom,mdss dsi ctrl0 1a94000 主要有兩個gpio需要配置,reset和t...
高通開發 LCD(一)
板子能夠正常列印出log,並且log能看到android啟動的 後,就可以連線上外設,開始進行驅動除錯。android驅動開發,真正自己寫乙個驅動 的機會很少,作為高通方案,基本的開發思路 4.詢問 商,是否有該晶元的 如果沒有,要initial code。驅動開發的主要工作是移植與除錯,如何快速的...
高通平台LCD驅動分析
目前手機晶元廠家提供的原始碼裡包含整個lcd驅動框架,一般廠家會定義乙個 fb.c的原始檔,註冊乙個平台裝置和平台驅動,在驅動的probe函式中來呼叫register framebuffer 從而生成 dev fbx的裝置節點。這裡最重要的資料結構是fb ops,它包括fb開啟 引數設定 畫圖 配置...