| 
									
										
										
										
											2021-09-27 11:32:29 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2023-09-11 12:58:38 +08:00
										 |  |  |  * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD | 
					
						
							| 
									
										
										
										
											2021-09-27 11:32:29 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-02-26 13:58:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "hal/lcd_hal.h"
 | 
					
						
							|  |  |  | #include "hal/lcd_ll.h"
 | 
					
						
							| 
									
										
										
										
											2022-05-30 16:09:40 +08:00
										 |  |  | #include "hal/log.h"
 | 
					
						
							| 
									
										
										
										
											2021-02-26 13:58:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | void lcd_hal_init(lcd_hal_context_t *hal, int id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     hal->dev = LCD_LL_GET_HW(id); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-05-30 16:09:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-13 17:50:29 +08:00
										 |  |  | 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, hal_utils_clk_div_t* lcd_clk_div) | 
					
						
							| 
									
										
										
										
											2022-05-30 16:09:40 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     // lcd_clk = module_clock_src / (n + b / a)
 | 
					
						
							|  |  |  |     // pixel_clk = lcd_clk / mo
 | 
					
						
							|  |  |  |     uint32_t mo = src_freq_hz / expect_pclk_freq_hz / LCD_LL_CLK_FRAC_DIV_N_MAX + 1; | 
					
						
							| 
									
										
										
										
											2022-07-15 18:07:52 +08:00
										 |  |  |     if (mo == 1 && !(lcd_clk_flags & LCD_HAL_PCLK_FLAG_ALLOW_EQUAL_SYSCLK)) { | 
					
						
							|  |  |  |         mo = 2; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-11 12:58:38 +08:00
										 |  |  |     hal_utils_clk_info_t lcd_clk_info = { | 
					
						
							|  |  |  |         .src_freq_hz = src_freq_hz, | 
					
						
							|  |  |  |         .exp_freq_hz = expect_pclk_freq_hz * mo, | 
					
						
							|  |  |  |         .max_integ = LCD_LL_CLK_FRAC_DIV_N_MAX, | 
					
						
							|  |  |  |         .min_integ = 2, | 
					
						
							|  |  |  |         .max_fract = LCD_LL_CLK_FRAC_DIV_AB_MAX, | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2023-11-13 17:50:29 +08:00
										 |  |  |     uint32_t real_freq = hal_utils_calc_clk_div_frac_fast(&lcd_clk_info, lcd_clk_div); | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2022-05-30 16:09:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     lcd_ll_set_pixel_clock_prescale(hal->dev, mo); | 
					
						
							| 
									
										
										
										
											2023-09-11 12:58:38 +08:00
										 |  |  |     return real_freq / mo; | 
					
						
							| 
									
										
										
										
											2022-05-30 16:09:40 +08:00
										 |  |  | } |