123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*
- * File : lcd_800480.c
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2010, RT-Thread Develop Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2010-01-01 bernard first version from QiuYi's driver
- */
- #include <rtthread.h>
- #include <soc3210.h>
- #include <rtgui/driver.h>
- #include <rtgui/color.h>
- /* LCD driver for 800x480 16bit */
- #define RT_HW_LCD_WIDTH 800
- #define RT_HW_LCD_HEIGHT 480
- ALIGN(4)
- volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH];
- #define K1BASE 0xA0000000
- #define KSEG1(addr) ((void *)(K1BASE | (rt_uint32_t)(addr)))
- #define HW_FB_ADDR KSEG1(_rt_framebuffer)
- #define HW_FB_PIXEL(x, y) *(volatile rt_uint16_t*)((rt_uint8_t*)HW_FB_ADDR + (y * RT_HW_LCD_WIDTH * 2) + x * 2)
- void rt_hw_lcd_update(rtgui_rect_t *rect)
- {
- }
- rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
- {
- return (rt_uint8_t *)HW_FB_ADDR;
- }
- 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)
- {
- HW_FB_PIXEL(x, y) = rtgui_color_to_565p(*c);
- }
- }
- 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(HW_FB_PIXEL(x, y));
- }
- return ;
- }
- void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y)
- {
- rt_uint32_t idx;
- rt_uint16_t color;
- /* get color pixel */
- color = rtgui_color_to_565p(*c);
- for (idx = x1; idx < x2; idx ++)
- {
- HW_FB_PIXEL(idx, y) = color;
- }
- }
- void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2)
- {
- rt_uint32_t idy;
- rt_uint16_t color;
- /* get color pixel */
- color = rtgui_color_to_565p(*c);
- for (idy = y1; idy < y2; idy ++)
- {
- HW_FB_PIXEL(x, idy) = 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_uint8_t* ptr;
- ptr = (rt_uint8_t*)&HW_FB_PIXEL(x1, y);
- rt_memcpy(ptr, pixels, (x2 - x1) * 2);
- }
- struct rtgui_graphic_driver _rtgui_lcd_driver =
- {
- "lcd",
- 2,
- RT_HW_LCD_WIDTH,
- RT_HW_LCD_HEIGHT,
- rt_hw_lcd_update,
- rt_hw_lcd_get_framebuffer,
- rt_hw_lcd_set_pixel,
- rt_hw_lcd_get_pixel,
- rt_hw_lcd_draw_hline,
- rt_hw_lcd_draw_vline,
- rt_hw_lcd_draw_raw_hline
- };
- #include "finsh.h"
- void hline(rt_uint32_t c, int x1, int x2, int y)
- {
- rtgui_color_t color = (rtgui_color_t)c;
- rt_hw_lcd_draw_hline(&color, x1, x2, y);
- }
- FINSH_FUNCTION_EXPORT(hline, draw a hline);
- void vline(rt_uint32_t c, int x, int y1, int y2)
- {
- rtgui_color_t color = (rtgui_color_t)c;
- rt_hw_lcd_draw_vline(&color, x, y1, y2);
- }
- FINSH_FUNCTION_EXPORT(vline, draw a vline);
- void clear()
- {
- int y;
- for (y = 0; y < _rtgui_lcd_driver.height; y ++)
- {
- rt_hw_lcd_draw_hline((rtgui_color_t*)&white, 0, 240, y);
- }
- }
- FINSH_FUNCTION_EXPORT(clear, clear screen);
- void fill(rt_uint32_t c)
- {
- int y;
- rtgui_color_t color = (rtgui_color_t)c;
- for (y = 0; y < _rtgui_lcd_driver.height; y ++)
- {
- rt_hw_lcd_draw_hline(&color, 0, _rtgui_lcd_driver.width, y);
- }
- }
- FINSH_FUNCTION_EXPORT(fill, fill screen with color);
- void lcd_init()
- {
- /* disable LCD controller */
- LCD_CTRL = LCD_CTRL & 0xfffe;
- /* set LCD clock */
- HSB_MISC_REG = (HSB_MISC_REG & 0xFFFD01FF) |
- (0x01 << 17) | /* enable LCD */
- (0x05 << 9); /* clock */
- LCD_VBARA = (rt_uint32_t)_rt_framebuffer - 0x80000000;
- LCD_VBARB = (rt_uint32_t)_rt_framebuffer - 0x80000000;
- LCD_HTIM = 0x12c031f;
- LCD_VTIM = 0x11501df;
- LCD_HVLEN = 0x41e0279;
- LCD_CTRL = 0x8709;
- rt_kprintf("VBARA 0x%08x\n", LCD_VBARA);
- rt_kprintf("CTRL 0x%08x\n", LCD_CTRL);
- rt_kprintf("HTIM 0x%08x\n", LCD_HTIM);
- rt_kprintf("VTIM 0x%08x\n", LCD_VTIM);
- rt_kprintf("HVLEN 0x%08x\n", LCD_HVLEN);
- rt_kprintf("HSB_MISC 0x%08x\n", HSB_MISC_REG);
- #ifdef RT_USING_RTGUI
- /* add lcd driver into graphic driver */
- rtgui_graphic_driver_add(&_rtgui_lcd_driver);
- #endif
- }
- FINSH_FUNCTION_EXPORT(lcd_init, init lcd);
- void rt_hw_lcd_init()
- {
- lcd_init();
- }
|