static void _g2d_drv_set_layer_info(g2d_layer_t *g2d_layer, int id) { unsigned int layer_width = g2d_layer->width; unsigned int layer_height = g2d_layer->height; unsigned int layer_pitch = _g2d_get_pitch_byte(g2d_layer->pitch, g2d_layer->format); CLR_G2D_LAYER_CON(id); SET_G2D_LAYER_CON_COLOR_FORMAT(id, g2d_layer->format); SET_G2D_LAYER_CON_ROTATE(id, g2d_layer->transform); SET_G2D_LAYER_OFFSET(id, g2d_layer->offset.x, g2d_layer->offset.y); if (!g2d_layer->rectangle) { SET_G2D_LAYER_ADDR(id, g2d_layer->addr); ASSERT(((unsigned) layer_pitch) <= 0x2000); SET_G2D_LAYER_PITCH(id, layer_pitch); } else { ENABLE_G2D_LAYER_CON_RECT_FILL(id); SET_G2D_LAYER_RECTANGLE_FILL_COLOR(id, g2d_layer->rect_color); } SET_G2D_LAYER_SIZE(id, layer_width, layer_height); if (g2d_layer->blending) { ENABLE_G2D_LAYER_CON_ALPHA(id); SET_G2D_LAYER_CON_ALPHA(id, g2d_layer->const_alpha); } else { DISABLE_G2D_LAYER_CON_ALPHA(id); } ENABLE_G2D_ROI_LAYER(id); }
G2D_STATUS_ENUM g2d_drv_rectfill_start(G2D_HANDLE_STRUCT *handle) { { kal_bool status; status = _g2d_drv_rectfill_check_window_range(handle); if(KAL_FALSE == status) return G2D_STATUS_RANGE_CHECK_FAIL; status = _g2d_drv_rectfill_set_window_intersection(handle); if(KAL_FALSE == status) return G2D_STATUS_RANGE_CHECK_FAIL; } HARD_RESET_G2D_ENGINE; REG_G2D_MODE_CTRL = 0; REG_G2D_ROI_CON = 0; REG_G2D_DI_CON = 0x0; CLR_G2D_LAYER_CON(0); CLR_G2D_LAYER_CON(1); ENABLE_G2D_LAYER_CON_RECT_FILL(1); /// setting the hw hisr callback function g2d_drv_set_hw_hisr_callback(&g2d_irq_handler); /// setting the avoidance and replacement colors g2d_drv_set_replacement_colors(handle); /// setting the clipping window g2d_drv_set_clipping_window(handle); /// setting the bitblt destination infomation _g2d_drv_rectfill_set_info(handle); g2d_drv_set_dithering(handle); /// disable bg REG_G2D_ROI_CON |= G2D_ROI_CON_DISABLE_BG_BIT; /// burst mode g2d_drv_set_burst_type(handle); /// slow down g2d_drv_set_slow_down(handle); if (KAL_TRUE == handle->callbackEnable) { REG_G2D_IRQ |= G2D_IRQ_ENABLE_BIT; } else { REG_G2D_IRQ &= ~G2D_IRQ_ENABLE_BIT; } REG_G2D_MODE_CTRL |= G2D_MODE_CON_ENG_MODE_G2D_BITBLT_BIT; /// trigger the rectangle fill REG_G2D_START = G2D_START_BIT; #if defined(G2D_HW_C_MODEL_SUPPORT) g2d_drv_c_model_start(handle); #endif return G2D_STATUS_OK; }
static void _g2d_drv_overlay_set_layer_info(G2D_HANDLE_STRUCT *handle) { G2D_OVERLAY_STRUCT *overlayFunc = &(handle->overlayFunc); kal_int32 layer; for (layer = 0; layer < G2D_HW_OVERLAY_TOTAL_LAYER; layer++) { G2D_OVERLAY_LAYER_STRUCT *layerInfo = &(overlayFunc->layerInfo[layer]); G2D_WINDOW_STRUCT *layerWindow = &(layerInfo->layerWindow); G2D_CANVAS_INFO_STRUCT *layerCanvas = &(layerInfo->layerCanvas); if(KAL_TRUE == (layerInfo->layerEnable)) { kal_uint32 layerWidth = layerWindow->buttomRight.x - layerWindow->topLeft.x + 1; kal_uint32 layerHeight = layerWindow->buttomRight.y - layerWindow->topLeft.y + 1; kal_uint32 layerPitch = 0; CLR_G2D_LAYER_CON(layer); switch(layerInfo->function) { case G2D_OVERLAY_LAYER_FUNCTION_BUFFER: { layerPitch = (layerCanvas->width) * (layerCanvas->bytesPerPixel); if(KAL_TRUE == (layerInfo->srcKeyEnable)) { ENABLE_G2D_LAYER_CON_SRC_KEY(layer); SET_G2D_LAYER_SRC_KEY(layer, layerInfo->srcKeyValue); } if(KAL_TRUE == (layerInfo->layerAlphaEnable)) { ENABLE_G2D_LAYER_CON_ALPHA(layer); SET_G2D_LAYER_CON_ALPHA(layer, layerInfo->layerAlphaValue); } { switch(layerCanvas->colorFormat) { case G2D_COLOR_FORMAT_GRAY: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_GRAY); break; case G2D_COLOR_FORMAT_RGB565: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_RGB565); break; case G2D_COLOR_FORMAT_ARGB8888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB8888); break; case G2D_COLOR_FORMAT_RGB888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_RGB888); break; case G2D_COLOR_FORMAT_BGR888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_BGR888); break; case G2D_COLOR_FORMAT_PARGB8888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_PARGB8888); break; case G2D_COLOR_FORMAT_UYVY422: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_UYVY); break; case G2D_COLOR_FORMAT_ARGB8565: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB8565); break; case G2D_COLOR_FORMAT_PARGB8565: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_PARGB8565); break; case G2D_COLOR_FORMAT_ARGB6666: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB6666); break; case G2D_COLOR_FORMAT_PARGB6666: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_PARGB6666); break; default: ASSERT(0); break; } } } break; case G2D_OVERLAY_LAYER_FUNCTION_RECT: { layerPitch = (layerCanvas->width) * (layerCanvas->bytesPerPixel); ENABLE_G2D_LAYER_CON_RECT_FILL(layer); if(KAL_TRUE == (layerInfo->srcKeyEnable)) { ASSERT(0); } if(KAL_TRUE == (layerInfo->layerAlphaEnable)) { ENABLE_G2D_LAYER_CON_ALPHA(layer); SET_G2D_LAYER_CON_ALPHA(layer, layerInfo->layerAlphaValue); } { switch(layerCanvas->colorFormat) { case G2D_COLOR_FORMAT_GRAY: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_GRAY); break; case G2D_COLOR_FORMAT_RGB565: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_RGB565); break; case G2D_COLOR_FORMAT_ARGB8888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB8888); break; case G2D_COLOR_FORMAT_RGB888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_RGB888); break; case G2D_COLOR_FORMAT_BGR888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_BGR888); break; case G2D_COLOR_FORMAT_PARGB8888: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_PARGB8888); break; case G2D_COLOR_FORMAT_UYVY422: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_UYVY); break; case G2D_COLOR_FORMAT_ARGB8565: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB8565); break; case G2D_COLOR_FORMAT_PARGB8565: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_PARGB8565); break; case G2D_COLOR_FORMAT_ARGB6666: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB6666); break; case G2D_COLOR_FORMAT_PARGB6666: SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_PARGB6666); break; default: ASSERT(0); break; } } /// Set color; SET_G2D_LAYER_RECTANGLE_FILL_COLOR(layer, (kal_uint32)layerInfo->rectFillColor); } break; case G2D_OVERLAY_LAYER_FUNCTION_NORMAL_FONT: { layerPitch = layerCanvas->width; ENABLE_G2D_LAYER_CON_FONT(layer); if((KAL_TRUE == (layerInfo->srcKeyEnable)) || (KAL_TRUE == (layerInfo->layerAlphaEnable))) { ASSERT(0); } ASSERT(G2D_CW_ROTATE_ANGLE_000 == (layerInfo->rotation)); SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB8888); layerCanvas->colorFormat = G2D_COLOR_FORMAT_ARGB8888; SET_G2D_LAYER_FONT_FOREGROUND_COLOR(layer, layerInfo->foregroundColor); } break; case G2D_OVERLAY_LAYER_FUNCTION_AA_FONT: { layerPitch = layerCanvas->width; ENABLE_G2D_LAYER_CON_FONT(layer); SET_G2D_LAYER_CON_AA_FONT_BIT(layer, (layerInfo->fontBit) << 28); if((KAL_TRUE == (layerInfo->srcKeyEnable)) || (KAL_FALSE == (layerInfo->layerAlphaEnable))) { ASSERT(0); } ENABLE_G2D_LAYER_CON_ALPHA(layer); SET_G2D_LAYER_CON_ALPHA(layer, 0xFF); ASSERT(G2D_CW_ROTATE_ANGLE_000 == (layerInfo->rotation)); layerCanvas->colorFormat = G2D_COLOR_FORMAT_ARGB8888; SET_G2D_LAYER_CON_COLOR_FORMAT(layer, G2D_LX_CON_COLOR_ARGB8888); SET_G2D_LAYER_FONT_FOREGROUND_COLOR(layer, layerInfo->foregroundColor); } break; default: ASSERT(0); } /// rotation { switch(layerInfo->rotation) { case G2D_CW_ROTATE_ANGLE_000: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_000); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x, layerWindow->topLeft.y); } break; case G2D_CW_ROTATE_ANGLE_090: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_090); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x, layerWindow->topLeft.y + layerWidth - 1); } break; case G2D_CW_ROTATE_ANGLE_180: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_180); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x + layerWidth - 1, layerWindow->topLeft.y + layerHeight - 1); } break; case G2D_CW_ROTATE_ANGLE_270: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_270); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x + layerHeight - 1, layerWindow->topLeft.y); } break; case G2D_CW_ROTATE_ANGLE_MIRROR_000: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_MIRROR_000); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x + layerWidth - 1, layerWindow->topLeft.y); } break; case G2D_CW_ROTATE_ANGLE_MIRROR_090: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_MIRROR_090); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x, layerWindow->topLeft.y); } break; case G2D_CW_ROTATE_ANGLE_MIRROR_180: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_MIRROR_180); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x, layerWindow->topLeft.y + layerHeight - 1); } break; case G2D_CW_ROTATE_ANGLE_MIRROR_270: { SET_G2D_LAYER_CON_ROTATE(layer, G2D_LX_CON_CCW_ROTATE_MIRROR_270); SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x + layerHeight - 1, layerWindow->topLeft.y + layerWidth - 1); } break; default: ASSERT(0); break; } } switch(layerCanvas->colorFormat) { case G2D_COLOR_FORMAT_GRAY: case G2D_COLOR_FORMAT_RGB565: case G2D_COLOR_FORMAT_ARGB8888: case G2D_COLOR_FORMAT_RGB888: case G2D_COLOR_FORMAT_BGR888: case G2D_COLOR_FORMAT_PARGB8888: case G2D_COLOR_FORMAT_ARGB8565: case G2D_COLOR_FORMAT_PARGB8565: case G2D_COLOR_FORMAT_ARGB6666: case G2D_COLOR_FORMAT_PARGB6666: SET_G2D_LAYER_ADDR(layer, (kal_uint32)(layerCanvas->RGBBufferAddr)); break; case G2D_COLOR_FORMAT_UYVY422: SET_G2D_LAYER_ADDR(layer, (kal_uint32)(layerCanvas->YUVBufferAddr[0])); break; default: ASSERT(0); break; } ASSERT(((unsigned)layerPitch) <= 0x2000); SET_G2D_LAYER_PITCH(layer, layerPitch); /// This is set in rotation /// SET_G2D_LAYER_OFFSET(layer, layerWindow->topLeft.x, layerWindow->topLeft.y); SET_G2D_LAYER_SIZE(layer, layerWidth, layerHeight); ENABLE_G2D_ROI_LAYER(layer); } } }