cc10128007.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright (c) 2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_panel.h"
  8. #include "hpm_pixelmux_drv.h"
  9. #include "hpm_lvb_drv.h"
  10. static void lvds_panel_lvb_init(hpm_panel_t *panel)
  11. {
  12. LVB_Type *lvb_base = panel->hw_if.video.lvds.lvb_base;
  13. lvb_config_t lvb_config;
  14. lvb_get_default_config(&lvb_config);
  15. lvb_config.split_mode_en = false;
  16. lvb_config.txclk_shift = lvb_txclk_shift_1100011;
  17. lvb_init(lvb_base, &lvb_config);
  18. lvb_ch_config_t lvb_ch_cfg;
  19. lvb_ch_cfg.map = lvb_ch_mapping_vesa;
  20. if (panel->hw_if.video.lvds.channel_di_index == 0)
  21. lvb_ch_cfg.data_src = lvb_ch_data_source_di0;
  22. else
  23. lvb_ch_cfg.data_src = lvb_ch_data_source_di1;
  24. if (panel->hw_if.video.lvds.channel_index == 0) {
  25. lvb_ch_config(lvb_base, lvb_ch_num_0, &lvb_ch_cfg);
  26. lvb_ch_enable(lvb_base, lvb_ch_num_0);
  27. } else {
  28. lvb_ch_config(lvb_base, lvb_ch_num_1, &lvb_ch_cfg);
  29. lvb_ch_enable(lvb_base, lvb_ch_num_1);
  30. }
  31. }
  32. static void lvds_panel_phy_init(hpm_panel_t *panel)
  33. {
  34. LVB_Type *lvb_base = panel->hw_if.video.lvds.lvb_base;
  35. lvds_phy_clk_param_t param;
  36. uint32_t pixel_clk = panel->hw_if.lcdc_pixel_clk_khz * 1000;
  37. pixelmux_lvds_phy_calc_pll_cfg(pixel_clk, false, &param);
  38. lvb_lvds_phy_lane_config_t lvds_lane_cfg;
  39. lvb_lvds_phy_lane_get_default_config(&lvds_lane_cfg);
  40. lvds_lane_cfg.fvco_div4 = param.reg.data_rate_div4;
  41. if (panel->hw_if.video.lvds.channel_index == 0) {
  42. pixelmux_config_lvds_tx_phy0_clk(&param.reg);
  43. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx0, &lvds_lane_cfg);
  44. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx1, &lvds_lane_cfg);
  45. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx2, &lvds_lane_cfg);
  46. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx3, &lvds_lane_cfg);
  47. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_txck, &lvds_lane_cfg);
  48. lvb_lvds_phy0_poweron(lvb_base);
  49. while (lvb_lvds_phy0_pll_is_lock(lvb_base) == false) {
  50. }
  51. } else {
  52. pixelmux_config_lvds_tx_phy1_clk(&param.reg);
  53. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx0, &lvds_lane_cfg);
  54. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx1, &lvds_lane_cfg);
  55. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx2, &lvds_lane_cfg);
  56. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx3, &lvds_lane_cfg);
  57. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_txck, &lvds_lane_cfg);
  58. lvb_lvds_phy1_poweron(lvb_base);
  59. while (lvb_lvds_phy1_pll_is_lock(lvb_base) == false) {
  60. }
  61. }
  62. }
  63. static void reset(hpm_panel_t *panel)
  64. {
  65. if (!panel->hw_if.set_reset_pin_level)
  66. return;
  67. panel->hw_if.set_reset_pin_level(0);
  68. hpm_panel_delay_us(2000);
  69. panel->hw_if.set_reset_pin_level(1);
  70. hpm_panel_delay_us(2000);
  71. }
  72. static void init(hpm_panel_t *panel)
  73. {
  74. if (panel->hw_if.set_video_router)
  75. panel->hw_if.set_video_router();
  76. lvds_panel_lvb_init(panel);
  77. lvds_panel_phy_init(panel);
  78. }
  79. static void power_on(hpm_panel_t *panel)
  80. {
  81. if (panel->state.power_state != HPM_PANEL_STATE_POWER_ON &&
  82. panel->hw_if.set_backlight) {
  83. if (panel->state.backlight_percent == 0)
  84. panel->state.backlight_percent = 100;
  85. panel->hw_if.set_backlight(panel->state.backlight_percent);
  86. panel->state.power_state = HPM_PANEL_STATE_POWER_ON;
  87. }
  88. }
  89. static void power_off(hpm_panel_t *panel)
  90. {
  91. if (panel->state.power_state != HPM_PANEL_STATE_POWER_OFF &&
  92. panel->hw_if.set_backlight) {
  93. panel->hw_if.set_backlight(0);
  94. panel->state.power_state = HPM_PANEL_STATE_POWER_OFF;
  95. }
  96. }
  97. hpm_panel_t panel_cc10128007 = {
  98. .name = "cc10128007",
  99. .if_type = HPM_PANEL_IF_TYPE_LVDS_SINGLE,
  100. .timing = {
  101. .pixel_clock_khz = 74250,
  102. .hactive = 800,
  103. .hfront_porch = 60,
  104. .hback_porch = 60,
  105. .hsync_len = 40,
  106. .vactive = 1280,
  107. .vfront_porch = 18,
  108. .vback_porch = 18,
  109. .vsync_len = 6,
  110. },
  111. .funcs = {
  112. .reset = reset,
  113. .init = init,
  114. .power_on = power_on,
  115. .power_off = power_off,
  116. },
  117. };