11723|23

91

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

进来讨论一下WINCE如何动态改变分辨率? [复制链接]

RT,最近小弟我在做WINCE(WINCE6)下动态改变分辨率的功能,起源于本公司的WINCE6平台支持HDMI输出,当HDMI以不同分辨率(1280*720,1920*1080,720*480。。。)输出时,希望wince能动态的改变分辨率,以使UI层能够在HDMI TV上全屏显示。
工作了一天,添加了一个驱动,在应用层使用DeviceIoControl要求底层驱动根据新的分辨率对LCD控制器重新配置,这段代码验证没有问题。但是结果是花屏,我在想修改完LCD控制器的配置后,如何通知WINCE内核(或者说GDI),要求其重载重绘?如果能让WINCE重绘重载显示驱动,那么估计我就能成功了。。。。请问该如何操作呀?不知道哪位哥们做过类似的开发?一起分享一下经验吧。。。。。

最新回复

wince5.0我实现了 NumModes GetModeInfo SetMode 打印也显示系统已经的到了4种分辩率模式,默认是SetMode=0 ChangeDisplaySettingsEx能调用驱动SetMode=1吗? 找了半天没看到哪里有介绍的   详情 回复 发表于 2010-6-15 18:56
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
LZ,走错方向了

应该考虑视频的缩放,以适应LCD,而不是改变LCD的分辨率
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关注一下
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
我见过有做成动态设置分辨率的,不过设置完以后,都要重新启动一下才可以,不知道不重新启动有没有办法做到。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
你说的是设备重起么?如果设备重起叫什么动态设置分辨率啊
不过display driver里面是要重新reset一下的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
mark,学习
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
早上上班,发现这么多朋友给我意见,先谢过了。。。。

我做的是Telechips的TCC89XX系列WINCE平台。

1. 我不用考虑视频的缩放,这个已经做好;TCC89XX芯片的LCDC有三层:IMG0,IMG1,IMG2;
IMG0放视频;IMG1放WINCE UI;IMG2放字幕。
IMG0放视频,已经有M2MSCALER缩放器了,多大多小的分辨率都可以缩放;
IMG1放WINCE UI层,没有M2MSCALER缩放器;

2. 我希望在不重新启动机器的情况下,动态用IOCTL改变WINCE的分辨率;

3. 用IOCTL在上层应用动态改变WINCE的分辨率只是暂时的打个草稿,等做成功了, 我会移植到ChangeDisplaySettingsEx API架构下;
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果你直接用IOCTL,花屏基本上是免不了的,因为你没有通知系统,而系统的gwes负责了很大一块UI和消息的处理。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
ruritanian,你说的对。

我现在的问题就是如何通知WINCE内核或者GDI,GWES,我系统的分辨率改变了,需要display.dll重载或者其他类似的动作???不能重启系统。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
如果你是通过ChangeDisplaySettingsEx通知驱动的,那么系统就会知道,它会帮你调整界面.
我记得怎么改不繁的,还是直接用ChangeDisplaySettingsEx吧,大概就做这么几步:
GetModeInfo里面返回多个分辨率
NumModes返回可供切换的分辨率的数目。
SetMode运行前系统应该已经把当前primary surface删除了,你需要在SetMode中重新分配primary surface。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
ruritanian,

能否提供实现GetModeInfo,NumModes和SetMode这三个函数的参考代码。我在我的display驱动中找到了这三个函数,但是实现挺简单的:

SCODE
TCCDISP::GetModeInfo(GPEMode *mode, int modeNo)
{
        //RETAILMSG(TC_LOG_LEVEL(TC_DEBUG), (TEXT("[DISPLAY     ] TCCDISP::GetModeInfo()\n\r")));

        if (modeNo != 0)
        {
                RETAILMSG(TC_LOG_LEVEL(TC_ERROR), (TEXT("[DISPDRV:ERR] GetModeInfo() : modeNo = %d, Driver Support Only Mode 0\n\r"), modeNo));
                return E_INVALIDARG;
        }

        *mode = *m_pMode;

        return S_OK;
}

int
TCCDISP::NumModes()
{
        RETAILMSG(TC_LOG_LEVEL(TC_DEBUG), (TEXT("[DISPLAY     ] TCCDISP::NumModes()\n\r")));
        return    1;
}

SCODE
TCCDISP::SetMode (INT modeId, HPALETTE *palette)
{
        SCODE scRet = S_OK;

        RETAILMSG(TC_LOG_LEVEL(TC_LOG), (TEXT("[DISPLAY     ] ++TCCDISP::SetMode(%d)\n\r"), modeId));

        if (modeId == 0)
        {
                m_dwPhysicalModeID = m_pMode->modeId;

                // Create Palette
                if (palette)
                {
                        *palette = EngCreatePalette(PAL_BITFIELDS, 0, NULL, gBitMasks[0], gBitMasks[1], gBitMasks[2]);
                }

                //Allocate Primary Surface
                if (NULL == m_pPrimarySurface)
                {
                        if (FAILED(AllocSurface((DDGPESurf **)&m_pPrimarySurface,
                                m_nScreenWidthSave, m_nScreenHeightSave,
                                m_pMode->format, m_pModeEx->ePixelFormat,
                                GPE_REQUIRE_VIDEO_MEMORY)))
                        {
                                RETAILMSG(TC_LOG_LEVEL(TC_ERROR), (TEXT("[DISPLAY     ] SetMode() : m_pPrimarySurface AllocSurface() Fail\n\r")));
                                scRet = E_INVALIDARG;
                        }
                        else
                        {
                                m_pVisibleSurface = (TCCDISPSurf*)m_pPrimarySurface;
                        }
                }

                m_pPrimarySurface->SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);

        }
        else
        {
                RETAILMSG(TC_LOG_LEVEL(TC_ERROR), (TEXT("[DISPLAY     ] SetMode() : modeId = %d, Driver Support Only Mode 0\n\r"), modeId));
                scRet = E_INVALIDARG;
        }

#ifdef _USING_HW_ACCELETE_
        //reserved for H/W Accelerate Dump Memory
        pHWTempHeap = m_pVideoMemoryHeap->Alloc(800*480*4);
#endif
        RETAILMSG(TC_LOG_LEVEL(TC_LOG), (TEXT("[DISPLAY     ] --TCCDISP::SetMode()\n\r")));

        return scRet;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个帖子要严重一下。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
你先把GetModeInfo和NumModes按照我说的实现了,然后再调一下SetMode,看上去你的代码里SetMode已经分配Primary surface了。SetMode里面的代码各家都不一样,需要调试一下。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 
哪个API会调用SetMode?还有加入我准备好几套分辨率的参数,应该在哪里初始化呢?

http://www.intelligraphics.com/introduction-wince-driver-development
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
ruritanian,

能给我讲讲display驱动中实现DDGPE继承类的各个成员函数或者GDI函数的调用流程吧?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

16
 
Mark
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

17
 
貌似飞凌的网站上看到过,不过俺不懂,建议楼主去咨询一下。

动态修改 LCD 显示我就做了,哈哈哈
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

18
 
gooogleman,

共享一下你的“动态改变WINCE LCD分辨率”开发经验给大家呀。。。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

19
 
这周非常爽,我已经在TCC8900 WINCE平台做出了动态改变WINCE分辨率。如同ruritanian群友所说的,

1.需要DISP驱动中准备好自己需要的分辨率模式,比如说800*480和1280*720两种模式。放在一个GPEModeEx                m_ModeInfoEx[2];数组中 其中m_ModeInfoEx中每个元素的modeId为0和1,以此类推

2.然后可以在TCCDISP::TCCDISP()构造函数中适当对m_ModeInfoEx进行初始化;

3.TCCDISP::NumModes()中必须返回2,也就是数组m_ModeInfoEx的元素大小;TCCDISP::GetModeInfo(GPEMode *mode, int modeNo)函数根据modeNo来判断是否支持;TCCDISP::SetMode就是根据modeId要求来新建m_pPrimarySurface,然后分配给m_pVisibleSurface;

4.应用程序部分我是用以下代码调用的:

case ID_RESOLUTION_1280:
MessageBox(hWnd, TEXT("ID_RESOLUTION_1280"),TEXT("Resolution"),MB_OK);
while (TRUE == EnumDisplaySettings(NULL, maxModeIndex, &DevMode))
{
        maxModeIndex++;
        if((DevMode.dmPelsWidth == 1280)&&(DevMode.dmPelsHeight == 720))
        {
        SaveLCDStatus( 1280,720);//修改注册表键值
        Ret = ChangeDisplaySettingsEx(NULL,&DevMode,NULL,CDS_RESET,NULL) ;
        if(Ret != DISP_CHANGE_SUCCESSFUL)
        {
        printf("Mode %d: Display mode resolution test failed.", maxModeIndex));
        }else{
        printf("ChangeDisplaySettingsEx dwRet = %d \r\n", Ret);
        break;
        }

        }

}
break;

case ID_RESOLUTION_480:
while (TRUE == EnumDisplaySettings(NULL, maxModeIndex, &DevMode))
{
maxModeIndex++;
if((DevMode.dmPelsWidth == 800)&&(DevMode.dmPelsHeight == 480))
{
    SaveLCDStatus( 800,480);
    Ret = ChangeDisplaySettingsEx(NULL,&DevMode,NULL,CDS_RESET,NULL) ;
    if(Ret != DISP_CHANGE_SUCCESSFUL)
    {
      printf("Mode %d: Display mode resolution test failed."), maxModeIndex);
    }else{
      printf("ChangeDisplaySettingsEx dwRet = %d \r\n", Ret);
      break;
    }
}
}
break;
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
楼主很厚道  好人啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表