<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

pci卡設計心得

作者: 時(shí)間:2012-04-18 來(lái)源:網(wǎng)絡(luò ) 收藏
. 自己直接去plx的網(wǎng)站看看.www.plxtech.com,我就知道這么點(diǎn),大家可以補充。

我用的是9052,還是那句話(huà),用的人多,技術(shù)成熟,遇到問(wèn)題了可以到bbs發(fā)問(wèn)。我就喜歡撿現成的,不服你就說(shuō)嘛?。。?!

9052的機理比較簡(jiǎn)單,它內部提供了兩種配置寄存器。一種叫做pci configuration registers ,這就是我們常說(shuō)的pci配置空間另外一個(gè)叫 local configuration registers,它提供了配置本地端的一些信息。這里提到了本地端,說(shuō)一說(shuō)。其實(shí)9052就相當于一個(gè)橋,連接的本地端的芯片到pci總線(xiàn)上,將pci指令例如讀寫(xiě)某個(gè)寄存器、內存、io翻譯到本地端。9052本地端提供了地址線(xiàn)26根(27:2)和數據線(xiàn)32根,還有LBE4根,可以翻譯成不同的地址線(xiàn),太麻煩了我就不詳細說(shuō)了,反正我用的LOCAL端是8位數據,在這種模式下LBE1和LBE0提供地址線(xiàn)[1:0]。PCI配置寄存器提供了6個(gè)基地址寄存器,這些基地址都是在系統中的物理地址其中BASE1 和BASE2 都是用來(lái)訪(fǎng)問(wèn)LOCAL 配置寄存器的基地址,BASE1是映射到內存的基地址,BASE2是映射到IO的基地址。所以可以通過(guò)內存和IO來(lái)訪(fǎng)問(wèn)LOCAL 配置寄存器。
BASE2~5四個(gè)空間提供了訪(fǎng)問(wèn)本地端所接的4個(gè)芯片(當然可以少于4個(gè)),它們將本地端的芯片通過(guò)本地端地址(在LOCAL配置寄存器中設)翻譯成PCI的地址,也就是將本地的芯片映射到系統的內存或io口。是不是很簡(jiǎn)單呀?這樣使用你的程序操作這一段內存(或io)實(shí)際上就是對本地的芯片操作了。我使用的是內存映射,本地端的芯片地址例如是0x0cc000,將此地址放入local配置寄存器的相應位置(由于有四個(gè)空間,可以選擇任意一個(gè)空間來(lái)對應此芯片),我用的是space0,還要配置此空間的大小,這樣在pci總線(xiàn)端系統會(huì )根據這個(gè)大小分配相應的內存空間(或io)供9052使用來(lái)映射local 上接的芯片。而系統分配的內存空間的信息會(huì )寫(xiě)入pci配置寄存器中,只要讀出來(lái)就可以了。9052工作時(shí)還需要一個(gè)配置芯片eeprom,plx公司推薦了93cs46,這個(gè)eeprom比較好買(mǎi),在中發(fā)一層就有。eeprom會(huì )在上電的時(shí)候配置9052,主要配置了的vendorID和deviceID,這是系統用來(lái)標識pci卡的,很重要,你的程序就靠這個(gè)標識來(lái)找到pci卡。還配置了local端的4個(gè)space的local基地址和大小,以及每個(gè)space的其它一些參數(這里不說(shuō)了)。eeprom的內容很重要的,如果沒(méi)寫(xiě)對很容易就出問(wèn)題我開(kāi)始老調不出來(lái)就是因為eeprom中的配置寫(xiě)錯了,郁悶了好長(cháng)一段時(shí)間喲!其實(shí)硬件本身很容易連,只要對應的腳相連就可以了,注意本地芯片如果不申請總線(xiàn)控制的話(huà),9052的lhold信號一定要接gnd,還有如果本地芯片沒(méi)有提供irdy#信號,9052的對應腳也必須接地否則你一讀此芯片,系統就會(huì )死機,永遠等待那個(gè)irdy#信號有效才讀取數據。

再說(shuō)軟件驅動(dòng),我說(shuō)過(guò)我編的是vxd,用vtools編的,可以用vc++直接編譯成vxd文件,至于為什么必須用vxd驅動(dòng)我想就不用說(shuō)了。我的vxd的主要任務(wù)就是在系統中找到我的pci卡,并讀出本地芯片所映射的內存物理地址,在windows系統中,用戶(hù)程序不能直接訪(fǎng)問(wèn)物理地址,只能使用線(xiàn)性地址,所以vxd還有做的一件事就是將物理地址轉換成線(xiàn)性地址供win app使用。vxd查找pci卡就是靠搜索vendorID和deviceID,它是通過(guò)依次搜索總線(xiàn)號和設備號(具體什么意思我也說(shuō)不清,反正知道就行了),看是否有符合指定的vendorID和deviceID,如果符合則認為找到了pci卡的配置空間,因為配置空間的第一個(gè)雙字就是vendorID和deviceID.然后向下面的地址依次讀就可以讀出pci卡的配置空間其他信息,包括space0映射的內存基地址。讀出此地址來(lái)再進(jìn)行物理地址到線(xiàn)性地址的轉換,就可以完全供win app使用了(可以通過(guò)指針訪(fǎng)問(wèn)),來(lái)讀取9052 local上掛的芯片了。
具體的查找方式主要通過(guò)vxd程序中首先向io地址0xcf8寫(xiě)入最高位為1的雙字0x80000000,這個(gè)數的第16到23位代表了總線(xiàn)號,第11到15位代表了設備號,第8到14位代表了功能號,然后就可以讀取io地址0xcfc的雙字,如果有效的話(huà)說(shuō)明此pci配置空間地址上掛了一個(gè)pci卡,從0xcfc讀出的數則為此pci卡配置空間的第一個(gè)雙字,即vendorID和deviceID,我是將vendorID和deviceID一起使用的,即判斷讀出的雙字是否等于我在9052配置eeprom中標定的數,如果是則說(shuō)明找到了我的pci卡,如果不是則繼續找。向0xcf8寫(xiě)入的數+0x800,在繼續
讀0xcfc,依次下去,直到找到。如果當此數加到0x80ffff00時(shí)還沒(méi)找到(

關(guān)鍵詞: pci卡

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>