其實從開始我對pci卡是一竅不通的,硬件還好說,軟件驅(qū)動程序更是一頭霧水,由于我的pci卡是要在windows98操作系統(tǒng)下應(yīng)用的,所以必須編寫pci卡的驅(qū)動程序,支持windows98下pnp硬件的驅(qū)動程序一般可以編程vxd。如果想為了以后的2k平臺兼容就最好編wdm,因為windows2k不支持vxd,而且以后的發(fā)展wdm肯定要代替vxd了。不過由于我找到的資料基本上都是介紹vxd的,感覺vxd的技術(shù)好像更成熟一點,編的人更多一點,所以偷了一下懶(慚愧),就沒有去研究wdm,就選擇了vxd。
我的pci卡其實很簡單,僅僅在本地端接了一個遙測信號的處理系統(tǒng)。
先說說硬件吧,其實按照正常的pci卡開發(fā)過程,仔細閱讀pci規(guī)范是很重要的,但是由于時間比較短,我也沒有很大的耐性看那些破規(guī)范,也就稍稍了解了一下。現(xiàn)在市場上有許多的專用的pci規(guī)范接口芯片,這些芯片提供的pci接口完全符合規(guī)范,具體符合的規(guī)范版本可以參看具體的芯片所以即使開發(fā)者不是很了解規(guī)范的具體細則,也可成功的設(shè)計pci卡。也就是可以達到傻瓜及設(shè)計。在連線上只要將對應(yīng)的引腳連在總線上就可以了,在連線時要注意pci規(guī)范中提到了信號用的反射波信號,所以驅(qū)動的信號只用了要求電壓的一半,另一半靠反射來提升。所以對信號線的長度有要求:64位卡的32位信號具備的最大連線長度是1500mil,64位擴展信號的附加信號的連線長度最大為2000mil,pci clk的長度為2500mil+/-100mil,如果不夠長度可以多繞幾圈。
還有一個要注意的是pci信號中prsnt1和prsnt2,開始我對這兩個信號一直不是很清楚,清華bbs上的精華區(qū)說得也是含糊,后來師兄devilface告訴我的prsnt1和prsnt2兩者必須有一個接gnd,否則系統(tǒng)肯定找不到卡,主板就是靠這兩個信號來判斷這個插槽上是否有卡,而其接法同pci卡使用的功率有關(guān)具體的含義如下(0 表示懸空,1表示接地):
prsnt1 prsnt2 含義
0 0 no card
0 1 15w
1 0 25w
1 1 7.5w
另外pci卡上最好在從槽上引的電源上多加幾個電容,所有電源都必須退藕一般規(guī)范推薦pci卡做4層板,但是我只做了2層,其實無所謂,只要2層布得開,沒必要布4層,不過我布線的時候還是費了一點功夫,用specctra布了5,6次,為研究室節(jié)省開支嘛。ㄒ菍(dǎo)師看見了該多感動呀。
pci規(guī)范規(guī)定了5v和3.3v兩種電氣規(guī)范,我們一般的機器上都是5v規(guī)范的插槽當(dāng)然也不乏3.3v的。所以我做的是5v的卡,不要以為5v的插槽上就得不到3.3v,一樣可以提供3.3v的。
前面提到了pci接口芯片,現(xiàn)在pci接口芯片技術(shù)已經(jīng)比較成熟了,介紹一點我知道的:
AMCC:早期有5920,后來5933風(fēng)靡國內(nèi),早期的PCI接口都是用這做的amcc最近又推出了5935,估計改了一些5933的bug,我看它的文檔幾乎與 5933一致.
plx :pci接口芯片的老大了.
9030,9052,9050:slave芯片
9050,9052面向isa卡轉(zhuǎn)pci的市場.
9030為嵌入式專門設(shè)計.他們的文檔不過100頁左右.不難
價錢便宜.不過170~190.
9054,9080,9060
9060是最早的32位master的pci控制芯片.
9080取代9060;9054可能更成熟一些.(?)
iop480.
好東西呀!帶sdram接口和嵌入cpu,只是開發(fā)起來困難比較大. 自己直接去plx的網(wǎng)站看看.www.plxtech.com,我就知道這么點,大家可以補充。
我用的是9052,還是那句話,用的人多,技術(shù)成熟,遇到問題了可以到bbs發(fā)問。我就喜歡撿現(xiàn)成的,不服你就說嘛。。!
9052的機理比較簡單,它內(nèi)部提供了兩種配置寄存器。一種叫做pci configuration registers ,這就是我們常說的pci配置空間另外一個叫 local configuration registers,它提供了配置本地端的一些信息。這里提到了本地端,說一說。其實9052就相當(dāng)于一個橋,連接pci卡的本地端的芯片到pci總線上,將pci指令例如讀寫某個寄存器、內(nèi)存、io翻譯到本地端。9052本地端提供了地址線26根(27:2)和數(shù)據(jù)線32根,還有LBE4根,可以翻譯成不同的地址線,太麻煩了我就不詳細說了,反正我用的LOCAL端是8位數(shù)據(jù),在這種模式下LBE1和LBE0提供地址線[1:0]。PCI配置寄存器提供了6個基地址寄存器,這些基地址都是在系統(tǒng)中的物理地址其中BASE1 和BASE2 都是用來訪問LOCAL 配置寄存器的基地址,BASE1是映射到內(nèi)存的基地址,BASE2是映射到IO的基地址。所以可以通過內(nèi)存和IO來訪問LOCAL 配置寄存器。
BASE2~5四個空間提供了訪問本地端所接的4個芯片(當(dāng)然可以少于4個),它們將本地端的芯片通過本地端地址(在LOCAL配置寄存器中設(shè))翻譯成PCI的地址,也就是將本地的芯片映射到系統(tǒng)的內(nèi)存或io口。是不是很簡單呀?這樣使用你的程序操作這一段內(nèi)存(或io)實際上就是對本地的芯片操作了。我使用的是內(nèi)存映射,本地端的芯片地址例如是0x0cc000,將此地址放入local配置寄存器的相應(yīng)位置(由于有四個空間,可以選擇任意一個空間來對應(yīng)此芯片),我用的是space0,還要配置此空間的大小,這樣在pci總線端系統(tǒng)會根據(jù)這個大小分配相應(yīng)的內(nèi)存空間(或io)供9052使用來映射local 上接的芯片。而系統(tǒng)分配的內(nèi)存空間的信息會寫入pci配置寄存器中,只要讀出來就可以了。9052工作時還需要一個配置芯片eeprom,plx公司推薦了93cs46,這個eeprom比較好買,在中發(fā)一層就有。eeprom會在pci卡上電的時候配置9052,主要配置了pci卡的vendorID和deviceID,這是系統(tǒng)用來標(biāo)識pci卡的,很重要,你的程序就靠這個標(biāo)識來找到pci卡。還配置了local端的4個space的local基地址和大小,以及每個space的其它一些參數(shù)(這里不說了)。eeprom的內(nèi)容很重要的,如果沒寫對很容易就出問題我開始老調(diào)不出來就是因為eeprom中的配置寫錯了,郁悶了好長一段時間喲!其實硬件本身很容易連,只要對應(yīng)的腳相連就可以了,注意本地芯片如果不申請總線控制的話,9052的lhold信號一定要接gnd,還有如果本地芯片沒有提供irdy#信號,9052的對應(yīng)腳也必須接地否則你一讀此芯片,系統(tǒng)就會死機,永遠等待那個irdy#信號有效才讀取數(shù)據(jù)。
再說軟件驅(qū)動,我說過我編的是vxd,用vtools編的,可以用vc++直接編譯成vxd文件,至于為什么必須用vxd驅(qū)動我想就不用說了。我的vxd的主要任務(wù)就是在系統(tǒng)中找到我的pci卡,并讀出本地芯片所映射的內(nèi)存物理地址,在windows系統(tǒng)中,用戶程序不能直接訪問物理地址,只能使用線性地址,所以vxd還有做的一件事就是將物理地址轉(zhuǎn)換成線性地址供win app使用。 vxd查找pci卡就是靠搜索vendorID和deviceID,它是通過依次搜索總線號和設(shè)備號(具體什么意思我也說不清,反正知道就行了),看是否有符合指定的vendorID和deviceID,如果符合則認(rèn)為找到了pci卡的配置空間,因為配置空間的第一個雙字就是vendorID和deviceID.然后向下面的地址依次讀就可以讀出pci卡的配置空間其他信息,包括space0映射的內(nèi)存基地址。讀出此地址來再進行物理地址到線性地址的轉(zhuǎn)換,就可以完全供win app使用了(可以通過指針訪問),來讀取9052 local上掛的芯片了。





