﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-嵌入式-文章分类-WinCE技术资料</title><link>http://www.cnitblog.com/zouzheng/category/2079.html</link><description>要像阿甘一直向前奔跑！</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 13:30:12 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 13:30:12 GMT</pubDate><ttl>60</ttl><item><title>WinCE的LCD驱动程序编写指南</title><link>http://www.cnitblog.com/zouzheng/articles/42113.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Tue, 08 Apr 2008 01:24:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/42113.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/42113.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/42113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/42113.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/42113.html</trackback:ping><description><![CDATA[<font size=4>本文以1024*768分辨率的TFT_16BPP真彩LCD为例,说明在WIN CE 4.2中驱动程序的修改事项，目标板的微处理器是S3C2410A。</font>
<div><a href="http://blog.photo.sina.com.cn/showpic.html#url=http://static13.photo.sina.com.cn/orignal/53a06e87445b2b894f4fc" target=_blank></a>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt"><font size=4><strong>该LCD的时序图如下图所示：</strong></font></span></div>
<div>&nbsp;&nbsp;<a href="http://blog.photo.sina.com.cn/showpic.html#url=http://static3.photo.sina.com.cn/orignal/53a06e87445b2e1795b82" target=_blank><img style="WIDTH: 500px; HEIGHT: 598px" src="http://static3.photo.sina.com.cn/bmiddle/53a06e87445b2e1795b82" border=0></a><a href="http://blog.photo.sina.com.cn/showpic.html#url=http://static3.photo.sina.com.cn/orignal/53a06e87445b2e1795b82" target=_blank></img></a></div>
<div><span style="FONT-SIZE: 10.5pt"><font size=2><span style="FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; COLOR: red">Note</span><span style="FONT-SIZE: 10.5pt; COLOR: red">：</span><span style="FONT-SIZE: 10.5pt; COLOR: red">LCD</span><span style="FONT-SIZE: 10.5pt; COLOR: red">时序的参数和时钟相位因不同</span><span style="FONT-SIZE: 10.5pt; COLOR: red">LCD</span><span style="FONT-SIZE: 10.5pt; COLOR: red">而异</span><span style="FONT-SIZE: 10.5pt; COLOR: red">,</span><span style="FONT-SIZE: 10.5pt; COLOR: red">请参考相应</span><span style="FONT-SIZE: 10.5pt; COLOR: red">LCD</span><span style="FONT-SIZE: 10.5pt; COLOR: red">的</span><span style="FONT-SIZE: 10.5pt; COLOR: red">datasheet.<br></span></span></font></span>
<div><span style="FONT-SIZE: 10.5pt; COLOR: red"><font color=#000000><span style="FONT-SIZE: 10.5pt">在</span><span style="FONT-SIZE: 10.5pt">WIN CE 4.2</span><span style="FONT-SIZE: 10.5pt">中修改</span><span style="FONT-SIZE: 10.5pt">LCD</span><span style="FONT-SIZE: 10.5pt">驱动程序有五个相关文件</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">分别是：</span></font><span style="FONT-SIZE: 10.5pt"><br><font color=#000000>1.&nbsp;&nbsp;&nbsp; &#8230;\WINCE420\PLATFORM\SMDK2410\INC\s2410.h<br>2.&nbsp;&nbsp;&nbsp; &#8230;\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c<br>3.&nbsp;&nbsp;&nbsp; &#8230;\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp<br>4.&nbsp;&nbsp;&nbsp; &#8230;\WINCE420\PLATFORM\SMDK2410\FILES\config.bib<br>5.&nbsp;&nbsp;&nbsp; &#8230;\ WINCE420\PLATFORM\SMDK2410\FILES\platform.reg<br></font></span></span></div>
<div><span style="FONT-SIZE: 10.5pt; COLOR: red"><font color=#000000>&nbsp;</font></span></div>
<div><span style="FONT-SIZE: 10.5pt; COLOR: red">1.&nbsp; s2410.h<br>&#8230;\WINCE420\PLATFORM\SMDK2410\INC\s2410.h<br></span><span style="FONT-SIZE: 10.5pt">主要有</span><span style="FONT-SIZE: 10.5pt">LCD</span><span style="FONT-SIZE: 10.5pt">控制器的寄存器定义、</span><span style="FONT-SIZE: 10.5pt">LCD</span><span style="FONT-SIZE: 10.5pt">控制器的工作时序定义、分辨率的定义等等。红色部分为修改后的内容：</span><span style="FONT-SIZE: 10.5pt"><br>#define LCDTYPE <span style="COLOR: red">TFT16BPP<br></span>#define LCD_TYPE <span style="COLOR: red">TFTxxx_xxx</span><br>#define SCR_XSIZE_TFT (<span style="COLOR: red">1280</span>)<br>#define SCR_YSIZE_TFT (<span style="COLOR: red">960</span>)<br>#define LCD_XSIZE_TFT&nbsp;(<span style="COLOR: red">1024</span>)<br>#define LCD_YSIZE_TFT&nbsp;(<span style="COLOR: red">768</span>)<br>#define VBPD ((<span style="COLOR: red">2-1</span>)&amp;0xff)<br>#define VFPD ((<span style="COLOR: red">2-1</span>)&amp;0xff)<br>#define VSPW ((<span style="COLOR: red">2-1</span>) &amp;0x3f)<br>#define HBPD ((<span style="COLOR: red">16-1</span>)&amp;0x7f)<br>#define HFPD ((<span style="COLOR: red">200-1</span>)&amp;0xff)<br>#define HSPW &nbsp;((<span style="COLOR: red">16-1</span>)&amp;0xff)<br>#define CLKVAL_TFT&nbsp;(<span style="COLOR: red">1</span>)&nbsp;&nbsp; //</span><span style="FONT-SIZE: 10.5pt">这个值的定义在</span><span style="FONT-SIZE: 10.5pt">LCD</span><span style="FONT-SIZE: 10.5pt">初始化函数中并不用到</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">而是直接用数值表示。</span></div>
<div><span style="FONT-SIZE: 10.5pt"><span style="COLOR: red">2.&nbsp;cfw.c<br>&#8230;\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c<br></span></span><span style="FONT-SIZE: 10.5pt">红色部分为修改后的内容：</span><span style="FONT-SIZE: 10.5pt"><br>static void InitDisplay()<br>{<br>********<br>s2410LCD-&gt;rLCDCON1=(<span style="COLOR: red">1</span>&lt;&lt;8)|(MVAL_USED&lt;&lt;7)|(<span style="COLOR: red">3</span>&lt;&lt;5)|(<span style="COLOR: red">12</span>&lt;&lt;1)|<span style="COLOR: red">0</span>;<br><span style="COLOR: red">// CLKVAL_TFT = 1 , HCLK = 100MHz -&gt; VCLK =25MHz&nbsp;</span></span></div>
<div><span style="FONT-SIZE: 10.5pt"><span style="COLOR: red">//</span></span><span style="FONT-SIZE: 10pt; COLOR: red">TFT LCD panel</span></div>
<div><span style="FONT-SIZE: 10pt; COLOR: red">//16 bpp for TFT<br></span><span style="FONT-SIZE: 10.5pt">s2410LCD-&gt;rLCDCON2=(VBPD&lt;&lt;24)|(LINEVAL_TFT&lt;&lt;14)|(VFPD&lt;&lt;6)|(VSPW);<br>s2410LCD-&gt;rLCDCON3=(HBPD&lt;&lt;19)|(HOZVAL_TFT&lt;&lt;8)|(HFPD);<br>s2410LCD-&gt;rLCDCON4=(MVAL&lt;&lt;8)|(HSPW);<br>s2410LCD-&gt;rLCDCON5=(<span style="COLOR: red">1</span>&lt;&lt;11)|(<span style="COLOR: red">0</span>&lt;&lt;10)|(<span style="COLOR: red">0</span>&lt;&lt;9)|(<span style="COLOR: red">0</span>&lt;&lt;8)|(<span style="COLOR: red">0</span>&lt;&lt;7)|(<span style="COLOR: red">0</span>&lt;&lt;6)|(<span style="COLOR: red">0</span>&lt;&lt;3)|(<span style="COLOR: red">0</span>&lt;&lt;1)|(<span style="COLOR: red">1</span>&lt;&lt;0);<br><span style="COLOR: red">//</span></span><span style="FONT-SIZE: 10pt; COLOR: red">5:6:5 Format<br>//The video data is fetched at VCLK falling edge<br>//VLINE/HSYNC pulse polarity-Normal<br>//VFRAME/VSYNC pulse polarity-Normal<br>//VD (video data) pulse polarity-Normal<br>//VDEN signal polarity-Normal<br>//Disable PWREN signal<br>//Byte swap Disable&nbsp;</span></div>
<div><span style="FONT-SIZE: 10pt; COLOR: red">//Half-Word swap Enable<br></span><span style="FONT-SIZE: 10.5pt">********<br>}<br></span></div>
<div><font size=2><span style="FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; COLOR: red"><span style="FONT-SIZE: 10.5pt"><font color=#000000><span style="FONT-SIZE: 10.5pt">红色部分为修改后的内容：</span><span style="FONT-SIZE: 10.5pt"><br>WORD TempBuffer[<span style="COLOR: red">1025</span>][<span style="COLOR: red">768</span>];<br>S3C2410DISP::S3C2410DISP (void)<br>{ ********<br>m_nScreenWidth = <span style="COLOR: red">1024</span>;<br>m_nScreenHeight = <span style="COLOR: red">768</span>;<br>*********<br>}<br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 10.5pt">到此修改工作基本完成，但还要一个问题：</span><span style="FONT-SIZE: 10.5pt">1024*768</span><span style="FONT-SIZE: 10.5pt">分辨率占用的显示缓冲区大小是：</span><span style="FONT-SIZE: 10.5pt">1024*768*2 = 1536 K Bytes,</span><span style="FONT-SIZE: 10.5pt">因此要确认所分配的内存空间够不够</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">是在</span><span style="FONT-SIZE: 10.5pt; COLOR: red">config.bib</span><span style="FONT-SIZE: 10.5pt">文件中定义的。如果以前定义的足够大</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt; COLOR: red">后面的步骤可以省略了。</span><span style="FONT-SIZE: 10.5pt"><br></span></font></span></span></span></font><span style="COLOR: red">3.&nbsp;s3c2410disp.cpp<br>&#8230;\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp</span></div>
</div>
<div><span style="FONT-SIZE: 10.5pt">&nbsp;</span><span style="FONT-SIZE: 10.5pt">项就是显示缓冲区的内存空间定义</span><span style="FONT-SIZE: 10.5pt">, 8c100000</span><span style="FONT-SIZE: 10.5pt">是开始地址</span><span style="FONT-SIZE: 10.5pt">, 00100000</span><span style="FONT-SIZE: 10.5pt">是大小。可以看出原先只定义了</span><span style="FONT-SIZE: 10.5pt">1M</span> <span style="FONT-SIZE: 10.5pt">Bytes</span><span style="FONT-SIZE: 10.5pt">的内存空间给</span><span style="FONT-SIZE: 10.5pt">LCD</span><span style="FONT-SIZE: 10.5pt">显示缓冲区</span><span style="FONT-SIZE: 10.5pt">;</span><span style="FONT-SIZE: 10.5pt">而</span><span style="FONT-SIZE: 10.5pt">1024*768</span><span style="FONT-SIZE: 10.5pt">需要</span><span style="FONT-SIZE: 10.5pt">1536 K Bytes</span><span style="FONT-SIZE: 10.5pt">的内存空间</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">因此需要修改这里的定义。但是一旦修改到</span><span style="FONT-SIZE: 10.5pt">config.bib</span><span style="FONT-SIZE: 10.5pt">文件的内容</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">将会涉及到很多地方的修改工作</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">过程比较繁琐。所幸的是我的目标板</span><span style="FONT-SIZE: 10.5pt">DISPLAY</span><span style="FONT-SIZE: 10.5pt">前面还有</span><span style="FONT-SIZE: 10.5pt">0x8C100000-(0x8C058000+0x00004000) = 656K Bytes</span><span style="FONT-SIZE: 10.5pt">未分配的内存空间</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">因此做如下修改：</span><br><span style="COLOR: red">4.&nbsp;config.bib</span><br><span style="COLOR: red">&#8230;\WINCE420\PLATFORM\SMDK2410\FILES\config.bib<br></span><span style="FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">#define NKNAME NK<br>#define NKSTART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8C200000<br>#define NKLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;01D00000<br>#define RAMSTART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8E000000<br>#define RAMLEN&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01F00000<br>$(NKNAME)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(NKSTART) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(NKLEN) &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAMIMAGE<br>RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(RAMSTART)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(RAMLEN) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAM<br>AUD_DMA&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 8c002000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED</span></span></div>
<div><span style="FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">DRV_GLB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c010000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00010000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED</span></span></div>
<div><span style="FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">DBGSER_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 8c022000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>SER_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c024000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>IR_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c026000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>SD_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c028000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00008000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RESERVED<br>EDBG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c030000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00020000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>CPXIPCHAIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;8c050000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00008000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>SLEEP_BUFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;8c058000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00004000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>DISPLAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c100000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00100000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br></span></span>DISPLAY</div>
<div><span style="FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"><span>AUD_DMA&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;8c002000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>DRV_GLB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8c010000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00010000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>DBGSER_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8c022000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00002000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;RESERVED<br>SER_DMA&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8c024000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>IR_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8c026000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00002000 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;RESERVED<br>SD_DMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c028000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00008000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>EDBG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c030000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00020000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>CPXIPCHAIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8c050000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00008000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED</span></span><br>SLEEP_BUFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8c058000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00004000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>;DISPLAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8c100000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00100000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br>DISPLAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">8c</span><span style="COLOR: red">060000</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red">001a</span><span style="COLOR: red">0000</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESERVED<br><span style="COLOR: red">5.</span>&nbsp;</span></div>
<div><span style="FONT-SIZE: 10.5pt">在（</span><span style="FONT-SIZE: 10.5pt">4</span><span style="FONT-SIZE: 10.5pt">）中修改了</span><span style="FONT-SIZE: 10.5pt">DISPLAY</span><span style="FONT-SIZE: 10.5pt">显示缓冲区的开始地址</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">因此要在&#8220;</span><span style="FONT-SIZE: 10.5pt; COLOR: red">s2410.h</span><span style="FONT-SIZE: 10.5pt">&#8221;中做相应的修改：</span><span style="FONT-SIZE: 10.5pt"><br><span style="COLOR: red">&#8230;\WINCE420\PLATFORM\SMDK2410\INC\s2410.h<br></span>#define DMA_BUFFER_BASE&nbsp;0xAC000000<br>#define DMA_PHYSICAL_BASE 0x30000000<br><br>//#define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00100000)<br>//#define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00100000)<br>#define FRAMEBUF_BASE&nbsp;(DMA_BUFFER_BASE + <span style="COLOR: red">0x00060000</span>)<br>#define FRAMEBUF_DMA_BASE&nbsp;(DMA_PHYSICAL_BASE + <span style="COLOR: red">0x00060000</span>)<br><br clear=all><br><span style="COLOR: red">6.</span>&nbsp;</span><span style="FONT-SIZE: 10.5pt">在（</span><span style="FONT-SIZE: 10.5pt">4</span><span style="FONT-SIZE: 10.5pt">）中修改了</span><span style="FONT-SIZE: 10.5pt">DISPLAY</span><span style="FONT-SIZE: 10.5pt">显示缓冲区的大小</span><span style="FONT-SIZE: 10.5pt">,</span> <span style="FONT-SIZE: 10.5pt">因此要在&#8220;</span><span style="FONT-SIZE: 10.5pt; COLOR: red">s3c2410disp.cpp</span><span style="FONT-SIZE: 10.5pt">&#8221;中做相应的修改：</span></div>
<div><span style="FONT-SIZE: 10.5pt">&nbsp;<span style="COLOR: red">&#8230;\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp<br></span></span><span style="FONT-SIZE: 10.5pt">红色部分为修改后的内容：</span><span style="FONT-SIZE: 10.5pt"><br>void S3C2410DISP::InitializeHardware (void)<br>{<br>*********<br>m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (<span style="COLOR: red">0x1A0000</span>), MEM_RESERVE, PAGE_NOACCESS);<br>if (m_VirtualFrameBuffer == NULL)<br>{<br>RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocated\n\r")));<br>&nbsp;return;<br>}<br>else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (<span style="COLOR: red">0x1A0000</span>), PAGE_READWRITE | PAGE_NOCACHE))<br>{<br>RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mapped\n\r")));<br>VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);<br>return;<br>}<br>*********<br>}<br></span><span style="FONT-SIZE: 10.5pt">&nbsp;</span><span style="FONT-SIZE: 10.5pt">在（</span><span style="FONT-SIZE: 10.5pt">4</span><span style="FONT-SIZE: 10.5pt">）中修改了</span><span style="FONT-SIZE: 10.5pt">DISPLAY</span><span style="FONT-SIZE: 10.5pt">显示缓冲区的开始地址</span><span style="FONT-SIZE: 10.5pt">,</span><span style="FONT-SIZE: 10.5pt">还要对注册表文件&#8220;</span><span style="FONT-SIZE: 10.5pt">platform.reg</span><span style="FONT-SIZE: 10.5pt">&#8221;做相应的修改：</span><span style="FONT-SIZE: 10.5pt"><br><span style="COLOR: red">&#8230;\ WINCE420\PLATFORM\SMDK2410\FILES\platform.reg<br></span>[HKEY_LOCAL_MACHINE\Drivers\Display\S3C2410\CONFIG]<br>"DisplayDll"="s3c2410disp.dll"<br>;"LCDVirtualFrameBase"=dword:ac100000<br>;"LCDPhysicalFrameBase"=dword:30100000<br>"LCDVirtualFrameBase"=dword:<span style="COLOR: red">ac060000</span><br>"LCDPhysicalFrameBase"=dword:<span style="COLOR: red">30060000<br></span></span></div>
<div><br><span style="COLOR: red">7.&nbsp;</span></div>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/42113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-04-08 09:24 <a href="http://www.cnitblog.com/zouzheng/articles/42113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinCE 中关于16BPP和24BPP之间的差别以及程序处理需要注意的地方</title><link>http://www.cnitblog.com/zouzheng/articles/42112.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Tue, 08 Apr 2008 01:19:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/42112.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/42112.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/42112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/42112.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/42112.html</trackback:ping><description><![CDATA[<p>WinCe中常用的处理图像有两种方式：166BPP&nbsp;&nbsp; 表现方式和 24BPP表现方式。</p>
<p>16BPP 使用2字节表示一个象素的颜色，而24BPP则使用4字节表达一个象素的颜色，因此 16BPP比 24 BPP节省了一半的内存空间。</p>
<p>使用24BPP时&nbsp; 一般都是&nbsp; R :G:B 为 8：8：8 位表示，每中颜色深度位0-255 </p>
<p>使用16BPP时&nbsp; 一般都是&nbsp; R :G:B 为 5：6：5 位表示为常用表示，因此 从24Bpp到16 BPP需要做颜色深度的变换，否则 出现的图像表现出来为：位置正确，图像颜色不正确，好像经过算法处理，实际为颜色没有同等变换而来。</p>
<p>依照24位真彩色的图像 取得 每一象素的 RGB值，主要变换算法为：</p>
<p>R*0x1f/0xFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; G = G*0x3f/0xFF&nbsp; B＝ B*0x1f/ 0xFF</p>
<p>下面我付上一个比较使用的 关于BMP处理的图像处理文件，为网络搜集。</p>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/42112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-04-08 09:19 <a href="http://www.cnitblog.com/zouzheng/articles/42112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改分分辨率</title><link>http://www.cnitblog.com/zouzheng/articles/42111.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Tue, 08 Apr 2008 01:17:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/42111.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/42111.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/42111.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/42111.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/42111.html</trackback:ping><description><![CDATA[<span class=tpc_title>继续问一个显示驱动的问题：如何实现镜像显示</span><br><br><span class=tpc_content>最近在搞一个屏的驱动，在这里找到不少资料，为答谢各位，先总结一下自己写这个屏的驱动的一些东东，然后在继续向大家问问提<span style="FONT-SIZE: 0pt"> G-1~PW ] </span>&nbsp;<br><span style="FONT-SIZE: 0pt">O7u8.uZ </span>&nbsp;<br>我的这个是在原S3C2410 BSP的240320显示驱动的基础上修改成320240，首先，需要修改的文件有<span style="FONT-SIZE: 0pt"> /'dicKc2 </span>&nbsp;<br>PLATFORM\SMDK2410\INC\s2410.h<span style="FONT-SIZE: 0pt"> @kV)�] </span>&nbsp;<br><span style="FONT-SIZE: 0pt">+ %"zG&amp; </span>&nbsp;<br>PLATFORM\SMDK2410\KERNEL\HAL\cfw.c<span style="FONT-SIZE: 0pt"> D" t8]( </span>&nbsp;<br><span style="FONT-SIZE: 0pt">($TPxA`Qq </span>&nbsp;<br>PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp<span style="FONT-SIZE: 0pt"> y/scM^y`K </span>&nbsp;<br><span style="FONT-SIZE: 0pt">J)XQ'i </span>&nbsp;<br>PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\sources<span style="FONT-SIZE: 0pt"> 1%UYmK </span>&nbsp;<br><span style="FONT-SIZE: 0pt">z&lt;%[G}[ </span>&nbsp;<br>s2410.h中，需要定义屏的分辨率，比如320，240，以及VBPD,VSPW,VFPD,HBPD,HSPW,HFPD这几个值，一般lcd的手册都会给出来，如果找不到，最好的办法就是一个一个的试<span style="FONT-SIZE: 0pt"> 0Z&amp;*vJ"Rh </span>&nbsp;<br><span style="FONT-SIZE: 0pt">q-B9+irj </span>&nbsp;<br><span style="FONT-SIZE: 0pt">o\7ag|8 </span>&nbsp;<br><span style="FONT-SIZE: 0pt">jPz*Y </span>&nbsp;<br>cfw.c中，修改的是InitDisplay（）函数，这个是屏的初始化部分。改成你要的东西就好了，同时还可以定义io口，用哪个口做PWR_EN，哪个口做背光控制<span style="FONT-SIZE: 0pt"> h�x-WL) </span>&nbsp;<br><span style="FONT-SIZE: 0pt">M)uSz`? </span>&nbsp;<br><span style="FONT-SIZE: 0pt">q&#_0*B </span>&nbsp;<br><span style="FONT-SIZE: 0pt">a bT%wQ </span>&nbsp;<br>s3c2410disp.cpp中，修改红色字的部分<span style="FONT-SIZE: 0pt"> q /U7t%l </span>&nbsp;<br><span style="FONT-SIZE: 0pt">X%4naf2hv </span>&nbsp;<br>WORD &nbsp; TempBuffer[<font color=crimson>321][240];</font><span style="FONT-SIZE: 0pt"> S% dlR`' </span>&nbsp;<br><span style="FONT-SIZE: 0pt">f% _4 ,y </span>&nbsp;<br>S3C2410DISP::S3C2410DISP (void)<span style="FONT-SIZE: 0pt"> z" niex0f </span>&nbsp;<br>{<span style="FONT-SIZE: 0pt"> qAqJ&gt;vS: </span>&nbsp;<br>&nbsp; RETAILMSG(0, (TEXT("++S3C2410DISP::S3C2410DISP\r\n")));<span style="FONT-SIZE: 0pt"> JTtRdhcB </span>&nbsp;<br>&nbsp; <span style="FONT-SIZE: 0pt">2|aa/@ko </span>&nbsp;<br>&nbsp; // setup up display mode related constants<span style="FONT-SIZE: 0pt"> Ir4h#1N3 </span>&nbsp;<br><font color=red>&nbsp; m_nScreenWidth = 320;<span style="FONT-SIZE: 0pt"> Hg)b;8UV3 </span>&nbsp;<br>&nbsp; m_nScreenHeight = 240;</font><span style="FONT-SIZE: 0pt"> 'fw\8L*bn </span>&nbsp;<br>&nbsp; m_colorDepth = 16;<span style="FONT-SIZE: 0pt"> ]+EgG?l </span>&nbsp;<br>&nbsp; m_cbScanLineLength = m_nScreenWidth * 2;<span style="FONT-SIZE: 0pt"> ,&lt;;W K&gt;p </span>&nbsp;<br>&nbsp; m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;<span style="FONT-SIZE: 0pt"> U8HdG7xDJ </span>&nbsp;<br>&nbsp; <span style="FONT-SIZE: 0pt">,wl|TX}r[ </span>&nbsp;<br>&nbsp; // memory map register access window, frame buffer, and program LCD controller<span style="FONT-SIZE: 0pt"> _\@a@  </span>&nbsp;<br>&nbsp; InitializeHardware();<span style="FONT-SIZE: 0pt"> HJVG% S </span>&nbsp;<br><span style="FONT-SIZE: 0pt">jQUx5$# </span>&nbsp;<br><span style="FONT-SIZE: 0pt">@R;* L:no </span>&nbsp;<br><span style="FONT-SIZE: 0pt">Bm)t.j&gt;uv </span>&nbsp;<br><span style="FONT-SIZE: 0pt">}_TLP0\ </span>&nbsp;<br>这样改完后，一般一个240320的屏就可以转成320240显示了<span style="FONT-SIZE: 0pt"> px� *% </span>&nbsp;<br><span style="FONT-SIZE: 0pt">EN1,^5^ </span>&nbsp;<br>注意一下，有的朋友显示只有1/3或2/3，或者显示很虚，或者花屏，主要是TempBuffer这里没改，改了就不会了，<span style="FONT-SIZE: 0pt"> }z6PDO </span>&nbsp;<br><span style="FONT-SIZE: 0pt">^s &gt;ny8� </span>&nbsp;<br>如果改了TempBuffer还不行，那就是你的初始化有问题，重点修改lcd的那几个寄存器以及hbpd,hfpd,hspw,vbpd,vfpd,vspw这几个值<span style="FONT-SIZE: 0pt"> )y?mR|s:] </span>&nbsp;<br><span style="FONT-SIZE: 0pt">gHhO. =;6 </span>&nbsp;<br><span style="FONT-SIZE: 0pt">Vf1Kc^Z-c </span>&nbsp;<br>另外，有人想实现旋转的功能，这个我也实现了<span style="FONT-SIZE: 0pt"> s�p50 </span>&nbsp;<br><span style="FONT-SIZE: 0pt">Ix5$:GpQb </span>&nbsp;<br>操作是这样的<span style="FONT-SIZE: 0pt"> v;]cx&lt;. </span>&nbsp;<br>s2410.h中，在最上面添加 #define ROTATE 1<span style="FONT-SIZE: 0pt"> !"YAOk </span>&nbsp;<br>sources中，在开始的地方添加 ROTATE=1 <span style="FONT-SIZE: 0pt">mk&lt;, )@ </span>&nbsp;<br>然后，在s3c2410disp.cpp中，修改几个地方<span style="FONT-SIZE: 0pt"> 2xut7{F </span>&nbsp;<br>1） 红色部分改成你要旋转的角度<span style="FONT-SIZE: 0pt"> ep]t!%) </span>&nbsp;<br>S3C2410DISP::S3C2410DISP (void)<span style="FONT-SIZE: 0pt"> =jf3p-j </span>&nbsp;<br>{<span style="FONT-SIZE: 0pt"> pQb *Q2f4 </span>&nbsp;<br>&nbsp; RETAILMSG(0, (TEXT("++S3C2410DISP::S3C2410DISP\r\n")));<span style="FONT-SIZE: 0pt"> v,"\9&gt;Lt� </span>&nbsp;<br>&nbsp; <span style="FONT-SIZE: 0pt">!ET1e </span>&nbsp;<br>&nbsp; // setup up display mode related constants<span style="FONT-SIZE: 0pt"> N?]&lt;dGOy </span>&nbsp;<br>&nbsp; m_nScreenWidth = 320;<span style="FONT-SIZE: 0pt"> Ecy?TN </span>&nbsp;<br>&nbsp; m_nScreenHeight = 240;<span style="FONT-SIZE: 0pt"> y-44hm1; </span>&nbsp;<br>&nbsp; m_colorDepth = 16;<span style="FONT-SIZE: 0pt"> 8B KY( </span>&nbsp;<br>&nbsp; m_cbScanLineLength = m_nScreenWidth * 2;<span style="FONT-SIZE: 0pt">  v1", x0K </span>&nbsp;<br>&nbsp; m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;<span style="FONT-SIZE: 0pt"> Ha?O:r :tH </span>&nbsp;<br>&nbsp; <span style="FONT-SIZE: 0pt">}7&lt;ec6_ </span>&nbsp;<br>&nbsp; // memory map register access window, frame buffer, and program LCD controller<span style="FONT-SIZE: 0pt"> )Jpb=P@ </span>&nbsp;<br>&nbsp; InitializeHardware();<span style="FONT-SIZE: 0pt"> .Sb:a05m= </span>&nbsp;<br><span style="FONT-SIZE: 0pt">m(F\2Qx </span>&nbsp;<br>#ifdef ROTATE<span style="FONT-SIZE: 0pt"> L2MGX[SE@$ </span>&nbsp;<br>&nbsp; m_iRotate = <font color=crimson>DMDO_180</font>;<span style="FONT-SIZE: 0pt"> {.Xk#1.^( </span>&nbsp;<br>&nbsp; SetRotateParms();<span style="FONT-SIZE: 0pt"> XW$7Te 0Q </span>&nbsp;<br>#endif //ROTATE<span style="FONT-SIZE: 0pt"> v+ ~Q{nN </span>&nbsp;<br><span style="FONT-SIZE: 0pt">__G^Jv{Q </span>&nbsp;<br><span style="FONT-SIZE: 0pt">Ke_VKO uc </span>&nbsp;<br><span style="FONT-SIZE: 0pt">"^a Y!Q[ </span>&nbsp;<br>2）这里有两个方法，先说我试过且成功了的 这个是论坛网友 uniper 的方法<span style="FONT-SIZE: 0pt"> FM?\'! p </span>&nbsp;<br>&nbsp; 在 DrvEscape()中，加上红字部分<span style="FONT-SIZE: 0pt"> q{S[iteQD! </span>&nbsp;<br>ULONG S3C2410DISP::DrvEscape(<span style="FONT-SIZE: 0pt">  ^L7d </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SURFOBJ *pso,<span style="FONT-SIZE: 0pt"> 2!,{'Wrf </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ULONG &nbsp; iEsc,<span style="FONT-SIZE: 0pt"> $,1n).!�1 </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ULONG &nbsp; cjIn,<span style="FONT-SIZE: 0pt"> S1tV|( </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PVOID &nbsp; pvIn,<span style="FONT-SIZE: 0pt"> eiH6|?%z' </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ULONG &nbsp; cjOut,<span style="FONT-SIZE: 0pt"> P{R4?r2L </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PVOID &nbsp; pvOut)<span style="FONT-SIZE: 0pt"> F[mZi&gt;R; </span>&nbsp;<br>{<span style="FONT-SIZE: 0pt"> y(J0"k} </span>&nbsp;<br>/*<span style="FONT-SIZE: 0pt"> N{=xiu36M </span>&nbsp;<br>&nbsp; if (iEsc == DRVESC_GETGAMMAVALUE)<span style="FONT-SIZE: 0pt"> \qu~#8?w2 </span>&nbsp;<br>&nbsp; {<span style="FONT-SIZE: 0pt"> ks&lt;x,C </span>&nbsp;<br>&nbsp; return GetGammaValue((ULONG *)pvOut);<span style="FONT-SIZE: 0pt"> #&amp;g20AtUj </span>&nbsp;<br>&nbsp; }<span style="FONT-SIZE: 0pt"> 9U\1SJb </span>&nbsp;<br>&nbsp; else if (iEsc == DRVESC_SETGAMMAVALUE)<span style="FONT-SIZE: 0pt"> ~O-9:(.s_ </span>&nbsp;<br>&nbsp; {<span style="FONT-SIZE: 0pt"> pbC eqG </span>&nbsp;<br>&nbsp; return SetGammaValue(cjIn, *(BOOL *)pvIn);<span style="FONT-SIZE: 0pt"> .R3;L8 </span>&nbsp;<br>&nbsp; }<span style="FONT-SIZE: 0pt"> dn!$-?�T </span>&nbsp;<br>*/<span style="FONT-SIZE: 0pt"> #5u\Bz- </span>&nbsp;<br>#ifdef ROTATE<span style="FONT-SIZE: 0pt"> wMp'K�Jx </span>&nbsp;<br><span style="FONT-SIZE: 0pt">ZJSkPk!S </span>&nbsp;<br><span style="FONT-SIZE: 0pt">;j3slI!?*1 </span>&nbsp;<br><font color=crimson>GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface;<span style="FONT-SIZE: 0pt"> kW+_.&lt;XZ </span>&nbsp;<br><span style="FONT-SIZE: 0pt">`,K?q </span>&nbsp;<br>switch (m_iRotate) {<span style="FONT-SIZE: 0pt"> o'H!mEl!ue </span>&nbsp;<br>&nbsp; case DMDO_0: &nbsp; <span style="FONT-SIZE: 0pt">k21&lt;A$8kQ </span>&nbsp;<br>&nbsp; case DMDO_180:<span style="FONT-SIZE: 0pt"> oZk6�Ra+N8 </span>&nbsp;<br>&nbsp; &nbsp; m_nScreenHeight = m_nScreenHeightSave;<span style="FONT-SIZE: 0pt"> &lt;DN-usm </span>&nbsp;<br>&nbsp; &nbsp; m_nScreenWidth = m_nScreenWidthSave;<span style="FONT-SIZE: 0pt"> nP:-{tgu- </span>&nbsp;<br>&nbsp; &nbsp; break;<span style="FONT-SIZE: 0pt"> UUlgnX21N </span>&nbsp;<br><span style="FONT-SIZE: 0pt">F I6Pgt7 </span>&nbsp;<br>&nbsp; case DMDO_90:<span style="FONT-SIZE: 0pt"> "zRd% </span>&nbsp;<br>&nbsp; case DMDO_270:<span style="FONT-SIZE: 0pt"> [Ojw0y </span>&nbsp;<br>&nbsp; &nbsp; m_nScreenWidth = m_nScreenHeightSave;<span style="FONT-SIZE: 0pt"> m2hIzj(R </span>&nbsp;<br>&nbsp; &nbsp; m_nScreenHeight = m_nScreenWidthSave;<span style="FONT-SIZE: 0pt"> =zxn5~9_i </span>&nbsp;<br>&nbsp; &nbsp; break;<span style="FONT-SIZE: 0pt"> ,L)i*o </span>&nbsp;<br>&nbsp; }<span style="FONT-SIZE: 0pt"> .m%JE�m </span>&nbsp;<br>m_pMode-&gt;width = m_nScreenWidth;<span style="FONT-SIZE: 0pt"> ^+k:^C </span>&nbsp;<br>m_pMode-&gt;height = m_nScreenHeight;<span style="FONT-SIZE: 0pt"> :tCtWXZ` </span>&nbsp;<br><span style="FONT-SIZE: 0pt">#&lt;rKFmwD{ </span>&nbsp;<br>pSurf-&gt;SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);</font><span style="FONT-SIZE: 0pt"> nx;G* R </span>&nbsp;<br><span style="FONT-SIZE: 0pt">afFeV}:D </span>&nbsp;<br><span style="FONT-SIZE: 0pt">(nks/:aU </span>&nbsp;<br><span style="FONT-SIZE: 0pt">BAO&amp;n </span>&nbsp;<br>&nbsp; if (iEsc == DRVESC_GETSCREENROTATION)<span style="FONT-SIZE: 0pt"> SX8[t~ n </span>&nbsp;<br>&nbsp; {<span style="FONT-SIZE: 0pt"> K3pM6 a </span>&nbsp;<br>&nbsp; &nbsp; *(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) &lt;&lt; 8) | ((BYTE)m_iRotate);<span style="FONT-SIZE: 0pt"> dX"_Mx </span>&nbsp;<br>&nbsp; &nbsp; return DISP_CHANGE_SUCCESSFUL; <span style="FONT-SIZE: 0pt">1}Rtk3*~U </span>&nbsp;<br>&nbsp; }<span style="FONT-SIZE: 0pt"> @�)]8P~(R= </span>&nbsp;<br>&nbsp; else if (iEsc == DRVESC_SETSCREENROTATION)<span style="FONT-SIZE: 0pt"> 4. _VD gn </span>&nbsp;<br>&nbsp; {<span style="FONT-SIZE: 0pt"> +0%pK </span>&nbsp;<br>&nbsp; &nbsp; if ((cjIn == DMDO_0) ||<span style="FONT-SIZE: 0pt"> QJ0g\ g </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; (cjIn == DMDO_90) ||<span style="FONT-SIZE: 0pt"> WWn&gt;w # </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; (cjIn == DMDO_180) ||<span style="FONT-SIZE: 0pt"> {%ky.YI </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; (cjIn == DMDO_270) )<span style="FONT-SIZE: 0pt"> lBK%/L </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; {<span style="FONT-SIZE: 0pt"> 6stR]8 </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return DynRotate(cjIn);<span style="FONT-SIZE: 0pt"> xAca=+m%WG </span>&nbsp;<br>&nbsp; &nbsp; &nbsp; }<span style="FONT-SIZE: 0pt"> 7~BZ$u&lt;;l= </span>&nbsp;<br>&nbsp; &nbsp; return DISP_CHANGE_BADMODE;<span style="FONT-SIZE: 0pt"> r /@hS4kt </span>&nbsp;<br>&nbsp; }<span style="FONT-SIZE: 0pt"> ? cT,A&lt;2B </span>&nbsp;<br>#endif //ROTATE &amp; ROTATE<span style="FONT-SIZE: 0pt"> &amp;1cU6:\NhQ </span>&nbsp;<br>&nbsp; <span style="FONT-SIZE: 0pt">iUb&lt;2-m </span>&nbsp;<br>&nbsp; return 0;<span style="FONT-SIZE: 0pt"> kLsq"(]pJ </span>&nbsp;<br>}<span style="FONT-SIZE: 0pt"> UI"T�YJ3G </span>&nbsp;<br><span style="FONT-SIZE: 0pt">8';77 8HL </span>&nbsp;<br><span style="FONT-SIZE: 0pt">` 7Y#q&lt; </span>&nbsp;<br><span style="FONT-SIZE: 0pt">v-�S +\h_ </span>&nbsp;<br><span style="FONT-SIZE: 0pt">*\h+-mLx{ </span>&nbsp;<br><span style="FONT-SIZE: 0pt">Hv.X,7t </span>&nbsp;<br>另外一个方法，这个我没做过实验，感觉也还可以，论坛网友 sliverzhou 的方法<span style="FONT-SIZE: 0pt"> A7QVQJ{rxM </span>&nbsp;<br>将S3C2410DISP::S3C2410DISP (void) 中的<span style="FONT-SIZE: 0pt"> '"!1L ?. </span>&nbsp;<br>#ifdef &nbsp; &nbsp; ROTATE<span style="FONT-SIZE: 0pt"> pg-nR POTs </span>&nbsp;<br>&nbsp; m_pPrimarySurface = new GPESurfRotate(m_nScreenWidthSave, m_nScreenHeightSave, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);<span style="FONT-SIZE: 0pt"> I@S"3+ </span>&nbsp;<br>#else<span style="FONT-SIZE: 0pt"> v) L gR?i </span>&nbsp;<br>&nbsp; m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format); &nbsp; &nbsp; <span style="FONT-SIZE: 0pt">b?2wP # </span>&nbsp;<br>#endif //!ROTATE<span style="FONT-SIZE: 0pt"> '2CVO </span>&nbsp;<br>修改为<span style="FONT-SIZE: 0pt"> rUZu/CnLcO </span>&nbsp;<br>#ifdef &nbsp; &nbsp; ROTATE<span style="FONT-SIZE: 0pt"> g9XwN/N </span>&nbsp;<br>&nbsp; m_pPrimarySurface = new GPESurfRotate(m_nScreenWidthSave, m_nScreenHeightSave, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);<span style="FONT-SIZE: 0pt"> o oJ7.YOf </span>&nbsp;<br><font color=crimson>&nbsp; ((GPESurfRotate *)m_pPrimarySurface)-&gt;SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate); &nbsp; &nbsp; // init cursor related vars</font><span style="FONT-SIZE: 0pt"> ,T&amp;g5 </span>&nbsp;<br>#else<span style="FONT-SIZE: 0pt">  �wMyS; </span>&nbsp;<br>&nbsp; m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format); &nbsp; &nbsp; <span style="FONT-SIZE: 0pt">1-U^BEq </span>&nbsp;<br>#endif //!ROTATE<span style="FONT-SIZE: 0pt"> ND["8~p </span>&nbsp;<br><span style="FONT-SIZE: 0pt">+;&lt;1M_Cl~ </span>&nbsp;<br><span style="FONT-SIZE: 0pt">2css/9&lt;) </span>&nbsp;<br>有网友反映，改了后图象屏幕没翻转，鼠标坐标翻转了，其实是没有加<span style="FONT-SIZE: 0pt"> ~IpdmM </span>&nbsp;<br>pSurf-&gt;SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate); &nbsp; <span style="FONT-SIZE: 0pt">2 ~{;. </span>&nbsp;<br>的原因，因为刚好我也碰到过这种情况<span style="FONT-SIZE: 0pt"> Q&amp;{t&lt;(8V&lt; </span>&nbsp;<br><span style="FONT-SIZE: 0pt">:;YXW}F </span>&nbsp;<br><span style="FONT-SIZE: 0pt">_CL(Z wqT </span>&nbsp;<br><span style="FONT-SIZE: 0pt">j$�imI3B </span>&nbsp;<br><span style="FONT-SIZE: 0pt">(,A "5 </span>&nbsp;<br>------------------<span style="FONT-SIZE: 0pt"> 3 0\5 </span>&nbsp;<br>当我完成上面的操作时，屏幕已经可以按照320240清楚的显示了，鼠标坐标也正常。但我的问题还没有得到彻底解决。就是显示镜像的问题。显示画面要从lcd的背面看才能看到正常的画面<span style="FONT-SIZE: 0pt"> /zt\n5_m </span>&nbsp;<br><span style="FONT-SIZE: 0pt">TRh vwk </span>&nbsp;<br>我在很多论坛，很多地方都是提到了显示翻转的，而不是显示镜像的，<span style="FONT-SIZE: 0pt"> SN/isjT3 </span>&nbsp;<br><span style="FONT-SIZE: 0pt">_jLT ayD </span>&nbsp;<br>有网友提到的GXStartDraw的方法，这个我感觉适合应用程序，而不是驱动部分的，所以我就没再按这个方法继续下去。<span style="FONT-SIZE: 0pt"> j:07&lt;r&gt; </span>&nbsp;<br><span style="FONT-SIZE: 0pt">V&lt;D[~n </span>&nbsp;<br>那现在唯一能做的就是修改驱动程序。无奈小弟我接触wince没一个星期，这么高级的东西怎么可能搞定，所以来求助各位了<span style="FONT-SIZE: 0pt"> .2@AI[  </span>&nbsp;<br><span style="FONT-SIZE: 0pt">*qER2/ 6S </span>&nbsp;<br><span style="FONT-SIZE: 0pt">/!uQ1@MH </span>&nbsp;<br>如果是修改驱动程序，具体是要改哪些地方啊？</span> 
<img src ="http://www.cnitblog.com/zouzheng/aggbug/42111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-04-08 09:17 <a href="http://www.cnitblog.com/zouzheng/articles/42111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2440/2410 LCD 屏幕旋转的问题 </title><link>http://www.cnitblog.com/zouzheng/articles/42110.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Tue, 08 Apr 2008 01:11:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/42110.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/42110.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/42110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/42110.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/42110.html</trackback:ping><description><![CDATA[2440/2410 LCD 屏幕旋转的问题
<p>winCE 4.2以上</p>
<p><font size=2>一.修改</font></p>
<p><font size=2>SMDK2440\DRIVERS\DISPLAY\S3C2440LCD 目录下的sources文件合适位置增加：</font></p>
<font size=2>
<p><br>CLEARTYPE=0<br>ROTATE=1 &nbsp; //这句是我加的<br><br><br>三.s3c2440disp.h文件头上加一句</p>
<p><br>#define ROTATE<br><br>四.s3c2440disp.cpp中<br>S3C2440DISP::S3C2440DISP (void)<br>{<br><br>#ifdef ROTATE<br>m_iRotate = DMDO_90; // 90不对是DMDO_90=1!!!!; &nbsp; //0-&gt;90 我修改0-》90<br>SetRotateParms();<br>#endif //ROTATE &nbsp; <br><br>五。检查platform.reg中，</p>
<p>[HKEY_LOCAL_MACHINE\System\GDI\Drivers]<br>"Display"="s3c2440disp.dll"<br></p>
<p>以下注册表可以有可以没有。<br>[HKEY_LOCAL_MACHINE\System\GDI\Rotation] &nbsp; <br>"ANGLE"=dword:5A &nbsp; ;0x5A for 90,这是我加的 &nbsp; ，加在gdi\drivers这项后面<br><br>六，要在S3C2440DISP::S3C2440DISP (void) 最后加一句<br>((GPESurfRotate *)m_pPrimarySurface)-&gt;SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);<br><br>而s2440.h、2410中关于屏幕的东西不要去改，那是初试化lcd控制器的，与这里没有关系。</p>
<p>修改LCD控制器是另外一个方式实现LCD旋转的。</p>
2440/2410 LCD 屏幕旋转的问题
<p>winCE 4.2以上</p>
<p><font size=2>一.修改</font></p>
<p><font size=2>SMDK2440\DRIVERS\DISPLAY\S3C2440LCD 目录下的sources文件合适位置增加：</font></p>
<font size=2>
<p><br>CLEARTYPE=0<br>ROTATE=1 &nbsp; //这句是我加的<br><br><br>三.s3c2440disp.h文件头上加一句</p>
<p><br>#define ROTATE<br><br>四.s3c2440disp.cpp中<br>S3C2440DISP::S3C2440DISP (void)<br>{<br><br>#ifdef ROTATE<br>m_iRotate = DMDO_90; // 90不对是DMDO_90=1!!!!; &nbsp; //0-&gt;90 我修改0-》90<br>SetRotateParms();<br>#endif //ROTATE &nbsp; <br><br>五。检查platform.reg中，</p>
<p>[HKEY_LOCAL_MACHINE\System\GDI\Drivers]<br>"Display"="s3c2440disp.dll"<br></p>
<p>以下注册表可以有可以没有。<br>[HKEY_LOCAL_MACHINE\System\GDI\Rotation] &nbsp; <br>"ANGLE"=dword:5A &nbsp; ;0x5A for 90,这是我加的 &nbsp; ，加在gdi\drivers这项后面<br><br>六，要在S3C2440DISP::S3C2440DISP (void) 最后加一句<br>((GPESurfRotate *)m_pPrimarySurface)-&gt;SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);<br><br>而s2440.h、2410中关于屏幕的东西不要去改，那是初试化lcd控制器的，与这里没有关系。</p>
<p>修改LCD控制器是另外一个方式实现LCD旋转的。</p>
</font></font>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/42110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-04-08 09:11 <a href="http://www.cnitblog.com/zouzheng/articles/42110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINCE 学习笔记  关于更改显示屏(zhuan)</title><link>http://www.cnitblog.com/zouzheng/articles/42109.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Tue, 08 Apr 2008 01:05:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/42109.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/42109.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/42109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/42109.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/42109.html</trackback:ping><description><![CDATA[<p><font face=Verdana>1.最好是用ADS写个测试程序,把TFT屏的有关参数确定下来.</font></p>
<p><font face=Verdana>2.platform\smdk2410\inc\s2410.h,更改成如下定义</font></p>
<p><font face=Verdana size=1>#define VBPD ((15)&amp;0xff)<br>#define VFPD ((15)&amp;0xff)<br>#define VSPW ((15)&amp;0x3f)<br><br>#define HBPD ((32)&amp;0x7f)<br>#define HFPD ((32)&amp;0xff)<br>#define HSPW ((96)&amp;0xff)<br><br>#define CLKVAL_TFT (1)</font></p>
<p><font face=Verdana>3.platform\smdk2410\kernel\hal\cfw.c</font></p>
<p><font face=Verdana size=1>/*<br>// Define some values for TFT 16bpp<br>// LCDTYPE 定义在s2410.h文件中,#define LCDTYPE TFT16BPP<br>//by xiaoyunsoft @2007-11-04<br>//#if(LCDTYPE == TFT16BPP) // TFT 640*480 / 16bpp<br>//#define FR_WIDTH 240<br>//#define FR_HEIGHT 320<br>//#define PhysicalVmemSize FR_HEIGHT*FR_WIDTH*LCDTYPE<br><br><br>#if(LCDTYPE == TFT16BPP) // TFT 640*480 / 16bpp<br>#define FR_WIDTH 640<br>#define FR_HEIGHT 480<br>#define PhysicalVmemSize FR_HEIGHT*FR_WIDTH*LCDTYPE<br><br>struct FrameBuffer {<br>unsigned short pixel[FR_HEIGHT][FR_WIDTH];<br>};<br><br>#else if(LCDTYPE == STN8BPP)// STN 320*240 / 8bpp<br>#define FR_WIDTH 320<br>#define FR_HEIGHT 240<br>#define PhysicalVmemSize FR_HEIGHT*FR_WIDTH<br><br>struct FrameBuffer {<br>unsigned char pixel[FR_HEIGHT][FR_WIDTH];<br>};<br>#endif<br>*/<br><br>struct FrameBuffer *FBuf;<br><br>static void InitDisplay()<br>{<br>//int i, j;<br>volatile IOPreg *s2410IOP;<br>volatile LCDreg *s2410LCD; <br><br>s2410IOP = (IOPreg *)IOP_BASE;<br>s2410LCD = (LCDreg *)LCD_BASE; <br><br>// LCD port initialize.<br>s2410IOP-&gt;rGPCUP = 0xFFFFFFFF;<br>s2410IOP-&gt;rGPCCON = 0xAAAAAAAA;<br><br>s2410IOP-&gt;rGPCCON = 0xAAAAAAAA;<br><br>s2410IOP-&gt;rGPDUP = 0xFFFFFFFF;<br>s2410IOP-&gt;rGPDCON = 0xAAAAAAAA;<br><br>s2410IOP-&gt;rGPGCON &amp;= ~(3 &lt;&lt; 8); /* Set LCD_PWREN as output */<br>s2410IOP-&gt;rGPGCON |= (1 &lt;&lt; 8);<br><br>s2410IOP-&gt;rGPGDAT |= (1 &lt;&lt; 4); /* Backlight ON */<br><br><br><br><br>//s2410LCD-&gt;rLCDCON1=(3&lt;&lt;8)|(MVAL_USED&lt;&lt;7)|(3&lt;&lt;5)|(12&lt;&lt;1)|0;<br>// TFT LCD panel,16bpp TFT,ENVID=off<br><br>s2410LCD-&gt;rLCDCON1=(CLKVAL_TFT&lt;&lt;8)|(MVAL_USED&lt;&lt;7)|(3&lt;&lt;5)|(12&lt;&lt;1)|0;<br>s2410LCD-&gt;rLCDCON2=(VBPD&lt;&lt;24)|(LINEVAL_TFT&lt;&lt;14)|(VFPD&lt;&lt;6)|(VSPW);<br>s2410LCD-&gt;rLCDCON3=(HBPD&lt;&lt;19)|(HOZVAL_TFT&lt;&lt;8)|(HFPD);<br>s2410LCD-&gt;rLCDCON4=(MVAL&lt;&lt;8)|(HSPW);<br>s2410LCD-&gt;rLCDCON5=(1&lt;&lt;11)|(1&lt;&lt;9)|(1&lt;&lt;8)|(1&lt;&lt;3)|(1&lt;&lt;0); //FRM5:6:5,HSYNC and VSYNC are inverted<br>s2410LCD-&gt;rLCDSADDR1=((FRAMEBUF_DMA_BASE&gt;&gt;22)&lt;&lt;21)|M5D(FRAMEBUF_DMA_BASE&gt;&gt;1);<br>s2410LCD-&gt;rLCDSADDR2=M5D( (FRAMEBUF_DMA_BASE+(LCD_XSIZE_TFT*LCD_YSIZE_TFT*2))&gt;&gt;1 );<br>s2410LCD-&gt;rLCDSADDR3=(((LCD_XSIZE_TFT-LCD_XSIZE_TFT)/1)&lt;&lt;11)|(LCD_XSIZE_TFT/1);<br>s2410LCD-&gt;rLCDINTMSK|=(3); // MASK LCD Sub Interrupt<br>s2410LCD-&gt;rLPCSEL&amp;=(~7); // Disable LPC3600<br>s2410LCD-&gt;rTPAL=0; // Disable Temp Palette<br><br>s2410LCD-&gt;rLCDCON1 |= 1;<br><br>RETAILMSG(1,(TEXT("LCD 640*480 Initialize(by xiaoyunsoft 2007-11-04)...\r\n")));<br><br>}</font></p>
<p><font face=Verdana>4.platform\smdk2410\drivers\display\S3C2410LCD\s3c2410disp.cpp</font></p>
<p><font face=Verdana><font size=1>S3C2410DISP::S3C2410DISP (void)<br>{<br>RETAILMSG(1, (TEXT("++S3C2410DISP::S3C2410DISP\r\n")));<br><br>// setup up display mode related constants<br>// m_nScreenWidth = 240;// xiaoyunsoft @ 2007-11-05<br>// m_nScreenHeight = 320;<br>m_nScreenWidth = 640;<br>m_nScreenHeight = 480;<br>m_colorDepth = 16;<br>m_cbScanLineLength = m_nScreenWidth * 2;<br>m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;<br><br>// memory map register access window, frame buffer, and program LCD controller<br>InitializeHardware();</font><br>...<br><font size=1>}</font></font></p>
<p><font face=Verdana size=1>...</font></p>
<p><font face=Verdana size=1>void S3C2410DISP::InitializeHardware (void)<br>{<br>WORD *ptr;<br>DWORD index;<br>HKEY hkDisplay = NULL;<br>DWORD dwLCDPhysicalFrameBase;<br>DWORD dwStatus, dwType, dwSize;<br><br>RETAILMSG(1, (_T("++S3C2410DISP::InitializeHardware\r\n")));<br><br>// open the registry key and read our configuration<br>dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, 0, &amp;hkDisplay);<br>dwType = REG_DWORD;<br><br>if(dwStatus == ERROR_SUCCESS &amp;&amp; dwType == REG_DWORD) {<br>dwSize = sizeof(DWORD);<br>dwStatus = RegQueryValueEx(hkDisplay, _T("LCDVirtualFrameBase"), NULL, &amp;dwType, <br>(LPBYTE) &amp;gdwLCDVirtualFrameBase, &amp;dwSize);<br>}<br>if(dwStatus == ERROR_SUCCESS &amp;&amp; dwType == REG_DWORD) {<br>dwSize = sizeof(DWORD);<br>dwStatus = RegQueryValueEx(hkDisplay, _T("LCDPhysicalFrameBase"), NULL, &amp;dwType, <br>(LPBYTE) &amp;dwLCDPhysicalFrameBase, &amp;dwSize);<br>}<br><br>// close the registry key<br>if(hkDisplay != NULL) {<br>RegCloseKey(hkDisplay);<br>}<br><br>// did we get everything?<br>if(dwStatus != ERROR_SUCCESS) {<br>RETAILMSG(0, (_T("SALCD2: InitializeHardware: couldn't get registry configuration\r\n")));<br>return;<br>}<br><br>// map frame buffer into process space memory<br>/* by xiaoyunsoft @ 2007-11-05 </font></p>
<p><font face=Verdana size=1>//</font><font face=Verdana color=#0000ff size=2>这里被我注释了,主要是改了它显示的缓存大上,原来是240*320定义了0x40000大小的缓存,现在不够用了.重新定义了0xA0000</font><font face=Verdana size=1><br>m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0x40000), MEM_RESERVE, PAGE_NOACCESS);<br>if (m_VirtualFrameBuffer == NULL) <br>{<br>RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocated\n\r")));<br>return;<br>}<br>else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0x40000), PAGE_READWRITE | PAGE_NOCACHE))<br>{<br>RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mapped\n\r")));<br>VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);<br>return;<br>}<br>*/<br><br></font><font face=Verdana color=#0000ff size=2>//这里要注意,它的缓存大小也许不能随意定义大小,要看它是否超过了PB工程中的config.bib文件中定义的display区的大小,这里没有超过,config.bib中定义的大小是0x00100000</font><font face=Verdana size=1><br>m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0xA0000), MEM_RESERVE, PAGE_NOACCESS);<br>if (m_VirtualFrameBuffer == NULL) <br>{<br>RETAILMSG(0,(TEXT("m_VirtualFrameBuffer is not allocated\n\r")));<br>return;<br>}<br>else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0xA0000), PAGE_READWRITE | PAGE_NOCACHE))<br>{<br>RETAILMSG(0, (TEXT("m_VirtualFrameBuffer is not mapped\n\r")));<br>VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);<br>return;<br>}<br><br>RETAILMSG(1, (TEXT("m_VirtualFrameBuffer is mapped at %x(PHY : %x)\n\r"), m_VirtualFrameBuffer, gdwLCDVirtualFrameBase));<br>RETAILMSG(1, (TEXT("Clearing frame buffer !!!\n\r")));<br><br>ptr = (WORD *)m_VirtualFrameBuffer;<br>　</font></p>
<p><font face=Verdana size=1>//这里昌往缓存里填初始化数据,不填也可以.<br>// clear rest of frame buffer out<br>//for (index = 0; index &lt; 320*240; index++)<br>for (index = 0; index &lt; 640*480; index++)<br>{<br>if(index &lt; 76800)//3200<br>{<br>ptr[index] = 0xf800;<br>}<br>else if(index &lt; 153600)//6400<br>{<br>ptr[index] = 0x07e0;<br>}<br>else if(index &lt; 230400)//9600<br>{<br>ptr[index] = 0x001f;<br>}<br>else<br>{<br>ptr[index] = 0xffff;<br>}<br>}<br><br>RETAILMSG(1, (_T("Initialize Display by xiaoyunsoft @ 2007-11-06\r\n")));<br>RETAILMSG(1, (_T("--S3C2410DISP::InitializeHardware\r\n")));<br>}</font></p>
<p><font face=Verdana size=1>单独编译后重新生成bin文件即可</font></p>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/42109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-04-08 09:05 <a href="http://www.cnitblog.com/zouzheng/articles/42109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>