summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRbb666 <[email protected]>2023-03-01 15:12:50 +0800
committerGitHub <[email protected]>2023-03-01 02:12:50 -0500
commitafd86f45473407539242f7dad12429ad5ad61d4e (patch)
tree88234359e33e7f932d290b90b319d43d30f3c384
parent423f0c61344dc1b0d9ca5fee2db0d65ad0839b0f (diff)
fix stm32 drv_lcd some problem (#6836)
* LTDC:将 Alpha 通道默认设置为0(完全透明) * rt_malloc 替换为 rt_malloc_align
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/drv_lcd.c110
1 files changed, 73 insertions, 37 deletions
diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_lcd.c b/bsp/stm32/libraries/HAL_Drivers/drv_lcd.c
index d40c717955..8f9167465e 100644
--- a/bsp/stm32/libraries/HAL_Drivers/drv_lcd.c
+++ b/bsp/stm32/libraries/HAL_Drivers/drv_lcd.c
@@ -12,15 +12,16 @@
#ifdef BSP_USING_LCD
#include <lcd_port.h>
+#include <rtdevice.h>
#include <string.h>
-//#define DRV_DEBUG
-#define LOG_TAG "drv.lcd"
+#define DRV_DEBUG
+#define LOG_TAG "drv.lcd"
#include <drv_log.h>
-#define LCD_DEVICE(dev) (struct drv_lcd_device*)(dev)
+#define LCD_DEVICE(dev) (struct drv_lcd_device *)(dev)
-static LTDC_HandleTypeDef LtdcHandle = {0};
+LTDC_HandleTypeDef LtdcHandle = {0};
struct drv_lcd_device
{
@@ -45,7 +46,7 @@ static rt_err_t drv_lcd_init(struct rt_device *device)
lcd = lcd;
return RT_EOK;
}
-
+#ifndef ART_PI_TouchGFX_LIB
static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args)
{
struct drv_lcd_device *lcd = LCD_DEVICE(device);
@@ -83,11 +84,11 @@ static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args)
struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args;
RT_ASSERT(info != RT_NULL);
- info->pixel_format = lcd->lcd_info.pixel_format;
+ info->pixel_format = lcd->lcd_info.pixel_format;
info->bits_per_pixel = 16;
- info->width = lcd->lcd_info.width;
- info->height = lcd->lcd_info.height;
- info->framebuffer = lcd->lcd_info.framebuffer;
+ info->width = lcd->lcd_info.width;
+ info->height = lcd->lcd_info.height;
+ info->framebuffer = lcd->lcd_info.framebuffer;
}
break;
@@ -108,7 +109,7 @@ void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc)
{
rt_sem_release(&_lcd.lcd_lock);
}
-
+#endif
void LTDC_IRQHandler(void)
{
rt_interrupt_enter();
@@ -144,7 +145,7 @@ rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd)
/* Accumulated vertical back porch = Vsync + VBP - 1 */
LtdcHandle.Init.AccumulatedVBP = LCD_VSYNC_HEIGHT + LCD_VBP - 1;
/* Accumulated active width = Hsync + HBP + Active Width - 1 */
- LtdcHandle.Init.AccumulatedActiveW = LCD_HSYNC_WIDTH + LCD_HBP + lcd->lcd_info.width - 1 ;
+ LtdcHandle.Init.AccumulatedActiveW = LCD_HSYNC_WIDTH + LCD_HBP + lcd->lcd_info.width - 1;
/* Accumulated active height = Vsync + VBP + Active Heigh - 1 */
LtdcHandle.Init.AccumulatedActiveH = LCD_VSYNC_HEIGHT + LCD_VBP + lcd->lcd_info.height - 1;
/* Total height = Vsync + VBP + Active Heigh + VFP - 1 */
@@ -197,7 +198,7 @@ rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd)
pLayerCfg.Alpha = 255;
/* Default Color configuration (configure A,R,G,B component values) */
- pLayerCfg.Alpha0 = 255;
+ pLayerCfg.Alpha0 = 0;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0;
@@ -261,7 +262,6 @@ void turn_on_lcd_backlight(void)
#else
void turn_on_lcd_backlight(void)
{
-
}
#endif
@@ -301,9 +301,9 @@ int drv_lcd_hw_init(void)
_lcd.lcd_info.pixel_format = LCD_PIXEL_FORMAT;
/* malloc memory for Triple Buffering */
- _lcd.lcd_info.framebuffer = rt_malloc(LCD_BUF_SIZE);
- _lcd.back_buf = rt_malloc(LCD_BUF_SIZE);
- _lcd.front_buf = rt_malloc(LCD_BUF_SIZE);
+ _lcd.lcd_info.framebuffer = rt_malloc_align(LCD_BUF_SIZE, LCD_BUF_SIZE);
+ _lcd.back_buf = rt_malloc_align(LCD_BUF_SIZE, LCD_BUF_SIZE);
+ _lcd.front_buf = rt_malloc_align(LCD_BUF_SIZE, LCD_BUF_SIZE);
if (_lcd.lcd_info.framebuffer == RT_NULL || _lcd.back_buf == RT_NULL || _lcd.front_buf == RT_NULL)
{
LOG_E("init frame buffer failed!\n");
@@ -316,13 +316,15 @@ int drv_lcd_hw_init(void)
memset(_lcd.back_buf, 0xFF, LCD_BUF_SIZE);
memset(_lcd.front_buf, 0xFF, LCD_BUF_SIZE);
- device->type = RT_Device_Class_Graphic;
+ device->type = RT_Device_Class_Graphic;
#ifdef RT_USING_DEVICE_OPS
- device->ops = &lcd_ops;
+ device->ops = &lcd_ops;
#else
- device->init = drv_lcd_init;
+ device->init = drv_lcd_init;
+#ifndef ART_PI_TouchGFX_LIB
device->control = drv_lcd_control;
#endif
+#endif
/* register lcd device */
rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR);
@@ -362,6 +364,7 @@ __exit:
}
INIT_DEVICE_EXPORT(drv_lcd_hw_init);
+#ifndef ART_PI_TouchGFX_LIB
#ifdef DRV_DEBUG
#ifdef FINSH_USING_MSH
int lcd_test()
@@ -371,28 +374,60 @@ int lcd_test()
while (1)
{
- /* red */
- for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+ if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB565)
{
- lcd->lcd_info.framebuffer[2 * i] = 0x00;
- lcd->lcd_info.framebuffer[2 * i + 1] = 0xF8;
+ /* red */
+ for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+ {
+ lcd->lcd_info.framebuffer[2 * i] = 0x00;
+ lcd->lcd_info.framebuffer[2 * i + 1] = 0xF8;
+ }
+ lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+ rt_thread_mdelay(1000);
+ /* green */
+ for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+ {
+ lcd->lcd_info.framebuffer[2 * i] = 0xE0;
+ lcd->lcd_info.framebuffer[2 * i + 1] = 0x07;
+ }
+ lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+ rt_thread_mdelay(1000);
+ /* blue */
+ for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+ {
+ lcd->lcd_info.framebuffer[2 * i] = 0x1F;
+ lcd->lcd_info.framebuffer[2 * i + 1] = 0x00;
+ }
}
- lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
- rt_thread_mdelay(1000);
- /* green */
- for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+ else if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB888)
{
- lcd->lcd_info.framebuffer[2 * i] = 0xE0;
- lcd->lcd_info.framebuffer[2 * i + 1] = 0x07;
- }
- lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
- rt_thread_mdelay(1000);
- /* blue */
- for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
- {
- lcd->lcd_info.framebuffer[2 * i] = 0x1F;
- lcd->lcd_info.framebuffer[2 * i + 1] = 0x00;
+ /* red */
+ for (int i = 0; i < LCD_BUF_SIZE / 3; i++)
+ {
+ lcd->lcd_info.framebuffer[3 * i] = 0x00;
+ lcd->lcd_info.framebuffer[3 * i + 1] = 0x00;
+ lcd->lcd_info.framebuffer[3 * i + 2] = 0xff;
+ }
+ lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+ rt_thread_mdelay(1000);
+ /* green */
+ for (int i = 0; i < LCD_BUF_SIZE / 3; i++)
+ {
+ lcd->lcd_info.framebuffer[3 * i] = 0x00;
+ lcd->lcd_info.framebuffer[3 * i + 1] = 0xff;
+ lcd->lcd_info.framebuffer[3 * i + 2] = 0x00;
+ }
+ lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+ rt_thread_mdelay(1000);
+ /* blue */
+ for (int i = 0; i < LCD_BUF_SIZE / 3; i++)
+ {
+ lcd->lcd_info.framebuffer[3 * i] = 0xff;
+ lcd->lcd_info.framebuffer[3 * i + 1] = 0x00;
+ lcd->lcd_info.framebuffer[3 * i + 2] = 0x00;
+ }
}
+
lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
rt_thread_mdelay(1000);
}
@@ -401,3 +436,4 @@ MSH_CMD_EXPORT(lcd_test, lcd_test);
#endif /* FINSH_USING_MSH */
#endif /* DRV_DEBUG */
#endif /* BSP_USING_LCD */
+#endif