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

📄 osd_osi.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 3 页
字号:
        }        break;            case GFX_VDEV_OSDIMG:        if(!(pSurface->uPlaneConfig & OSD_PLANE_IMAGE))        {            PDEBUG("Surface is incompatible with still device!\n");            return -1;        }        break;            default:    // we could not attach it to null device        PDEBUG("Invalid device ID!\n");        return -1;    }        /////////////////////////    if(os_get_mutex(gOSDMutex))    {        PDEBUG("Failed on mutex!\n");        return -1;    }        pSurface->pNextAttach = gOSDDev[graphDev].pSurface;    pSurface->attachedDev = graphDev;    gOSDDev[graphDev].pSurface = pSurface;        __update_device_surface(graphDev, pSurface);    if(GFX_VDEV_OSDGFX == graphDev && !gOSDDev[GFX_VDEV_OSDIMG].pSurface && !pSurface->twinheader)         osd_atom_set_plane_control(OSD_PLANE_A_DISABLE, OSD_PLANE_IMAGE);   // should we ?    os_release_mutex(gOSDMutex);    /////////////////////////    PDEBUG("Success!\n");    return 0;}// pSurface can be NULL to detach default surface INT osd_osi_detach_comp_gfx_surface(GFX_VISUAL_DEVICE_ID_T graphDev, GFX_SURFACE_T * pSurface){    int updateSurface = 0;    int twinheader = 0;    if( GFX_VDEV_NULL == graphDev ||         (pSurface && (   !gfx_osi_pSurface_alloc(pSurface)  // psurface can be NULL                      || pSurface->attachedDev != graphDev) ))    {        PDEBUG("Invalid parameter or uninitialized surface!\n");        return -1;    // we cann't do it    }    if(!pSurface)   // if it is NULL, detach the top most surface        pSurface = gOSDDev[graphDev].pSurface;    if(!(gOSDDev[graphDev].uAttr & __OSD_GRAPH_DEVICE_INIT))     {        PDEBUG("Device %d is not initlized!\n", (INT)graphDev);        return -1;    }    /////////////////////////    if(os_get_mutex(gOSDMutex))    {        PDEBUG("Failed on mutex!\n");        return -1;    }    // detach     if(gOSDDev[graphDev].pSurface)    {        GFX_SURFACE_T *pCurr = gOSDDev[graphDev].pSurface;        GFX_SURFACE_T *pPrev = NULL;        // look it up        while(pCurr && pCurr != pSurface)         {            pPrev = pCurr;            pCurr = pCurr->pNextAttach;        }        if(!pCurr)  // not find        {            os_release_mutex(gOSDMutex);            /////////////////////////            PDEBUG("Surface 0x%8.8x is not attached to device %d!\n", (INT)pSurface, (INT)graphDev);            return -1;        }        pCurr->attachedDev = GFX_VDEV_NULL;        if(pCurr == gOSDDev[graphDev].pSurface) //  the top most one        {            updateSurface = 1;            if(GFX_VDEV_OSDGFX == graphDev && gOSDDev[graphDev].pSurface->twinheader) twinheader = 1;            gOSDDev[graphDev].pSurface = pCurr->pNextAttach;        }        else // we don't need to update the surface        {            // pPrev should never be NULL at this point            pPrev->pNextAttach = pCurr->pNextAttach;        }        pCurr->pNextAttach = NULL; // done    }    else    {        os_release_mutex(gOSDMutex);        /////////////////////////        PDEBUG("Device %d doesn't have a surface attached!\n", (INT)graphDev);        return -1;    }    if(updateSurface)    {        if(NULL == gOSDDev[graphDev].pSurface)  // no one attached, so shutdown        {            switch(graphDev)            {            case GFX_VDEV_OSDCUR:                osd_atom_set_plane_control(OSD_PLANE_A_DISABLE, OSD_PLANE_CURSOR);                break;                            case GFX_VDEV_OSDGFX:                osd_atom_set_plane_control(OSD_PLANE_A_DISABLE, OSD_PLANE_GRAPHICS);                osd_atom_set_display_control(OSD_CNTL_E32BCO, 0);   // certainly                if(gOSDDev[GFX_VDEV_OSDIMG].pSurface)                    __update_device_surface(GFX_VDEV_OSDGFX, gOSDDev[GFX_VDEV_OSDGFX].pSurface);                else                    osd_atom_set_plane_control(OSD_PLANE_A_DISABLE, OSD_PLANE_IMAGE);   // should we ?                break;                            case GFX_VDEV_OSDIMG:                osd_atom_set_plane_control(OSD_PLANE_A_DISABLE, OSD_PLANE_IMAGE);                if(gOSDDev[GFX_VDEV_OSDGFX].pSurface && gOSDDev[GFX_VDEV_OSDGFX].pSurface->twinheader)   // we need to update this for twinheader ones                    __update_device_surface(GFX_VDEV_OSDGFX, gOSDDev[GFX_VDEV_OSDGFX].pSurface);                break;                            default:                PDEBUG("Invalid device ID!\n");            }        }        else    // update the current surface        {            if(twinheader && gOSDDev[GFX_VDEV_OSDIMG].pSurface)                 __update_device_surface(GFX_VDEV_OSDIMG, gOSDDev[GFX_VDEV_OSDIMG].pSurface);            __update_device_surface(graphDev, gOSDDev[graphDev].pSurface);        }    }    os_release_mutex(gOSDMutex);    /////////////////////////    PDEBUG("Success!\n");    return 0;}INT osd_osi_set_device_parm(GFX_VISUAL_DEVICE_ID_T graphDev, OSD_GRAPH_DEVICE_PARM_T parm, UINT uValue){    INT rtn;    UINT uPlane=0;    if(!(gOSDDev[graphDev].uAttr & __OSD_GRAPH_DEVICE_INIT))     {        PDEBUG("Device %d is not initlized!\n", (INT)graphDev);        return -1;    }    switch(graphDev)    {    case GFX_VDEV_OSDCUR:        uPlane = OSD_PLANE_CURSOR;        break;    case GFX_VDEV_OSDGFX:        uPlane = OSD_PLANE_GRAPHICS;        break;    case GFX_VDEV_OSDIMG:        uPlane = OSD_PLANE_IMAGE;        break;    default:        PDEBUG("Invalid device ID!\n");        os_release_mutex(gOSDMutex);        /////////////////////////        return -1;    }    /////////////////////////    if(os_get_mutex(gOSDMutex))    {        PDEBUG("Failed on mutex!\n");        return -1;    }    switch(parm)    {    case OSD_GRAPH_DEVICE_ENABLE:    //   0x001 enable / 0x000 disable        rtn = osd_atom_set_plane_control(uValue ? OSD_PLANE_A_ENABLE : OSD_PLANE_A_DISABLE, uPlane);        break;    default:        rtn = -1;        break;    }    os_release_mutex(gOSDMutex);    /////////////////////////    return rtn;}UINT osd_osi_get_device_parm(GFX_VISUAL_DEVICE_ID_T graphDev, OSD_GRAPH_DEVICE_PARM_T parm){    UINT rtn;    UINT uPlane=0;    if(!(gOSDDev[graphDev].uAttr & __OSD_GRAPH_DEVICE_INIT))     {        PDEBUG("Device %d is not initlized!\n", (INT)graphDev);        return 0;    }    switch(graphDev)    {    case GFX_VDEV_OSDCUR:        uPlane = OSD_PLANE_CURSOR;        break;    case GFX_VDEV_OSDGFX:        uPlane = OSD_PLANE_GRAPHICS;        break;    case GFX_VDEV_OSDIMG:        uPlane = OSD_PLANE_IMAGE;        break;    default:        PDEBUG("Invalid device ID!\n");        os_release_mutex(gOSDMutex);        /////////////////////////        return 0;    }    /////////////////////////    if(os_get_mutex(gOSDMutex))    {        PDEBUG("Failed on mutex!\n");        return 0;    }    switch(parm)    {    case OSD_GRAPH_DEVICE_ENABLE:    //   0x001 enable / 0x000 disable        rtn = osd_atom_get_plane_control(OSD_PLANE_A_ENABLE, uPlane);        break;    default:        rtn = 0;        break;    }    os_release_mutex(gOSDMutex);    /////////////////////////    return rtn;}INT osd_osi_set_display_parm(OSD_DISPLAY_CONTROL_T parm, UINT uAttr){    INT rtn;    /////////////////////////    if(os_get_mutex(gOSDMutex))    {        PDEBUG("Failed on mutex!\n");        return -1;    }    switch(parm)    {    case OSD_DISP_CNTL_BACKCOLOR:  // 16 bit back color        rtn = osd_atom_set_display_control(OSD_CNTL_BACKCOLOR, uAttr);        break;    case OSD_DISP_CNTL_AFVP:      // Anti-flicker video plane, 0 disable, 1 enable        rtn = osd_atom_set_display_control(OSD_CNTL_AFVP, uAttr);        break;    case OSD_DISP_CNTL_EDAF:      // Enable display anti-flicker, 0 disable, 1 enable        rtn = osd_atom_set_display_control(OSD_CNTL_EDAF, uAttr);        break;    case OSD_DISP_CNTL_AFDT:      // Anti-flicker detection threshold, 2 bits attr        rtn = osd_atom_set_display_control(OSD_CNTL_AFDT, uAttr);        break;    case OSD_DISP_CNTL_VPAFC:     // Video plane anti-flicker correction, 2 bits attr        rtn = osd_atom_set_display_control(OSD_CNTL_VPAFC, uAttr);        break;    case OSD_DISP_CNTL_ANIM:     // Animation mode, 0 no, 1 yes -- BJC 102102        rtn = osd_atom_set_display_control(OSD_CNTL_ANIM, uAttr);        break;    case OSD_DISP_CNTL_ANIMR:    // Animation rate, 3 bits attr -- BJC 102102        rtn = osd_atom_set_display_control(OSD_CNTL_ANIMR, uAttr);        break;    case OSD_DISP_CNTL_CHFSR:    // Custom horizontal FIR scaling ratio, 9 bits attr -- BJC 102102        rtn = osd_atom_set_display_control(OSD_CNTL_CHFSR, uAttr);        break;    default:        rtn = -1;        break;    }        os_release_mutex(gOSDMutex);    /////////////////////////    return rtn;}UINT osd_osi_get_display_parm(OSD_DISPLAY_CONTROL_T parm){    UINT rtn;    /////////////////////////    if(os_get_mutex(gOSDMutex))    {        PDEBUG("Failed on mutex!\n");        return 0;    }    switch(parm)    {    case OSD_DISP_CNTL_BACKCOLOR:  // 16 bit back color        rtn = osd_atom_get_display_control(OSD_CNTL_BACKCOLOR);        break;    case OSD_DISP_CNTL_AFVP:      // Anti-flicker video plane, 0 disable, 1 enable        rtn = osd_atom_get_display_control(OSD_CNTL_AFVP);        break;    case OSD_DISP_CNTL_EDAF:      // Enable display anti-flicker, 0 disable, 1 enable        rtn = osd_atom_get_display_control(OSD_CNTL_EDAF);        break;    case OSD_DISP_CNTL_AFDT:      // Anti-flicker detection threshold, 2 bits attr        rtn = osd_atom_get_display_control(OSD_CNTL_AFDT);        break;    case OSD_DISP_CNTL_VPAFC:     // Video plane anti-flicker correction, 2 bits attr        rtn = osd_atom_get_display_control(OSD_CNTL_VPAFC);        break;    case OSD_DISP_CNTL_ANIM:     // Animation mode, 0 no, 1 yes -- BJC 102102        rtn = osd_atom_get_display_control(OSD_CNTL_ANIM);        break;    case OSD_DISP_CNTL_ANIMR:    // Animation rate, 3 bits attr -- BJC 102102        rtn = osd_atom_get_display_control(OSD_CNTL_ANIMR);        break;    case OSD_DISP_CNTL_CHFSR:    // Custom horizontal FIR scaling ratio, 9 bits attr -- BJC 102102        rtn = osd_atom_get_display_control(OSD_CNTL_CHFSR);        break;    default:        rtn = 0;        break;    }        os_release_mutex(gOSDMutex);    /////////////////////////    return rtn;}INT osd_osi_set_comp_gfx_surface_parm(GFX_SURFACE_T * pSurface, OSD_GRAPH_SURFACE_PARM_T parm, ULONG lValue1, ULONG lValue2){    if(!gfx_osi_pSurface_valid(pSurface) || !IS_SURFACE_OSD_COMP(pSurface->uPlaneConfig))     {        PDEBUG("Invalid parameter or uninitialized surface!\n");        return -1;    // we cann't do it    }    if(pSurface->uAttr & __GFX_SURFACE_OSDCURSOR)   // cursor    {        STB_OSD_CURSOR_CONTROL_BLOCK_T *pCntl;        pCntl = os_get_logical_address(pSurface->hBuffer);        switch(parm)        {        case OSD_GRAPH_SURFACE_FLICKER_CORRECTION:       // set the antiflicker filter value (v1)            pCntl->anti_flicker = (unsigned)lValue1&0x03;   // two bits            break;                    case OSD_GRAPH_SURFACE_SCREEN_OFFSET:            // the offset of surface to screen (v1 as horizontal, v2 as vertical)            {

⌨️ 快捷键说明

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