linux qcom LCD framwork
點擊打開鏈接
0.關鍵字
MDSS?: Multimedia Display sub system?
DSI: Display Serial Interface
- 1
- 2
1.涉及文件
(1) drivers\video\fbmem.c (核心層)
register_framebuffer(struct fb_info *fb_info) //對外暴露核心函數- 1
(2)drivers\video\msm\mdss\mdss_fb.c (mdss 核心層 fbx平臺設備驅動)
// 調用 fbmem.c的 register_framebuffer注冊 fbx- 1
(4)msm8610-mdss.dtsi (文件名通常為?msmxxx-mdss.dtsi?指定了mdss 的?mdp?和?dsi)
mdss_mdp: qcom,mdss_mdp@fd900000 {compatible = "qcom,mdss_mdp3"; // 對應mdss驅動 mdss_mdp.c----------mdss_dsi0: qcom,mdss_dsi@fdd00000 {compatible = "qcom,msm-dsi-v2"; // 對應dsi解析驅動 dsi_host_v2.c或者mdss_dsi0: qcom,mdss_dsi_ctrl0@1a94000 {compatible = "qcom,mdss-dsi-ctrl"; // 對應dsi解析驅動 mdss_dsi.c- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
(3)drivers\video\msm\mdss\dsi_host_v2.c (lcd驅動 dsi)
// 通過下面函數向 mdss_fb.c 注冊了fb_info結構 (包含在mdss_dsi_ctrl_pdata結構中) dsi_panel_device_register_v2(struct platform_device *dev,struct mdss_dsi_ctrl_pdata *ctrl_pdata)static const struct of_device_id msm_dsi_v2_dt_match[] = {{.compatible = "qcom,msm-dsi-v2"},{} };- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
或者?
drivers\video\msm\mdss\mdss_dsi.c
(5)drivers\video\msm\mdss\mdp3.c (mdp)
.compatible = "qcom,mdss_mdp3",- 1
- 2
- 3
(6)msm8610-asus.dts (指定mdp中的哪一個配置)?
通常在dts文件的 mdss_dsi0 lab里面通過?qcom,dsi-pref-prim-pan?屬性 指定使用哪一個lcd配置
- 1
- 2
- 3
(7)dsi-panel-fl10802-fwvga-video.dtsi
&mdss_mdp {dsi_fl10802_fwvga_vid: qcom,mdss_dsi_fl10802_fwvga_video {qcom,mdss-dsi-panel-name = "fl10802 fwvga video mode dsi panel";qcom,mdss-dsi-drive-ic = "fl10802";qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;qcom,mdss-dsi-panel-type = "dsi_video_mode";qcom,mdss-dsi-panel-destination = "display_1";...}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2. mdss_mdp 和 mdss_dsi0 的關系
mdss_mdp?相當于一個數組,里面定義了很多不同lcd顯示屏的配置項包括分辨率等等
mdss_dsi0?的 “qcom,dsi-pref-prim-pan?” 屬性指定了使用mdss_mdp中哪一個lcd配置選項?
3.時序圖
http://download.csdn.net/detail/u012719256/9603691?
畫的有點渣,湊活看吧,不要在意細節??
4. 重要結構
結構關系
backLight 關鍵字:qcom,mdss-dsi-bl-pmic-control-type- 1
- 2
- 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
① struct mdss_panel_info
struct mdss_panel_info {u32 xres; // x 分辨率 qcom,mdss-dsi-panel-widthu32 yres; // y 分辨率 qcom,mdss-dsi-panel-heightu32 physical_width; // x 物理大小 qcom,mdss-pan-physical-width-dimensionu32 physical_height; // y 物理大小 qcom,mdss-pan-physical-height-dimensionstruct lcd_panel_info lcdc; // 邊界 (1.1)邊界u32 bpp; // bpp qcom,mdss-dsi-bppstruct mipi_panel_info mipi; // mipi顯示模式 video or cmd (1.2)mipiu32 type;u32 wait_cycle;u32 pdest; // 第幾個fb設備 qcom,mdss-dsi-panel-destination = "display_1";u32 brightness_max;u32 bl_max;u32 bl_min;u32 fb_num;u32 clk_rate;u32 clk_min;u32 clk_max;u32 frame_count;u32 is_3d_panel;u32 out_format;u32 rst_seq[MDSS_DSI_RST_SEQ_LEN];...}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
(1.1)邊界
struct lcd_panel_info {u32 h_back_porch;u32 h_front_porch;u32 h_pulse_width;u32 v_back_porch;u32 v_front_porch;u32 v_pulse_width;u32 border_clr;u32 underflow_clr;u32 hsync_skew;/* Pad width */u32 xres_pad; // qcom,mdss-dsi-h-left-border/* Pad height */u32 yres_pad; // qcom,mdss-dsi-h-right-border };- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
(1.2)mipi
struct mipi_panel_info {char mode; /* video/cmd */ // 顯示模式 qcom,mdss-dsi-panel-type = "dsi_video_mode";char interleave_mode;char crc_check;char ecc_check;char dst_format; /* shared by video and command */char data_lane0;char data_lane1;char data_lane2;char data_lane3;char dlane_swap; /* data lane swap */char rgb_swap;char b_sel;char g_sel;char r_sel;char rx_eot_ignore;char tx_eot_append;char t_clk_post; /* 0xc0, DSI_CLKOUT_TIMING_CTRL */char t_clk_pre; /* 0xc0, DSI_CLKOUT_TIMING_CTRL */char vc; /* virtual channel */struct mdss_dsi_phy_ctrl dsi_phy_db;/* video mode */char pulse_mode_hsa_he;char hfp_power_stop;char hbp_power_stop;char hsa_power_stop;char eof_bllp_power_stop;char last_line_interleave_en;char bllp_power_stop;char traffic_mode;char frame_rate;/* command mode */char interleave_max;char insert_dcs_cmd;char wr_mem_continue;char wr_mem_start;char te_sel;char stream; /* 0 or 1 */char mdp_trigger;char dma_trigger;/*Dynamic Switch Support*/bool dynamic_switch_enabled;u32 pixel_packing;u32 dsi_pclk_rate;/* The packet-size should not bet changed */char no_max_pkt_size;/* Clock required during LP commands */char force_clk_lane_hs; //強制DSI_CLK始終處于HS,因我們用DSI CLK as 參考時鐘char vsync_enable;char hw_vsync_mode;char lp11_init;u32 init_delay; };- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
5.結構賦值
//結構從設備數中獲取數據賦值 mdss_dsi_panel.cint mdss_dsi_panel_init(struct device_node *node,struct mdss_dsi_ctrl_pdata *ctrl_pdata, int ndx)// use Dsi_host_v2.c (drivers\video\msm\mdss): rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata, cmd_cfg_cont_splash); Mdss_dsi.c (drivers\video\msm\mdss): rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata, ndx);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
6.lk中傳遞lcm使用的dsi配置名字給kernel
aboot_init // lk\app\aboot\aboot.ctarget_display_init // lk\target\msm8953\target_display.cgcdb_display_init // lk\dev\gcdb\display\gcdb_display.cmsm_display_init // display.cdisplay_image_on_screen //aboot_init // lk\app\aboot\aboot.ctarget_display_init // lk\target\msm8953\target_display.cgcdb_display_init // lk\dev\gcdb\display\gcdb_display.coem_panel_select // lk\target\msm8953\oem_panel.cpanel_id = NT51021B_INX_WUXGA_VIDEO_PANEL; // ☆ panel_id 賦值,使用哪個lcd配置init_panel_data switch (panel_id) {case NT51021B_INX_WUXGA_VIDEO_PANEL:panelstruct->paneldata = &nt51021b_inx_wuxga_video_panel_data; // 根據 panel_id 指定傳給kernel使用的lcm配置----------// lk\dev\gcdb\display\include\panel_nt51021b_inx_wuxga_video.h (lcm配置文件)static struct panel_config nt51021b_inx_wuxga_video_panel_data = {"qcom,mdss_dsi_nt51021b_inx_wuxga_video", // ☆ panel_node_id 對應dtsi中 panel使用的名字 "dsi:0:", "qcom,mdss-dsi-panel",10, 0, "DISPLAY_1", 0, 0, 60, 0, 0, 0, 1, 10000, 0, 0, 0, 0, 0, 0, NULL }; ----------// arch\arm64\boot\dts\qcom\dsi-panel-nt51021b-inx-wuxga-video.dtsi &mdss_mdp {dsi_nt51021b_inx_wuxga_vid: qcom,mdss_dsi_nt51021b_inx_wuxga_video {//dts中的 panel名字qcom,mdss-dsi-panel-name = "nt51021b inx wuxga video mode dsi panel"; // 對應 sys/class/graphic/fb0/panl_info 中的信息- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
6.dts中command格式解析
qcom,mdss-dsi-on-command = [// 延時 reg data 29 01 00 00 01 00 02 8F A529 01 00 00 14 00 02 01 0029 01 00 00 01 00 02 8F A529 01 00 00 00 00 02 8C 8029 01 00 00 00 00 02 C7 5029 01 00 00 00 00 02 C5 5029 01 00 00 00 00 02 85 0429 01 00 00 00 00 02 86 0829 01 00 00 00 00 02 83 AA29 01 00 00 00 00 02 84 1129 01 00 00 00 00 02 A0 3629 01 00 00 00 00 02 A1 3629 01 00 00 00 00 02 9C 1029 01 00 00 00 00 02 A9 4B29 01 00 00 00 00 02 8F 00];- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
7.fb旋轉參數配置
(1) 方法1
fb_info->var->rotate // 是否旋轉- 1
(2) 方法2
msm_fb_data_type->panel_orientation //是否旋轉fb (mdss_fb.h)// 通過dsi中的 qcom,mdss-dsi-panel-orientation 關鍵字控制 (mdss_dsi_panel.c) data = of_get_property(np, "qcom,mdss-dsi-panel-orientation", NULL);if (data) {pr_debug("panel orientation is %s\n", data);if (!strcmp(data, "180"))pinfo->panel_orientation = MDP_ROT_180;else if (!strcmp(data, "hflip"))pinfo->panel_orientation = MDP_FLIP_LR;else if (!strcmp(data, "vflip"))pinfo->panel_orientation = MDP_FLIP_UD;}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
(3)方法三?
system/build.prop?
+ ro.panel.mountflip=3
- 1
- 2
- 3
- 4
- 5
- 6
8.展頻
mdss-pll.c展頻開關:arch/arm/boot/dts/qcom/msm8953-mdss-pll.dtsi qcom,dsi-pll-ssc-en;mode:qcom,dsi-pll-ssc-mode = "down-spread";two parameters to program SSC :clk/msm/mdss/mdss-dsi-pll-8996.c:ssc_ppm_default & ssc_freq_default展頻范圍:down mode : freq - freq * (ssc_ppm/1000,000)center mode : freq ± freq * (ssc_ppm/1000,000) / 2up mode : freq + freq * (ssc_ppm/1000,000)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
9.bklt_en_gpio、 disp_en_gpio、 rst_gpio相關gpio口
// (msm8917-pmi8937-qrd-sku5.dtsi board.dtsi ) mdss_dsi_active mdss_dsi_suspend qcom,platform-reset-gpio qcom,platform-enable-gpio &mdss_dsi0 { qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>;pinctrl-names = "mdss_default", "mdss_sleep";pinctrl-0 = <&mdss_dsi_active>;pinctrl-1 = <&mdss_dsi_suspend>;qcom,platform-reset-gpio = <&tlmm 60 0>; // rstqcom,platform-enable-gpio= <&tlmm 46 0>; //供電引腳 };//(mdss_dsi.c) disp_en_gpio bklt_en_gpio rst_gpio// mdss_dsi_parse_gpio_params ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-enable-gpio", 0);ctrl_pdata->disp_te_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-te-gpio", 0);ctrl_pdata->bklt_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-bklight-en-gpio", 0);ctrl_pdata->rst_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-reset-gpio", 0);ctrl_pdata->mode_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,"qcom,platform-mode-gpio", 0);// mdss_dsi_panel_power_onmdss_dsi_panel_reset(pdata, 1); // (mdss_dsi_panel.c)gpio_set_value((ctrl_pdata->bklt_en_gpio), 0);gpio_set_value((ctrl_pdata->disp_en_gpio), 0);gpio_set_value((ctrl_pdata->rst_gpio), 0);// mdss_dsi_panel_power_offmdss_dsi_panel_reset(pdata, 0); // (mdss_dsi_panel.c)gpio_set_value((ctrl_pdata->bklt_en_gpio), 0);gpio_set_value((ctrl_pdata->disp_en_gpio), 0);gpio_set_value((ctrl_pdata->rst_gpio), 0);// (msm8917-pinctrl.dtsi)pmx_mdss: pmx_mdss {mdss_dsi_active: mdss_dsi_active {mux {pins = "gpio60", "gpio46";function = "gpio";};config {pins = "gpio60", "gpio46";drive-strength = <8>; /* 8 mA */bias-disable = <0>; /* no pull */ // output-high;};};mdss_dsi_suspend: mdss_dsi_suspend {mux {pins = "gpio60", "gpio46";function = "gpio";};config {pins = "gpio60", "gpio46";drive-strength = <2>; /* 2 mA */bias-pull-down; /* pull down */};};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
10.esd功能
qcom,esd-check-enabled // 是否使用esd check 功能 qcom,mdss-dsi-panel-status-check-mode // esd check的方式 te_signal_check (只能在cmd模式下用)or reg_read- 1
- 2
- 3
10.1 cmd mode demo
qcom,mdss-dsi-te-pin-select = <1>;qcom,mdss-dsi-te-v-sync-rd-ptr-irq-line = <0x2c>;qcom,mdss-dsi-te-v-sync-continue-lines = <0x3c>;qcom,mdss-dsi-te-dcs-command = <1>;qcom,esd-check-enabled; // enable esd checkqcom,mdss-dsi-panel-status-check-mode = "te_signal_check"; // esd check mode te模式 (只能用作cmd模式)qcom,mdss-dsi-te-check-enable; // teqcom,mdss-dsi-te-using-te-pin; // use te pin- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
10.2 video mode demo
qcom,esd-check-enabled;qcom,mdss-dsi-panel-status-check-mode = "reg_read";qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08];qcom,mdss-dsi-panel-status-command-state = "dsi_lp_mode";qcom,mdss-dsi-panel-status-read-length = <1>;qcom,mdss-dsi-panel-max-error-count = <2>;qcom,mdss-dsi-panel-status-value = <0x9c>;- 1
- 2
- 3
- 4
- 5
- 6
- 7
總結
以上是生活随笔為你收集整理的linux qcom LCD framwork的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于android7.1+msm8937
- 下一篇: 高通平台modem部分mbn文件的OTA