[Android6.0][RK3399] 双屏异显代码实现流程分析

人生难得几回搏,此时不搏待何时。这篇文章主要讲述[Android6.0][RK3399] 双屏异显代码实现流程分析相关的知识,希望能为你提供帮助。
本文转载自:http://blog.csdn.net/dearsq/article/details/55050125

    • Patch Code
      • dtsi
        • rk3399-androiddtsi
        • rk3399-evb-rev3-androiddts
      • lcdc 控制器
        • rk322x_lcdcc
        • rk_fbc
      • timing 初始化
        • rk_screenc
        • rk32_dpc
        • rk32_mipi_dsih
        • rk_fbh
        • lcd 的 dtsi
 
Platform: RK3399 
OS: android 6.0 
Version: v2016.08 
LCD interface: eDP + mipi
Patch CodeDate: Fri, 09 Dec 2016 10:53:11 +0800 
Subject: [PATCH] video: rockchip: fb: add support dual lcd 
Change-Id: I246f8e7d725d26abf2555d3077dd87da72920731 
Signed-off-by: Huang xxx < × × × >
dtsi
rk3399-android.dtsi
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi index a009537..05a8377 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi @@ -287,7 +287,7 @@ status = "okay"; compatible = "rockchip,rk-fb"; rockchip,disp-mode = < DUAL> ; -rockchip,uboot-logo-on = < 1> ; +rockchip,uboot-logo-on = < 0> ; memory-region = < & rockchip_logo> ; };

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
rk3399-evb-rev3-android.dts【[Android6.0][RK3399] 双屏异显代码实现流程分析】在 rk_screen 中默认只有一个 screen0, 用于填充 primary screen 的 timing 
现在需要添加 screen1,用于填充 extend screen 的 timing
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts b/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts index 3b3ff7c..3653205 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts @@ -51,18 +51,55 @@ }; & rk_screen { -#include < dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi> +status = "okay"; +screen0 { +screen_prop = < PRMRY> ; +native-mode = < DEFAULT_MODE> ; +power_ctr { +lcd_en0: lcd-en { +rockchip,power_type = < GPIO> ; +gpios = < & gpio1 13 GPIO_ACTIVE_HIGH> ; +rockchip,delay = < 10> ; +}; +/* lcd_cs { +rockchip,power_type = < GPIO> ; +gpios = < & gpio7 GPIO_A4 GPIO_ACTIVE_HIGH> ; +rockchip,delay = < 10> ; +}; */ +}; +#include < dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi> +//#include < dt-bindings/display/screen-timing/lcd-F402.dtsi> +}; +screen1 { +screen_prop = < EXTEND> ; +native-mode = < DEFAULT_MODE> ; +power_ctr { +/* cd_en1: lcd-en { +rockchip,power_type = < GPIO> ; +gpios = < & gpio1 13 GPIO_ACTIVE_HIGH> ; +rockchip,delay = < 10> ; +}; */ +/* lcd_cs { +rockchip,power_type = < GPIO> ; +gpios = < & gpio7 GPIO_A4 GPIO_ACTIVE_HIGH> ; +rockchip,delay = < 10> ; +}; */ +}; +#include < dt-bindings/display/screen-timing/lcd-F402.dtsi> +//#include < dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi> +//#include "lcd-box.dtsi" +}; }; & vopb_rk_fb { status = "okay"; power_ctr: power_ctr { rockchip,debug = < 0> ; -lcd_en: lcd-en { +/* lcd_en: lcd-en { rockchip,power_type = < GPIO> ; gpios = < & gpio1 13 GPIO_ACTIVE_HIGH> ; rockchip,delay = < 10> ; -}; +}; *//*lcd_cs: lcd-cs { rockchip,power_type = < GPIO> ; @@ -80,14 +117,23 @@ & vopl_rk_fb { status = "okay"; +rockchip,uboot-logo-on = < 0> ; }; //设置 mipi 通道的为主屏, eDP 的为副屏 & mipi0_rk_fb { status = "okay"; +prop = < PRMRY> ; +//prop = < EXTEND> ; +}; + +& edp_rk_fb { +status = "okay"; +prop = < EXTEND> ; +//prop = < PRMRY> ; }; & hdmi_rk_fb { -status = "okay"; +status = "disabled"; rockchip,hdmi_video_source = < DISPLAY_SOURCE_LCDC1> ; }; ``` ``` diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi index b3c7141..b72ce6c 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi @@ -101,7 +101,7 @@ 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255> ; -default-brightness-level = < 200> ; +default-brightness-level = < 128> ; }; clkin_gmac: external-gmac-clock { @@ -370,7 +370,7 @@ }; & i2c4 { -status = "okay"; +status = "disabled"; i2c-scl-rising-time-ns = < 600> ; i2c-scl-falling-time-ns = < 20> ;

  • 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
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
lcdc 控制器
rk322x_lcdc.c
diff --git a/drivers/video/rockchip/lcdc/rk322x_lcdc.c b/drivers/video/rockchip/lcdc/rk322x_lcdc.c index 93c996a..d6bdff3 100644 --- a/drivers/video/rockchip/lcdc/rk322x_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk322x_lcdc.c @@ -5252,6 +5252,10 @@rk322x_pdev = pdev; +if (dev_drv-> cur_screen-> type != SCREEN_HDMI & & +dev_drv-> cur_screen-> type != SCREEN_TVOUT) +dev_drv-> hot_plug_state = 1; + if (dev_drv-> cur_screen-> refresh_mode == SCREEN_CMD_MODE) { te_pin = of_get_named_gpio_flags(np, "te-gpio", 0, NULL); if (IS_ERR_VALUE(te_pin)) {

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
rk_fb.c
diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 25563a4..80db2e2 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -73,9 +73,8 @@ extern phys_addr_t uboot_logo_base; extern phys_addr_t uboot_logo_size; extern phys_addr_t uboot_logo_offset; -static struct rk_fb_trsm_ops *trsm_lvds_ops; -static struct rk_fb_trsm_ops *trsm_edp_ops; -static struct rk_fb_trsm_ops *trsm_mipi_ops; +static struct rk_fb_trsm_ops *trsm_prmry_ops; +static struct rk_fb_trsm_ops *trsm_extend_ops; static int uboot_logo_on; static int rk_fb_debug_lvl; @@ -115,26 +114,13 @@ int rk_fb_trsm_ops_register(struct rk_fb_trsm_ops *ops, int type) { -switch (type) { -case SCREEN_RGB: -case SCREEN_LVDS: -case SCREEN_DUAL_LVDS: -case SCREEN_LVDS_10BIT: -case SCREEN_DUAL_LVDS_10BIT: -trsm_lvds_ops = ops; -break; -case SCREEN_EDP: -trsm_edp_ops = ops; -break; -case SCREEN_MIPI: -case SCREEN_DUAL_MIPI: -trsm_mipi_ops = ops; -break; -default: -pr_warn("%s: unsupported transmitter: %d!\n", -__func__, type); -break; -} +if (type == PRMRY) +trsm_prmry_ops = ops; +else if (type == EXTEND) +trsm_extend_ops = ops; +else +pr_err("%s, type:%d\n", __func__, type); + return 0; }@@ -142,27 +128,12 @@ { struct rk_fb_trsm_ops *ops; -switch (type) { -case SCREEN_RGB: -case SCREEN_LVDS: -case SCREEN_DUAL_LVDS: -case SCREEN_LVDS_10BIT: -case SCREEN_DUAL_LVDS_10BIT: -ops = trsm_lvds_ops; -break; -case SCREEN_EDP: -ops = trsm_edp_ops; -break; -case SCREEN_MIPI: -case SCREEN_DUAL_MIPI: -ops = trsm_mipi_ops; -break; -default: -ops = NULL; -pr_warn("%s: unsupported transmitter: %d!\n", -__func__, type); -break; -} +if (type == PRMRY) +ops = trsm_prmry_ops; +else if (type == EXTEND) +ops = trsm_extend_ops; +else +pr_err("%s, type:%d\n", __func__, type); return ops; }@@ -317,10 +288,10 @@ /* * rk display power control parse from dts */ -int rk_disp_pwr_ctr_parse_dt(struct rk_lcdc_driver *dev_drv) +int rk_disp_pwr_ctr_parse_dt(struct device_node *np, +struct rk_screen *rk_screen) { -struct device_node *root = of_get_child_by_name(dev_drv-> dev-> of_node, -"power_ctr"); +struct device_node *root = of_get_child_by_name(np, "power_ctr"); struct device_node *child; struct rk_disp_pwr_ctr_list *pwr_ctr; struct list_head *pos; @@ -329,10 +300,10 @@ u32 debug = 0; int ret; -INIT_LIST_HEAD(& dev_drv-> pwrlist_head); +INIT_LIST_HEAD(rk_screen-> pwrlist_head); if (!root) { -dev_err(dev_drv-> dev, "can‘t find power_ctr node for lcdc%d\n", -dev_drv-> id); +dev_err(rk_screen-> dev, "can‘t find power_ctr node for lcdc%d\n", +rk_screen-> lcdc_id); return -ENODEV; }@@ -347,7 +318,7 @@ pwr_ctr-> pwr_ctr.type = GPIO; pwr_ctr-> pwr_ctr.gpio = of_get_gpio_flags(child, 0, & flags); if (!gpio_is_valid(pwr_ctr-> pwr_ctr.gpio)) { -dev_err(dev_drv-> dev, "%s ivalid gpio\n", +dev_err(rk_screen-> dev, "%s ivalid gpio\n", child-> name); return -EINVAL; } @@ -355,7 +326,7 @@ ret = gpio_request(pwr_ctr-> pwr_ctr.gpio, child-> name); if (ret) { -dev_err(dev_drv-> dev, +dev_err(rk_screen-> dev, "request %s gpio fail:%d\n", child-> name, ret); } @@ -364,9 +335,9 @@ pwr_ctr-> pwr_ctr.type = REGULATOR; pwr_ctr-> pwr_ctr.rgl_name = NULL; ret = of_property_read_string(child, "rockchip,regulator_name", -& (pwr_ctr-> pwr_ctr.rgl_name)); +& (pwr_ctr-> pwr_ctr.rgl_name)); if (ret || IS_ERR_OR_NULL(pwr_ctr-> pwr_ctr.rgl_name)) -dev_err(dev_drv-> dev, "get regulator name failed!\n"); +dev_err(rk_screen-> dev, "get regulator name failed!\n"); if (!of_property_read_u32(child, "rockchip,regulator_voltage", & val)) pwr_ctr-> pwr_ctr.volt = val; else @@ -378,29 +349,30 @@ pwr_ctr-> pwr_ctr.delay = val; else pwr_ctr-> pwr_ctr.delay = 0; -list_add_tail(& pwr_ctr-> list, & dev_drv-> pwrlist_head); +list_add_tail(& pwr_ctr-> list, rk_screen-> pwrlist_head); }of_property_read_u32(root, "rockchip,debug", & debug); if (debug) { -list_for_each(pos, & dev_drv-> pwrlist_head) { +list_for_each(pos, rk_screen-> pwrlist_head) { pwr_ctr = list_entry(pos, struct rk_disp_pwr_ctr_list, list); -pr_info("pwr_ctr_name:%s\n" -"pwr_type:%s\n" -"gpio:%d\n" -"atv_val:%d\n" -"delay:%d\n\n", -pwr_ctr-> pwr_ctr.name, -(pwr_ctr-> pwr_ctr.type == GPIO) ? "gpio" : "regulator", -pwr_ctr-> pwr_ctr.gpio, -pwr_ctr-> pwr_ctr.atv_val, -pwr_ctr-> pwr_ctr.delay); +printk(KERN_INFO "pwr_ctr_name:%s\n" +"pwr_type:%s\n" +"gpio:%d\n" +"atv_val:%d\n" +"delay:%d\n\n", +pwr_ctr-> pwr_ctr.name, +(pwr_ctr-> pwr_ctr.type == GPIO) ? "gpio" : "regulator", +pwr_ctr-> pwr_ctr.gpio, +pwr_ctr-> pwr_ctr.atv_val, +pwr_ctr-> pwr_ctr.delay); } }return 0; + } int rk_disp_pwr_enable(struct rk_lcdc_driver *dev_drv) @@ -411,9 +383,14 @@ struct regulator *regulator_lcd = NULL; int count = 10; -if (list_empty(& dev_drv-> pwrlist_head)) +if (!dev_drv-> cur_screen-> pwrlist_head) { +pr_info("error:%s, lcdc%d screen pwrlist null\n", +__func__, dev_drv-> id); return 0; -list_for_each(pos, & dev_drv-> pwrlist_head) { +} +if (list_empty(dev_drv-> cur_screen-> pwrlist_head)) +return 0; +list_for_each(pos, dev_drv-> cur_screen-> pwrlist_head) { pwr_ctr_list = list_entry(pos, struct rk_disp_pwr_ctr_list, list); pwr_ctr = & pwr_ctr_list-> pwr_ctr; @@ -422,8 +399,7 @@ mdelay(pwr_ctr-> delay); } else if (pwr_ctr-> type == REGULATOR) { if (pwr_ctr-> rgl_name) -regulator_lcd = -regulator_get(NULL, pwr_ctr-> rgl_name); +regulator_lcd = regulator_get(NULL, pwr_ctr-> rgl_name); if (regulator_lcd == NULL) { dev_err(dev_drv-> dev, "%s: regulator get failed,regulator name:%s\n", @@ -456,9 +432,14 @@ struct regulator *regulator_lcd = NULL; int count = 10; -if (list_empty(& dev_drv-> pwrlist_head)) +if (!dev_drv-> cur_screen-> pwrlist_head) { +pr_info("error:%s, lcdc%d screen pwrlist null\n", +__func__, dev_drv-> id); return 0; -list_for_each(pos, & dev_drv-> pwrlist_head) { +} +if (list_empty(dev_drv-> cur_screen-> pwrlist_head)) +return 0; +list_for_each(pos, dev_drv-> cur_screen-> pwrlist_head) { pwr_ctr_list = list_entry(pos, struct rk_disp_pwr_ctr_list, list); pwr_ctr = & pwr_ctr_list-> pwr_ctr; @@ -474,8 +455,7 @@ continue; } while (regulator_is_enabled(regulator_lcd) > 0) { -if (regulator_disable(regulator_lcd) == 0 || -count == 0) +if (regulator_disable(regulator_lcd) == 0 || count == 0) break; else dev_err(dev_drv-> dev, @@ -530,6 +510,8 @@ screen-> pin_den = 1; else screen-> pin_den = 0; +printk("hjc> > > prop:%d, x:%d, y:%d, dclk:%d\n", screen-> prop, +screen-> mode.xres, screen-> mode.yres, screen-> mode.pixclock); return 0; } @@ -544,7 +526,7 @@ pr_err("parse display timing err\n"); return -EINVAL; } -dt = display_timings_get(disp_timing, disp_timing-> native_mode); +dt = display_timings_get(disp_timing, screen-> native_mode); rk_fb_video_mode_from_timing(dt, screen); return 0; @@ -3942,7 +3924,8 @@ win = dev_drv-> win[win_id]; if (!strcmp(fbi-> fix.id, "fb0")) { -fb_mem_size = get_fb_size(dev_drv-> reserved_fb); +fb_mem_size = get_fb_size(dev_drv-> reserved_fb, +dev_drv-> cur_screen); #if defined(CONFIG_ION_ROCKCHIP) if (rk_fb_alloc_buffer_by_ion(fbi, win, fb_mem_size) < 0) return -ENOMEM; @@ -3963,8 +3946,7 @@ if (dev_drv-> prop == EXTEND & & dev_drv-> iommu_enabled) { struct rk_lcdc_driver *dev_drv_prmry; int win_id_prmry; - -fb_mem_size = get_fb_size(dev_drv-> reserved_fb); +fb_mem_size = get_fb_size(dev_drv-> reserved_fb, dev_drv-> cur_screen); #if defined(CONFIG_ION_ROCKCHIP) dev_drv_prmry = rk_get_prmry_lcdc_drv(); if (dev_drv_prmry == NULL) @@ -4129,14 +4111,9 @@ dev_drv-> area_support[i] = 1; if (dev_drv-> ops-> area_support_num) dev_drv-> ops-> area_support_num(dev_drv, dev_drv-> area_support); -rk_disp_pwr_ctr_parse_dt(dev_drv); -if (dev_drv-> prop == PRMRY) { -rk_fb_set_prmry_screen(screen); -rk_fb_get_prmry_screen(screen); -} -dev_drv-> trsm_ops = rk_fb_trsm_ops_get(screen-> type); -if (dev_drv-> prop != PRMRY) -rk_fb_get_extern_screen(screen); +rk_fb_set_screen(screen, dev_drv-> prop); +rk_fb_get_screen(screen, dev_drv-> prop); +dev_drv-> trsm_ops = rk_fb_trsm_ops_get(dev_drv-> prop); dev_drv-> output_color = screen-> color_mode; return 0; @@ -4511,15 +4488,24 @@ struct fb_info *extend_fbi = rk_fb-> fb[dev_drv-> fb_index_base]; extend_fbi-> var.pixclock = rk_fb-> fb[0]-> var.pixclock; -if (rk_fb-> disp_mode == DUAL_LCD) { -extend_fbi-> fbops-> fb_open(extend_fbi, 1); -if (dev_drv-> iommu_enabled) { -if (dev_drv-> mmu_dev) -rockchip_iovmm_set_fault_handler(dev_drv-> dev, -rk_fb_sysmmu_fault_handler); -} -rk_fb_alloc_buffer(extend_fbi); +extend_fbi-> var.xres_virtual = rk_fb-> fb[0]-> var.xres_virtual; +extend_fbi-> var.yres_virtual = rk_fb-> fb[0]-> var.yres_virtual; +extend_fbi-> var.xres = rk_fb-> fb[0]-> var.xres; +extend_fbi-> var.yres = rk_fb-> fb[0]-> var.yres; +extend_fbi-> fbops-> fb_open(extend_fbi, 1); +if (dev_drv-> iommu_enabled) { +if (dev_drv-> mmu_dev) +rockchip_iovmm_set_fault_handler(dev_drv-> dev, +rk_fb_sysmmu_fault_handler); +if (dev_drv-> ops-> mmu_en) +dev_drv-> ops-> mmu_en(dev_drv); } +rk_fb_alloc_buffer(extend_fbi); +//if (rk_fb-> disp_mode == DUAL_LCD) { +extend_fbi-> fbops-> fb_set_par(extend_fbi); +extend_fbi-> fbops-> fb_pan_display(& extend_fbi-> var, +extend_fbi); +//} } #endif return 0;

  • 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
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
timing 初始化
rk_screen.c
diff --git a/drivers/video/rockchip/screen/rk_screen.c b/drivers/video/rockchip/screen/rk_screen.c index 3a4e6c3..7473e5f 100644 --- a/drivers/video/rockchip/screen/rk_screen.c +++ b/drivers/video/rockchip/screen/rk_screen.c @@ -4,57 +4,102 @@ #include "lcd.h" #include "../hdmi/rockchip-hdmi.h"-static struct rk_screen *rk_screen; +static struct rk_screen *prmry_screen; +static struct rk_screen *extend_screen; + +static void rk_screen_info_error(struct rk_screen *screen, int prop) +{ +pr_err("> > > > > > > > > > > > > > > > > > > > error< < < < < < < < < < < < < < < < < < < < \n"); +pr_err("> > please init %s screen info in dtsi file< < \n", +(prop == PRMRY) ? "prmry" : "extend"); +pr_err("> > > > > > > > > > > > > > > > > > > > error< < < < < < < < < < < < < < < < < < < < \n"); +} int rk_fb_get_extern_screen(struct rk_screen *screen) { -if (unlikely(!rk_screen) || unlikely(!screen)) +if (unlikely(!extend_screen) || unlikely(!screen)) return -1; - -memcpy(screen, rk_screen, sizeof(struct rk_screen)); +memcpy(screen, extend_screen, sizeof(struct rk_screen)); screen-> dsp_lut = NULL; screen-> cabc_lut = NULL; -screen-> type = SCREEN_NULL; - return 0; }-intrk_fb_get_prmry_screen(struct rk_screen *screen) +int rk_fb_get_prmry_screen(struct rk_screen *screen) { -if (unlikely(!rk_screen) || unlikely(!screen)) +if (unlikely(!prmry_screen) || unlikely(!screen)) return -1; -memcpy(screen, rk_screen, sizeof(struct rk_screen)); +memcpy(screen, prmry_screen, sizeof(struct rk_screen)); return 0; }-int rk_fb_set_prmry_screen(struct rk_screen *screen) +intrk_fb_get_screen(struct rk_screen *screen, int prop) { -if (unlikely(!rk_screen) || unlikely(!screen)) +struct rk_screen *cur_screen = NULL; +if (unlikely(!screen)) return -1; -rk_screen-> lcdc_id = screen-> lcdc_id; -rk_screen-> screen_id = screen-> screen_id; -rk_screen-> x_mirror = screen-> x_mirror; -rk_screen-> y_mirror = screen-> y_mirror; -rk_screen-> overscan.left = screen-> overscan.left; -rk_screen-> overscan.top = screen-> overscan.left; -rk_screen-> overscan.right = screen-> overscan.left; -rk_screen-> overscan.bottom = screen-> overscan.left; +if (prop == PRMRY) { +if (unlikely(!prmry_screen)) { +rk_screen_info_error(screen, prop); +return -1; +} +cur_screen = prmry_screen; +} else { +if (unlikely(!extend_screen)) { +rk_screen_info_error(screen, prop); +return -1; +} +cur_screen = extend_screen; +} +memcpy(screen, cur_screen, sizeof(struct rk_screen)); return 0; }-size_t get_fb_size(u8 reserved_fb) +int rk_fb_set_screen(struct rk_screen *screen, int prop) +{ +struct rk_screen *cur_screen = NULL; + +if (unlikely(!screen)) +return -1; +if (prop == PRMRY) { +if (unlikely(!prmry_screen)) { +rk_screen_info_error(screen, prop); +return -1; +} +cur_screen = prmry_screen; +} else { +if (unlikely(!extend_screen)) { +rk_screen_info_error(screen, prop); +return -1; +} +cur_screen = extend_screen; +} + +cur_screen-> lcdc_id = screen-> lcdc_id; +cur_screen-> screen_id = screen-> screen_id; +cur_screen-> x_mirror = screen-> x_mirror; +cur_screen-> y_mirror = screen-> y_mirror; +cur_screen-> overscan.left = screen-> overscan.left; +cur_screen-> overscan.top = screen-> overscan.left; +cur_screen-> overscan.right = screen-> overscan.left; +cur_screen-> overscan.bottom = screen-> overscan.left; + +return 0; +} + +size_t get_fb_size(u8 reserved_fb, struct rk_screen *screen) { size_t size = 0; u32 xres = 0; u32 yres = 0; -if (unlikely(!rk_screen)) +if (unlikely(!screen)) return 0; -xres = rk_screen-> mode.xres; -yres = rk_screen-> mode.yres; +xres = screen-> mode.xres; +yres = screen-> mode.yres; /* align as 64 bytes(16*4) in an odd number of times */ xres = ALIGN_64BYTE_ODD_TIMES(xres, ALIGN_PIXEL_64BYTE_RGB8888); @@ -73,22 +118,51 @@ static int rk_screen_probe(struct platform_device *pdev) { struct device_node *np = pdev-> dev.of_node; -int ret; +struct device_node *screen_np; +struct rk_screen *rk_screen; +int ret, screen_prop; if (!np) { dev_err(& pdev-> dev, "Missing device tree node.\n"); return -EINVAL; } -rk_screen = devm_kzalloc(& pdev-> dev, -sizeof(struct rk_screen), GFP_KERNEL); -if (!rk_screen) { -dev_err(& pdev-> dev, "kmalloc for rk screen fail!"); -return-ENOMEM; + +for_each_child_of_node(np, screen_np) { +rk_screen = devm_kzalloc(& pdev-> dev, +sizeof(struct rk_screen), GFP_KERNEL); +if (!rk_screen) { +dev_err(& pdev-> dev, "kmalloc for rk screen fail!"); +return-ENOMEM; +} +rk_screen-> pwrlist_head = devm_kzalloc(& pdev-> dev, +sizeof(struct list_head), GFP_KERNEL); +if (!rk_screen-> pwrlist_head) { +dev_err(& pdev-> dev, "kmalloc for rk_screen pwrlist_head fail!"); +return-ENOMEM; +} +of_property_read_u32(screen_np, "screen_prop", & screen_prop); +if (screen_prop == PRMRY) +prmry_screen = rk_screen; +else if (screen_prop == EXTEND) +extend_screen = rk_screen; +else +dev_err(& pdev-> dev, "unknow screen prop: %d\n", +screen_prop); +rk_screen-> prop = screen_prop; +of_property_read_u32(screen_np, "native-mode", & rk_screen-> native_mode); +rk_screen-> dev = & pdev-> dev; +ret = rk_fb_prase_timing_dt(screen_np, rk_screen); +pr_info("%s screen timing parse %s\n", +(screen_prop == PRMRY) ? "prmry" : "extend", +ret ? "failed" : "success"); +ret = rk_disp_pwr_ctr_parse_dt(screen_np, rk_screen); +pr_info("%s screen power ctrl parse %s\n", +(screen_prop == PRMRY) ? "prmry" : "extend", +ret ? "failed" : "success"); } -ret = rk_fb_prase_timing_dt(np, rk_screen); -dev_info(& pdev-> dev, "rockchip screen probe %s\n", -ret ? "failed" : "success"); -return ret; + +dev_info(& pdev-> dev, "rockchip screen probe success\n"); +return 0; } static const struct of_device_id rk_screen_dt_ids[] = {

  • 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
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
rk32_dp.c
diff --git a/drivers/video/rockchip/transmitter/rk32_dp.c b/drivers/video/rockchip/transmitter/rk32_dp.c index 6d386bc..0bffdb0 100755 --- a/drivers/video/rockchip/transmitter/rk32_dp.c +++ b/drivers/video/rockchip/transmitter/rk32_dp.c @@ -129,7 +129,7 @@ struct rk_screen *screen = & edp-> screen; u32 val = 0; -rk_fb_get_prmry_screen(screen); +rk_fb_get_screen(screen, edp-> prop); if (cpu_is_rk3288()) { if (screen-> lcdc_id == 1)/*select lcdc*/ @@ -1734,17 +1734,21 @@ struct resource *res; struct device_node *np = pdev-> dev.of_node; int ret; +int prop; if (!np) { dev_err(& pdev-> dev, "Missing device tree node.\n"); return -EINVAL; } +of_property_read_u32(np, "prop", & prop); +pr_info("Use EDP as %s screen\n", (prop == PRMRY) ? "prmry" : "extend"); edp = devm_kzalloc(& pdev-> dev, sizeof(struct rk32_edp), GFP_KERNEL); if (!edp) { dev_err(& pdev-> dev, "no memory for state\n"); return -ENOMEM; } +edp-> prop = prop; edp-> dev = & pdev-> dev; edp-> video_info.h_sync_polarity = 0; edp-> video_info.v_sync_polarity = 0; @@ -1756,7 +1760,7 @@edp-> video_info.link_rate= LINK_RATE_1_62GBPS; edp-> video_info.lane_count= LANE_CNT4; -rk_fb_get_prmry_screen(& edp-> screen); +rk_fb_get_screen(& edp-> screen, prop); if (edp-> screen.type != SCREEN_EDP) { dev_err(& pdev-> dev, "screen is not edp!\n"); return -EINVAL; @@ -1852,7 +1856,7 @@ pm_runtime_get_sync(& pdev-> dev); rk32_edp = edp; -rk_fb_trsm_ops_register(& trsm_edp_ops, SCREEN_EDP); +rk_fb_trsm_ops_register(& trsm_edp_ops, prop); #if defined(CONFIG_DEBUG_FS) edp-> debugfs_dir = debugfs_create_dir("edp", NULL); if (IS_ERR(edp-> debugfs_dir)) { diff --git a/drivers/video/rockchip/transmitter/rk32_dp.h b/drivers/video/rockchip/transmitter/rk32_dp.h index 2dc41c6..fda0de2 100755 --- a/drivers/video/rockchip/transmitter/rk32_dp.h +++ b/drivers/video/rockchip/transmitter/rk32_dp.h @@ -571,6 +571,7 @@ bool edp_en; int soctype; struct dentry *debugfs_dir; +int prop; }; ``` #### rk32_mipi_dsi.c ``` diff --git a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c index 741fdb5..ed68d85 100644 --- a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c +++ b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c @@ -1609,7 +1609,7 @@ pm_runtime_get_sync(& dsi0-> pdev-> dev); #endif opt_mode = dsi0-> screen.refresh_mode; -rk_fb_get_prmry_screen(dsi0-> screen.screen); +rk_fb_get_screen(dsi0-> screen.screen, dsi0-> prop); dsi0-> screen.lcdc_id = dsi0-> screen.screen-> lcdc_id; rk32_init_phy_mode(dsi0-> screen.lcdc_id); @@ -1875,7 +1875,7 @@ static int rk32_mipi_dsi_probe(struct platform_device *pdev) { int ret = 0; -static int id; +static int id, prop; struct dsi *dsi; struct mipi_dsi_ops *ops; struct rk_screen *screen; @@ -1890,7 +1890,8 @@ return -ENODEV; } data = https://www.songbingjia.com/android/of_id-> data; - +of_property_read_u32(np,"prop", & prop); +pr_info("Use mipi as %s screen\n", (prop == PRMRY) ? "prmry" : "extend"); dsi = devm_kzalloc(& pdev-> dev, sizeof(struct dsi), GFP_KERNEL); if (!dsi) { dev_err(& pdev-> dev, "request struct dsi fail!\n"); @@ -1997,8 +1998,8 @@ dev_err(& pdev-> dev, "request struct rk_screen fail!\n"); return -1; } -rk_fb_get_prmry_screen(screen); - +rk_fb_get_screen(screen, prop); +dsi-> prop = prop; dsi-> pdev = pdev; ops = & dsi-> ops; ops-> dsi = dsi; @@ -2056,7 +2057,7 @@ if(!support_uboot_display()) rk32_init_phy_mode(dsi_screen-> lcdc_id); */ -rk_fb_trsm_ops_register(& trsm_dsi_ops, SCREEN_MIPI); +rk_fb_trsm_ops_register(& trsm_dsi_ops, prop); #ifdef MIPI_DSI_REGISTER_IO debugfs_create_file("mipidsi0", S_IFREG | S_IRUGO, dsi-> debugfs_dir, dsi, & reg_proc_fops);

  • 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
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
rk32_mipi_dsi.h
diff --git a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h index f568254..473db82 100644 --- a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h +++ b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h @@ -307,6 +307,7 @@ struct dsi { u8 dsi_id; u8 lcdc_id; +int prop; u8 vid; u8 clk_on; struct regmap *grf_base;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
rk_fb.h
diff --git a/include/dt-bindings/display/rk_fb.h b/include/dt-bindings/display/rk_fb.h index 81c9855..ae7241d 100755 --- a/include/dt-bindings/display/rk_fb.h +++ b/include/dt-bindings/display/rk_fb.h @@ -14,6 +14,13 @@ #define DUAL2 #define DUAL_LCD3+#define DEFAULT_MODE0 +#define HDMI_720P0 +#define HDMI_1080P 1 +#define HDMI_2160P 2 +#define NTSC_CVBS3 +#define PAL_CVBS4 + #define DEFAULT_MODE0 #define ONE_VOP_DUAL_MIPI_HOR_SCAN 1 #define ONE_VOP_DUAL_MIPI_VER_SCAN 2

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
lcd 的 dtsi
diff --git a/include/dt-bindings/display/screen-timing/lcd-F402.dtsi b/include/dt-bindings/display/screen-timing/lcd-F402.dtsi index a3ad25f..abe178f 100644 --- a/include/dt-bindings/display/screen-timing/lcd-F402.dtsi +++ b/include/dt-bindings/display/screen-timing/lcd-F402.dtsi @@ -4,9 +4,9 @@ */-disp_timings: display-timings { -native-mode = < & timing0> ; -timing0: timing0 { +display-timings { +native-mode = < & f402> ; +f402: timing0 { screen-type = < SCREEN_EDP> ; out-face= < OUT_P666> ; clock-frequency = < 205000000> ;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
diff --git a/include/dt-bindings/display/screen-timing/lcd-box.dtsi b/include/dt-bindings/display/screen-timing/lcd-box.dtsi index 2109a89..20e2a21 100644 --- a/include/dt-bindings/display/screen-timing/lcd-box.dtsi +++ b/include/dt-bindings/display/screen-timing/lcd-box.dtsi @@ -3,36 +3,9 @@ * */-disp_power_ctr: power_ctr { -/*rockchip,debug = < 0> ; -lcd_en:lcd_en { -rockchip,power_type = < GPIO> ; -gpios = < & gpio0 GPIO_B0 GPIO_ACTIVE_HIGH> ; -rockchip,delay = < 10> ; -}; - -bl_en:bl_en { -rockchip,power_type = < GPIO> ; -gpios = < & gpio0 GPIO_A2 GPIO_ACTIVE_HIGH> ; -rockchip,delay = < 10> ; -}; - -bl_ctr:bl_ctr { -rockchip,power_type = < GPIO> ; -gpios = < & gpio3 GPIO_D6 GPIO_ACTIVE_HIGH> ; -rockchip,delay = < 10> ; -}; - -lcd_rst:lcd_rst { -rockchip,power_type = < REGULATOR> ; -rockchip,delay = < 5> ; -}; */ - -}; - -disp_timings: display-timings { -native-mode = < & timing0> ; -timing0: timing0 { +display-timings { +native-mode = < & hdmi_720p> ; +hdmi_720p: timing0 { screen-type = < SCREEN_RGB> ; out-face= < OUT_P888> ; color-mode = < COLOR_YCBCR> ; @@ -53,7 +26,7 @@ swap-rg = < 0> ; swap-gb = < 0> ; }; -timing1: timing1 { +hdmi_1080p: timing1 { screen-type = < SCREEN_RGB> ; out-face= < OUT_P888> ; color-mode = < COLOR_YCBCR> ; @@ -74,7 +47,7 @@ swap-rg = < 0> ; swap-gb = < 0> ; }; -timing2: timing2 { +hdmi_2160p: timing2 { screen-type = < SCREEN_RGB> ; out-face= < OUT_P888> ; color-mode = < COLOR_YCBCR> ;

  • 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
diff --git a/include/dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi b/include/dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi index b408d65..6a203a9 100644 --- a/include/dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi +++ b/include/dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi @@ -84,10 +84,10 @@ */ }; -disp_timings: display-timings { -native-mode = < & timing0> ; +display-timings { +native-mode = < & tv080wum_nl0_mipi> ; compatible = "rockchip,display-timings"; -timing0: timing0 { +tv080wum_nl0_mipi: timing0 { screen-type = < SCREEN_MIPI> ; lvds-format = < LVDS_8BIT_2> ; out-face= < OUT_P888> ; diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index d7634a8..1130ea4 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -811,7 +811,10 @@ extern int rk_fb_get_prmry_screen( struct rk_screen *screen); extern int rk_fb_set_prmry_screen(struct rk_screen *screen); extern u32 rk_fb_get_prmry_screen_pixclock(void); -extern int rk_disp_pwr_ctr_parse_dt(struct rk_lcdc_driver *dev_drv); +extern int rk_fb_get_screen(struct rk_screen *screen, int prop); +extern int rk_fb_set_screen(struct rk_screen *screen, int prop); +extern int rk_disp_pwr_ctr_parse_dt(struct device_node *np, +struct rk_screen *rk_screen); extern int rk_disp_pwr_enable(struct rk_lcdc_driver *dev_drv); extern int rk_disp_pwr_disable(struct rk_lcdc_driver *dev_drv); extern bool is_prmry_rk_lcdc_registered(void); diff --git a/include/linux/rk_screen.h b/include/linux/rk_screen.h index 5e5cd30..71a0d4d 100644 --- a/include/linux/rk_screen.h +++ b/include/linux/rk_screen.h @@ -61,13 +61,17 @@ *ft: the time need to display one frame time */ struct rk_screen { -u16 type; +struct device*dev; +int prop; u16 refresh_mode; +struct list_head *pwrlist_head; +u16 type; u16 lvds_format; u16 face; u16 color_mode; u8 lcdc_id; u8 screen_id; +int native_mode; struct fb_videomode mode; u32 post_dsp_stx; u32 post_dsp_sty; @@ -145,7 +149,7 @@ }; extern void set_lcd_info(struct rk_screen *screen, struct rk29lcd_info *lcd_info); -extern size_t get_fb_size(u8 reserved_fb); +extern size_t get_fb_size(u8 reserved_fb, struct rk_screen *screen); extern void set_tv_info(struct rk_screen *screen); extern void set_hdmi_info(struct rk_screen *screen);


    推荐阅读