📄 pciinfo.cpp
字号:
/*! \file mypciinf.cpp \brief Get PCI Information Copyright (c) 2004 Yamami All rights reserved. License=MIT/X Licnese \author Yamami \version $Revision: 1.4 $ \date create:2004/05/09 update:$Date: 2004/10/10 19:06:45 $*/#include <monapi.h>#include <monapi/messages.h>#include <monapi/CString.h>#include "pciinfo.h"using namespace MonAPI;int MonaMain(List<char*>* pekoe) { int reti; dword c_deviceid; dword InValue; word Vendor; word Device; syscall_get_io(); CString bundlePath = MonAPI::System::getBundlePath(); //pciinfo僼傽僀儖傪僆乕僾儞 monapi_cmemoryinfo* pciinfData = monapi_call_file_decompress_bz2_file(bundlePath + "/" + PCIINFO_FILE, MONAPI_TRUE); //僄儔乕張棟 if(pciinfData == NULL){ printf("PCI DATA FILE OPEN ERROR !!!\n"); } printf("PCI Information !!!\n"); //僶僗斣崋0偵偮偄偰丄僨僶僀僗斣崋傪0乣31偺偦傟偧傟偵偮偄偰丄儀儞僟乕ID傪撉傒弌偡 for(c_deviceid = 0; c_deviceid < 32 ; c_deviceid++ ){ reti = lookup_pci_hw( c_deviceid , 0, 0 ,0, &InValue); if (InValue != 0xFFFFFFFF){ //儀儞僟乕ID偺庢摼 Vendor = InValue & 0x0000FFFF; Device = InValue >> 16; //儀儞僟乕柤徧/僨僶僀僗柤徧偺庢摼 CString VendorName; CString DeviceName; CString Dummy = getPciInfName(pciinfData->Data , InValue , &VendorName , &DeviceName); printf("DeviceNo=%d , Vendor=%x VendorName=%s Device=%x DeviceName=%s \n" ,c_deviceid , Vendor , (const char*)VendorName , Device , (const char*)DeviceName ); } } monapi_cmemoryinfo_dispose(pciinfData); monapi_cmemoryinfo_delete(pciinfData); return 0;}/*! \brief lookup_pci_hw PCI僨僶僀僗扵偟 \param dword deviceid [in] 僨僶僀僗斣崋 \param dword func [in] 僼傽儞僋僔儑儞斣崋 \param dword bus [in] 僶僗斣崋 \param dword regaddr [in] 儗僕僗僞傾僪儗僗 \param dword * InValue [OUT] 庢摼儗僕僗僞偺抣 \return int 寢壥 \author Yamami \date create:2004/05/15 update:2004/05/15*/int lookup_pci_hw( dword deviceid , dword func , dword bus , dword regaddr , dword *InValue){ dword outvalue; dword outport; dword inport; dword tmp; //printf("lookup_pci_hw !!!\n"); tmp = 0; //PCI CONFIG_ADDRESS儗僕僗僞偺抣愝掕 //bit0-1丗0偵屌掕 //bit2-7丗儗僕僗僞傾僪儗僗 //bit8-10丗婡擻斣崋 //bit11-15丗僨僶僀僗斣崋 //bit16-23丗僶僗斣崋 //bit24-30丗儕僓乕僽偱丄0偵屌掕 //bit31丗僀僱乕僽儖價僢僩偱丄1偵屌掕 //儗僕僗僞 價僢僩埵抲 31,30丒丒丒丒0(32價僢僩) //;僀僱乕僽儖價僢僩偲丄僶僗斣崋傪僙僢僩偡傞丅 outvalue = 0x8000; outvalue = outvalue | bus; outvalue = outvalue << 16; //僨僶僀僗斣崋丄婡擻斣崋愝掕 tmp = deviceid; tmp = tmp << 3; tmp = tmp + func; tmp = tmp << 8; outvalue = outvalue + tmp; tmp = 0; //儗僕僗僞傾僪儗僗偺巜掕 tmp = regaddr; tmp = tmp << 2; outvalue = outvalue + tmp; //I/O億乕僩偺巜掕 (0x0cf8丄32bit丄Read/Write壜) outport = PCI_CONFIG_ADDRESS_ADDR; //偙偙偱丄僨僶僢僌僾儕儞僩傪偟偰傒傞丅 //printf("Value= %x \n" , outvalue); //printf("Port= %x \n" , outport); outp32(outport,outvalue); //CONFIG_DATA儗僕僗僞乮0x0cfc乣0x0cff丄擟堄偺僒僀僘丄Read/Write壜乯 inport = PCI_CONFIG_DATA_ADDR; *InValue = inp32(inport); //僀僱乕僽儖價僢僩偺僋儕傾 outp32(outport,0); return 0;}/*! \brief IsLineSeparator 僙僷儗乕僞敾掕 \param char ch [IN] 僉儍儔僋僞 \return bool 僙僷儗乕僞暥帤側傜true 埲奜側傜false \author Tino巵 \date create:2004/06/111 update:2004/06/11*/inline bool IsLineSeparator(char ch){ return ch == '\r' || ch == '\n' || ch == '\0';}/*! \brief getPciInfName PCI忣曬柤徧(儀儞僟乕丄僨僶僀僗)忣曬庢摼 PCI儗僕僗僞抣 傪堷悢偵偲傝丄PCIINF.TXT 偐傜奩摉偡傞儀儞僟乕柤徧儀儞僟柤徧傪庢摼偡傞丅丅 \param byte* PciInfData [IN] PCI忣曬僨乕僞 \param dword InValue [IN] PCI儗僕僗僞抣(儀儞僟乕CD & 僨僶僀僗CD) \param CString& VendorName [OUT] 儀儞僟乕柤徧 \param CString& DeviceName [OUT] 僨僶僀僗柤徧 \return MonAPI::CString dummy(僟儈乕栠傝抣) \author Yamami \date create:2004/05/16 update:2004/06/11*/CString getPciInfName( byte* PciInfData, dword InValue , CString* VendorName , CString* DeviceName){ word Vendor; word Device; //儀儞僟乕ID偺庢摼 Vendor = InValue & 0x0000FFFF; Device = InValue >> 16; char VendorHex[5]; //儀儞僟乕CD奿擺梡 char DeviceHex[5]; //儀儞僟乕CD奿擺梡 sprintf(VendorHex, "%04X", Vendor); sprintf(DeviceHex, "%04X", Device); //NULL傑偱孞傝曉偟 while (*PciInfData != 0){ //printf("%c",*PciInfData); //傑偢丄儀儞僟乕柤徧傪扵偡 //儔僀儞僙僷儗乕僞側傜師偺暥帤傊 if (IsLineSeparator(*PciInfData)){ PciInfData++; } else if (strncmp((const char*)PciInfData, VendorHex, 4) == 0){ const char* ps = (const char*)(PciInfData + 5), * pe = ps; for (; !IsLineSeparator(*pe); pe++); //return CString(ps, pe - ps); //儀儞僟乕忣曬妋掕 *VendorName = CString(ps, pe - ps); //printf("%s\n",(const char*)VendorName); //儀儞僟乕柤埲壓偺僨僶僀僗傪専嶕偡傞丅 //1峴撉傒旘偽偟 for (; !IsLineSeparator(*PciInfData); PciInfData++); while (*PciInfData != 0){ if (IsLineSeparator(*PciInfData)){ PciInfData++; //儔僀儞僙僷儗乕僞偺師偑僞僽側傜丄僨僶僀僗忣曬 if (strncmp((const char*)PciInfData, "\t", 1) == 0){ PciInfData++; if (strncmp((const char*)PciInfData, DeviceHex, 4) == 0){ const char* ps = (const char*)(PciInfData + 5), * pe = ps; for (; !IsLineSeparator(*pe); pe++); *DeviceName = CString(ps, pe - ps); //printf("%s\n",(const char*)DeviceName); return "dumy"; } else{ //師偺僨僶僀僗傊 for (; !IsLineSeparator(*PciInfData); PciInfData++); } } //儀儞僟乕偑曄峏偝傟傞傑偱撉傫偱尒偮偐傜側偐偭偨傜丄晄柧偲偡傞丅 else{ *DeviceName = "???"; //printf("%s\n",(const char*)DeviceName); return "dumy"; } } else{ printf("tobashi\n"); //偳傟偵傕奩摉偟側偄峴偼撉傒旘偽偟 for (; !IsLineSeparator(*PciInfData); PciInfData++); } } } else{ //偳傟偵傕奩摉偟側偄峴偼撉傒旘偽偟 for (; !IsLineSeparator(*PciInfData); PciInfData++); } } // 晄柧 *VendorName = "???"; *DeviceName = "???"; return "???";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -