2007-01-19 23:18:00
caimouse
閱讀數 4805
更多分類專欄:
嵌入式軟體開發
繼續來分析
pci裝置的搜尋過程,下面就是通過呼叫搜尋程式來實現的。
for(i = 0, pb = _pci_head; i < pci_roots; i++, pb = pb->next)
接著去看看函式
_pci_scan_dev
的實現:
static
void
_pci_scan_dev
(struct pci_device *dev, int bus, int device, int initialise)
}
上面是根據
pci的匯流排定義,可以知道它最多有
32個裝置,因此就需要把這
32個裝置進行列舉。下面的搜尋過程是通過
pci的標識來進行的,因為每個
pci插槽存在裝置時,它的
id不為
0xffff ffff
,根據這樣的特徵,就可以知道是否存在
pci裝置了。
static
void
_pci_query_dev
(struct pci_device *dev, int bus, int device, int initialise)
if (id == 0 || id == 0xffffffff)
上面判斷是否存在
pci裝置,如果不存在就返回。
misc = _pci_conf_read(tag, pci_bhlc_reg);
if (pci_hdrtype_multifn(misc))
_pci_query_dev_func (dev, tag, initialise);}}
else
上面讀取
pci資訊,並分類
pci裝置,然後儲存到
pci裝置列表裡。
}找到所有裝置之後,就需要把
pci的匯流排頻寬分配,並分別分配裝置的記憶體對映空間。通過下面的程式實現的:
static
void
_setup_pcibuses
(int initialise)
def_ltim = 1;
}else
/* convert to cycle count */
def_ltim = def_ltim * 33 / 4;
}/* most devices don't implement bottom three bits */
def_ltim = (def_ltim + 7) & ~7;
max_ltim = (max_ltim + 7) & ~7;
pb->def_ltim = min (def_ltim, 255);
pb->max_ltim = min (max (max_ltim, def_ltim), 255);}}
sbd_display ("pcir", chkpnt_pcir);
_pci_hwreinit ();
/* setup the individual device windows */
sbd_display ("pciw", chkpnt_pciw);
for(i = 0, pd = _pci_head; i < pci_roots; i++, pd = pd->next)
}到這裡,就已經把
pci區域性匯流排上的裝置配置完成。
pci匯流排配置是非常複雜的,不但有眾多的裝置,還有記憶體空間的分配,還有裝置的
dma選擇,還有橋裝置在上面的轉換等等。
繼續來分析
pci裝置的搜尋過程,下面就是通過呼叫搜尋程式來實現的。
for(i = 0, pb = _pci_head; i < pci_roots; i++, pb = pb->next)
接著去看看函式
_pci_scan_dev
的實現:
static
void
_pci_scan_dev
(struct pci_device *dev, int bus, int device, int initialise)
}
上面是根據
pci的匯流排定義,可以知道它最多有
32個裝置,因此就需要把這
32個裝置進行列舉。下面的搜尋過程是通過
pci的標識來進行的,因為每個
pci插槽存在裝置時,它的
id不為
0xffff ffff
,根據這樣的特徵,就可以知道是否存在
pci裝置了。
static
void
_pci_query_dev
(struct pci_device *dev, int bus, int device, int initialise)
if (id == 0 || id == 0xffffffff)
上面判斷是否存在
pci裝置,如果不存在就返回。
misc = _pci_conf_read(tag, pci_bhlc_reg);
if (pci_hdrtype_multifn(misc))
_pci_query_dev_func (dev, tag, initialise);}}
else
上面讀取
pci資訊,並分類
pci裝置,然後儲存到
pci裝置列表裡。
}找到所有裝置之後,就需要把
pci的匯流排頻寬分配,並分別分配裝置的記憶體對映空間。通過下面的程式實現的:
static
void
_setup_pcibuses
(int initialise)
def_ltim = 1;
}else
/* convert to cycle count */
def_ltim = def_ltim * 33 / 4;
}/* most devices don't implement bottom three bits */
def_ltim = (def_ltim + 7) & ~7;
max_ltim = (max_ltim + 7) & ~7;
pb->def_ltim = min (def_ltim, 255);
pb->max_ltim = min (max (max_ltim, def_ltim), 255);}}
sbd_display ("pcir", chkpnt_pcir);
_pci_hwreinit ();
/* setup the individual device windows */
sbd_display ("pciw", chkpnt_pciw);
for(i = 0, pd = _pci_head; i < pci_roots; i++, pd = pd->next)
}到這裡,就已經把
pci區域性匯流排上的裝置配置完成。
pci匯流排配置是非常複雜的,不但有眾多的裝置,還有記憶體空間的分配,還有裝置的
dma選擇,還有橋裝置在上面的轉換等等。
龍芯軟體開發(23) PCI裝置初始化
2007 01 11 00 05 00 caimouse 閱讀數 5217 更多分類專欄 嵌入式軟體開發 目前在個人電腦裡,主機板上使用區域性匯流排技術把不同的裝置連線在一起,這樣就可以隨時新增裝置到匯流排上。比如主機板上一般都有很多 pci插槽,可以插入顯示卡 音效卡 網絡卡以及符合 pci匯流排...
龍芯軟體開發(24) PCI裝置初始化2
在彙編的 裡,已經進行了串列埠初始化,在這裡更進一步初始化串列埠,它是通過呼叫下面的 實現的 define superio cfg reg 0x85 上面定義南橋裡串列埠暫存器位址。static void initserial void 接著來看初始化鍵盤,static void init keyb...
龍芯軟體開發(25) PCI裝置初始化3
上面繼續初始化南橋之後,再接著下來,就要初始化 pci匯流排上其它的裝置了。看下面的 cpu configcache 上面重新配置龍芯 2e的快取。pci businit 1 pci bus initialization 上面繼續初始化 pci匯流排上的裝置,這個函式裡要初始化完成所有其它連線到 p...