2015-09-16
系統的所有pci裝置記錄在/sys/bus/pci/devices目錄下面:
可以看到0000:00:11.0下連線有0000:02:00.0, 0000:02:01.0, 0000:02:02.0, 0000:02:03.0四個裝置。
所以,通過分析/sys/bus/pci/devices目錄結構,就可以簡單生成pci裝置的樹形結構。
具體過程如下:
1.讀取所有的pci位址(/sys/bus/pci/devices)
承載pci資訊的結構體定義如下:
/*****************************/
typedef struct _pci_data st_pci_data;
typedef struct _pci_node
st_pci_node;
/****************************/
intget_all_pci_devices( st_pci_node **stpppcis )
while( ( stpentry = readdir( fpdir ) ) != null )
/* init the pci node */
init_pci_node( stppcitmp );
/* ** fill the pci node
** pci address(domain:bus:slot.function)
** pci domain bus slot function
*/strcpy( stppcitmp->data.capciaddr, stpentry->d_name );
split_pci_addr( stppcitmp->data.capciaddr, stppcitmp->data.capcidomain,
stppcitmp->data.capcibus, stppcitmp->data.capcislot, stppcitmp->data.capcifunction );
get_pci_vendor_id( stppcitmp->data.capciaddr, stppcitmp->data.capcivendorid );
get_pci_product_id( stppcitmp->data.capciaddr, stppcitmp->data.capciproductid );
get_pci_class_id( stppcitmp->data.capciaddr, stppcitmp->data.capciclassid );
get_pci_class_desc( stppcitmp->data.capciclassid, stppcitmp->data.capciclassdesc );
if( stpcur == null )
*stpppcis = stppcitmp;
else
stpcur->next = stppcitmp;
stpcur = stppcitmp;
}return 0;
}
2.再分別讀取單個pci位址下的目錄節點,和步驟1下的pci位址比較,將找到的pci位址,作為當前pci位址的子節點
}3.將生成的pci樹輸出到xml檔案
int
print_pci_xml_file( char *cpxmlfilename, st_pci_node *stppcis )
intprint_pci_xml_node( xmlnodeptr pxmlparent, st_pci_node *stppcis )
return 0;
}
4.執行結果如下:
5.源**
PCI裝置的電源管理
pci裝置的電源管理包括系統pm和runtime pm。當進行系統電源管理時,比如 echo mem sys power state,系統下所有的註冊了系統電源管理介面的裝置都被要求執行各自的介面函式。runtime pm僅作用於某一特定裝置。struct dev pm ops 這裡對部分函式進行簡...
使用Xilinx SDK生成裝置樹
章節描述 介紹如何通過sdk生成裝置樹,以用於arm linux環境。開發環境 介紹 device tree是一種描述硬體的資料結構,由一系列被命名的結點 node 和屬性 property 組成,而結點本身可包含子結點。所謂屬性,其實就是成對出現的name和value。在device tree中,...
pci裝置probe函式的呼叫時機
int init wwinit void else ret pci register driver wwcodec if ret else return 0 以上3處列印資訊,在安裝wwcode.ko模組的時候,列印出來的資訊顯示 wwcodec 0.1.1 dev 14 03 12 1405 ww...