q是从鼠标收到的数据,它的q[0],q[11]等是起始位,应为逻辑0;q[10],q[21]等是停止位,应是逻辑1;q[9],q[20]等为奇偶校验位。在验证数据帧状态下根据测试得到的packet_good信号值确定是跳转到等待状态还是输出数据帧状态。
该鼠标控制器缺省状态为标准PS/2模式,要进入微软的Intellimouse只需向鼠标发送前文(见1.2)所提到的命令序列,并将msmode置为逻辑1即可。
2、鼠标控制器的验证
我们在一个使用Altera公司的Cyclone系列[5]的 EP1C6Q240C8 芯片的开发板上对该设计进行了验证。在NiosII IDE集成开发环境[6]中我们编写了一个测试程序。其部分代码如下所示,它的作用是等待鼠标事件的发生并打印鼠标事件信息。
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: %d\n", xdata, ydata, zdata);
}
我们测试了一个带滚轮的双飞燕光电鼠标和一个不带滚轮的飞利浦的机械鼠标。测试中,当我们分别按下鼠标左键,右键,及中键;或在水平方向,竖直方向移动鼠标;或者转动滚轮时,程序都会在NiosII IDE的Console窗口连续的打印出相应的信息。满足了我们支持标准PS/2(IBM PS/2)和微软的Intellimouse两种模式的要求。结果证明,本文所提出的设计是成功的。
3、结束语
本文介绍了一个用于Nios II处理器系统的鼠标控制器的设计,支持标准PS/2 鼠标和微软的Intellimouse。相比于其他嵌入式系统中采用另外增加一个单片机(如一般采用的Intel8042或AT89C51[7]等)作为鼠标控制器来说,减少了系统成本,也减少硬件布板布线的复杂性,可以在Nios II处理器系统中广泛使用。
该设计最大的创新点在于增加了读取鼠标响应的功能,并实现了主机向鼠标发送命令,在此基础上实现了对微软的Intellimouse的支持,相比参考文献[8]中提到的2D鼠标控制器有较大的改进。