高手网友分析鼠标工作原理

2010-08-28 10:45:15来源:西部e网作者:

    现在的有线光学鼠标中一般都有2块集成电路,一块是CMOS/DSP芯片,比如像安捷伦2051,一块是USB/PS2的接口转换芯片,比如像现在的IE4/MX510中使用的cy7c63743,RAZER VIPER中使用的GL603USB(廉价品,比cy7c63743功能更弱)。IE3/IO1.1/WMO1.1的情况比较特殊,这两块芯片是2合一的。

  2051的白皮书

  cy7c63743的白皮书

  CMOS/DSP芯片大家谈得比较多,好像它就决定了鼠标性能的一切,因此所以USB/PS2的接口转换芯片就成了盲点。那么现在就来谈谈这个东西。

  我曾经以为这种接口转换芯片只是一个把数据流转换成usb数据流的东西,是完全硬件操作的。但是如果真的这种情况的话,就有很多无法解释的现象。比如:为什么IE4/MX510用的是一个芯片,IE4在98下面却有问题?为什么几个鼠标都用同样的2051/cy7c63743,一个飞得厉害(指针乱跳),一个丢祯(指针有停顿),有得却用得挺好?为什么会有可以脱离软件自由切换cpi的鼠标,却找不到特殊的硬件(电路,透镜等)?…………

  前几个星期,抽空仔细研究了一下安捷伦2051和cy7c637xx的pdf白皮书,豁然开朗,突然一切都明白了。问题的关键是,cy7c637xx不是纯硬件的,而是一个可编程器件,完全就是一个单片机,可以通过编程来完成很多特殊的效果。

    这里说几个由于这个结论而得到解释的悬念。

    1、为什么IE4放弃了很成熟的IE3的一体化芯片,反而造成了现在的98下USB口的问题?

  答案是为了实现纵横滚轮的功能,不得不这么做。看过cy7c637xx或安捷伦2051白皮书,可以发现,所有的按键都是连接到接口转换芯片上的,通过对接口转换芯片的编程来识别,而且有几个按键就必须要有几根信号线。

  纵横滚轮实际是相当于增加了2个按键,而IE3的一体化芯片的按键输入信号线已经不够了,不得已只能放弃。相对于完全重新设计一个一体化芯片,保留原来的cmos/dsp,使用外部接口芯片是比较简单而且灵活性比较高的方案。结果就是现在的IE4的电路构成,使用了和MX系列一样的cy7c63743。由于是首次使用了cy7c63743,原有的芯片的软件无法流用,需要完全重新编程,从而造成了在98下USB有问题。

    2、IE4有9000次版?

  可能性还是有的,因为接口芯片原来的固化程序可能有不够完善,确实可以对其进行改善。但CMOS/DSP芯片从一开始就应该是9000次的,没有变化。具体的效果也无法确认。

    3、IE4可以软件升级到9000次?

  做梦!cy7c63743要写片机才能改写,无法仅使用USB口来写入。而且在后面我会提到,接口芯片中固化的软件对鼠标性能有重大影响,应该是企业机密,固化后很难破解,而提供用户升级大大加大了被破解的可能性(因为用USB口传输时无法加密,完全可以截取)。9000次的是用了USB2.0?胡说八道!cy7c63743只支持USB1.1,只有12MHZ的内部晶振,如何上到480Mbps???

    4、为什么几个鼠标都用同样的2051/cy7c63743,表现却不一样?

  这就看个厂家各自的软件功力了。看2051的白皮书,可以找到一个很基本的例程,编译固化后,鼠标可以有最基本的功能。但如果拿来就这么用的话,移动太快,超过2051的极限,指针绝对就飞了。就像很多山寨货一样。如果下点功夫,在程序里加点判断条件,如果两次读数差别太大(比如超过了2051的极限值),就可以认为从CMOS/DSP得到的信号已经不可靠。接下来怎么处理?想简单的话,可以把这次的读数废弃,计数直接清零。结果就是鼠标移动了指针没动,停顿丢祯了。丢祯比飞稍好,起码不用到处找鼠标指针了。如果再下点功夫,设计一个复杂的算法,对读数进行补偿,从而推算正确的移动方向,鼠标是实用性就能大大的提高。而这种算法的编程可不是那么容易的,其详细构成大概也是各大厂商的机密吧。双光头的极光飞貂也是使用了这个概念,只不过是用第2个光头的数据来对第1个的数据进行补偿。(以上纯属推测,可能和实际情况有出入)。

    5、CPI可自由切换是如何实现的?

  标称800CPI的CMOS/DSP芯片每移动一英寸产生800个脉冲信号(请参考2051白皮书)。接口芯片实际是对CMOS/DSP产生的脉冲信号进行计数并处理后,转换成USB信号输出,如果在转换成USB信号输出前将结果再处理一下,加减乘除一番,就能获得不同的CPI值了。特别是乘2除2这样的计算在接口芯片这样的单片机上是很容易实现的。学过汇编的人应该记得,乘以2最简单的方法是把被乘数向左移动一位,除以2就是向右移一位就可以了。所以800CPI转200、400、1600以至于3200都是只要一两条汇编指令就可以完成的。而800CPI转1000CPI这种小数倍的乘法就要复杂得多。所以某个品牌的鼠标1000CPI的前代还是用硬件来实现的,1600CPI的这一代绝对是对接口编程来实现的,只要加一句移位指令就成了,太简单了。且慢,不是还有什么16位的数据传输吗?

    6、16位数据传输是个什么玩意?

  先来看看这个微软的windows标准数据结构

    http://www.microsoft.com/taiwan/whdc/hwdev/tech/input/5b_wheel.mspx#top

  我们可以发现,X,Y的位移值都是8位二进制数(8bit),换算成十进制每次最高能表示256个脉冲,125hz的最高usb口采样率,一秒能表示多少个脉冲?
256(脉冲/次)*125(次/秒)=32000(脉冲/秒)

    那么800CPI表示800脉冲/英寸,40英寸/秒的鼠标一秒能产生多少个脉冲?

    800(脉冲/英寸)*40(英寸/秒)=32000(脉冲/秒)

    也就是说标准的数据结构最高只能使用于800CPI、40英寸/秒的鼠标。

    而1600CPI、40英寸/秒的鼠标每秒产生

    1600(脉冲/英寸)*40(英寸/秒)=64000(脉冲/秒)

    用windows标准的数据结构根本无法表示,溢出了!怎么办?改数据结构,增加数据位长。实际上只需要加1bit也就是总共只要9bit就能够表示64000脉冲/秒了,为什么会有16bit的数据?因为从现在的驱动都是32bit的,从编程角度来看,加1byte比加1bit的程序来得简单,而且16bit比9bit要好看多了,何乐而不为呢?不过上面那个windows标准数据结构必须要遵守,不然标准驱动无法使用,鼠标插上必须马上装驱动,这样的话还要另接一个鼠标来操作,好傻!所以就算是16bit也是在标准数据结构的后面再加2个8bit,不能算真正的16bit数据。

关键词:鼠标

赞助商链接: