rt-thread-official/bsp/renesas/ra6m3-hmi-board/board/ports/drv_g2d.c

218 lines
5.8 KiB
C

/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-12-10 Rbb666 the first version
*/
#include <rtthread.h>
#include <lcd_port.h>
#include <stdlib.h>
#include "drv_g2d.h"
#ifdef BSP_USING_G2D
static d2_device *_d2_handle;
static d2_renderbuffer *renderbuffer;
static uint32_t _GetD2Mode(void)
{
uint32_t r;
r = d2_mode_rgb565;
return r;
}
int G2d_Drv_HWInit(void)
{
d2_s32 d2_err;
// Initialize D/AVE 2D driver
_d2_handle = (d2_device *)rt_malloc(sizeof(_d2_handle));
_d2_handle = d2_opendevice(0);
d2_err = d2_inithw(_d2_handle, 0);
if (d2_err != D2_OK)
{
rt_kprintf("Could NOT d2_inithw\n");
d2_closedevice(_d2_handle);
return RT_ERROR;
}
// Clear both buffers
d2_framebuffer(_d2_handle,
&fb_background[0],
480,
480,
272,
(d2_s32) _GetD2Mode());
d2_clear(_d2_handle, 0x000000);
// Set various D2 parameters
d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_one_minus_alpha);
d2_setblendmode(_d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha);
d2_setalphamode(_d2_handle, d2_am_constant);
d2_setalpha(_d2_handle, UINT8_MAX);
d2_setantialiasing(_d2_handle, 1);
d2_setlinecap(_d2_handle, d2_lc_butt);
d2_setlinejoin(_d2_handle, d2_lj_miter);
renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20);
if (!renderbuffer)
{
rt_kprintf("NO renderbuffer\n");
d2_closedevice(_d2_handle);
}
return RT_EOK;
}
void _GraphicsHWDeInit(void)
{
// Stop graphics LCD controller
while (FSP_SUCCESS != R_GLCDC_Stop(g_display0.p_ctrl))
{
/* Wait for GLCDC register update to complete before closing driver. */
}
R_GLCDC_Close(g_display0.p_ctrl);
// Deinitialize D/AVE 2D driver
d2_freerenderbuffer(_d2_handle, renderbuffer);
d2_deinithw(_d2_handle);
d2_closedevice(_d2_handle);
}
static int32_t _CircleAA(int32_t x0, int32_t y0, int32_t r, int32_t w)
{
uint32_t Mode;
int32_t ret;
Mode = _GetD2Mode();
// Generate render operations
d2_framebuffer(_d2_handle,
(uint16_t *)&fb_background[0],
LCD_WIDTH,
LCD_WIDTH,
LCD_HEIGHT,
(d2_s32) Mode);
d2_selectrenderbuffer(_d2_handle, renderbuffer);
d2_setcolor(_d2_handle, 0, 0xF800); // green
d2_cliprect(_d2_handle, 0, 0, LCD_WIDTH, LCD_HEIGHT);
ret = d2_rendercircle(_d2_handle,
(d2_point)(x0 << 4),
(d2_point)(y0 << 4),
(d2_width)(r << 4),
(d2_width)(w << 4));
// Execute render operations
d2_executerenderbuffer(_d2_handle, renderbuffer, 0);
d2_flushframe(_d2_handle);
while (d2_commandspending(_d2_handle))
{
/* Do nothing */
}
return ret;
}
int G2D_Test_Draw_Circle()
{
_CircleAA(240, 100, 50, 10);
return 0;
}
MSH_CMD_EXPORT(G2D_Test_Draw_Circle, G2D_Draw_Circle);
#ifdef PKG_USING_LVGL
void lv_port_gpu_blit(int32_t x,
int32_t y,
const void *p,
const lv_area_t *area)
{
uint32_t Mode;
uint32_t ModeSrc;
Mode = _GetD2Mode();
ModeSrc = d2_mode_rgb565;
lv_coord_t img_w, img_h;
img_w = lv_area_get_width(area);
img_h = lv_area_get_height(area);
// Generate render operations
d2_framebuffer(_d2_handle,
(uint16_t *)&fb_background[0],
LCD_WIDTH,
LCD_WIDTH,
LCD_HEIGHT,
(d2_s32) Mode);
d2_selectrenderbuffer(_d2_handle, renderbuffer);
d2_cliprect(_d2_handle, 0, 0, LCD_WIDTH, LCD_HEIGHT);
d2_setblitsrc(_d2_handle, (void *) p, img_w, img_w, img_h, ModeSrc);
d2_blitcopy(_d2_handle, img_w, img_h, 0, 0, (d2_width)(img_w << 4), (d2_width)(img_h << 4),
(d2_point)(x << 4), (d2_point)(y << 4), 0);
// Execute render operations
d2_executerenderbuffer(_d2_handle, renderbuffer, 0);
// In single-buffered mode always wait for DRW to finish before returning
d2_flushframe(_d2_handle);
}
#endif
void _LCD_FillRect(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color)
{
uint32_t Mode;
int32_t xSize;
int32_t ySize;
Mode = _GetD2Mode();
// Generate render operations
d2_framebuffer(_d2_handle,
(uint16_t *)&fb_background[0],
LCD_WIDTH,
LCD_WIDTH,
LCD_HEIGHT,
(d2_s32) Mode);
d2_selectrenderbuffer(_d2_handle, renderbuffer);
d2_setcolor(_d2_handle, 0, (uint16_t)color);
d2_setalpha(_d2_handle, 0xff);
d2_cliprect(_d2_handle, x0, y0, x1, y1);
xSize = (x1 - x0) + 1;
ySize = (y1 - y0) + 1;
d2_renderbox(_d2_handle, (d2_point)(x0 << 4), (d2_point)(y0 << 4), (d2_width)(xSize << 4),
(d2_width)(ySize << 4));
rt_kprintf("color:%#x\n", color);
// Execute render operations
d2_executerenderbuffer(_d2_handle, renderbuffer, 0);
d2_flushframe(_d2_handle);
d2_setalpha(_d2_handle, UINT8_MAX);
d2_u8 fillmode_bkup = d2_getfillmode(_d2_handle);
d2_setfillmode(_d2_handle, fillmode_bkup);
}
int G2D_Test_Draw_FillRect(int argc, const char *argv[])
{
if (argc > 0)
{
_LCD_FillRect(100, 100, 150, 150, 0x00F800);
_LCD_FillRect(100, 100, 120, 120, 0x0000FF);
rt_kprintf("x0:%d y0:%d x1:%d y1:%d\n", atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
}
return 0;
}
MSH_CMD_EXPORT(G2D_Test_Draw_FillRect, G2D_Test_Draw_FillRect);
#endif