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

最近在搞一个屏的驱动,在这里找到不少资料,为答谢各位,先总结一下自己写这个屏的驱动的一些东东,然后在继续向大家问问提 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  
如果是修改驱动程序,具体是要改哪些地方啊?