用于NIOS II 嵌入式處理器系統(tǒng)的鼠標(biāo)控制器設(shè)計(jì)
q是從鼠標(biāo)收到的數(shù)據(jù),它的q[0],q[11]等是起始位,應(yīng)為邏輯0;q[10],q[21]等是停止位,應(yīng)是邏輯1;q[9],q[20]等為奇偶校驗(yàn)位。在驗(yàn)證數(shù)據(jù)幀狀態(tài)下根據(jù)測(cè)試得到的packet_good信號(hào)值確定是跳轉(zhuǎn)到等待狀態(tài)還是輸出數(shù)據(jù)幀狀態(tài)。
該鼠標(biāo)控制器缺省狀態(tài)為標(biāo)準(zhǔn)PS/2模式,要進(jìn)入微軟的Intellimouse只需向鼠標(biāo)發(fā)送前文(見(jiàn)1.2)所提到的命令序列,并將msmode置為邏輯1即可。
2、鼠標(biāo)控制器的驗(yàn)證
我們?cè)谝粋€(gè)使用Altera公司的Cyclone系列[5]的 EP1C6Q240C8 芯片的開(kāi)發(fā)板上對(duì)該設(shè)計(jì)進(jìn)行了驗(yàn)證。在NiosII IDE集成開(kāi)發(fā)環(huán)境[6]中我們編寫(xiě)了一個(gè)測(cè)試程序。其部分代碼如下所示,它的作用是等待鼠標(biāo)事件的發(fā)生并打印鼠標(biāo)事件信息。
while (wait_rx_ready(0,PS2_READY,PS2_MOUSEDATA,data) 0);
if ((data PS2_RBUTTON)){
printf(RBUTTON......n);}
else if ((data PS2_LBUTTON)) {
printf(LBUTTON......n);}
else if((data PS2_MBUTTON)) {
printf(MBUTTON......n);}
else {
xdata = (data PS2_XMASK) >> PS2_XSHIFT;
ydata = (data PS2_YMASK) >> PS2_YSHIFT;
zdata = (data PS2_ZMASK) >> PS2_ZSHIFT;
printf(x: %d, y: %d, z: %dn, xdata, ydata, zdata);
}
我們測(cè)試了一個(gè)帶滾輪的雙飛燕光電鼠標(biāo)和一個(gè)不帶滾輪的飛利浦的機(jī)械鼠標(biāo)。測(cè)試中,當(dāng)我們分別按下鼠標(biāo)左鍵,右鍵,及中鍵;或在水平方向,豎直方向移動(dòng)鼠標(biāo);或者轉(zhuǎn)動(dòng)滾輪時(shí),程序都會(huì)在NiosII IDE的Console窗口連續(xù)的打印出相應(yīng)的信息。滿足了我們支持標(biāo)準(zhǔn)PS/2(IBM PS/2)和微軟的Intellimouse兩種模式的要求。結(jié)果證明,本文所提出的設(shè)計(jì)是成功的。
3、結(jié)束語(yǔ)
本文介紹了一個(gè)用于Nios II處理器系統(tǒng)的鼠標(biāo)控制器的設(shè)計(jì),支持標(biāo)準(zhǔn)PS/2 鼠標(biāo)和微軟的Intellimouse。相比于其他嵌入式系統(tǒng)中采用另外增加一個(gè)單片機(jī)(如一般采用的Intel8042或AT89C51[7]等)作為鼠標(biāo)控制器來(lái)說(shuō),減少了系統(tǒng)成本,也減少硬件布板布線的復(fù)雜性,可以在Nios II處理器系統(tǒng)中廣泛使用。
該設(shè)計(jì)最大的創(chuàng)新點(diǎn)在于增加了讀取鼠標(biāo)響應(yīng)的功能,并實(shí)現(xiàn)了主機(jī)向鼠標(biāo)發(fā)送命令,在此基礎(chǔ)上實(shí)現(xiàn)了對(duì)微軟的Intellimouse的支持,相比參考文獻(xiàn)[8]中提到的2D鼠標(biāo)控制器有較大的改進(jìn)。
評(píng)論