166 lines
5.8 KiB
C
166 lines
5.8 KiB
C
#include "app_config.h"
|
||
|
||
#ifdef CONFIG_CPU_WL82
|
||
#include "generic/typedef.h"
|
||
#include "asm/WL82_imd.h"
|
||
#include "lcd_drive.h"
|
||
#include "lcd_config.h"
|
||
#include "gpio.h"
|
||
#include "yuv_to_rgb.h"
|
||
|
||
#if TCFG_LCD_480x272_8BITS
|
||
|
||
#define LCD_W 480
|
||
#define LCD_H 272
|
||
|
||
#define LCD_RGB888_DATA_SIZE LCD_W*LCD_H*3
|
||
|
||
void lcd_480x272_8bits_text(void);
|
||
|
||
static void ui_data_handle(u8 *data, u32 size)
|
||
{
|
||
ui_send_data_ready(data, size);
|
||
}
|
||
static void camera_data_handle(u8 *data, u32 size)
|
||
{
|
||
camera_send_data_ready(data, size);
|
||
}
|
||
|
||
static void send_data_to_lcd(u8 *data, u32 size)//最终通过NO_te线程发送数据
|
||
{
|
||
u8 *req_buf = NULL;
|
||
u32 req_len = 0;
|
||
|
||
req_buf = lcd_req_buf(&req_len);//RGB-DVP屏幕使用IMD接口,先获取内部可用缓冲区,再在缓冲区进行数据转换
|
||
if (req_buf && req_len) {
|
||
RGB565_to_RGB888(data, req_buf, LCD_W, LCD_H);
|
||
lcd_req_buf_update(req_buf, req_len);
|
||
} else {
|
||
req_buf = malloc(LCD_RGB888_DATA_SIZE);
|
||
if (req_buf) {
|
||
RGB565_to_RGB888(data, req_buf, LCD_W, LCD_H);
|
||
camera_data_handle(req_buf, LCD_RGB888_DATA_SIZE);
|
||
free(req_buf);
|
||
}
|
||
}
|
||
}
|
||
|
||
static void lcd_480x272_clearscreen(u32 color)
|
||
{
|
||
lcd_send_map(NULL, color);
|
||
}
|
||
static int lcd_480x272_8bits_init(void)
|
||
{
|
||
printf("lcd 480x272 8bits init ...\n");
|
||
/*lcd_480x272_8bits_text();*/
|
||
init_TE(send_data_to_lcd);
|
||
|
||
return 0;
|
||
}
|
||
static void lcd_480x272_8bit_SetRange(u16 xs, u16 xe, u16 ys, u16 ye)
|
||
{
|
||
/******UI每次发送数据都会调用开窗告诉屏幕要刷新那个区域***********/
|
||
set_lcd_ui_x_y(xs, xe, ys, ye);
|
||
|
||
}
|
||
static void lcd_480x272_8bit_reset(void)
|
||
{
|
||
|
||
}
|
||
static void lcd_480x272_8bit_led_ctrl(u8 status)
|
||
{
|
||
//背光控制以及放在//lcd_te_driver.c 优化开机显示
|
||
/*lcd_bl_pinstate(status);*/
|
||
}
|
||
|
||
void lcd_480x272_8bits_text(void)
|
||
{
|
||
u8 *buf = malloc(LCD_RGB888_DATA_SIZE);
|
||
/* rgb565 */
|
||
/* 蓝 绿 红 */
|
||
/* 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 */
|
||
/* 8 8 8 */
|
||
while (1) {
|
||
printf("[test]>>>>>>>>lcd_480x272_8bits_text");
|
||
memset(buf, 0x00, LCD_RGB888_DATA_SIZE);
|
||
for (u32 i = 0; i < LCD_RGB888_DATA_SIZE; i += 3) {
|
||
buf[i] = 0xff;
|
||
}
|
||
lcd_send_map(buf, LCD_RGB888_DATA_SIZE);
|
||
os_time_dly(100);
|
||
|
||
printf("[test]>>>>>>>>lcd_480x272_8bits_text");
|
||
memset(buf, 0x00, LCD_RGB888_DATA_SIZE);
|
||
memset(buf, 0x00, LCD_RGB888_DATA_SIZE);
|
||
for (u32 i = 1; i < LCD_RGB888_DATA_SIZE; i += 3) {
|
||
buf[i] = 0xff;
|
||
}
|
||
lcd_send_map(buf, LCD_RGB888_DATA_SIZE);
|
||
os_time_dly(100);
|
||
|
||
printf("[test]>>>>>>>>lcd_480x272_8bits_text");
|
||
memset(buf, 0x00, LCD_RGB888_DATA_SIZE);
|
||
memset(buf, 0x00, LCD_RGB888_DATA_SIZE);
|
||
for (u32 i = 2; i < LCD_RGB888_DATA_SIZE; i += 3) {
|
||
buf[i] = 0xff;
|
||
}
|
||
lcd_send_map(buf, LCD_RGB888_DATA_SIZE);
|
||
os_time_dly(100);
|
||
}
|
||
}
|
||
|
||
// *INDENT-OFF*
|
||
IMD_RGB_PLATFORM_DATA_BEGIN(lcd_rgb_data)
|
||
.test_mode = TRUE, //初始化颜色显示
|
||
.double_buffer = TRUE, //底层使用一张显存应用层一张显存 每次都是拷贝数据到显存更新数据
|
||
.req_buf_waite = FALSE, //底层buff更新是否需要等待在中断更新:小分辨率等待,大分辨率不等带
|
||
.new_double_buffer = FALSE, //应用层双BUF
|
||
.test_color = 0xFFFF00, //初始化颜色(r<<16|g<<8|b)
|
||
.group_port = IMD_IO_GROUPC, //IO口选择:IMD_IO_GROUPA/IMD_IO_GROUPC
|
||
.irq_en = TRUE,//FALSE, //使能GB传输的帧中断,频率较高建议关闭:TRUE/FALSE
|
||
.clk_edge = IMD_CLK_UPDATE_H, //更新数据边缘选择:IMD_CLK_UPDATE_H/IMD_CLK_UPDATE_L
|
||
.sync0 = IMD_VSYN_EN | IMD_SYN_EDGE_H, //行帧同步信号选择:
|
||
.sync1 = IMD_HSYN_EN | IMD_SYN_EDGE_H, //行帧同步信号选择:
|
||
.sync2 = IMD_DE_EN | IMD_SYN_EDGE_H, //行帧步信号选择:
|
||
//.sync2 = IMD_SYNC_DIS, //行帧同步信号选择:
|
||
/*.data_out_mode = IMD_DATA_LSB, //输出输出大小端:IMD_DATA_MSB/IMD_DATA_LSB*/
|
||
.data_in_format = IMD_RGB_888, //RGB输入格式:IMD_RGB_888
|
||
.data_out_format= IMD_RGB_888, //RGB输出格式:IMD_RGB_888/IMD_RGB_666
|
||
.data_out_mode = IMD_DATA_MSB, //输出输出大小端:IMD_DATA_MSB/IMD_DATA_LSB
|
||
.data_shift_en = FALSE, //RGB666数据右移位2位(先右移在按照MSB/LSB输出)
|
||
.pll_clk_div = IMD_PLL_DIV24,//WL82_imd.h
|
||
//IMD_PLL_DIV28 一帧数据28ms
|
||
//IMD_PLL_DIV24 一帧数据24ms
|
||
//IMD_PLL_DIV20 一帧数据20ms //依次类推 DIV后面数值就是一帧数据的时间 帧数为 1000ms/28ms = 35帧
|
||
.hsync_forward = 10, //行前沿宽度周期个数
|
||
.hsync_behind = 10, //行后沿宽度周期个数
|
||
.hsync_time = 268, //行同步脉冲宽度周期个数
|
||
.vsync_forward = 8, //帧前沿宽度的行时间个数
|
||
.vsync_behind = 3, //帧后沿宽度的行时间个数
|
||
.vsync_time = 5, //帧同步脉冲宽的行时间个数
|
||
.width = LCD_W, //RGB屏宽
|
||
.height = LCD_H, //RGB屏高
|
||
IMD_RGB_PLATFORM_DATA_END()
|
||
|
||
REGISTER_LCD_DEV(lcd_480x271_bits_dev) = {
|
||
.name = "LCD_480x272_8BITS",
|
||
.lcd_priv = (void*)&lcd_rgb_data,
|
||
.lcd_width = LCD_W,
|
||
.lcd_height = LCD_H,
|
||
.color_format = LCD_COLOR_RGB888,
|
||
.column_addr_align = 1,
|
||
.row_addr_align = 1,
|
||
.LCD_Init = lcd_480x272_8bits_init,
|
||
.SetDrawArea = lcd_480x272_8bit_SetRange,
|
||
.LCD_Draw = ui_data_handle,
|
||
.LCD_Draw_1 = camera_data_handle,
|
||
.LCD_DrawToDev = lcd_send_map,//应用层直接到设备接口层,需要做好缓冲区共用互斥,慎用!
|
||
.LCD_ClearScreen = lcd_480x272_clearscreen,
|
||
.Reset = lcd_480x272_8bit_reset,
|
||
.BackLightCtrl = lcd_480x272_8bit_led_ctrl,
|
||
};
|
||
// *INDENT-ON*
|
||
|
||
#endif
|
||
#endif
|