1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2017-10-30     Tanek        the first version
9  * 2023-09-25     Frogrey      export MIPI DSI config parameters.
10  */
11 
12 #include <rtthread.h>
13 
14 #ifdef BSP_USING_LCD_MIPI
15 
16 #include "display_support.h"
17 #include "drv_lcd_mipi.h"
18 #include "fsl_common.h"
19 #include "fsl_iomuxc.h"
20 #include "fsl_elcdif.h"
21 #include "drv_gpio.h"
22 
23 #define LOG_TAG             "drv.lcd_mipi"
24 #include <drv_log.h>
25 
26 #if !defined(LCD_MIPI_WIDTH) || !defined(LCD_MIPI_HEIGHT)
27 #error "Please config mipi dsi pixel parameters."
28 #endif
29 
30 #if !defined(LCD_MIPI_HFP) || !defined(LCD_MIPI_HBP) || !defined(LCD_MIPI_HSW) || \
31     !defined(LCD_MIPI_VFP) || !defined(LCD_MIPI_VBP) || !defined(LCD_MIPI_VSW)
32 #error "Please config mipi dsi timing parameters."
33 #endif
34 
35 #if !defined(LCD_MIPI_BL_PIN) || !defined(LCD_MIPI_RST_PIN)
36 #error "Please config mipi dsi backlight or reset pin."
37 #endif
38 
39 struct imxrt_lcd_mipi
40 {
41     struct rt_device device;
42     struct rt_device_graphic_info info;
43 };
44 
45 static struct imxrt_lcd_mipi lcd_mipi;
46 
imxrt_lcd_mipi_init(rt_device_t device)47 static rt_err_t imxrt_lcd_mipi_init(rt_device_t device)
48 {
49     RT_ASSERT(device != RT_NULL);
50 
51     BOARD_PrepareDisplayController();
52 
53     /* MIPI DSI DEVICE INFORMATION*/
54     lcd_mipi.info.width          = LCD_MIPI_WIDTH;
55     lcd_mipi.info.height         = LCD_MIPI_HEIGHT;
56 #if DEMO_USE_XRGB8888
57     lcd_mipi.info.pixel_format   = RTGRAPHIC_PIXEL_FORMAT_ARGB888;
58     lcd_mipi.info.bits_per_pixel = 32;
59 #elif DEMO_USE_RGB565
60     lcd_mipi.info.pixel_format   = RTGRAPHIC_PIXEL_FORMAT_RGB565;
61     lcd_mipi.info.bits_per_pixel = 16;
62 #else
63     lcd_mipi.info.bits_per_pixel = 16;
64 #endif
65 
66     return RT_EOK;
67 }
68 
imxrt_lcd_mipi_control(rt_device_t device,int cmd,void * args)69 static rt_err_t imxrt_lcd_mipi_control(rt_device_t device, int cmd, void *args)
70 {
71     switch(cmd)
72     {
73     case RTGRAPHIC_CTRL_RECT_UPDATE:
74         break;
75 
76     case RTGRAPHIC_CTRL_POWERON:
77         rt_pin_write(LCD_MIPI_BL_PIN, PIN_HIGH);
78         break;
79 
80     case RTGRAPHIC_CTRL_POWEROFF:
81         rt_pin_write(LCD_MIPI_BL_PIN, PIN_LOW);
82         break;
83 
84     case RTGRAPHIC_CTRL_GET_INFO:
85         rt_memcpy(args, &lcd_mipi.info, sizeof(lcd_mipi.info));
86         break;
87 
88     case RTGRAPHIC_CTRL_SET_MODE:
89         break;
90     }
91 
92     return RT_EOK;
93 }
94 
rt_hw_lcd_mipi_init(void)95 int rt_hw_lcd_mipi_init(void)
96 {
97     rt_err_t ret;
98 
99     lcd_mipi.device.type    = RT_Device_Class_Graphic;
100     lcd_mipi.device.init    = imxrt_lcd_mipi_init;
101     lcd_mipi.device.open    = RT_NULL;
102     lcd_mipi.device.close   = RT_NULL;
103     lcd_mipi.device.read    = RT_NULL;
104     lcd_mipi.device.write   = RT_NULL;
105     lcd_mipi.device.control = imxrt_lcd_mipi_control;
106 
107     lcd_mipi.device.user_data = (void *)&lcd_mipi.info;
108 
109     ret = rt_device_register(&lcd_mipi.device, "lcd_mipi", RT_DEVICE_FLAG_RDWR);
110 
111     return ret;
112 }
113 
114 INIT_DEVICE_EXPORT(rt_hw_lcd_mipi_init);
115 
116 #endif /* BSP_USING_LCD_MIPI */
117