本文转载自:http://blog.csdn.net/dearsq/article/details/55050125

Platform: RK3399 
OS: Android 6.0 
Version: v2016.08 
LCD interface: eDP + mipi

Patch Code

Date: 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

  1. diff --git a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
  2. index a009537..05a8377 100644
  3. --- a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
  4. +++ b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
  5. @@ -287,7 +287,7 @@
  6. status = "okay";
  7. compatible = "rockchip,rk-fb";
  8. rockchip,disp-mode = <DUAL>;
  9. - rockchip,uboot-logo-on = <1>;
  10. + rockchip,uboot-logo-on = <0>;
  11. memory-region = <&rockchip_logo>;
  12. };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

rk3399-evb-rev3-android.dts

在 rk_screen 中默认只有一个 screen0, 用于填充 primary screen 的 timing 
现在需要添加 screen1,用于填充 extend screen 的 timing

  1. diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts b/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts
  2. index 3b3ff7c..3653205 100644
  3. --- a/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts
  4. +++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-rev3-android.dts
  5. @@ -51,18 +51,55 @@
  6. };
  7. &rk_screen {
  8. - #include <dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi>
  9. + status = "okay";
  10. + screen0 {
  11. + screen_prop = <PRMRY>;
  12. + native-mode = <DEFAULT_MODE>;
  13. + power_ctr {
  14. + lcd_en0: lcd-en {
  15. + rockchip,power_type = <GPIO>;
  16. + gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
  17. + rockchip,delay = <10>;
  18. + };
  19. + /* lcd_cs {
  20. + rockchip,power_type = <GPIO>;
  21. + gpios = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
  22. + rockchip,delay = <10>;
  23. + }; */
  24. + };
  25. + #include <dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi>
  26. + //#include <dt-bindings/display/screen-timing/lcd-F402.dtsi>
  27. + };
  28. + screen1 {
  29. + screen_prop = <EXTEND>;
  30. + native-mode = <DEFAULT_MODE>;
  31. + power_ctr {
  32. + /* cd_en1: lcd-en {
  33. + rockchip,power_type = <GPIO>;
  34. + gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
  35. + rockchip,delay = <10>;
  36. + };*/
  37. + /* lcd_cs {
  38. + rockchip,power_type = <GPIO>;
  39. + gpios = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
  40. + rockchip,delay = <10>;
  41. + }; */
  42. + };
  43. + #include <dt-bindings/display/screen-timing/lcd-F402.dtsi>
  44. + //#include <dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi>
  45. + //#include "lcd-box.dtsi"
  46. + };
  47. };
  48. &vopb_rk_fb {
  49. status = "okay";
  50. power_ctr: power_ctr {
  51. rockchip,debug = <0>;
  52. - lcd_en: lcd-en {
  53. + /* lcd_en: lcd-en {
  54. rockchip,power_type = <GPIO>;
  55. gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
  56. rockchip,delay = <10>;
  57. - };
  58. + }; */
  59. /*lcd_cs: lcd-cs {
  60. rockchip,power_type = <GPIO>;
  61. @@ -80,14 +117,23 @@
  62. &vopl_rk_fb {
  63. status = "okay";
  64. + rockchip,uboot-logo-on = <0>;
  65. };
  66. //设置 mipi 通道的为主屏, eDP 的为副屏
  67. &mipi0_rk_fb {
  68. status = "okay";
  69. + prop = <PRMRY>;
  70. + //prop = <EXTEND>;
  71. +};
  72. +
  73. +&edp_rk_fb {
  74. + status = "okay";
  75. + prop = <EXTEND>;
  76. + //prop = <PRMRY>;
  77. };
  78. &hdmi_rk_fb {
  79. - status = "okay";
  80. + status = "disabled";
  81. rockchip,hdmi_video_source = <DISPLAY_SOURCE_LCDC1>;
  82. };
  83. ```
  84. ```
  85. diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi
  86. index b3c7141..b72ce6c 100644
  87. --- a/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi
  88. +++ b/arch/arm64/boot/dts/rockchip/rk3399-evb.dtsi
  89. @@ -101,7 +101,7 @@
  90. 232 233 234 235 236 237 238 239
  91. 240 241 242 243 244 245 246 247
  92. 248 249 250 251 252 253 254 255>;
  93. - default-brightness-level = <200>;
  94. + default-brightness-level = <128>;
  95. };
  96. clkin_gmac: external-gmac-clock {
  97. @@ -370,7 +370,7 @@
  98. };
  99. &i2c4 {
  100. - status = "okay";
  101. + status = "disabled";
  102. i2c-scl-rising-time-ns = <600>;
  103. 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

  1. diff --git a/drivers/video/rockchip/lcdc/rk322x_lcdc.c b/drivers/video/rockchip/lcdc/rk322x_lcdc.c
  2. index 93c996a..d6bdff3 100644
  3. --- a/drivers/video/rockchip/lcdc/rk322x_lcdc.c
  4. +++ b/drivers/video/rockchip/lcdc/rk322x_lcdc.c
  5. @@ -5252,6 +5252,10 @@
  6. rk322x_pdev = pdev;
  7. + if (dev_drv->cur_screen->type != SCREEN_HDMI &&
  8. + dev_drv->cur_screen->type != SCREEN_TVOUT)
  9. + dev_drv->hot_plug_state = 1;
  10. +
  11. if (dev_drv->cur_screen->refresh_mode == SCREEN_CMD_MODE) {
  12. te_pin = of_get_named_gpio_flags(np, "te-gpio", 0, NULL);
  13. if (IS_ERR_VALUE(te_pin)) {
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

rk_fb.c

  1. diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c
  2. index 25563a4..80db2e2 100644
  3. --- a/drivers/video/rockchip/rk_fb.c
  4. +++ b/drivers/video/rockchip/rk_fb.c
  5. @@ -73,9 +73,8 @@
  6. extern phys_addr_t uboot_logo_base;
  7. extern phys_addr_t uboot_logo_size;
  8. extern phys_addr_t uboot_logo_offset;
  9. -static struct rk_fb_trsm_ops *trsm_lvds_ops;
  10. -static struct rk_fb_trsm_ops *trsm_edp_ops;
  11. -static struct rk_fb_trsm_ops *trsm_mipi_ops;
  12. +static struct rk_fb_trsm_ops *trsm_prmry_ops;
  13. +static struct rk_fb_trsm_ops *trsm_extend_ops;
  14. static int uboot_logo_on;
  15. static int rk_fb_debug_lvl;
  16. @@ -115,26 +114,13 @@
  17. int rk_fb_trsm_ops_register(struct rk_fb_trsm_ops *ops, int type)
  18. {
  19. - switch (type) {
  20. - case SCREEN_RGB:
  21. - case SCREEN_LVDS:
  22. - case SCREEN_DUAL_LVDS:
  23. - case SCREEN_LVDS_10BIT:
  24. - case SCREEN_DUAL_LVDS_10BIT:
  25. - trsm_lvds_ops = ops;
  26. - break;
  27. - case SCREEN_EDP:
  28. - trsm_edp_ops = ops;
  29. - break;
  30. - case SCREEN_MIPI:
  31. - case SCREEN_DUAL_MIPI:
  32. - trsm_mipi_ops = ops;
  33. - break;
  34. - default:
  35. - pr_warn("%s: unsupported transmitter: %d!\n",
  36. - __func__, type);
  37. - break;
  38. - }
  39. + if (type == PRMRY)
  40. + trsm_prmry_ops = ops;
  41. + else if (type == EXTEND)
  42. + trsm_extend_ops = ops;
  43. + else
  44. + pr_err("%s, type:%d\n", __func__, type);
  45. +
  46. return 0;
  47. }
  48. @@ -142,27 +128,12 @@
  49. {
  50. struct rk_fb_trsm_ops *ops;
  51. - switch (type) {
  52. - case SCREEN_RGB:
  53. - case SCREEN_LVDS:
  54. - case SCREEN_DUAL_LVDS:
  55. - case SCREEN_LVDS_10BIT:
  56. - case SCREEN_DUAL_LVDS_10BIT:
  57. - ops = trsm_lvds_ops;
  58. - break;
  59. - case SCREEN_EDP:
  60. - ops = trsm_edp_ops;
  61. - break;
  62. - case SCREEN_MIPI:
  63. - case SCREEN_DUAL_MIPI:
  64. - ops = trsm_mipi_ops;
  65. - break;
  66. - default:
  67. - ops = NULL;
  68. - pr_warn("%s: unsupported transmitter: %d!\n",
  69. - __func__, type);
  70. - break;
  71. - }
  72. + if (type == PRMRY)
  73. + ops = trsm_prmry_ops;
  74. + else if (type == EXTEND)
  75. + ops = trsm_extend_ops;
  76. + else
  77. + pr_err("%s, type:%d\n", __func__, type);
  78. return ops;
  79. }
  80. @@ -317,10 +288,10 @@
  81. /*
  82. * rk display power control parse from dts
  83. */
  84. -int rk_disp_pwr_ctr_parse_dt(struct rk_lcdc_driver *dev_drv)
  85. +int rk_disp_pwr_ctr_parse_dt(struct device_node *np,
  86. + struct rk_screen *rk_screen)
  87. {
  88. - struct device_node *root = of_get_child_by_name(dev_drv->dev->of_node,
  89. - "power_ctr");
  90. + struct device_node *root = of_get_child_by_name(np, "power_ctr");
  91. struct device_node *child;
  92. struct rk_disp_pwr_ctr_list *pwr_ctr;
  93. struct list_head *pos;
  94. @@ -329,10 +300,10 @@
  95. u32 debug = 0;
  96. int ret;
  97. - INIT_LIST_HEAD(&dev_drv->pwrlist_head);
  98. + INIT_LIST_HEAD(rk_screen->pwrlist_head);
  99. if (!root) {
  100. - dev_err(dev_drv->dev, "can't find power_ctr node for lcdc%d\n",
  101. - dev_drv->id);
  102. + dev_err(rk_screen->dev, "can't find power_ctr node for lcdc%d\n",
  103. + rk_screen->lcdc_id);
  104. return -ENODEV;
  105. }
  106. @@ -347,7 +318,7 @@
  107. pwr_ctr->pwr_ctr.type = GPIO;
  108. pwr_ctr->pwr_ctr.gpio = of_get_gpio_flags(child, 0, &flags);
  109. if (!gpio_is_valid(pwr_ctr->pwr_ctr.gpio)) {
  110. - dev_err(dev_drv->dev, "%s ivalid gpio\n",
  111. + dev_err(rk_screen->dev, "%s ivalid gpio\n",
  112. child->name);
  113. return -EINVAL;
  114. }
  115. @@ -355,7 +326,7 @@
  116. ret = gpio_request(pwr_ctr->pwr_ctr.gpio,
  117. child->name);
  118. if (ret) {
  119. - dev_err(dev_drv->dev,
  120. + dev_err(rk_screen->dev,
  121. "request %s gpio fail:%d\n",
  122. child->name, ret);
  123. }
  124. @@ -364,9 +335,9 @@
  125. pwr_ctr->pwr_ctr.type = REGULATOR;
  126. pwr_ctr->pwr_ctr.rgl_name = NULL;
  127. ret = of_property_read_string(child, "rockchip,regulator_name",
  128. - &(pwr_ctr->pwr_ctr.rgl_name));
  129. + &(pwr_ctr->pwr_ctr.rgl_name));
  130. if (ret || IS_ERR_OR_NULL(pwr_ctr->pwr_ctr.rgl_name))
  131. - dev_err(dev_drv->dev, "get regulator name failed!\n");
  132. + dev_err(rk_screen->dev, "get regulator name failed!\n");
  133. if (!of_property_read_u32(child, "rockchip,regulator_voltage", &val))
  134. pwr_ctr->pwr_ctr.volt = val;
  135. else
  136. @@ -378,29 +349,30 @@
  137. pwr_ctr->pwr_ctr.delay = val;
  138. else
  139. pwr_ctr->pwr_ctr.delay = 0;
  140. - list_add_tail(&pwr_ctr->list, &dev_drv->pwrlist_head);
  141. + list_add_tail(&pwr_ctr->list, rk_screen->pwrlist_head);
  142. }
  143. of_property_read_u32(root, "rockchip,debug", &debug);
  144. if (debug) {
  145. - list_for_each(pos, &dev_drv->pwrlist_head) {
  146. + list_for_each(pos, rk_screen->pwrlist_head) {
  147. pwr_ctr = list_entry(pos, struct rk_disp_pwr_ctr_list,
  148. list);
  149. - pr_info("pwr_ctr_name:%s\n"
  150. - "pwr_type:%s\n"
  151. - "gpio:%d\n"
  152. - "atv_val:%d\n"
  153. - "delay:%d\n\n",
  154. - pwr_ctr->pwr_ctr.name,
  155. - (pwr_ctr->pwr_ctr.type == GPIO) ? "gpio" : "regulator",
  156. - pwr_ctr->pwr_ctr.gpio,
  157. - pwr_ctr->pwr_ctr.atv_val,
  158. - pwr_ctr->pwr_ctr.delay);
  159. + printk(KERN_INFO "pwr_ctr_name:%s\n"
  160. + "pwr_type:%s\n"
  161. + "gpio:%d\n"
  162. + "atv_val:%d\n"
  163. + "delay:%d\n\n",
  164. + pwr_ctr->pwr_ctr.name,
  165. + (pwr_ctr->pwr_ctr.type == GPIO) ? "gpio" : "regulator",
  166. + pwr_ctr->pwr_ctr.gpio,
  167. + pwr_ctr->pwr_ctr.atv_val,
  168. + pwr_ctr->pwr_ctr.delay);
  169. }
  170. }
  171. return 0;
  172. +
  173. }
  174. int rk_disp_pwr_enable(struct rk_lcdc_driver *dev_drv)
  175. @@ -411,9 +383,14 @@
  176. struct regulator *regulator_lcd = NULL;
  177. int count = 10;
  178. - if (list_empty(&dev_drv->pwrlist_head))
  179. + if (!dev_drv->cur_screen->pwrlist_head) {
  180. + pr_info("error: %s, lcdc%d screen pwrlist null\n",
  181. + __func__, dev_drv->id);
  182. return 0;
  183. - list_for_each(pos, &dev_drv->pwrlist_head) {
  184. + }
  185. + if (list_empty(dev_drv->cur_screen->pwrlist_head))
  186. + return 0;
  187. + list_for_each(pos, dev_drv->cur_screen->pwrlist_head) {
  188. pwr_ctr_list = list_entry(pos, struct rk_disp_pwr_ctr_list,
  189. list);
  190. pwr_ctr = &pwr_ctr_list->pwr_ctr;
  191. @@ -422,8 +399,7 @@
  192. mdelay(pwr_ctr->delay);
  193. } else if (pwr_ctr->type == REGULATOR) {
  194. if (pwr_ctr->rgl_name)
  195. - regulator_lcd =
  196. - regulator_get(NULL, pwr_ctr->rgl_name);
  197. + regulator_lcd = regulator_get(NULL, pwr_ctr->rgl_name);
  198. if (regulator_lcd == NULL) {
  199. dev_err(dev_drv->dev,
  200. "%s: regulator get failed,regulator name:%s\n",
  201. @@ -456,9 +432,14 @@
  202. struct regulator *regulator_lcd = NULL;
  203. int count = 10;
  204. - if (list_empty(&dev_drv->pwrlist_head))
  205. + if (!dev_drv->cur_screen->pwrlist_head) {
  206. + pr_info("error: %s, lcdc%d screen pwrlist null\n",
  207. + __func__, dev_drv->id);
  208. return 0;
  209. - list_for_each(pos, &dev_drv->pwrlist_head) {
  210. + }
  211. + if (list_empty(dev_drv->cur_screen->pwrlist_head))
  212. + return 0;
  213. + list_for_each(pos, dev_drv->cur_screen->pwrlist_head) {
  214. pwr_ctr_list = list_entry(pos, struct rk_disp_pwr_ctr_list,
  215. list);
  216. pwr_ctr = &pwr_ctr_list->pwr_ctr;
  217. @@ -474,8 +455,7 @@
  218. continue;
  219. }
  220. while (regulator_is_enabled(regulator_lcd) > 0) {
  221. - if (regulator_disable(regulator_lcd) == 0 ||
  222. - count == 0)
  223. + if (regulator_disable(regulator_lcd) == 0 || count == 0)
  224. break;
  225. else
  226. dev_err(dev_drv->dev,
  227. @@ -530,6 +510,8 @@
  228. screen->pin_den = 1;
  229. else
  230. screen->pin_den = 0;
  231. + printk("hjc>>>prop:%d, x:%d, y:%d, dclk:%d\n", screen->prop,
  232. + screen->mode.xres, screen->mode.yres, screen->mode.pixclock);
  233. return 0;
  234. }
  235. @@ -544,7 +526,7 @@
  236. pr_err("parse display timing err\n");
  237. return -EINVAL;
  238. }
  239. - dt = display_timings_get(disp_timing, disp_timing->native_mode);
  240. + dt = display_timings_get(disp_timing, screen->native_mode);
  241. rk_fb_video_mode_from_timing(dt, screen);
  242. return 0;
  243. @@ -3942,7 +3924,8 @@
  244. win = dev_drv->win[win_id];
  245. if (!strcmp(fbi->fix.id, "fb0")) {
  246. - fb_mem_size = get_fb_size(dev_drv->reserved_fb);
  247. + fb_mem_size = get_fb_size(dev_drv->reserved_fb,
  248. + dev_drv->cur_screen);
  249. #if defined(CONFIG_ION_ROCKCHIP)
  250. if (rk_fb_alloc_buffer_by_ion(fbi, win, fb_mem_size) < 0)
  251. return -ENOMEM;
  252. @@ -3963,8 +3946,7 @@
  253. if (dev_drv->prop == EXTEND && dev_drv->iommu_enabled) {
  254. struct rk_lcdc_driver *dev_drv_prmry;
  255. int win_id_prmry;
  256. -
  257. - fb_mem_size = get_fb_size(dev_drv->reserved_fb);
  258. + fb_mem_size = get_fb_size(dev_drv->reserved_fb, dev_drv->cur_screen);
  259. #if defined(CONFIG_ION_ROCKCHIP)
  260. dev_drv_prmry = rk_get_prmry_lcdc_drv();
  261. if (dev_drv_prmry == NULL)
  262. @@ -4129,14 +4111,9 @@
  263. dev_drv->area_support[i] = 1;
  264. if (dev_drv->ops->area_support_num)
  265. dev_drv->ops->area_support_num(dev_drv, dev_drv->area_support);
  266. - rk_disp_pwr_ctr_parse_dt(dev_drv);
  267. - if (dev_drv->prop == PRMRY) {
  268. - rk_fb_set_prmry_screen(screen);
  269. - rk_fb_get_prmry_screen(screen);
  270. - }
  271. - dev_drv->trsm_ops = rk_fb_trsm_ops_get(screen->type);
  272. - if (dev_drv->prop != PRMRY)
  273. - rk_fb_get_extern_screen(screen);
  274. + rk_fb_set_screen(screen, dev_drv->prop);
  275. + rk_fb_get_screen(screen, dev_drv->prop);
  276. + dev_drv->trsm_ops = rk_fb_trsm_ops_get(dev_drv->prop);
  277. dev_drv->output_color = screen->color_mode;
  278. return 0;
  279. @@ -4511,15 +4488,24 @@
  280. struct fb_info *extend_fbi = rk_fb->fb[dev_drv->fb_index_base];
  281. extend_fbi->var.pixclock = rk_fb->fb[0]->var.pixclock;
  282. - if (rk_fb->disp_mode == DUAL_LCD) {
  283. - extend_fbi->fbops->fb_open(extend_fbi, 1);
  284. - if (dev_drv->iommu_enabled) {
  285. - if (dev_drv->mmu_dev)
  286. - rockchip_iovmm_set_fault_handler(dev_drv->dev,
  287. - rk_fb_sysmmu_fault_handler);
  288. - }
  289. - rk_fb_alloc_buffer(extend_fbi);
  290. + extend_fbi->var.xres_virtual = rk_fb->fb[0]->var.xres_virtual;
  291. + extend_fbi->var.yres_virtual = rk_fb->fb[0]->var.yres_virtual;
  292. + extend_fbi->var.xres = rk_fb->fb[0]->var.xres;
  293. + extend_fbi->var.yres = rk_fb->fb[0]->var.yres;
  294. + extend_fbi->fbops->fb_open(extend_fbi, 1);
  295. + if (dev_drv->iommu_enabled) {
  296. + if (dev_drv->mmu_dev)
  297. + rockchip_iovmm_set_fault_handler(dev_drv->dev,
  298. + rk_fb_sysmmu_fault_handler);
  299. + if (dev_drv->ops->mmu_en)
  300. + dev_drv->ops->mmu_en(dev_drv);
  301. }
  302. + rk_fb_alloc_buffer(extend_fbi);
  303. + //if (rk_fb->disp_mode == DUAL_LCD) {
  304. + extend_fbi->fbops->fb_set_par(extend_fbi);
  305. + extend_fbi->fbops->fb_pan_display(&extend_fbi->var,
  306. + extend_fbi);
  307. + //}
  308. }
  309. #endif
  310. 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

  1. diff --git a/drivers/video/rockchip/screen/rk_screen.c b/drivers/video/rockchip/screen/rk_screen.c
  2. index 3a4e6c3..7473e5f 100644
  3. --- a/drivers/video/rockchip/screen/rk_screen.c
  4. +++ b/drivers/video/rockchip/screen/rk_screen.c
  5. @@ -4,57 +4,102 @@
  6. #include "lcd.h"
  7. #include "../hdmi/rockchip-hdmi.h"
  8. -static struct rk_screen *rk_screen;
  9. +static struct rk_screen *prmry_screen;
  10. +static struct rk_screen *extend_screen;
  11. +
  12. +static void rk_screen_info_error(struct rk_screen *screen, int prop)
  13. +{
  14. + pr_err(">>>>>>>>>>>>>>>>>>>>error<<<<<<<<<<<<<<<<<<<<\n");
  15. + pr_err(">>please init %s screen info in dtsi file<<\n",
  16. + (prop == PRMRY) ? "prmry" : "extend");
  17. + pr_err(">>>>>>>>>>>>>>>>>>>>error<<<<<<<<<<<<<<<<<<<<\n");
  18. +}
  19. int rk_fb_get_extern_screen(struct rk_screen *screen)
  20. {
  21. - if (unlikely(!rk_screen) || unlikely(!screen))
  22. + if (unlikely(!extend_screen) || unlikely(!screen))
  23. return -1;
  24. -
  25. - memcpy(screen, rk_screen, sizeof(struct rk_screen));
  26. + memcpy(screen, extend_screen, sizeof(struct rk_screen));
  27. screen->dsp_lut = NULL;
  28. screen->cabc_lut = NULL;
  29. - screen->type = SCREEN_NULL;
  30. -
  31. return 0;
  32. }
  33. -int rk_fb_get_prmry_screen(struct rk_screen *screen)
  34. +int rk_fb_get_prmry_screen(struct rk_screen *screen)
  35. {
  36. - if (unlikely(!rk_screen) || unlikely(!screen))
  37. + if (unlikely(!prmry_screen) || unlikely(!screen))
  38. return -1;
  39. - memcpy(screen, rk_screen, sizeof(struct rk_screen));
  40. + memcpy(screen, prmry_screen, sizeof(struct rk_screen));
  41. return 0;
  42. }
  43. -int rk_fb_set_prmry_screen(struct rk_screen *screen)
  44. +int rk_fb_get_screen(struct rk_screen *screen, int prop)
  45. {
  46. - if (unlikely(!rk_screen) || unlikely(!screen))
  47. + struct rk_screen *cur_screen = NULL;
  48. + if (unlikely(!screen))
  49. return -1;
  50. - rk_screen->lcdc_id = screen->lcdc_id;
  51. - rk_screen->screen_id = screen->screen_id;
  52. - rk_screen->x_mirror = screen->x_mirror;
  53. - rk_screen->y_mirror = screen->y_mirror;
  54. - rk_screen->overscan.left = screen->overscan.left;
  55. - rk_screen->overscan.top = screen->overscan.left;
  56. - rk_screen->overscan.right = screen->overscan.left;
  57. - rk_screen->overscan.bottom = screen->overscan.left;
  58. + if (prop == PRMRY) {
  59. + if (unlikely(!prmry_screen)) {
  60. + rk_screen_info_error(screen, prop);
  61. + return -1;
  62. + }
  63. + cur_screen = prmry_screen;
  64. + } else {
  65. + if (unlikely(!extend_screen)) {
  66. + rk_screen_info_error(screen, prop);
  67. + return -1;
  68. + }
  69. + cur_screen = extend_screen;
  70. + }
  71. + memcpy(screen, cur_screen, sizeof(struct rk_screen));
  72. return 0;
  73. }
  74. -size_t get_fb_size(u8 reserved_fb)
  75. +int rk_fb_set_screen(struct rk_screen *screen, int prop)
  76. +{
  77. + struct rk_screen *cur_screen = NULL;
  78. +
  79. + if (unlikely(!screen))
  80. + return -1;
  81. + if (prop == PRMRY) {
  82. + if (unlikely(!prmry_screen)) {
  83. + rk_screen_info_error(screen, prop);
  84. + return -1;
  85. + }
  86. + cur_screen = prmry_screen;
  87. + } else {
  88. + if (unlikely(!extend_screen)) {
  89. + rk_screen_info_error(screen, prop);
  90. + return -1;
  91. + }
  92. + cur_screen = extend_screen;
  93. + }
  94. +
  95. + cur_screen->lcdc_id = screen->lcdc_id;
  96. + cur_screen->screen_id = screen->screen_id;
  97. + cur_screen->x_mirror = screen->x_mirror;
  98. + cur_screen->y_mirror = screen->y_mirror;
  99. + cur_screen->overscan.left = screen->overscan.left;
  100. + cur_screen->overscan.top = screen->overscan.left;
  101. + cur_screen->overscan.right = screen->overscan.left;
  102. + cur_screen->overscan.bottom = screen->overscan.left;
  103. +
  104. + return 0;
  105. +}
  106. +
  107. +size_t get_fb_size(u8 reserved_fb, struct rk_screen *screen)
  108. {
  109. size_t size = 0;
  110. u32 xres = 0;
  111. u32 yres = 0;
  112. - if (unlikely(!rk_screen))
  113. + if (unlikely(!screen))
  114. return 0;
  115. - xres = rk_screen->mode.xres;
  116. - yres = rk_screen->mode.yres;
  117. + xres = screen->mode.xres;
  118. + yres = screen->mode.yres;
  119. /* align as 64 bytes(16*4) in an odd number of times */
  120. xres = ALIGN_64BYTE_ODD_TIMES(xres, ALIGN_PIXEL_64BYTE_RGB8888);
  121. @@ -73,22 +118,51 @@
  122. static int rk_screen_probe(struct platform_device *pdev)
  123. {
  124. struct device_node *np = pdev->dev.of_node;
  125. - int ret;
  126. + struct device_node *screen_np;
  127. + struct rk_screen *rk_screen;
  128. + int ret, screen_prop;
  129. if (!np) {
  130. dev_err(&pdev->dev, "Missing device tree node.\n");
  131. return -EINVAL;
  132. }
  133. - rk_screen = devm_kzalloc(&pdev->dev,
  134. - sizeof(struct rk_screen), GFP_KERNEL);
  135. - if (!rk_screen) {
  136. - dev_err(&pdev->dev, "kmalloc for rk screen fail!");
  137. - return -ENOMEM;
  138. +
  139. + for_each_child_of_node(np, screen_np) {
  140. + rk_screen = devm_kzalloc(&pdev->dev,
  141. + sizeof(struct rk_screen), GFP_KERNEL);
  142. + if (!rk_screen) {
  143. + dev_err(&pdev->dev, "kmalloc for rk screen fail!");
  144. + return -ENOMEM;
  145. + }
  146. + rk_screen->pwrlist_head = devm_kzalloc(&pdev->dev,
  147. + sizeof(struct list_head), GFP_KERNEL);
  148. + if (!rk_screen->pwrlist_head) {
  149. + dev_err(&pdev->dev, "kmalloc for rk_screen pwrlist_head fail!");
  150. + return -ENOMEM;
  151. + }
  152. + of_property_read_u32(screen_np, "screen_prop", &screen_prop);
  153. + if (screen_prop == PRMRY)
  154. + prmry_screen = rk_screen;
  155. + else if (screen_prop == EXTEND)
  156. + extend_screen = rk_screen;
  157. + else
  158. + dev_err(&pdev->dev, "unknow screen prop: %d\n",
  159. + screen_prop);
  160. + rk_screen->prop = screen_prop;
  161. + of_property_read_u32(screen_np, "native-mode", &rk_screen->native_mode);
  162. + rk_screen->dev = &pdev->dev;
  163. + ret = rk_fb_prase_timing_dt(screen_np, rk_screen);
  164. + pr_info("%s screen timing parse %s\n",
  165. + (screen_prop == PRMRY) ? "prmry" : "extend",
  166. + ret ? "failed" : "success");
  167. + ret = rk_disp_pwr_ctr_parse_dt(screen_np, rk_screen);
  168. + pr_info("%s screen power ctrl parse %s\n",
  169. + (screen_prop == PRMRY) ? "prmry" : "extend",
  170. + ret ? "failed" : "success");
  171. }
  172. - ret = rk_fb_prase_timing_dt(np, rk_screen);
  173. - dev_info(&pdev->dev, "rockchip screen probe %s\n",
  174. - ret ? "failed" : "success");
  175. - return ret;
  176. +
  177. + dev_info(&pdev->dev, "rockchip screen probe success\n");
  178. + return 0;
  179. }
  180. 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

  1. diff --git a/drivers/video/rockchip/transmitter/rk32_dp.c b/drivers/video/rockchip/transmitter/rk32_dp.c
  2. index 6d386bc..0bffdb0 100755
  3. --- a/drivers/video/rockchip/transmitter/rk32_dp.c
  4. +++ b/drivers/video/rockchip/transmitter/rk32_dp.c
  5. @@ -129,7 +129,7 @@
  6. struct rk_screen *screen = &edp->screen;
  7. u32 val = 0;
  8. - rk_fb_get_prmry_screen(screen);
  9. + rk_fb_get_screen(screen, edp->prop);
  10. if (cpu_is_rk3288()) {
  11. if (screen->lcdc_id == 1) /*select lcdc*/
  12. @@ -1734,17 +1734,21 @@
  13. struct resource *res;
  14. struct device_node *np = pdev->dev.of_node;
  15. int ret;
  16. + int prop;
  17. if (!np) {
  18. dev_err(&pdev->dev, "Missing device tree node.\n");
  19. return -EINVAL;
  20. }
  21. + of_property_read_u32(np, "prop", &prop);
  22. + pr_info("Use EDP as %s screen\n", (prop == PRMRY) ? "prmry" : "extend");
  23. edp = devm_kzalloc(&pdev->dev, sizeof(struct rk32_edp), GFP_KERNEL);
  24. if (!edp) {
  25. dev_err(&pdev->dev, "no memory for state\n");
  26. return -ENOMEM;
  27. }
  28. + edp->prop = prop;
  29. edp->dev = &pdev->dev;
  30. edp->video_info.h_sync_polarity = 0;
  31. edp->video_info.v_sync_polarity = 0;
  32. @@ -1756,7 +1760,7 @@
  33. edp->video_info.link_rate = LINK_RATE_1_62GBPS;
  34. edp->video_info.lane_count = LANE_CNT4;
  35. - rk_fb_get_prmry_screen(&edp->screen);
  36. + rk_fb_get_screen(&edp->screen, prop);
  37. if (edp->screen.type != SCREEN_EDP) {
  38. dev_err(&pdev->dev, "screen is not edp!\n");
  39. return -EINVAL;
  40. @@ -1852,7 +1856,7 @@
  41. pm_runtime_get_sync(&pdev->dev);
  42. rk32_edp = edp;
  43. - rk_fb_trsm_ops_register(&trsm_edp_ops, SCREEN_EDP);
  44. + rk_fb_trsm_ops_register(&trsm_edp_ops, prop);
  45. #if defined(CONFIG_DEBUG_FS)
  46. edp->debugfs_dir = debugfs_create_dir("edp", NULL);
  47. if (IS_ERR(edp->debugfs_dir)) {
  48. diff --git a/drivers/video/rockchip/transmitter/rk32_dp.h b/drivers/video/rockchip/transmitter/rk32_dp.h
  49. index 2dc41c6..fda0de2 100755
  50. --- a/drivers/video/rockchip/transmitter/rk32_dp.h
  51. +++ b/drivers/video/rockchip/transmitter/rk32_dp.h
  52. @@ -571,6 +571,7 @@
  53. bool edp_en;
  54. int soctype;
  55. struct dentry *debugfs_dir;
  56. + int prop;
  57. };
  58. ```
  59. #### rk32_mipi_dsi.c
  60. ```
  61. diff --git a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c
  62. index 741fdb5..ed68d85 100644
  63. --- a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c
  64. +++ b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c
  65. @@ -1609,7 +1609,7 @@
  66. pm_runtime_get_sync(&dsi0->pdev->dev);
  67. #endif
  68. opt_mode = dsi0->screen.refresh_mode;
  69. - rk_fb_get_prmry_screen(dsi0->screen.screen);
  70. + rk_fb_get_screen(dsi0->screen.screen, dsi0->prop);
  71. dsi0->screen.lcdc_id = dsi0->screen.screen->lcdc_id;
  72. rk32_init_phy_mode(dsi0->screen.lcdc_id);
  73. @@ -1875,7 +1875,7 @@
  74. static int rk32_mipi_dsi_probe(struct platform_device *pdev)
  75. {
  76. int ret = 0;
  77. - static int id;
  78. + static int id, prop;
  79. struct dsi *dsi;
  80. struct mipi_dsi_ops *ops;
  81. struct rk_screen *screen;
  82. @@ -1890,7 +1890,8 @@
  83. return -ENODEV;
  84. }
  85. data = of_id->data;
  86. -
  87. + of_property_read_u32(np, "prop", &prop);
  88. + pr_info("Use mipi as %s screen\n", (prop == PRMRY) ? "prmry" : "extend");
  89. dsi = devm_kzalloc(&pdev->dev, sizeof(struct dsi), GFP_KERNEL);
  90. if (!dsi) {
  91. dev_err(&pdev->dev, "request struct dsi fail!\n");
  92. @@ -1997,8 +1998,8 @@
  93. dev_err(&pdev->dev, "request struct rk_screen fail!\n");
  94. return -1;
  95. }
  96. - rk_fb_get_prmry_screen(screen);
  97. -
  98. + rk_fb_get_screen(screen, prop);
  99. + dsi->prop = prop;
  100. dsi->pdev = pdev;
  101. ops = &dsi->ops;
  102. ops->dsi = dsi;
  103. @@ -2056,7 +2057,7 @@
  104. if(!support_uboot_display())
  105. rk32_init_phy_mode(dsi_screen->lcdc_id);
  106. */
  107. - rk_fb_trsm_ops_register(&trsm_dsi_ops, SCREEN_MIPI);
  108. + rk_fb_trsm_ops_register(&trsm_dsi_ops, prop);
  109. #ifdef MIPI_DSI_REGISTER_IO
  110. debugfs_create_file("mipidsi0", S_IFREG | S_IRUGO, dsi->debugfs_dir, dsi,
  111. &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

  1. diff --git a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h
  2. index f568254..473db82 100644
  3. --- a/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h
  4. +++ b/drivers/video/rockchip/transmitter/rk32_mipi_dsi.h
  5. @@ -307,6 +307,7 @@
  6. struct dsi {
  7. u8 dsi_id;
  8. u8 lcdc_id;
  9. + int prop;
  10. u8 vid;
  11. u8 clk_on;
  12. struct regmap *grf_base;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

rk_fb.h

  1. diff --git a/include/dt-bindings/display/rk_fb.h b/include/dt-bindings/display/rk_fb.h
  2. index 81c9855..ae7241d 100755
  3. --- a/include/dt-bindings/display/rk_fb.h
  4. +++ b/include/dt-bindings/display/rk_fb.h
  5. @@ -14,6 +14,13 @@
  6. #define DUAL 2
  7. #define DUAL_LCD 3
  8. +#define DEFAULT_MODE 0
  9. +#define HDMI_720P 0
  10. +#define HDMI_1080P 1
  11. +#define HDMI_2160P 2
  12. +#define NTSC_CVBS 3
  13. +#define PAL_CVBS 4
  14. +
  15. #define DEFAULT_MODE 0
  16. #define ONE_VOP_DUAL_MIPI_HOR_SCAN 1
  17. #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

  1. diff --git a/include/dt-bindings/display/screen-timing/lcd-F402.dtsi b/include/dt-bindings/display/screen-timing/lcd-F402.dtsi
  2. index a3ad25f..abe178f 100644
  3. --- a/include/dt-bindings/display/screen-timing/lcd-F402.dtsi
  4. +++ b/include/dt-bindings/display/screen-timing/lcd-F402.dtsi
  5. @@ -4,9 +4,9 @@
  6. */
  7. -disp_timings: display-timings {
  8. - native-mode = <&timing0>;
  9. - timing0: timing0 {
  10. +display-timings {
  11. + native-mode = <&f402>;
  12. + f402: timing0 {
  13. screen-type = <SCREEN_EDP>;
  14. out-face = <OUT_P666>;
  15. clock-frequency = <205000000>;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  1. diff --git a/include/dt-bindings/display/screen-timing/lcd-box.dtsi b/include/dt-bindings/display/screen-timing/lcd-box.dtsi
  2. index 2109a89..20e2a21 100644
  3. --- a/include/dt-bindings/display/screen-timing/lcd-box.dtsi
  4. +++ b/include/dt-bindings/display/screen-timing/lcd-box.dtsi
  5. @@ -3,36 +3,9 @@
  6. *
  7. */
  8. - disp_power_ctr: power_ctr {
  9. - /* rockchip,debug = <0>;
  10. - lcd_en:lcd_en {
  11. - rockchip,power_type = <GPIO>;
  12. - gpios = <&gpio0 GPIO_B0 GPIO_ACTIVE_HIGH>;
  13. - rockchip,delay = <10>;
  14. - };
  15. -
  16. - bl_en:bl_en {
  17. - rockchip,power_type = <GPIO>;
  18. - gpios = <&gpio0 GPIO_A2 GPIO_ACTIVE_HIGH>;
  19. - rockchip,delay = <10>;
  20. - };
  21. -
  22. - bl_ctr:bl_ctr {
  23. - rockchip,power_type = <GPIO>;
  24. - gpios = <&gpio3 GPIO_D6 GPIO_ACTIVE_HIGH>;
  25. - rockchip,delay = <10>;
  26. - };
  27. -
  28. - lcd_rst:lcd_rst {
  29. - rockchip,power_type = <REGULATOR>;
  30. - rockchip,delay = <5>;
  31. - };*/
  32. -
  33. -};
  34. -
  35. -disp_timings: display-timings {
  36. - native-mode = <&timing0>;
  37. - timing0: timing0 {
  38. +display-timings {
  39. + native-mode = <&hdmi_720p>;
  40. + hdmi_720p: timing0 {
  41. screen-type = <SCREEN_RGB>;
  42. out-face = <OUT_P888>;
  43. color-mode = <COLOR_YCBCR>;
  44. @@ -53,7 +26,7 @@
  45. swap-rg = <0>;
  46. swap-gb = <0>;
  47. };
  48. - timing1: timing1 {
  49. + hdmi_1080p: timing1 {
  50. screen-type = <SCREEN_RGB>;
  51. out-face = <OUT_P888>;
  52. color-mode = <COLOR_YCBCR>;
  53. @@ -74,7 +47,7 @@
  54. swap-rg = <0>;
  55. swap-gb = <0>;
  56. };
  57. - timing2: timing2 {
  58. + hdmi_2160p: timing2 {
  59. screen-type = <SCREEN_RGB>;
  60. out-face = <OUT_P888>;
  61. 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
  1. 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
  2. index b408d65..6a203a9 100644
  3. --- a/include/dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi
  4. +++ b/include/dt-bindings/display/screen-timing/lcd-tv080wum-nl0-mipi.dtsi
  5. @@ -84,10 +84,10 @@
  6. */
  7. };
  8. -disp_timings: display-timings {
  9. - native-mode = <&timing0>;
  10. +display-timings {
  11. + native-mode = <&tv080wum_nl0_mipi>;
  12. compatible = "rockchip,display-timings";
  13. - timing0: timing0 {
  14. + tv080wum_nl0_mipi: timing0 {
  15. screen-type = <SCREEN_MIPI>;
  16. lvds-format = <LVDS_8BIT_2>;
  17. out-face = <OUT_P888>;
  18. diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h
  19. index d7634a8..1130ea4 100755
  20. --- a/include/linux/rk_fb.h
  21. +++ b/include/linux/rk_fb.h
  22. @@ -811,7 +811,10 @@
  23. extern int rk_fb_get_prmry_screen( struct rk_screen *screen);
  24. extern int rk_fb_set_prmry_screen(struct rk_screen *screen);
  25. extern u32 rk_fb_get_prmry_screen_pixclock(void);
  26. -extern int rk_disp_pwr_ctr_parse_dt(struct rk_lcdc_driver *dev_drv);
  27. +extern int rk_fb_get_screen(struct rk_screen *screen, int prop);
  28. +extern int rk_fb_set_screen(struct rk_screen *screen, int prop);
  29. +extern int rk_disp_pwr_ctr_parse_dt(struct device_node *np,
  30. + struct rk_screen *rk_screen);
  31. extern int rk_disp_pwr_enable(struct rk_lcdc_driver *dev_drv);
  32. extern int rk_disp_pwr_disable(struct rk_lcdc_driver *dev_drv);
  33. extern bool is_prmry_rk_lcdc_registered(void);
  34. diff --git a/include/linux/rk_screen.h b/include/linux/rk_screen.h
  35. index 5e5cd30..71a0d4d 100644
  36. --- a/include/linux/rk_screen.h
  37. +++ b/include/linux/rk_screen.h
  38. @@ -61,13 +61,17 @@
  39. *ft: the time need to display one frame time
  40. */
  41. struct rk_screen {
  42. - u16 type;
  43. + struct device *dev;
  44. + int prop;
  45. u16 refresh_mode;
  46. + struct list_head *pwrlist_head;
  47. + u16 type;
  48. u16 lvds_format;
  49. u16 face;
  50. u16 color_mode;
  51. u8 lcdc_id;
  52. u8 screen_id;
  53. + int native_mode;
  54. struct fb_videomode mode;
  55. u32 post_dsp_stx;
  56. u32 post_dsp_sty;
  57. @@ -145,7 +149,7 @@
  58. };
  59. extern void set_lcd_info(struct rk_screen *screen, struct rk29lcd_info *lcd_info);
  60. -extern size_t get_fb_size(u8 reserved_fb);
  61. +extern size_t get_fb_size(u8 reserved_fb, struct rk_screen *screen);
  62. extern void set_tv_info(struct rk_screen *screen);
  63. extern void set_hdmi_info(struct rk_screen *screen);

[Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】的更多相关文章

  1. [Android6.0][RK3399] 双屏异显代码实现流程分析(一)【转】

    本文转载自:http://blog.csdn.net/dearsq/article/details/55049182 Platform: RK3399 OS: Android 6.0 Version: ...

  2. RK3288 6.0 双屏异显,横屏+竖屏【转】

    本文转载自:http://blog.csdn.net/clx44551/article/details/78215730?locationNum=8&fps=1 RK3288 6.0 双屏异显 ...

  3. Android6.0以上关于RecyclerView显是不全的问题

    Android6.0以上关于RecyclerView显是不全的问题 需求描述 适配的时候发现Android 6.0以上,RecyclerView显示不全,以下是没有问题的.这个时候查看布局文件,可以看 ...

  4. RK3288 增加双屏异显 eDP+LVDS

    CPU:RK3288 系统:Android 5.1 下面是官方文档中的信息. 1.rk3288 支持的显示接口可以任意组合. 2.双屏异显时,一个显示接口当主屏,另一个当副屏:主副屏由板级 dts 文 ...

  5. iTOP-4418/6818开发板支持双屏异显,双屏同显

    iTOP-4418/6818开发板平台安卓系统下支持双屏异显,双屏同显,客户可按照不同用途,分别播放适合屏幕显示方式的内容 ,如HDMI屏幕和LCD屏幕显示不同内容, 一个屏幕播放广告,另一个屏幕运行 ...

  6. 【ARM开发板】迅为IMX6开发板QT下LVDS和HDMI双屏异显

    本文转自迅为论坛:http://www.topeetboard.com 平台:迅为-IMX6开发板 首先开发板分别连接9.7寸屏和HDMI显示器,然后使用MfgTool工具烧写QT系统,然后拨码开关设 ...

  7. Rk3288 双屏异显单触摸

    系统版本:RK3288 android 5.1 设备同时有两个lcd,主屏是mipi接口,带有触摸屏,触摸屏是usb接口,副屏是hdmi接口,没有触摸屏,正常情况下,两个lcd显示相同内容,触摸屏一切 ...

  8. RK3288 双屏异显,两屏默认方向不一致

    CPU:RK3288 系统:Android 5.1 RK3288 支持双屏异显,一般都会同方向显示,如果遇到两个 lcd 的默认方向不一致,只需修改下面参数即可. 例如:主屏为mipi接口,分辨率为 ...

  9. RK3288 双屏异显时,触摸屏(USB接口)无反应

    系统版本:RK3288 android 5.1 设备同时有两个lcd,主屏是mipi接口,带有触摸屏,触摸屏是usb接口,副屏是hdmi接口,没有触摸屏,正常情况下,两个lcd显示相同内容,触摸屏一切 ...

随机推荐

  1. 56.fielddata filter的细粒度内存加载控制

    语法: POST /test_index/_mapping/test_type { "properties": { "test_field": { " ...

  2. PHP 数组使用之道

    本文首发于 PHP 数组使用之道,转载请注明出处. 这个教程我将通过一些实用的实例和最佳实践的方式列举出 PHP 中常用的数组函数.每个 PHP 工程师都应该掌握它们的使用方法,以及如何通过组合使用来 ...

  3. Python Pandas库的学习(一)

    今天我们来学习一下Pandas库,前面我们讲了Numpy库的学习 接下来我们学习一下比较重要的库Pandas库,这个库比Numpy库还重要 Pandas库是在Numpy库上进行了封装,相当于高级Num ...

  4. Linux最常用的基础命令 下篇

    Linux最常用的基础命令个人总结 shell脚本 脚本就是:写一堆指令存成一个文本,用于完成一些小任务 a="123" linux中定义一个变量 echo $a echo $b ...

  5. CUDA_one

    首先我看了讲解CUDA基础部分以后,大致对CUDA的基本了解如下: 第一:CUDA实行并行化的过程分为两部分,一个是线程块之间的并行(这是在每个线程网格中grid进行的),一个是对于每一个线程块内部各 ...

  6. S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下

    1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000.ARM上电后会从SRAM ...

  7. Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框

     Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...

  8. LaTex/Overleaf使用笔记

    1. 添加网页引用 @misc{ r1,   author = "Wikipedia",   title = "Binary decision diagram --- { ...

  9. Quartz.net框架使用

    概述:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  10. [NOIP2008] 提高组 洛谷P1125 笨小猴

    题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最 ...