大家好,我自己的开发板使用的NT35510屏幕芯片,参考咱V5的GUIX移植demo,我自己重新移植了LCD驱动,现在就简单的替换了驱动函数中的内容(stm32f4_565rgb_buffer_toggle()),屏幕可以点亮,但是不显示内容。求助大佬们帮忙看下,我的这个屏幕驱动函数写的对不对,非常感谢,并附上源代码。
链接:https://pan.baidu.com/s/1J3Wnn9Pro9CvSzT3SmyCVA
提取码:xv3k
[C] 纯文本查看 复制代码 extern __IO uint8_t lcd_is_busy;
static void stm32f4_565rgb_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirty)
{
GX_RECTANGLE Limit;
GX_RECTANGLE Copy;
ULONG offset;
INT copy_width;
INT copy_height;
#if !defined(GX_CHROMEART_ENABLE)
INT row;
INT src_stride_ulongs;
INT dest_stride_ulongs;
#endif
uint16_t *p, x, y, x1, y1;
uint32_t blkCnt0, blkCnt1;
ULONG *get;
ULONG *put;
gx_utility_rectangle_define(&Limit, 0, 0,
canvas->gx_canvas_x_resolution - 1,
canvas->gx_canvas_y_resolution - 1);
if (gx_utility_rectangle_overlap_detect(&Limit, &canvas->gx_canvas_dirty_area, &Copy))
{
Copy.gx_rectangle_left &= 0xfffe;
Copy.gx_rectangle_right |= 0x01;
copy_width = Copy.gx_rectangle_right - Copy.gx_rectangle_left + 1;
copy_height = Copy.gx_rectangle_bottom - Copy.gx_rectangle_top + 1;
offset = Copy.gx_rectangle_top * canvas->gx_canvas_x_resolution;
offset += Copy.gx_rectangle_left;
offset /= 2;
get = canvas ->gx_canvas_memory;
get += offset;
src_stride_ulongs = canvas ->gx_canvas_x_resolution ;
dest_stride_ulongs = lcddev.width / 2;
p = (uint16_t *)get;
x = canvas->gx_canvas_display_offset_x + Copy.gx_rectangle_left;
y = canvas->gx_canvas_display_offset_y + Copy.gx_rectangle_top;
x1 = Copy.gx_rectangle_right + canvas->gx_canvas_display_offset_x;
y1 = canvas->gx_canvas_display_offset_y + Copy.gx_rectangle_bottom;
lcd_is_busy = 1;
LCD->LCD_REG = 0x30; LCD->LCD_RAM = x;
LCD->LCD_REG = 0x31; LCD->LCD_RAM = x>>8;
LCD->LCD_REG = 0x32; LCD->LCD_RAM = y;
LCD->LCD_REG = 0x33; LCD->LCD_RAM = y>>8;
LCD->LCD_REG = 0x34; LCD->LCD_RAM = x1;
LCD->LCD_REG = 0x35; LCD->LCD_RAM = x1>>8;
LCD->LCD_REG = 0x36; LCD->LCD_RAM = y1;
LCD->LCD_REG = 0x37; LCD->LCD_RAM = y1>>8;
LCD->LCD_REG = 0x46; LCD->LCD_RAM = x;
LCD->LCD_REG = 0x47; LCD->LCD_RAM = x>> 8;
LCD->LCD_REG = 0x48; LCD->LCD_RAM = y;
LCD->LCD_REG = 0x49; LCD->LCD_RAM = y >> 8;
LCD->LCD_REG = 0x02;
for(row = 0; row < copy_height; row++)
{
blkCnt0 = copy_width >> 2U;
blkCnt1 = copy_width % 0x4U;
while (blkCnt0 > 0U)
{
LCD->LCD_RAM = *p++;
LCD->LCD_RAM = *p++;
LCD->LCD_RAM = *p++;
LCD->LCD_RAM = *p++;
blkCnt0--;
}
while (blkCnt1 > 0U)
{
LCD->LCD_RAM = *p++;
blkCnt1--;
}
p = p - copy_width + src_stride_ulongs;
}
LCD->LCD_REG = 0x30; LCD->LCD_RAM = 0;
LCD->LCD_REG = 0x31; LCD->LCD_RAM = 0;
LCD->LCD_REG = 0x32; LCD->LCD_RAM = 0;
LCD->LCD_REG = 0x33; LCD->LCD_RAM = 0;
LCD->LCD_REG = 0x34; LCD->LCD_RAM = lcddev.width;
LCD->LCD_REG = 0x35; LCD->LCD_RAM = lcddev.width>>8;
LCD->LCD_REG = 0x36; LCD->LCD_RAM = lcddev.height;
LCD->LCD_REG = 0x37; LCD->LCD_RAM = lcddev.height>>8;
lcd_is_busy = 0;
}
}
|