未验证 提交 afd86f45 编写于 作者: R Rbb666 提交者: GitHub

fix stm32 drv_lcd some problem (#6836)

* LTDC:将 Alpha 通道默认设置为0(完全透明)
* rt_malloc 替换为 rt_malloc_align
上级 423f0c61
...@@ -12,15 +12,16 @@ ...@@ -12,15 +12,16 @@
#ifdef BSP_USING_LCD #ifdef BSP_USING_LCD
#include <lcd_port.h> #include <lcd_port.h>
#include <rtdevice.h>
#include <string.h> #include <string.h>
//#define DRV_DEBUG #define DRV_DEBUG
#define LOG_TAG "drv.lcd" #define LOG_TAG "drv.lcd"
#include <drv_log.h> #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 struct drv_lcd_device
{ {
...@@ -45,7 +46,7 @@ static rt_err_t drv_lcd_init(struct rt_device *device) ...@@ -45,7 +46,7 @@ static rt_err_t drv_lcd_init(struct rt_device *device)
lcd = lcd; lcd = lcd;
return RT_EOK; return RT_EOK;
} }
#ifndef ART_PI_TouchGFX_LIB
static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args) static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args)
{ {
struct drv_lcd_device *lcd = LCD_DEVICE(device); 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) ...@@ -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; struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args;
RT_ASSERT(info != RT_NULL); 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->bits_per_pixel = 16;
info->width = lcd->lcd_info.width; info->width = lcd->lcd_info.width;
info->height = lcd->lcd_info.height; info->height = lcd->lcd_info.height;
info->framebuffer = lcd->lcd_info.framebuffer; info->framebuffer = lcd->lcd_info.framebuffer;
} }
break; break;
...@@ -108,7 +109,7 @@ void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc) ...@@ -108,7 +109,7 @@ void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc)
{ {
rt_sem_release(&_lcd.lcd_lock); rt_sem_release(&_lcd.lcd_lock);
} }
#endif
void LTDC_IRQHandler(void) void LTDC_IRQHandler(void)
{ {
rt_interrupt_enter(); rt_interrupt_enter();
...@@ -144,7 +145,7 @@ rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd) ...@@ -144,7 +145,7 @@ rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd)
/* Accumulated vertical back porch = Vsync + VBP - 1 */ /* Accumulated vertical back porch = Vsync + VBP - 1 */
LtdcHandle.Init.AccumulatedVBP = LCD_VSYNC_HEIGHT + LCD_VBP - 1; LtdcHandle.Init.AccumulatedVBP = LCD_VSYNC_HEIGHT + LCD_VBP - 1;
/* Accumulated active width = Hsync + HBP + Active Width - 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 */ /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */
LtdcHandle.Init.AccumulatedActiveH = LCD_VSYNC_HEIGHT + LCD_VBP + lcd->lcd_info.height - 1; LtdcHandle.Init.AccumulatedActiveH = LCD_VSYNC_HEIGHT + LCD_VBP + lcd->lcd_info.height - 1;
/* Total height = Vsync + VBP + Active Heigh + VFP - 1 */ /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */
...@@ -197,7 +198,7 @@ rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd) ...@@ -197,7 +198,7 @@ rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd)
pLayerCfg.Alpha = 255; pLayerCfg.Alpha = 255;
/* Default Color configuration (configure A,R,G,B component values) */ /* Default Color configuration (configure A,R,G,B component values) */
pLayerCfg.Alpha0 = 255; pLayerCfg.Alpha0 = 0;
pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0; pLayerCfg.Backcolor.Red = 0;
...@@ -261,7 +262,6 @@ void turn_on_lcd_backlight(void) ...@@ -261,7 +262,6 @@ void turn_on_lcd_backlight(void)
#else #else
void turn_on_lcd_backlight(void) void turn_on_lcd_backlight(void)
{ {
} }
#endif #endif
...@@ -301,9 +301,9 @@ int drv_lcd_hw_init(void) ...@@ -301,9 +301,9 @@ int drv_lcd_hw_init(void)
_lcd.lcd_info.pixel_format = LCD_PIXEL_FORMAT; _lcd.lcd_info.pixel_format = LCD_PIXEL_FORMAT;
/* malloc memory for Triple Buffering */ /* malloc memory for Triple Buffering */
_lcd.lcd_info.framebuffer = rt_malloc(LCD_BUF_SIZE); _lcd.lcd_info.framebuffer = rt_malloc_align(LCD_BUF_SIZE, LCD_BUF_SIZE);
_lcd.back_buf = rt_malloc(LCD_BUF_SIZE); _lcd.back_buf = rt_malloc_align(LCD_BUF_SIZE, LCD_BUF_SIZE);
_lcd.front_buf = rt_malloc(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) if (_lcd.lcd_info.framebuffer == RT_NULL || _lcd.back_buf == RT_NULL || _lcd.front_buf == RT_NULL)
{ {
LOG_E("init frame buffer failed!\n"); LOG_E("init frame buffer failed!\n");
...@@ -316,12 +316,14 @@ int drv_lcd_hw_init(void) ...@@ -316,12 +316,14 @@ int drv_lcd_hw_init(void)
memset(_lcd.back_buf, 0xFF, LCD_BUF_SIZE); memset(_lcd.back_buf, 0xFF, LCD_BUF_SIZE);
memset(_lcd.front_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 #ifdef RT_USING_DEVICE_OPS
device->ops = &lcd_ops; device->ops = &lcd_ops;
#else #else
device->init = drv_lcd_init; device->init = drv_lcd_init;
#ifndef ART_PI_TouchGFX_LIB
device->control = drv_lcd_control; device->control = drv_lcd_control;
#endif
#endif #endif
/* register lcd device */ /* register lcd device */
...@@ -362,6 +364,7 @@ __exit: ...@@ -362,6 +364,7 @@ __exit:
} }
INIT_DEVICE_EXPORT(drv_lcd_hw_init); INIT_DEVICE_EXPORT(drv_lcd_hw_init);
#ifndef ART_PI_TouchGFX_LIB
#ifdef DRV_DEBUG #ifdef DRV_DEBUG
#ifdef FINSH_USING_MSH #ifdef FINSH_USING_MSH
int lcd_test() int lcd_test()
...@@ -371,28 +374,60 @@ int lcd_test() ...@@ -371,28 +374,60 @@ int lcd_test()
while (1) while (1)
{ {
/* red */ if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB565)
for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
{ {
lcd->lcd_info.framebuffer[2 * i] = 0x00; /* red */
lcd->lcd_info.framebuffer[2 * i + 1] = 0xF8; 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); else if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB888)
rt_thread_mdelay(1000);
/* green */
for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
{ {
lcd->lcd_info.framebuffer[2 * i] = 0xE0; /* red */
lcd->lcd_info.framebuffer[2 * i + 1] = 0x07; for (int i = 0; i < LCD_BUF_SIZE / 3; i++)
} {
lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); lcd->lcd_info.framebuffer[3 * i] = 0x00;
rt_thread_mdelay(1000); lcd->lcd_info.framebuffer[3 * i + 1] = 0x00;
/* blue */ lcd->lcd_info.framebuffer[3 * i + 2] = 0xff;
for (int i = 0; i < LCD_BUF_SIZE / 2; i++) }
{ lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
lcd->lcd_info.framebuffer[2 * i] = 0x1F; rt_thread_mdelay(1000);
lcd->lcd_info.framebuffer[2 * i + 1] = 0x00; /* 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); lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
rt_thread_mdelay(1000); rt_thread_mdelay(1000);
} }
...@@ -401,3 +436,4 @@ MSH_CMD_EXPORT(lcd_test, lcd_test); ...@@ -401,3 +436,4 @@ MSH_CMD_EXPORT(lcd_test, lcd_test);
#endif /* FINSH_USING_MSH */ #endif /* FINSH_USING_MSH */
#endif /* DRV_DEBUG */ #endif /* DRV_DEBUG */
#endif /* BSP_USING_LCD */ #endif /* BSP_USING_LCD */
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册