tm103xdgp01.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 = true;
  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. lvb_ch_config(lvb_base, lvb_ch_num_0, &lvb_ch_cfg);
  25. lvb_ch_config(lvb_base, lvb_ch_num_1, &lvb_ch_cfg);
  26. lvb_ch_enable(lvb_base, lvb_ch_num_0);
  27. lvb_ch_enable(lvb_base, lvb_ch_num_1);
  28. }
  29. static void lvds_panel_phy_init(hpm_panel_t *panel)
  30. {
  31. LVB_Type *lvb_base = panel->hw_if.video.lvds.lvb_base;
  32. lvds_phy_clk_param_t param;
  33. uint32_t pixel_clk = panel->hw_if.lcdc_pixel_clk_khz * 1000;
  34. pixelmux_lvds_phy_calc_pll_cfg(pixel_clk, true, &param);
  35. pixelmux_config_lvds_tx_phy0_clk(&param.reg);
  36. pixelmux_config_lvds_tx_phy1_clk(&param.reg);
  37. lvb_lvds_phy_lane_config_t lvds_lane_cfg;
  38. lvb_lvds_phy_lane_get_default_config(&lvds_lane_cfg);
  39. lvds_lane_cfg.fvco_div4 = param.reg.data_rate_div4;
  40. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx0, &lvds_lane_cfg);
  41. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx1, &lvds_lane_cfg);
  42. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx2, &lvds_lane_cfg);
  43. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_tx3, &lvds_lane_cfg);
  44. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds0_txck, &lvds_lane_cfg);
  45. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx0, &lvds_lane_cfg);
  46. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx1, &lvds_lane_cfg);
  47. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx2, &lvds_lane_cfg);
  48. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_tx3, &lvds_lane_cfg);
  49. lvb_lvds_phy_lane_init(lvb_base, lvb_lvds_lane_idx_lvds1_txck, &lvds_lane_cfg);
  50. lvb_lvds_phy0_poweron(lvb_base);
  51. lvb_lvds_phy1_poweron(lvb_base);
  52. while (lvb_lvds_phy_split_pll_is_lock(lvb_base) == false) {
  53. }
  54. }
  55. static void reset(hpm_panel_t *panel)
  56. {
  57. if (!panel->hw_if.set_reset_pin_level)
  58. return;
  59. panel->hw_if.set_reset_pin_level(0);
  60. hpm_panel_delay_us(2000);
  61. panel->hw_if.set_reset_pin_level(1);
  62. hpm_panel_delay_us(2000);
  63. }
  64. static void init(hpm_panel_t *panel)
  65. {
  66. if (panel->hw_if.set_video_router)
  67. panel->hw_if.set_video_router();
  68. lvds_panel_lvb_init(panel);
  69. lvds_panel_phy_init(panel);
  70. }
  71. hpm_panel_t panel_tm103xdgp01 = {
  72. .name = "tm103xdgp01",
  73. .if_type = HPM_PANEL_IF_TYPE_LVDS_SPLIT,
  74. .timing = {
  75. .pixel_clock_khz = 45000,
  76. .hactive = 1920,
  77. .hfront_porch = 32,
  78. .hback_porch = 32,
  79. .hsync_len = 64,
  80. .vactive = 720,
  81. .vfront_porch = 2,
  82. .vback_porch = 2,
  83. .vsync_len = 4,
  84. },
  85. .funcs = {
  86. .reset = reset,
  87. .init = init,
  88. },
  89. };