uboot下IXP425 PCI驅動程式設計

來源:互聯網
上載者:User
摘要:
本文說明了IXP425 PCI控制器的結構和操作方法,然後說明了如何在UBOOT下為IXP425編寫PCI驅動程式,最後說明了怎樣驅動PCI網卡EEPRO-100。

一 引言
UBOOT是sourceforge下的一個開放原始碼的項目,它是Universal Bootloader的簡寫,也就是通用啟動程式的意思。通過選取不同的編譯選項,可以引導多種處理器啟動,如PowerPC,ARM,MIPS,X86等。
IXP425是Intel公司推出的一款使用XScale核的CPU,其內部有三個網路處理引擎,被廣泛的運用於網路裝置中。要使用網路處理引擎必須使用Intel提供的庫,但由於著作權的原因,UBOOT並沒有提供對網路處理引擎的支援,因此其

不能使用網路。為了方便調試,我們為UBOOT編寫了PCI的驅動程式,這樣就能使用PCI網卡訪問網路。
本文說明如何編寫IXP425的PCI驅動程式,並以EEPRO-100網卡為例,說明了如何驅動PCI網卡。

二 PCI配置空間
  每個PC I 裝置有3 種物理空間: 配置空間、Memory空間和I/O 空間。配置空間是長度256 位元組的一段連續空間,其中前64個位元組為Header( 頭標) , 其餘192 位元組為裝置相關資訊。在64 位元組的Header 中, 前16 位元組的定義是確定的,後48位元組的具體含義因裝置而異,圖1為配置空間的頭標區。

圖1
  配置空間中的一個重要部分是基地址寄存器(Base Address Register) , 它的內容是PCI 裝置的地址空間映射到系統地址空間的起始物理地址。其中,bit0= 1 表示I/O 空間映射, bit0= 0 表示儲存空間空間映射。所有PC I 裝置必須實現儲存空間空間映射或I/O空間映射。通過向BAR 寫全1 然後讀取相關寄存器即可確定所需地址空間的大小。

三 IXP425 PCI控制器
IXP425內部整合了PCI控制器,既支援在主模式也支援在從模式下工作,具體的工作模式可以在PCI控制狀態寄存器的Bit0上讀取,這一位在系統重起時由擴充匯流排的Bit1設定,為唯讀,若該位為1則IXP425作為主裝置,若該位為0

則IXP425位從裝置。
在IXP425中,PCI的寄存器可分為兩類。一類可以直接由IXP425內部的AHB匯流排訪問,和記憶體統一編址,提供了訪問PCI配置空間的介面。另一類寄存器是PCI配置空間寄存器,它們符合PCI匯流排標準,其內容在第二節中介紹過。
3.1 配置方法
對於IXP425的PCI配置空間和外部裝置的PCI配置空間,訪問的方法是不同的,下面將分別說明。
a 訪問IXP425配置空間
IXP425內部的PCI配置空間不能由AHB匯流排訪問,IXP425提供了pci_crp_ad_cbe,pci_crp_wdata,pci_crp_rdata三個寄存器來完成對其內部PCI配置空間的訪問。pci_crp_ad_cbe紀錄要訪問的地址和命令,pci_crp_wdata,

pci_crp_rdata分別為資料寫入寄存器和資料讀取寄存器。訪問的過程如下:
1 在pci_crp_ad_cbe中寫入要操作的命令和要訪問寄存器的位移量
2 如果要做寫入操作,向pci_crp_wdata中寫入資料;如果要作讀取操作,從pci_crp_rdata中讀取資料。

b 訪問外部裝置PCI配置空間
pci_np_ad,pci_np_cbe,pci_np_wdata,pci_np_rdata,這四個寄存器為一組non_pre_fetch寄存器,它們提供了訪問外部PCI配置空間的方法。它們屬於上面介紹的第一類寄存器,可以由AHB匯流排直接存取,編址分別為0xC0000000,0xC0000004,0xC0000008和0xC000000C。pci_np_ad是PCI匯流排地址寄存器,提供了訪問外部PCI配置空間的地址。pci_np_cbe是PCI命令及位元組控制寄存器,它將對外部PCI空間作相應的操作,這些操作包括讀/寫配置空間,讀/寫Memory空間及讀/寫I/O空間等,在配置的過程中主要是完成對配置空間的讀寫,Memory空間和I/O空間可以在配置完成後由CPU迸發的讀寫。pci_np_wdata,pci_np_rdata分別為需要讀入或寫入的資料,它們將被儲存在這

兩個寄存器中。對外部PCI空間的訪問可分為如下的三個步驟:
1 在pci_np_ad中寫入需要訪問寄存器的地址,格式2示:

圖2
PCI匯流排可以在模式0和1兩種模式下工作,但IXP425隻支援在模式0下工作,所以這裡只說明了在模式0下的操作。這裡要特別指出的是,選定特定的PCI裝置需要把ID_SEL引腳置高電平,其功能如同片選訊號,高電平的選擇可以在pci_np_ad的11到31位完成,如串連外部裝置ID_SEL引腳的為地址線31位則應該把第31位置1。
2 在pci_np_cbe寫入要操作的命令
3 如果要寫入資料,就在pci_np_wdata中寫入資料;如果要讀取資料,則可以在pci_np_rdata中讀取
3.2 AHB地址與PCI地址間的轉換
在進行Memory讀/寫和I/O讀寫時,可以用地址轉換迸發的進行,下面說明了AHB地址和PCI地址間的轉換關係。
a AHB空間到PCI空間的轉化
在IXP425中,PCI的地址空間被分為四個視窗,共為64M,如表1示:
起始地址 結束位址
視窗一 ( 16MB ) 0x48000000 0x48FFFFFF
視窗二 ( 16MB ) 0x49000000 0x49FFFFFF
視窗三 ( 16MB ) 0x4A000000 0x4AFFFFFF
視窗四 ( 16MB ) 0x4B000000 0x4BFFFFFF
表1
當AHB匯流排上有如上的地址時,將會通過寄存器PCI_PCIMEMBASE轉換。該寄存器被分為4個部分,每部分紀錄了轉換後的基地址。例如若PCI_PCIMEMBASE的值為0x12345678,若AHB匯流排地址為0x48012345,轉換後的PCI地址為0x12012345。若AHB匯流排地址為0x4A005678,怎PCI匯流排地址為0x56005678。
b PCI地址到AHB地址的轉化
PCI地址到AHB地址的轉換通過PCI_AHBMEMBASE, PCI_AHBIOBASE,及在配置空間中的BAR0-5幾個寄存器來控制。寄存器PCI_AHBMEMBASE被分為四部分,對應BAR0-3四個基底位址暫存器,負責PCI Memory周期的地址轉換。假設PCI_AHBMEMBASE的值為0x01020304,BAR0值為0x20000000,BAR1的值為0x21000000, BAR2值為0x22000000,BAR3值為0x23000000。當PCI匯流排地址為0x21001234時,它將被映射到BAR1上,對應得AHB地址就為0x02001234。
寄存器PCI_AHBIOBASE和BAR5對應,PCI_AHBIOBASE紀錄I/O在AHB匯流排上的基址,而BAR5紀錄在PCI匯流排上的基址,它們的轉換方法與上面Memory地址的轉換方法相同。而落在BAR4範圍內的地址將被直接轉換到IXP425內的一個寄存器PCI Doorbell Register。

四 PCI驅動程式
4.1 PCI控制器初始化
由於我們使用的目標板IXDP425中,IXP425工作在主模式下,因此這裡只介紹主模式下的初始化過程。其過程如下:
1 為PCI控制器分配引腳。除了PCI控制器本身的串連外,IXP425還使用了GPIO的一部分引腳,這包括GPIO14時鐘引腳,GPIO13 RESET引腳,GPIO8-11中斷引腳。
2 配置寄存器PCI_AHBMEMBASE, PCI_AHBIOBASE,PCI_PCIMEMBASE,以及IXP425的Base Address Register,為IXP425內部的AHB與PCI地址轉換做初始化。
3 掃描外部裝置。通過在PCI匯流排上掃描來發現PCI裝置,若在匯流排上讀取到有裝置ID則表示有裝置存在,這是還應該讀取裝置的Base Address Register,以確定裝置儲存空間的大小。
4 為每個裝置分配基地址。通過掃描得到的儲存空間大小為外圍裝置計算統一的AHB匯流排上的基址,並把計算得到的基址寫入相應PCI裝置的Base Address Register。
4.2 串連網路卡驅動程式
在U-BOOT中已經提供了EEPRO-100的驅動程式,只要把它同PCI的驅動程式串連就可以使用。
1 加入編譯選項。在include/configs/ixdp425.h中加入#define CONFIG_EEPRO100,這樣U-BOOT在編譯時間就會加上網卡部分的程式。
2 串連網路卡驅動程式。在網卡的驅動程式中使用了兩個宏來完成AHB地址和PCI地址的轉換,bus_to_phys(a)提供了PCI地址到AHB地址的轉換,phys_to_bus(a)提供了AHB地址到PCI地址的轉換。這兩個宏內部使用了一個結構表示第三節中所述寄存器的值。結構如下:
struct pci_region {
unsigned long bus_start; /* Start on the bus */
unsigned long phys_start; /* Start in physical address space */
unsigned long size; /* Size */
unsigned long flags; /* Resource flags */
};
在結構中定義了PCI地址的起始地址,AHB地址的起始地址,儲存空間大小和資源類型(Memory或I/O)等資訊。在初始化中對這個結構賦值,然後調用函數pci_register_hose(hose);向系統註冊就可完成網路卡驅動程式的串連。

五 結論
本文介紹了如何為IXP425在U-BOOT下添加PCI驅動程式,說明了IXP425 PCI控制器的工作方式,最後說明了怎樣把PCI網卡EEPRO-100加入到U-BOOT中。
到這裡,基本可以工作起來了(PCI介面),當IXP455要訪問RTL8139的MAR0,處於0x08。那麼軟體只需要讀取0x48000008,到PCI上變成0xC1000008,而RTL8139的BAR是0xC1000000,要對這個基地址作出翻譯,最後就訪問到了0x8,MAR0寄存器。

至此,PCI的傳輸通路全部打通了,下面簡單介紹一下PCI的中斷和DMA傳輸資料。

引用於"隨點BBS" "2beanet":www.2beanet.com/bbs http://www.2beanet.com/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.