WINCE修改分辨率有关文件

文章转自:http://1958.blog.163.com/blog/static/33449667200911251713920/

WINCE修改分辨率有关文件大至如下:

\SMDK2440\DRIVERS\DISPLAY\S3C2440LCD\s3c2440disp.cpp

\SMDK2440\DRIVERS\TOUCHP\tchpdd.cpp

\SMDK2440\INC\s2440.h

\SMDK2440\KERNEL\HAL\cfw.c

继续问一个显示驱动的问题:如何实现镜像显示

最近在搞一个屏的驱动,在这里找到不少资料,为答谢各位,先总结一下自己写这个屏的驱动的一些东东,然后在继续向大家问问提 G-1~PW ]  
O7u8.uZ  
我的这个是在原S3C2410 BSP的240320显示驱动的基础上修改成320240,首先,需要修改的文件有 /'dicKc2  
PLATFORM\SMDK2410\INC\s2410.h @kV)?]  
+ %"zG&  
PLATFORM\SMDK2410\KERNEL\HAL\cfw.c D" t8](  
($TPxA`Qq  
PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp y/scM^y`K  
J)XQ'i  
PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\sources 1%UYmK  
z<%[G}[  
s2410.h中,需要定义屏的分辨率,比如320,240,以及VBPD,VSPW,VFPD,HBPD,HSPW,HFPD这几个值,一般lcd的手册都会给出来,如果找不到,最好的办法就是一个一个的试 0Z&*vJ"Rh  
q-B9+irj  
o\7ag|8  
jPz*Y  
cfw.c中,修改的是InitDisplay()函数,这个是屏的初始化部分。改成你要的东西就好了,同时还可以定义io口,用哪个口做PWR_EN,哪个口做背光控制 h?x-WL)  
M)uSz`?  
q&#_0*B  
a bT%wQ  
s3c2410disp.cpp中,修改红色字的部分 q /U7t%l  
X%4naf2hv  
WORD   TempBuffer[321][240]; S% dlR`'  
f% _4 ,y  
S3C2410DISP::S3C2410DISP (void) z" niex0f  
{ qAqJ>vS:  
  RETAILMSG(0, (TEXT("++S3C2410DISP::S3C2410DISP\r\n"))); JTtRdhcB  
  2|aa/@ko  
  // setup up display mode related constants Ir4h#1N3  
  m_nScreenWidth = 320; Hg)b;8UV3  
  m_nScreenHeight = 240;
'fw\8L*bn  
  m_colorDepth = 16; ]+EgG?l  
  m_cbScanLineLength = m_nScreenWidth * 2; ,<;W K>p  
  m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength; U8HdG7xDJ  
  ,wl|TX}r[  
  // memory map register access window, frame buffer, and program LCD controller _\@a@  
  InitializeHardware(); HJVG% S  
jQUx5$#  
@R;* L:no  
Bm)t.j>uv  
}_TLP0\  
这样改完后,一般一个240320的屏就可以转成320240显示了 px? *%  
EN1,^5^  
注意一下,有的朋友显示只有1/3或2/3,或者显示很虚,或者花屏,主要是TempBuffer这里没改,改了就不会了, }z6PDO  
^s >ny8?  
如果改了TempBuffer还不行,那就是你的初始化有问题,重点修改lcd的那几个寄存器以及hbpd,hfpd,hspw,vbpd,vfpd,vspw这几个值 )y?mR|s:]  
gHhO. =;6  
Vf1Kc^Z-c  
另外,有人想实现旋转的功能,这个我也实现了 s?p50  
Ix5$:GpQb  
操作是这样的 v;]cx<.  
s2410.h中,在最上面添加 #define ROTATE 1 !"YAOk  
sources中,在开始的地方添加 ROTATE=1 mk<, )@  
然后,在s3c2410disp.cpp中,修改几个地方 2xut7{F  
1) 红色部分改成你要旋转的角度 ep]t!%)  
S3C2410DISP::S3C2410DISP (void) =jf3p-j  
{ pQb *Q2f4  
  RETAILMSG(0, (TEXT("++S3C2410DISP::S3C2410DISP\r\n"))); v,"\9>Lt?  
  !ET1e  
  // setup up display mode related constants N?]<dGOy  
  m_nScreenWidth = 320; Ecy?TN  
  m_nScreenHeight = 240; y-44hm1;  
  m_colorDepth = 16; 8B KY(  
  m_cbScanLineLength = m_nScreenWidth * 2; v1", x0K  
  m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength; Ha?O:r :tH  
  }7<ec6_  
  // memory map register access window, frame buffer, and program LCD controller )Jpb=P@  
  InitializeHardware(); .Sb:a05m=  
m(F\2Qx  
#ifdef ROTATE L2MGX[SE@$  
  m_iRotate = DMDO_180; {.Xk#1.^(  
  SetRotateParms(); XW$7Te 0Q  
#endif //ROTATE v+ ~Q{nN  
__G^Jv{Q  
Ke_VKO uc  
"^a Y!Q[  
2)这里有两个方法,先说我试过且成功了的 这个是论坛网友 uniper 的方法 FM?\'! p  
  在 DrvEscape()中,加上红字部分 q{S[iteQD!  
ULONG S3C2410DISP::DrvEscape( ^L7d  
                SURFOBJ *pso, 2!,{'Wrf  
                ULONG   iEsc, $,1n).!?1  
                ULONG   cjIn, S1tV|(  
                PVOID   pvIn, eiH6|?%z'  
                ULONG   cjOut, P{R4?r2L  
                PVOID   pvOut) F[mZi>R;  
{ y(J0"k}  
/* N{=xiu36M  
  if (iEsc == DRVESC_GETGAMMAVALUE) \qu~#8?w2  
  { ks<x,C  
  return GetGammaValue((ULONG *)pvOut); #&g20AtUj  
  } 9U\1SJb  
  else if (iEsc == DRVESC_SETGAMMAVALUE) ~O-9:(.s_  
  { pbC eqG  
  return SetGammaValue(cjIn, *(BOOL *)pvIn); .R3;L8  
  } dn!$-??T  
*/ #5u\Bz-  
#ifdef ROTATE wMp'K?Jx  
ZJSkPk!S  
;j3slI!?*1  
GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface; kW+_.<XZ  
`,K?q  
switch (m_iRotate) { o'H!mEl!ue  
  case DMDO_0:   k21<A$8kQ  
  case DMDO_180: oZk6?Ra+N8  
    m_nScreenHeight = m_nScreenHeightSave; <DN-usm  
    m_nScreenWidth = m_nScreenWidthSave; nP:-{tgu-  
    break; UUlgnX21N  
F I6Pgt7  
  case DMDO_90: "zRd%  
  case DMDO_270: [Ojw0y  
    m_nScreenWidth = m_nScreenHeightSave; m2hIzj(R  
    m_nScreenHeight = m_nScreenWidthSave; =zxn5~9_i  
    break; ,L)i*o  
  } .m%JE?m  
m_pMode->width = m_nScreenWidth; ^+k:^C  
m_pMode->height = m_nScreenHeight; :tCtWXZ`  
#<rKFmwD{  
pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);
nx;G* R  
afFeV}:D  
(nks/:aU  
BAO&n  
  if (iEsc == DRVESC_GETSCREENROTATION) SX8[t~ n  
  { K3pM6 a  
    *(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate); dX"_Mx  
    return DISP_CHANGE_SUCCESSFUL; 1}Rtk3*~U  
  } @?)]8P~(R=  
  else if (iEsc == DRVESC_SETSCREENROTATION) 4. _VD gn  
  { +0%pK  
    if ((cjIn == DMDO_0) || QJ0g\ g  
      (cjIn == DMDO_90) || WWn>w #  
      (cjIn == DMDO_180) || {%ky.YI  
      (cjIn == DMDO_270) ) lBK%/L  
      { 6stR]8  
          return DynRotate(cjIn); xAca=+m%WG  
      } 7~BZ$u<;l=  
    return DISP_CHANGE_BADMODE; r /@hS4kt  
  } ? cT,A<2B  
#endif //ROTATE & ROTATE &1cU6:\NhQ  
  iUb<2-m  
  return 0; kLsq"(]pJ  
} UI"T?YJ3G  
8';77 8HL  
` 7Y#q<  
v-?S +\h_  
*\h+-mLx{  
Hv.X,7t  
另外一个方法,这个我没做过实验,感觉也还可以,论坛网友 sliverzhou 的方法 A7QVQJ{rxM  
将S3C2410DISP::S3C2410DISP (void) 中的 '"!1L ?.  
#ifdef     ROTATE pg-nR POTs  
  m_pPrimarySurface = new GPESurfRotate(m_nScreenWidthSave, m_nScreenHeightSave, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format); I@S"3+  
#else v) L gR?i  
  m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);     b?2wP #  
#endif //!ROTATE '2CVO  
修改为 rUZu/CnLcO  
#ifdef     ROTATE g9XwN/N  
  m_pPrimarySurface = new GPESurfRotate(m_nScreenWidthSave, m_nScreenHeightSave, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format); o oJ7.YOf  
  ((GPESurfRotate *)m_pPrimarySurface)->SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);     // init cursor related vars ,T&g5  
#else ?wMyS;  
  m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);     1-U^BEq  
#endif //!ROTATE ND["8~p  
+;<1M_Cl~  
2css/9<)  
有网友反映,改了后图象屏幕没翻转,鼠标坐标翻转了,其实是没有加 ~IpdmM  
pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);   2 ~{;.  
的原因,因为刚好我也碰到过这种情况 Q&{t<(8V<  
:;YXW}F  
_CL(Z wqT  
j$?imI3B  
(,A "5  
------------------ 3 0\5  
当我完成上面的操作时,屏幕已经可以按照320240清楚的显示了,鼠标坐标也正常。但我的问题还没有得到彻底解决。就是显示镜像的问题。显示画面要从lcd的背面看才能看到正常的画面 /zt\n5_m  
TRh vwk  
我在很多论坛,很多地方都是提到了显示翻转的,而不是显示镜像的, SN/isjT3  
_jLT ayD  
有网友提到的GXStartDraw的方法,这个我感觉适合应用程序,而不是驱动部分的,所以我就没再按这个方法继续下去。 j:07<r>  
V<D[~n  
那现在唯一能做的就是修改驱动程序。无奈小弟我接触wince没一个星期,这么高级的东西怎么可能搞定,所以来求助各位了 .2@AI[  
*qER2/ 6S  
/!uQ1@MH  
如果是修改驱动程序,具体是要改哪些地方啊?
 

 

在你的PB中,在你加入的显卡驱动的注册表中(在comman.reg or platform.reg or project.reg中,具体要看你的显卡驱动注册加在哪个文件里的,你不要说这你都不知那我就没法了!),找到如下的语句,修改就行了: ; Width & Height values must be hex (分辨率) USlF+RY@3L  
; 1024x768 : 400h x 300h  
; 800x600 : 320h x 258h
; 720x576 : 2D0h x 240h (Use this with a refresh rate of 50 Hz.)
; 720x480 : 2D0h x 1E0h
; 640x480 : 280h x 1E0h
;-----------------------------------------------------------------------------
"Width"=dword:2D0  //改为你的设置要求
"Height"=dword:240  //改为你的设置要求    

;-----------------------------------------------------------------------------
; Bit depth must be one of:(色彩地支持位设置)
; 8bpp : 8   
; 16bpp : 10
; 24bpp : 18   
; 32bpp : 20   
; (815 does not support 32 bpp)
;-----------------------------------------------------------------------------    

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值