⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvgop_bloader.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 3 页
字号:
    MDrv_GE_SetFrameBufferInfo(gwinFB[fbId].width, gwinFB[fbId].height, gwinFB[fbId].pitch, gwinFB[fbId].fbFmt, gwinFB[fbId].addr);
}

/******************************************************************************/
/// Check if GWIN is created
/// @param gId \b IN \copydoc GWINID
/******************************************************************************/
U8   MDrv_GOP_GWIN_IsGwinExist(U8 gId)
{

    if ((gId > MAX_GWIN_SUPPORT) || (gwinMap[gId]>MAX_GWIN_FB_SUPPORT) || \
        (gwinFB[gwinMap[gId]].allocated == FALSE) || (gwinMap[gId] == GWIN_ID_INVALID))
    {
        return FALSE;
    }

    return TRUE;
}

/******************************************************************************/
/// Move a GWIN's display left top position
/// @param gId  \b IN \copydoc GWINID
/// @param dispX \b IN left top x
/// @param dispY \b IN left top y
/******************************************************************************/
void MDrv_GOP_GWIN_SetWinDispPosition(U8 gId, U16 dispX, U16 dispY)
{
    GOP_GWIN_INFO gWin;
    U8 fbId;

    if (gId >= MAX_GWIN_SUPPORT )
    {
        GOP_DEBUGINFO( printf( "MDrv_GOP_GWIN_SetWinDispPosition(Id....), gId out of bound\n" ) );
        return;
    }

    fbId = gwinMap[gId];

    if ((fbId == GWIN_ID_INVALID) || (gwinFB[fbId].allocated== FALSE))
    {
        GOP_DEBUGINFO( printf("MDrv_GOP_GWIN_SetWinDispPosition: gId=%d not allocated\n",gId));
        return;
    }

    if (fbId > MAX_GWIN_FB_SUPPORT)
    {
        GOP_DEBUGINFO( printf( "MDrv_GOP_GWIN_SetWinDispPosition(Id....), gId --> fb out of bound\n" ) );
        return;
    }

    MDrv_GOP_GWIN_GetWinInfo(gId, &gWin);

    gwinFB[fbId].x0 = gWin.u16DispHPixelStart = dispX;
    gwinFB[fbId].y0 = gWin.u16DispVPixelStart = dispY;
    gwinFB[fbId].x1 = gWin.u16DispHPixelEnd = dispX + gwinFB[fbId].width;
    gwinFB[fbId].y1 = gWin.u16DispVPixelEnd = dispY + gwinFB[fbId].height;

    //printf("\r\n MDrv_GOP_GWIN_SetWinDispPosition>");
    //printf("(%u, %u)-(%u, %u)", gwinFB[fbId].x0, gwinFB[fbId].y0, gwinFB[fbId].x1, gwinFB[fbId].y1);
    MDrv_GOP_GWIN_SetWinInfo(gId, &gWin);
}

/******************************************************************************/
/// Create frame buffer, (width * height * 2) bytes will be allocated
/// from SDRAM
/// @param fbId  \b IN frame buffer id 0 ~ (MAX_GWIN_FB_SUPPORT - 1)
/// @param dispX \b IN display x
/// @param dispY \b IN display y
/// @param width \b IN width
/// @param height \b IN height
/// @param fbFmt \b IN frame buffer format
/// @return
///   - #GWIN_NO_AVAILABLE fbId is not valid
///   - #GWIN_OK destroy successfully
/// @see MDrv_GOP_GWIN_DestroyFB
/******************************************************************************/
U8 MDrv_GOP_GWIN_CreateFB(U8 fbId, U16 dispX, U16 dispY, U16 width, U16 height,  U16 fbFmt)
{
    U8 bytePerPix = 2;
    U8 gIdLast; // gIdLast is the prev valid winId
    U32 addr;
    U32 size;

    if (fbId >= MAX_GWIN_FB_SUPPORT)
    {
        msWarning(ERR_FB_ID_OUT_OF_RANGE);
        GOP_DEBUGINFO(printf("MDrv_GOP_GWIN_CreateFB: gwin max already reached, cannot open new win\n"));
        return GWIN_NO_AVAILABLE;
    }

    if (gwinFB[fbId].allocated == TRUE)
    {
        msWarning(ERR_FB_ID_ALREADY_ALLOCATED);
        GOP_DEBUGINFO(printf("MDrv_GOP_GWIN_CreateFB: gwin  already allocated\n"));
        return GWIN_NO_AVAILABLE;

    }

    GOP_DEBUGINFO(printf("MDrv_GOP_GWIN_CreateFB: new gwinFBId = %bd \r\n", fbId));

    // look for available Sdram slot
    gIdLast = gwinMap[GWIN_OSD_DEFAULT];  // gIdLast is the prev valid winId

    while   (gwinFB[gIdLast].next != GWIN_SDRAM_NULL)
    {
        gIdLast = gwinFB[gIdLast].next;
    }

    if (gIdLast == gwinMap[GWIN_OSD_DEFAULT])
   {
        addr = (GWIN_KEEP_INIT_OSDWIN == 0) ? GOP_GWIN_RB_BASE_ADR : \
                    gwinFB[gIdLast].addr + gwinFB[gIdLast].size; //consider if need to keep OSD data
        addr = (addr + GWIN_SDRAM_PG_UNIT-1) & (~(GWIN_SDRAM_PG_UNIT-1));
    }
    else
   {
        addr = (gwinFB[gIdLast].addr + gwinFB[gIdLast].size + GWIN_SDRAM_PG_UNIT-1) & (~(GWIN_SDRAM_PG_UNIT-1));
    }

    if (width & 0x0003)  /* width must be multi-of-4 */
    {
        width &= 0xFFFC;
     GOP_DEBUGINFO(printf("MDrv_GOP_GWIN_CreateFB: width must be multiple of 4, rounding to %d\n", width));
    }

    size =  ((U32)width) * ((U32)height) * ((U32)bytePerPix);

    // check available fb buffer size
    if (addr + size >= GOP_GWIN_RB_BASE_ADR + GOP_GWIN_RB_BASE_LEN)
    {
        if (gopSdramFree >= size) // too many fragments
        {
            //GOP_GWIN_REARRANGE_SDRAM(fbId, &addr);
        }
        else
        {
            msWarning(ERR_FB_OUT_OF_MEMORY);
            return GWIN_NO_AVAILABLE;
        }
    }
    #if 0
    if ((addr & GOP_SDRAM_BOUNDARY_MASK) != ((addr + size) & GOP_SDRAM_BOUNDARY_MASK))
    {
        residue = ((addr + size) & GOP_SDRAM_BOUNDARY_MASK) - addr;
        gopSdramFree -= residue;
        addr = ((addr + size) & GOP_SDRAM_BOUNDARY_MASK);
    }
    if ((addr & GOP_SDRAM_BOUNDARY_MASK) != ((addr + size) & GOP_SDRAM_BOUNDARY_MASK))
    {
        GOP_DEBUGINFO(printf("cannot allocate fb!\r\n"));
        gopSdramFree += residue;
        return GWIN_NO_AVAILABLE;
    }
    #endif
    gopSdramFree -= size;
    GOP_DEBUGINFO(printf("MDrv_GOP_GWIN_CreateFB(fbId=%bd): addr=%lx, size =%lx, available=%lx\n", fbId, addr, size, gopSdramFree));

    gwinFB[fbId].enable = FALSE;
    gwinFB[fbId].allocated = TRUE;
    //gwinFB[fbId].gWinId = gId;  // set by calling functions
    dispX += GOP_PD_OFFSET;
    gwinFB[fbId].x0 = dispX;
    gwinFB[fbId].y0 = dispY;
    gwinFB[fbId].width = width;
    gwinFB[fbId].height= height;
    gwinFB[fbId].x1 = gwinFB[fbId].x0 + gwinFB[fbId].width;
    gwinFB[fbId].y1 = gwinFB[fbId].y0 + gwinFB[fbId].height;
//    gwinFB[fbId].pitch = width & 0xFFFC;//width; //(width & 0xFFF8);  // pitch must be 4-pix alignment
    gwinFB[fbId].addr  = addr;
    gwinFB[fbId].size  = size;

    // FB format
    gwinFB[fbId].fbFmt  = (fbFmt != FB_FMT_AS_DEFAULT) ? fbFmt : gwinFB[gwinMap[GWIN_OSD_DEFAULT]].fbFmt;
    gwinFB[fbId].fbFmt |= gwinFB[fbId].fbFmt << 8;

    switch ( (gwinFB[fbId].fbFmt & 0xff ) )
    {
    case GE_FMT_I1 :
        gwinFB[fbId].pitch = (width) >> 3;
        break;
    case GE_FMT_I2 :
        gwinFB[fbId].pitch = (width<<1) >> 3;
        break;
    case GE_FMT_I4 :
        gwinFB[fbId].pitch = (width<<2) >> 3;
        break;
    case GE_FMT_I8 :
        gwinFB[fbId].pitch = width;
        break;
    case GE_FMT_RGB565 :
    case GE_FMT_ARGB1555 :
    case GE_FMT_ARGB4444 :
    case GE_FMT_1ABFgBg12355:
    case GE_FMT_1BAAFGBG123433 :
        gwinFB[fbId].pitch = width << 1;
        break;
    case GE_FMT_ARGB8888 :
        gwinFB[fbId].pitch = width << 2;
        break;
    default :
        //print err
        break;
    }

    // update ptrs
    gwinFB[fbId].prev = gIdLast;
    gwinFB[gIdLast].next = fbId;

    return (GWIN_OK);
}

//-------------------------------------------------------------------------------------------------
/// Set GOP Destination DisplayPlane
/// @param u8GOP_num \b IN: GOP number: 0 or 1
/// @param eDstType \b IN: GOP Destination DisplayPlane Type
/// @return TRUE: sucess / FALSE: fail
//-------------------------------------------------------------------------------------------------
BOOLEAN MDrv_GOP_DstPlane_Set(U8 u8GOP_num, GOPDstType eDstType)
{
    U16 u16RegVal;
#if 1
    MS_IPSEL_GOP IPSEL_GOP;


    if ((u8GOP_num>= MAX_GOP_SUPPORT))
    {
        return FALSE;
    }

//    MsOS_DiableAllInterrupts(u32OldIntr);

    // Set GOP Register for set Dst Plane is OP or IP

    if(current_bank != u8GOP_num)
        GOP_Write16Reg(GOP_BAK_SEL, u8GOP_num, 0x0003);


    u16RegVal = eDstType;
    GOP_Write16Reg(GOP_SVM, u16RegVal, 0x0003);      // Write gwin_dest[1:0]

    GOP_Write16Reg(GOP_BAK_SEL, current_bank, 0x0003);


    // Set GOP is IP0 or IP1
    if ((eDstType & BIT_MASK(GOP_DST_TYPE_VALIDBITS)) == 0x01)
    {
        switch (u8GOP_num)
        {
        case 0:
            if (eDstType == E_GOP_DST_IP0)
            {
                IPSEL_GOP = MS_IP0_SEL_GOP0;
            }
            else if (eDstType == E_GOP_DST_IP1)
            {
                IPSEL_GOP = MS_IP1_SEL_GOP0;
            }
            else
            {
//                MsOS_RestoreAllInterrupts(u32OldIntr);
                return FALSE;
            }
            break;

        case 1:
            if (eDstType == E_GOP_DST_IP0)
            {
                IPSEL_GOP = MS_IP0_SEL_GOP1;
            }
            else if (eDstType == E_GOP_DST_IP1)
            {
                IPSEL_GOP = MS_IP1_SEL_GOP1;
            }
            else
            {
                return FALSE;
            }
            break;
        default:
            return FALSE;
        }
//        _MDrv_Scaler_Set_GOPSel(IPSEL_GOP);
    }

#if 0       // Doesn't necessary.
    //Record in Gobal Variables.
    for (u32Wid =0; u32Wid < MAX_GWIN_SUPPORT; u32Wid++)
    {
        _GWinInfo[u8GOP_num][u32Wid].eDstType = eDstType;
    }
#endif

#endif
    return TRUE;
}

/********************************************************************************/
/// Set GWIN data format to GOP registers
/// @param u8win \b IN \copydoc GWINID
/// @param clrtype \b IN \copydoc GOPColorType
/********************************************************************************/
void MDrv_GOP_GWIN_SetWinFmt(U8 u8win, GOPColorType clrtype)
{
    U16 regval;
    U16 mask;

    GOP_Read16Reg(GOP_GWIN_DTYPE, &regval);
    clrtype = clrtype & 0x0f;
    mask = (U16)(0xF)<< (u8win*4);
    regval &= ~mask;
    regval |= ((clrtype << (u8win*4)) & mask);
    GOP_Write16Reg(GOP_GWIN_DTYPE, regval, GOP_REG_WORD_MASK);

}



/********************************************************************************/
/// Map GE/GOP buffer format
/// @param u8Type \b IN 0: GE to GOP, 1: GOP to GE
/// @param u8Fmt \b IN  Color type of GE/GOP
/********************************************************************************/
U8 MDrv_GOP_GWIN_BufFmtMap(U8 u8Type , U8 u8Fmt)
{
    U8 ret;
    if(u8Type == 0) {       // GE to GOP
        switch(u8Fmt) {
            case GE_FMT_I2:
                ret = E_GOP_COLOR_I2;
                break;
            case GE_FMT_I4:
                ret = E_GOP_COLOR_I4;
                break;
            case GE_FMT_I8:
                ret = E_GOP_COLOR_I8;
                break;
            case GE_FMT_RGB565:
                ret = E_GOP_COLOR_RGB565;
                break;
            case GE_FMT_ARGB1555:
#if (CC_USE_123433 == 1)
                ret = E_GOP_COLOR_ALPHABLINK;
#else
                ret = E_GOP_COLOR_RGB555_BLINK;
#endif

                break;
            case GE_FMT_ARGB4444:
                ret = E_GOP_COLOR_ARGB4444;
                break;
            case GE_FMT_1BAAFGBG123433:
                ret = E_GOP_COLOR_ALPHABLINK;
                break;
            case GE_FMT_ARGB8888:
                ret = E_GOP_COLOR_ARGB8888;
                break;
            case GE_FMT_I1:
            default:
                ret = E_GOP_COLOR_RGB565;
                break;
        }

    }
    else {                  // GOP to GE
        switch(u8Fmt) {
            case E_GOP_COLOR_RGB555_BLINK:
                ret = GE_FMT_ARGB1555;
                break;
            case E_GOP_COLOR_RGB565:
                ret = GE_FMT_RGB565;
                break;
            case E_GOP_COLOR_ARGB4444:
                ret = GE_FMT_ARGB4444;
                break;
            case E_GOP_COLOR_ALPHABLINK:
                ret = GE_FMT_1BAAFGBG123433;
                break;
            case E_GOP_COLOR_I8:
                ret = E_GOP_COLOR_I8;
                break;
            case E_GOP_COLOR_ARGB8888:
                ret = GE_FMT_ARGB1555;
                break;
            case E_GOP_COLOR_I4:
                ret = GE_FMT_ARGB8888;
                break;
            case E_GOP_COLOR_I2:
                ret = GE_FMT_I2;
                break;
            case E_GOP_COLOR_RGB555YUV422:
            case E_GOP_COLOR_YUV422:
            default:
                ret = 0xFF;
                break;

        }
    }

    return ret;
}

/********************************************************************************/
/// Get bpp information according to buffer format
/// @param fbFmt \b IN Buffer format
/// @return bits per pixel (bpp) of spefific buffer format
/********************************************************************************/
U16 MDrv_GOP_GetBPP(U8 fbFmt)
{
    U16 bpp;

    switch ( fbFmt )
    {
    case E_GOP_COLOR_RGB555_BLINK :
    case E_GOP_COLOR_RGB565 :
    case E_GOP_COLOR_ARGB4444 :
    case E_GOP_COLOR_ALPHABLINK :
    case E_GOP_COLOR_RGB555YUV422:
        bpp = 16;
        break;
    case E_GOP_COLOR_ARGB8888 :
        bpp = 32;
        break;

    case E_GOP_COLOR_YUV422:
    case E_GOP_COLOR_I8 :
        bpp = 8;
        break;
    case E_GOP_COLOR_I4 :
        bpp = 4;
        break;

    case E_GOP_COLOR_I2 :
        bpp = 2;
        break;

    default :
        //print err
        break;
    }
    return bpp;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -