現在的有線光學鼠標中一般都有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數據。