10690|28

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince 驱动中,实现动态修改显示分辨率和颜色深度 [复制链接]

WINCE 5.0 + 三星S3C2450平台

因为所使用的LCD支持24位,S3C2450的LCD控制器又支持16位和24位,32位等,所以,有以下需求:

上层应用可以在不重启系统的情况下设置系统显示在16位与24位之间切换,这样的好处是,在查看图片
显示UI等对CPU运算要求不高的情况下,使用24bit的颜色深度,得到更好的显示效果,而在播放电视等
要求实时性高的应用中,如使用24位的话,系统处理不过来,这时切换到16BIT显示模式,

我现在通过display驱动的DrvEscape()函数,提供接口给应用,在相应的CASE里面进行LCD控制器的重新
初始化,如上层应用想由24bit改设为16bit时,那就初始LCD控制器为16位模式,

问题:1虽然控制器的数据改变了,但是系统发下来的数据还是24位的,造成显示不正常!
       当LCD控制器设好后,应该要告知系统新的分辩率和像素点颜色深度,还有数据格式等信息,就如开机
       初始Display驱动时给回调函数的那些信息,现在要如何才能让系统重新获得这些信息呢?
      2 初始化显示驱动时,使用的那些回调函数是由系统来调用的,我们自已又没有办法去调用它,有没有什么机制,
        使得系统再初始化一次显示驱动?比如有没有这样一个标志消息?

      3 我尝试过,在buildDDHALInfo()函数里面,用一个全局变量记下了第一次初始化时系统传过来的结构地址,
  然后在DrvEscape() 的相应CASE里。初始化LCD控制器后,再调用一次buildDDHALInfo(),传入相同的地址,但是GWES
  异常了,没有成功告知系统新的显示参数!
      4 请各位大侠指点,要实现我要的功能,要怎么办?或是有什么其它的方法吗?谢谢。

    E-mail:yplai@smit.com.cn

此帖出自WindowsCE论坛

最新回复

吾亦遇到这样问题,480*272*16的屏,更改为720*576*16的改不过来.郁闷中,有没有解结了的呀? QQ383645329,  详情 回复 发表于 2010-6-13 14:56
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
顶呀,
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
周工开发网-淘宝店开张!
三款周立功99元开发板,非常适合初学者,资料丰富价格便宜。

EasyARM1138  (内嵌USB仿真器的Cortex-M3开发板)
EasyARM2103  (arm7内核开发板)
EasyFPGA030  (FPGA开发板)

详情如下:

www.01zg.com
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶,没有这么做过

LCD驱动是本机驱动,在系统启动就会被系统调用了。现在我们启动后再去控制他,但是系统不会知道,还是认为是启动时候的配置,

估计楼主要找到微软的代码来修改才行哦。然后自己写个函数通知系统。

期待真正的答案。
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
上层程序应该还需要调用ChangeDisplaySettingsEx(NULL, &DevMode, NULL, 0, NULL)来切换dmBitsPerPel,输入参数DevMode.dmFields=DM_BITSPERPEL,这样OS就知道Display的bpp改变了,
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
修改后对系统进行热启动就行了。
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 xajhuang 的回复:
修改后对系统进行热启动就行了。


建议LZ先将各种分辨率和色深的驱动单独调试成功,然后再试这个需求
这个好像是必需的
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 xajhuang 的回复:
修改后对系统进行热启动就行了。

重新启动应该不是必须的。和PC一样,完全是可以动态切换的,包括分辨率。
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
ChangeDisplaySettingsEx(NULL, &DevMode, NULL, 0, NULL)这个我用过了,
我还试了ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL)等 ,都试过了
返回的值一直是-2,也就是DISP_CHANGE_BADMODE,

我用
BOOL EnumDisplaySettings(
  LPCTSTR lpszDeviceName,
  DWORD iModeNum,
  LPDEVMODE lpDevMode
);
读回了当前系统显示参数信息是正常的,分辩率和色深等,都是对了,但是
原封不动地,再ChangeDisplaySettingsEx,就返回DISP_CHANGE_BADMODE,
我的方法是:EnumDisplayDevices()得到当前显示设备的device name,然后传入EnumDisplaySettings,
读回分辩率等信怎,也就是DevMode的所有信息,然后,
修改一下DevMode结构的dmBitsPerPel = 16; //16BIT
       DevMode结构的dmFields = DM_BITSPERPEL;

然后再:ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL);

但是返回的一直是 -2 ,不知为什么,就算我EnumDisplaySettings读得DEVMODE 结构信息后,
原封不动地传入:ChangeDisplaySettingsEx(),还是返回-2,真是奇怪了,
是不是有什么细节我忘了?请高手指点
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
自已顶起!,
各们大侠帮帮忙,我看了很多资料,都没有找到突破口
现在急用呀
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

11
 
Display驱动里面,GetModeInfo;NumModes等函数需要告诉OS有两种显示模式,例如一个是320*240 16bpp,另一个是320*240 24bpp。然后调用ChangeDisplaySettingsEx,上层应该就会调用驱动的SetMode来切换显示模式。完全不用重新启动。可以参考微软的例子wince500\public\common\oak\csp\x86\geode\gxvideo\base\Misc.cpp
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
谢谢楼上的,我马上尝试!
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
mark!
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
帮顶
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
谢谢帮顶,我现在还在试,有结果了,我会发上来和大家分享
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
今天试了,在显示驱动在加载时是:800*480 32bit,这时创建了一个480*800*4的显存空间。
GetModeInfo()里面,用一个静态变量,实现两种模式:modeId 0: 480*800*32bit
                                              modeId 1: 480*800*16bit
然后,SetMode(),设为modeId 1 ,这时,使用的是16位,所以,桌面显示的东西颜色是不对的,
这时,通过DrvEscape()函数,改变LCD控制器,使输出16BPP_565格式,这时,显示的颜色对了,
该蓝的蓝该绿的绿,但是,一个桌面的都显示不完,显示的图标很大,还有栅条,我认为是因为
初始申请的显示是480*800*4,,而16BIT时,应该用的显存是480*800*2的,所以,造成显存跟
屏幕不对应,也就是一行的数据,占用了两行的屏幕,触摸屏也是不准了,不知我的估计正不正确,
请各位大侠指点,

还有,上层该调用什么接口,才能调到驱动中的SetMode()?上面我运行的SetMode是在驱动初始化后面
自已调用的,只是我改了里面的模式,

有没有一种方法可以,重新加载一遍DISPLAY驱动?前提是不重启
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

17
 
lz,Nyditot Virtual Display玩过没有?
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 
嘿嘿,了解过,不过,那只是用来虚拟改变分辩率的,我现在最主要的是改变色彩深度,而且是针对GDI,
唉,我发现一个问题,我在15楼中的回复中,那个有栅条出现的原因是这样的,当把LCD控制器改为16BPP_565模式后,
它是每个像素点发两个字节的,但是,系统给显示填充的数据,还是按每个像素点4个字节填充,这样高位的个字节就是空的,而此时LCD控制器把它当作另一像素点的数据了,所以使得该点是黑的,
我有以上结论是因为有以下证据:
Eboot中设LCD控制器:         24BPP_888       480*800*4
进入系统,初始display驱动时 COLOER_DETH = 32  480*800*4
加裁display驱动的后期,在Setmode里设为 COLOER_DETH = 16  480*800*4
使得GDI数据是 whith =800 heith = 480  format = 4 (gpe16)

此时,我通过IOCTRL,动态改变LCD控制器为16BPP_565模式

显示的颜色正常了,但是,就是图标被放大了,显示不完桌面

此时,我用一个 unsigned short * pFE = (unsigned short *)DISPLAY_DMA_BUFFER;
  for(int i=0;i    * pFE++ = 0x001f; //蓝色
这时,能很好的显示,证明了我上面的推论

请问一下,我该如何解决?
期待牛人的指点!
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

19
 
我要顶上去,不要沉下去呀!!·!!!
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

20
 
再顶,问题迫在眉睫呀!谢谢啦
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表