lcd_hal.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "hal/lcd_hal.h"
  7. #include "hal/lcd_ll.h"
  8. #include "hal/log.h"
  9. #include "hal/hal_utils.h"
  10. void lcd_hal_init(lcd_hal_context_t *hal, int id)
  11. {
  12. hal->dev = LCD_LL_GET_HW(id);
  13. }
  14. uint32_t lcd_hal_cal_pclk_freq(lcd_hal_context_t *hal, uint32_t src_freq_hz, uint32_t expect_pclk_freq_hz, int lcd_clk_flags)
  15. {
  16. // lcd_clk = module_clock_src / (n + b / a)
  17. // pixel_clk = lcd_clk / mo
  18. uint32_t mo = src_freq_hz / expect_pclk_freq_hz / LCD_LL_CLK_FRAC_DIV_N_MAX + 1;
  19. if (mo == 1 && !(lcd_clk_flags & LCD_HAL_PCLK_FLAG_ALLOW_EQUAL_SYSCLK)) {
  20. mo = 2;
  21. }
  22. hal_utils_clk_info_t lcd_clk_info = {
  23. .src_freq_hz = src_freq_hz,
  24. .exp_freq_hz = expect_pclk_freq_hz * mo,
  25. .max_integ = LCD_LL_CLK_FRAC_DIV_N_MAX,
  26. .min_integ = 2,
  27. .max_fract = LCD_LL_CLK_FRAC_DIV_AB_MAX,
  28. };
  29. hal_utils_clk_div_t lcd_clk_div = {};
  30. uint32_t real_freq = hal_utils_calc_clk_div_frac_fast(&lcd_clk_info, &lcd_clk_div);
  31. HAL_EARLY_LOGD("lcd_hal", "n=%"PRIu32",a=%"PRIu32",b=%"PRIu32",mo=%"PRIu32, lcd_clk_div.integer, lcd_clk_div.denominator, lcd_clk_div.numerator, mo);
  32. lcd_ll_set_group_clock_coeff(hal->dev, lcd_clk_div.integer, lcd_clk_div.denominator, lcd_clk_div.numerator);
  33. lcd_ll_set_pixel_clock_prescale(hal->dev, mo);
  34. return real_freq / mo;
  35. }