?? skyeye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.htm
字號(hào):
void lcd_disable(ARMul_State *state)
{
int i;
if (skyeye_config.no_lcd)
return;
//chy 2004-03-11
*(state->mach_io.lcd_is_enable)=0;
if(lcd_depth<=8){
for (i = 0; i <2^lcd_depth ; i++) {
if (gc[i]) {
gdk_gc_destroy(gc[i]);
gc[i] = NULL;
}
}
}//釋放GdkGC(Gdk圖形設(shè)備上下文)
if (window) {
gtk_widget_destroy(window);
window = NULL;
}//關(guān)閉模擬lcd屏幕的gtk window
}
lcd_cycle(ARMul_State *state)
{
gtk_main_iteration_do(FALSE);
}
/*無(wú)阻塞地檢查gtk模擬出的lcd window中是否有事件需要相應(yīng)的事件回調(diào)函數(shù)處理(如expose_event,
motion_notify_event,button_press_event等),這些事件是在lcd_enable中注冊(cè)的。
SkyEye模擬ep7312時(shí),本函數(shù)在skyeye_mach_ep7312.c的函數(shù)ep7312_io_do_cycle中被調(diào)用,
最終是被armio.c中的io_do_cycle調(diào)用,也就是每個(gè)時(shí)鐘執(zhí)行一次。
當(dāng)對(duì)lcd顯示內(nèi)存進(jìn)行寫操作時(shí),lcd_write會(huì)被調(diào)用,將相應(yīng)的象素畫到lcd屏幕仿真窗口上*/
void lcd_write(ARMul_State *state, ARMword addr, ARMword data)
{
ARMword offset;
int pixnum, x, y, bit;
int pix;
GdkColor color;
//如果不使用lcd,則返回
if (skyeye_config.no_lcd)
return;
//根據(jù)象素所在的4字節(jié)的地址,計(jì)算該4字節(jié)所包含的第一個(gè)象素對(duì)應(yīng)于在lcd仿真屏幕上的坐標(biāo)
offset = (addr & ~3) - LCD_BASE;
pixnum = offset * 8/ lcd_depth;
x = pixnum % lcd_width;
y = pixnum / lcd_width;
assert(y < lcd_height);
//調(diào)用gdk畫點(diǎn)函數(shù)gdk_draw_point畫出該4字節(jié)所包含的所有象素點(diǎn)
//當(dāng)顏色深度等于 1時(shí),要畫32個(gè)點(diǎn)
//當(dāng)顏色深度等于 2時(shí),要畫16個(gè)點(diǎn)
//當(dāng)顏色深度等于 4時(shí),要畫8個(gè)點(diǎn)
//當(dāng)顏色深度等于 8時(shí),要畫4個(gè)點(diǎn)
//當(dāng)顏色深度等于16時(shí),要畫2個(gè)點(diǎn)
//當(dāng)顏色深度等于32時(shí),要畫1個(gè)點(diǎn)
for (bit = 0; bit < 32; bit += lcd_depth) {
switch (lcd_depth) {
//當(dāng)顏色深度<=8時(shí),已經(jīng)根據(jù)相應(yīng)的調(diào)色板調(diào)出RGB值
case 1:
case 2:
case 4:
case 8:
pix = (data >> bit) % (1 << lcd_depth);
gdk_draw_point(LCD->window, gc[pix], x, y);
x++;
break;
case 15:
break;
//當(dāng)顏色深度大于8時(shí),可以直接根據(jù)象素值調(diào)出RGB值
case 16:
pix = (data >> bit) % (1 << lcd_depth);
color.red = (short)((pix&0x00007c00)<<1); //rgb--->1555
color.green = (short)((pix&0x000003e0)<<6);
color.blue = (short)((pix&0x0000001f)<<11);
gdk_color_alloc (colormap, &color);
mygc = gdk_gc_new(LCD->window);
gdk_gc_set_foreground(mygc, &color);
gdk_draw_point(LCD->window, mygc, x, y);
x++;
break;
case 24:
break;
case 32:
color.red = ((data&0x00ff0000)>>8);
color.green = ((data&0x0000ff00));
color.blue = ((data&0x000000ff)<<8);
gdk_color_alloc (colormap, &color);
mygc = gdk_gc_new(LCD->window);
gdk_gc_set_foreground(mygc, &color);
gdk_draw_point(LCD->window, mygc, x, y);
break;
default:
break;
}
}
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P><A name=IDA0FQTB><SPAN class=atitle3>4.
TouchScreen模擬模塊的設(shè)計(jì)與實(shí)現(xiàn)概述</SPAN></A><BR>TouchScreen模擬模塊的設(shè)計(jì)思路將與LCD模擬窗口同樣大小的GTK+組件置于LCD組件容器中,并為該組件注冊(cè)鼠標(biāo)鍵按下,釋放及移動(dòng)三種事件,當(dāng)鼠標(biāo)在組件窗口有鍵按下,釋放或移動(dòng)的動(dòng)作,則在相應(yīng)的事件回調(diào)函數(shù)種記錄其在窗口上的坐標(biāo)及鍵的狀態(tài),并產(chǎn)生修改中斷寄存器中的相應(yīng)位置1,在SkyEye上運(yùn)行的嵌入式OS檢測(cè)到中斷寄存器的數(shù)據(jù)變化就產(chǎn)生中斷,TouchScreen驅(qū)動(dòng)程序中注冊(cè)了該中斷的中斷服務(wù)程序ISR則復(fù)制所記錄的數(shù)據(jù)供應(yīng)用程序使用,這一思路簡(jiǎn)單說(shuō)來(lái)就是,完成GTK+的鼠標(biāo)事件到TouchScreen事件的映射。</P>
<P>因此TouchScreen模擬模塊只需要關(guān)注GTK+鼠標(biāo)事件的發(fā)生,記錄事件數(shù)據(jù)并在*_io_do_cycle
函數(shù)中對(duì)I/O模擬模塊所模擬的中斷狀態(tài)寄存器進(jìn)行置數(shù)操作,即為嵌入式操作系統(tǒng)內(nèi)核產(chǎn)生中斷信號(hào)的條件。</P>
<P>下圖就是SkyEye模擬器的TouchScreen模擬的流程圖(包括與真實(shí)硬件的比較):</P>
<P><A name=IDADGQTB><B>圖 0-3 SkyEye的TouchScreen模擬流程圖</B></A><BR><IMG
height=305 alt="圖 0-3 SkyEye的TouchScreen模擬流程圖"
src="SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files/image007.jpg" width=642 border=0
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P>TouchScreen模擬模塊的實(shí)現(xiàn)采用了與模擬采用DragonBall開發(fā)板的Xcopilot模擬器相類似的簡(jiǎn)化方式。在實(shí)際的TouchScreen硬件中,為了定位動(dòng)作發(fā)生的坐標(biāo),要先先經(jīng)過(guò)一個(gè)12位的A/D轉(zhuǎn)換器分別轉(zhuǎn)換X,Y坐標(biāo)對(duì)應(yīng)12位數(shù)字量,然后由驅(qū)動(dòng)程序通過(guò)SPI串行總線串行接收。SkyEye作為一個(gè)指令級(jí)的模擬器,無(wú)需保證與真實(shí)時(shí)鐘節(jié)拍在時(shí)序上的一致,因此允許對(duì)TouchScreen這樣的外設(shè)的模擬進(jìn)行簡(jiǎn)化。</P>
<P><A name=resources><SPAN class=atitle2>參考資料 </SPAN></A>
<UL>
<LI>本文節(jié)自<A
href="http://www.china-pub.com/computers/common/info.asp?id=21879"
target=_blank
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">《源碼開放的嵌入式系統(tǒng)軟件分析與實(shí)踐--基于SkyEye和ARM開發(fā)平臺(tái)》</A>一書的第三章,對(duì)
SkyEye 開源項(xiàng)目感興趣的可以閱讀本書。<BR><BR>
<LI><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.shtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SkyEye硬件模擬平臺(tái),
第一部分: SkyEye 介紹</A><BR><BR>
<LI><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part2/index.shtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SkyEye硬件模擬平臺(tái),第二部分:
安裝與使用</A><BR><BR>
<LI><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part3/s1/index.shtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SkyEye硬件模擬平臺(tái),第三部分:
硬件仿真實(shí)現(xiàn)之一</A><BR><BR>
<LI><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part3/s2/index.shtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SkyEye硬件模擬平臺(tái),第三部分:
硬件仿真實(shí)現(xiàn)之二</A><BR><BR>
<LI><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part3/s3/index.shtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SkyEye
硬件模擬平臺(tái),第三部分: 硬件仿真實(shí)現(xiàn)之三</A><BR><BR>
<LI><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part3/s4/index.shtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SkyEye
硬件模擬平臺(tái),第三部分: 硬件仿真實(shí)現(xiàn)之四</A><BR><BR>
<LI>在 <A href="http://www-900.ibm.com/developerworks/cn/linux/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks
Linux 專區(qū)</A> 可以找到更多為 Linux 開發(fā)者準(zhǔn)備的參考資料。<BR></LI></UL>
<P></P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><A name=author1></A><SPAN class=atitle2>關(guān)于作者</SPAN><BR>
<P>陳渝, 清華大學(xué),通過(guò) <A href="mailto:yuchen@tsinghua.edu.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">yuchen@tsinghua.edu.cn</A>
可以和他聯(lián)系。</P></TD></TR></TBODY></TABLE><BR clear=all><IMG height=10 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(1).gif" width=100
border=0><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD align=right width="100%"><A
href="http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part3/s5/index.shtml#top">到頁(yè)首</A></TD>
<TD width=5><IMG height=1 alt=""
src="SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files/c.gif" width=5 border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#000000 colSpan=2><IMG height=1 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(1).gif" width=100
border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff colSpan=2><IMG height=8 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(1).gif" width=100
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<TBODY>
<TR vAlign=top>
<TD>
<FORM
action=/developerworks/cn/cnratings.nsf/RateArticle?CreateDocument
method=post><INPUT type=hidden value="SkyEye硬件模擬平臺(tái),第三部分: 硬件仿真實(shí)現(xiàn)之五"
name=ArticleTitle><INPUT type=hidden value=Linux name=Zone><INPUT
type=hidden
value=/developerworks/cn/thankyou/thankyou_feedback.shtml
name=RedirectURL>
<SCRIPT language=javascript>document.write('<input type="HIDDEN" name="url" value="'+location.href+'">');</SCRIPT>
<A name=rating><SPAN class=atitle2>對(duì)本文的評(píng)價(jià)</SPAN></A>
<P>您對(duì)這篇文章的看法如何?</P>
<TABLE cellSpacing=0 cellPadding=0 width=600 border=0>
<TBODY>
<TR>
<TD colSpan=5><IMG height=8 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(1).gif"
width=100 border=0></TD></TR>
<TR vAlign=top>
<TD width="21%"><INPUT type=radio value=1 name=Rating>太差!
(1)</TD>
<TD width="17%"><INPUT type=radio value=2 name=Rating>需提高
(2)</TD>
<TD width="24%"><INPUT type=radio value=3 name=Rating>一般;尚可
(3)</TD>
<TD width="17%"><INPUT type=radio value=4 name=Rating>好文章
(4)</TD>
<TD width="21%"><INPUT type=radio value=5
name=Rating>真棒!(5)</TD></TR></TBODY></TABLE><BR><B>建議?</B><BR><TEXTAREA name=Comments rows=5 wrap=virtual cols=60></TEXTAREA><BR><BR><INPUT type=submit value=提交反饋意見></FORM></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff><IMG height=8 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(1).gif" width=100
border=0></TD></TR></TBODY></TABLE></TD>
<TD width=1><IMG height=1 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(1).gif" width=1
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="D:\新建文件夾\SkyEye硬件模擬平臺(tái),第三部分 硬件仿真實(shí)現(xiàn)之五.files\c(2).gif" width=1></TD></TR>
<TR vAlign=top>
<TD class=bbg height=21> <A class=mainlink
href="http://www-900.ibm.com/cn/ibm/index.shtml">關(guān)于 IBM</A><SPAN
class=divider> | </SPAN><A class=mainlink
href="http://www-900.ibm.com/cn/ibm/privacy/index.shtml">隱私條約</A><SPAN
class=divider> | </SPAN><A class=mainlink
href="http://www-900.ibm.com/cn/ibm/legal/index.shtml">使用條款</A><SPAN
class=divider> | </SPAN><A class=mainlink
href="http://www-900.ibm.com/cn/ibm/contact/index.shtml">聯(lián)系
IBM</A></TD></TR></TBODY></TABLE></BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -