⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pciinfo.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 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 + -