龍芯軟體開發(25) PCI裝置初始化3

2021-08-22 06:39:47 字數 3913 閱讀 1379

上面繼續初始化南橋之後,再接著下來,就要初始化

pci匯流排上其它的裝置了。看下面的**:

cpu_configcache

();

上面重新配置龍芯

2e的快取。

_pci_businit(1);/* pci bus initialization */

上面繼續初始化

pci匯流排上的裝置,這個函式裡要初始化完成所有其它連線到

pci匯流排上的裝置。接著看這個函式的**如下:

void

_pci_businit

(int

init)

上面獲取

pci顯示值。

/* intialise the pci bridge */

if (/*init*/ 1)

上面實現

pci的分配空間,主要設定北橋。以便後面可以搜尋到所有

pci的裝置。

if(monarch_mode)

for(i = 0, pb = _pci_head; i

< pci_roots; i++, pb = pb->next)

上面實現所有

pci裝置的列舉。由於

pci插槽上有很多裝置,並且是即插即用,並不能確定那個裝置一定存在,所以只能列舉所有裝置。

_setup_pcibuses(init);

上面把發現的

pci裝置全部初始化。 }

}下面是

pci函式

_pci_hwinit

初始化實現:

int_pci_hwinit

(initialise, iot, memt)

intinitialise;

bus_space_tag_t

iot;

bus_space_tag_t

memt;

上面判斷是否需要初始化,如果不需要分配

pci的鍊錶,就返回去。

pci_local_mem_pci_base = pci_local_mem_pci_base; /*

*allocate and initialize pci bus heads. */

/** pci bus 0 */

pd = pmalloc(sizeof(struct

pci_device));

pb = pmalloc(sizeof(struct

pci_bus));

if(pd == null || pb == null)

上面分配乙個

pci鍊錶的節點,由於

pci匯流排上的裝置是可變的,只能使用鍊錶來儲存裝置資訊。同時還判斷記憶體是否分配成功。

pd->pa.pa_flags = pci_flags_io_enabled | pci_flags_mem_enabled;

上面設定使用

io和記憶體空間。

pd->pa.pa_iot = pmalloc(sizeof(bus_space_tag_t));

pd->pa.pa_iot->bus_reverse = 1;

pd->pa.pa_iot->bus_base = bonito_pciio_base_va;

上面設定io的

tag配置。

//printf("pd->pa.pa_iot=%p,bus_base=0x%x/n",pd->pa.pa_iot,pd->pa.pa_iot->bus_base);

pd->pa.pa_memt = pmalloc(sizeof(bus_space_tag_t));

pd->pa.pa_memt->bus_reverse = 1;

//pd->pa.pa_memt->bus_base = 0xa0000000; /* pci memory start from 0x10000000 */

pd->pa.pa_memt->bus_base = 0xb0000000; /* pci memory start from 0x00000000 */

上面設定記憶體空間。

pd->pa.pa_dmat = &bus_dmamap_tag;

上面設定

dma配置。

pd->bridge.secbus = pb;

_pci_head = pd;

上面儲存

pci裝置。

#ifndef

new_pci_window

/* reserve first window for vga mem */

pb->minpcimemaddr= pci_mem_space_pci_base+0x04000000;

pb->nextpcimemaddr = pci_mem_space_pci_base+bonito_pcilo_size;

#else

pb->minpcimemaddr= pci_mem_space_pci_base;

pb->nextpcimemaddr = pci_mem_space_pci_base+ 0x0a000000;

#endif

pb->minpciioaddr= pci_io_space_base+0x000a000;

pb->nextpciioaddr = pci_io_space_base+ bonito_pciio_size;

pb->pci_mem_base = bonito_pcilo_base_va;

pb->pci_io_base = bonito_pciio_base_va;

pb->max_lat = 255;

pb->fast_b2b = 1;

pb->prefetch = 1;

pb->bandwidth = 0x4000000;

pb->ndev = 1;

_pci_bushead = pb;

_pci_bus[_max_pci_bus++] = pd;

上面儲存

pci匯流排配置。

bus_dmamap_tag._dmamap_offs = 0;

#ifndef

new_pci_window

/*set bonito register; first windows for 0-0x4000000 pci mem */

bonito_pcimap =

bonito_pcimap_win(0, /*pci_mem_space_pci_base+*/0x00000000) |

bonito_pcimap_win(1, pci_mem_space_pci_base+0x04000000) |

bonito_pcimap_win(2, pci_mem_space_pci_base+0x08000000) |

bonito_pcimap_pcimap_2;

#else

bonito_pcimap = (pci_mem_space_pci_base >>27) | (((pci_mem_space_pci_base + 0x08000000) >>25)<<5);

#endif

bonito_pcibase0 = pci_local_mem_pci_base;

bonito_pcibase1 = pci_local_mem_isa_base;

bonito_pcibase2 = pci_local_reg_pci_base;

/* pci base0/1 can access 256m sdram */

bonito_pcimembasecfg = 0;

上面設定了北橋裡的

pci配置記憶體空間分配。

return(1); }

這裡的**,先從北橋裡分配

pci的

io空間和記憶體空間,然後通過列舉所有記憶體空間來發現

pci的裝置,最後對於發現的裝置進行配置,並啟動相應的裝置。

後面再仔細地檢視怎麼樣實現查詢

pci裝置的發現和

pci裝置配置。

龍芯軟體開發(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...

龍芯軟體開發(26) PCI裝置初始化4

2007 01 19 23 18 00 caimouse 閱讀數 4805 更多分類專欄 嵌入式軟體開發 繼續來分析 pci裝置的搜尋過程,下面就是通過呼叫搜尋程式來實現的。for i 0,pb pci head i pci roots i pb pb next 接著去看看函式 pci scan d...