summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2010-05-11 06:11:17 +0000
committerbernard.xiong <[email protected]>2010-05-11 06:11:17 +0000
commit9c8a595e2879d7210ff2ad0af0da097d3cec4f7c (patch)
tree23b296c405597abfb25c5be91802d355e6c62e7f /bsp
parente7fb7e6c1480c8e38f8fa0affbd874edc307527c (diff)
add double buffer support in driver.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@701 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'bsp')
-rw-r--r--bsp/mini2440/lcd_a70.c30
-rw-r--r--bsp/mini2440/lcd_n35.c30
-rw-r--r--bsp/mini2440/lcd_t35.c30
3 files changed, 69 insertions, 21 deletions
diff --git a/bsp/mini2440/lcd_a70.c b/bsp/mini2440/lcd_a70.c
index 933423a6fd..fe45948733 100644
--- a/bsp/mini2440/lcd_a70.c
+++ b/bsp/mini2440/lcd_a70.c
@@ -111,6 +111,7 @@
#define S3C2410_LCDINT_FRSYNC (1<<1)
+volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
void lcd_power_enable(int invpwren,int pwren)
@@ -170,19 +171,34 @@ void LcdBkLtSet(rt_uint32_t HiRatio)
void rt_hw_lcd_update(rtgui_rect_t *rect)
{
- /* nothing */
+ rt_uint16_t *src_ptr, *dst_ptr;
+ rt_uint32_t pitch, index;
+
+ pitch = 2 * (rect->x2 - rect->x1);
+
+ /* copy from framebuffer to physical framebuffer */
+ src_ptr = &_rt_framebuffer[rect->x1][rect->y1];
+ dst_ptr = &_rt_hw_framebuffer[rect->x1][rect->y1];
+
+ for (index = rect->y1; index < rect->y2; index ++)
+ {
+ memcpy(dst_ptr, src_ptr, pitch);
+
+ src_ptr += (rect->x2 - rect->x1);
+ dst_ptr += (rect->x2 - rect->x1);
+ }
}
rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
{
- return (rt_uint8_t *)_rt_hw_framebuffer;
+ return (rt_uint8_t *)_rt_framebuffer;
}
void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
{
if (x < RT_HW_LCD_WIDTH && y < RT_HW_LCD_HEIGHT)
{
- _rt_hw_framebuffer[(y)][(x)] = rtgui_color_to_565p(*c);
+ _rt_framebuffer[(y)][(x)] = rtgui_color_to_565p(*c);
}
}
@@ -190,7 +206,7 @@ void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
{
if (x < RT_HW_LCD_WIDTH && y < RT_HW_LCD_HEIGHT)
{
- *c = rtgui_color_from_565p(_rt_hw_framebuffer[(y)][(x)]);
+ *c = rtgui_color_from_565p(_rt_framebuffer[(y)][(x)]);
}
return ;
@@ -206,7 +222,7 @@ void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_
for (idx = x1; idx < x2; idx ++)
{
- _rt_hw_framebuffer[y][idx] = color;
+ _rt_framebuffer[y][idx] = color;
}
}
@@ -220,13 +236,13 @@ void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t
for (idy = y1; idy < y2; idy ++)
{
- _rt_hw_framebuffer[idy][x] = color;
+ _rt_framebuffer[idy][x] = color;
}
}
void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y)
{
- rt_memcpy((void*)&_rt_hw_framebuffer[y][x1], pixels, (x2 - x1) * 2);
+ rt_memcpy((void*)&_rt_framebuffer[y][x1], pixels, (x2 - x1) * 2);
}
struct rtgui_graphic_driver _rtgui_lcd_driver =
diff --git a/bsp/mini2440/lcd_n35.c b/bsp/mini2440/lcd_n35.c
index c867659556..b135048234 100644
--- a/bsp/mini2440/lcd_n35.c
+++ b/bsp/mini2440/lcd_n35.c
@@ -111,6 +111,7 @@
#define S3C2410_LCDINT_FRSYNC (1<<1)
+volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
void lcd_power_enable(int invpwren,int pwren)
@@ -170,19 +171,34 @@ void LcdBkLtSet(rt_uint32_t HiRatio)
void rt_hw_lcd_update(rtgui_rect_t *rect)
{
- /* nothing */
+ rt_uint16_t *src_ptr, *dst_ptr;
+ rt_uint32_t pitch, index;
+
+ pitch = 2 * (rect->x2 - rect->x1);
+
+ /* copy from framebuffer to physical framebuffer */
+ src_ptr = &_rt_framebuffer[rect->x1][rect->y1];
+ dst_ptr = &_rt_hw_framebuffer[rect->x1][rect->y1];
+
+ for (index = rect->y1; index < rect->y2; index ++)
+ {
+ memcpy(dst_ptr, src_ptr, pitch);
+
+ src_ptr += (rect->x2 - rect->x1);
+ dst_ptr += (rect->x2 - rect->x1);
+ }
}
rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
{
- return (rt_uint8_t *)_rt_hw_framebuffer;
+ return (rt_uint8_t *)_rt_framebuffer;
}
void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
{
if (x < RT_HW_LCD_WIDTH && y < RT_HW_LCD_HEIGHT)
{
- _rt_hw_framebuffer[(y)][(x)] = rtgui_color_to_565p(*c);
+ _rt_framebuffer[(y)][(x)] = rtgui_color_to_565p(*c);
}
}
@@ -190,7 +206,7 @@ void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
{
if (x < RT_HW_LCD_WIDTH && y < RT_HW_LCD_HEIGHT)
{
- *c = rtgui_color_from_565p(_rt_hw_framebuffer[(y)][(x)]);
+ *c = rtgui_color_from_565p(_rt_framebuffer[(y)][(x)]);
}
return ;
@@ -206,7 +222,7 @@ void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_
for (idx = x1; idx < x2; idx ++)
{
- _rt_hw_framebuffer[y][idx] = color;
+ _rt_framebuffer[y][idx] = color;
}
}
@@ -220,13 +236,13 @@ void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t
for (idy = y1; idy < y2; idy ++)
{
- _rt_hw_framebuffer[idy][x] = color;
+ _rt_framebuffer[idy][x] = color;
}
}
void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y)
{
- rt_memcpy((void*)&_rt_hw_framebuffer[y][x1], pixels, (x2 - x1) * 2);
+ rt_memcpy((void*)&_rt_framebuffer[y][x1], pixels, (x2 - x1) * 2);
}
struct rtgui_graphic_driver _rtgui_lcd_driver =
diff --git a/bsp/mini2440/lcd_t35.c b/bsp/mini2440/lcd_t35.c
index a9f5d1f716..75816b2ea6 100644
--- a/bsp/mini2440/lcd_t35.c
+++ b/bsp/mini2440/lcd_t35.c
@@ -111,6 +111,7 @@
#define S3C2410_LCDINT_FRSYNC (1<<1)
+volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
void lcd_power_enable(int invpwren,int pwren)
@@ -170,19 +171,34 @@ void LcdBkLtSet(rt_uint32_t HiRatio)
void rt_hw_lcd_update(rtgui_rect_t *rect)
{
- /* nothing */
+ rt_uint16_t *src_ptr, *dst_ptr;
+ rt_uint32_t pitch, index;
+
+ pitch = 2 * (rect->x2 - rect->x1);
+
+ /* copy from framebuffer to physical framebuffer */
+ src_ptr = &_rt_framebuffer[rect->x1][rect->y1];
+ dst_ptr = &_rt_hw_framebuffer[rect->x1][rect->y1];
+
+ for (index = rect->y1; index < rect->y2; index ++)
+ {
+ memcpy(dst_ptr, src_ptr, pitch);
+
+ src_ptr += (rect->x2 - rect->x1);
+ dst_ptr += (rect->x2 - rect->x1);
+ }
}
rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
{
- return (rt_uint8_t *)_rt_hw_framebuffer;
+ return (rt_uint8_t *)_rt_framebuffer;
}
void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
{
if (x < RT_HW_LCD_WIDTH && y < RT_HW_LCD_HEIGHT)
{
- _rt_hw_framebuffer[(y)][(x)] = rtgui_color_to_565p(*c);
+ _rt_framebuffer[(y)][(x)] = rtgui_color_to_565p(*c);
}
}
@@ -190,7 +206,7 @@ void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
{
if (x < RT_HW_LCD_WIDTH && y < RT_HW_LCD_HEIGHT)
{
- *c = rtgui_color_from_565p(_rt_hw_framebuffer[(y)][(x)]);
+ *c = rtgui_color_from_565p(_rt_framebuffer[(y)][(x)]);
}
return ;
@@ -206,7 +222,7 @@ void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_
for (idx = x1; idx < x2; idx ++)
{
- _rt_hw_framebuffer[y][idx] = color;
+ _rt_framebuffer[y][idx] = color;
}
}
@@ -220,13 +236,13 @@ void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t
for (idy = y1; idy < y2; idy ++)
{
- _rt_hw_framebuffer[idy][x] = color;
+ _rt_framebuffer[idy][x] = color;
}
}
void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y)
{
- rt_memcpy((void*)&_rt_hw_framebuffer[y][x1], pixels, (x2 - x1) * 2);
+ rt_memcpy((void*)&_rt_framebuffer[y][x1], pixels, (x2 - x1) * 2);
}
struct rtgui_graphic_driver _rtgui_lcd_driver =