added ARMCpuInfo.cpp
This commit is contained in:
parent
22070d4169
commit
dc22dc4d85
@ -29,18 +29,112 @@ namespace hgl
|
||||
ENUM_CLASS_RANGE(Unknow,JLQ)
|
||||
};
|
||||
|
||||
struct SOCInfo
|
||||
enum class CpuArch
|
||||
{
|
||||
Unknow=0,
|
||||
|
||||
ARMv7, ///<ARMv7
|
||||
ARMv8, ///<ARMv8
|
||||
ARMv9, ///<ARMv9
|
||||
|
||||
MIPS,
|
||||
|
||||
X86_32,
|
||||
X86_64,
|
||||
|
||||
ENUM_CLASS_RANGE(Unknow,X86_64)
|
||||
};
|
||||
|
||||
enum class ARMArch
|
||||
{
|
||||
Unknow=0,
|
||||
|
||||
ARMv7, ///<ARMv7A
|
||||
ARMv8,
|
||||
ARMv8_2,
|
||||
ARMv9,
|
||||
ARMv9_2,
|
||||
|
||||
ENUM_CLASS_RANGE(Unknow,ARMv9_2)
|
||||
};
|
||||
|
||||
union ARMCpuName
|
||||
{
|
||||
//如A76,level为7,gen为6
|
||||
//A710,level为7,gen为10
|
||||
|
||||
struct
|
||||
{
|
||||
char family; ///<A或X
|
||||
uint8 level; ///<级别,目前就0,1,3,5,7
|
||||
uint8 gen; ///<代数
|
||||
bool ae:1;
|
||||
bool c:1;
|
||||
};
|
||||
|
||||
uint32 value;
|
||||
};
|
||||
|
||||
struct ARMCpuInfo
|
||||
{
|
||||
ARMCpuName name;
|
||||
|
||||
ARMArch arch;
|
||||
|
||||
bool support_32bit;
|
||||
bool support_64bit;
|
||||
};
|
||||
|
||||
const uint32 ParseARMCpuName(const char *); ///<根据字符串解晰ARM CPU名称ID
|
||||
|
||||
bool ParseARMCpuInfo(ARMCpuInfo *,const uint32 &cpu_name_id); ///<根据ARM CPU名字ID解晰CPU信息
|
||||
|
||||
enum class KryoArchLevel
|
||||
{
|
||||
Prime,
|
||||
Gold,
|
||||
Silver,
|
||||
|
||||
ENUM_CLASS_RANGE(Prime,Silver)
|
||||
};
|
||||
|
||||
/**
|
||||
* 高通 Kryo CPU核心信息<br>
|
||||
* 注:这里的频率单位为MHz,而且只是默认频率,实际频率可能会更高或更低
|
||||
*/
|
||||
struct KryoCpuCoreInfo
|
||||
{
|
||||
ARMCpuInfo arm; ///<对应的ARM处理器
|
||||
|
||||
uint core_count; ///<核心数量
|
||||
|
||||
uint base_freq; ///<基础频率
|
||||
uint boost_freq; ///<最高频率
|
||||
};
|
||||
|
||||
struct KryoCPUInfo
|
||||
{
|
||||
/**
|
||||
* Kryo CPU 型号
|
||||
* 旧系列直接使用数字型号,新的6gen1/7gen1/8gen1之类,直接写为601/701/801
|
||||
*/
|
||||
uint model;
|
||||
|
||||
KryoCpuCoreInfo core[size_t(KryoArchLevel::RANGE_SIZE)];
|
||||
};
|
||||
|
||||
struct SOCModel
|
||||
{
|
||||
SOCVendor vendor;
|
||||
char model[32];
|
||||
|
||||
public:
|
||||
|
||||
CompOperatorMemcmp(const SOCInfo &);
|
||||
CompOperatorMemcmp(const SOCModel &);
|
||||
};
|
||||
|
||||
/**
|
||||
* 根据收集到的SOC信息,解晰具体的SOC厂商和主要型号
|
||||
*/
|
||||
bool ParseSOCInfo(SOCInfo &,const char *);
|
||||
bool ParseSOCModel(SOCModel &,const char *);
|
||||
}//namespace hgl
|
||||
|
@ -126,7 +126,10 @@ SET(ANDROID_ABOUT_SOURCE ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/Android
|
||||
SOURCE_GROUP("Android\\Version" FILES ${ANDROID_ABOUT_SOURCE})
|
||||
|
||||
SET(SOC_SOURCE ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/SOC.h
|
||||
SOC.cpp)
|
||||
SOC/SOC.cpp
|
||||
SOC/ARMCpuInfo.cpp
|
||||
SOC/Kryo.cpp
|
||||
)
|
||||
|
||||
SOURCE_GROUP("SOC" FILES ${SOC_SOURCE})
|
||||
|
||||
|
134
src/SOC/ARMCpuInfo.cpp
Normal file
134
src/SOC/ARMCpuInfo.cpp
Normal file
@ -0,0 +1,134 @@
|
||||
#include<hgl/platform/SOC.h>
|
||||
#include<hgl/type/Map.h>
|
||||
|
||||
namespace hgl
|
||||
{
|
||||
const uint32 ParseARMCpuName(const char *str)
|
||||
{
|
||||
ARMCpuName arm_cpu_name;
|
||||
|
||||
if(!str)return(0);
|
||||
|
||||
arm_cpu_name.value=0;
|
||||
|
||||
const char *p=str;
|
||||
|
||||
if(*p=='A')arm_cpu_name.family='A';else
|
||||
if(*p=='X')arm_cpu_name.family='X';else
|
||||
return(0);
|
||||
|
||||
++p;
|
||||
|
||||
uint num;
|
||||
|
||||
if(hgl::stou(p,num)==false)
|
||||
return(0);
|
||||
|
||||
if(num<0)
|
||||
return(0);
|
||||
|
||||
if(arm_cpu_name.family=='X')
|
||||
{
|
||||
arm_cpu_name.gen=num;
|
||||
}
|
||||
else
|
||||
if(arm_cpu_name.family=='A')
|
||||
{
|
||||
if(num<30)
|
||||
{
|
||||
arm_cpu_name.gen=num;
|
||||
}
|
||||
else
|
||||
{
|
||||
arm_cpu_name.level=*p-'0';
|
||||
++p;
|
||||
hgl::stou(p,arm_cpu_name.gen);
|
||||
}
|
||||
}
|
||||
|
||||
while(hgl::isdigit(*p))++p; //跳过所有数字
|
||||
|
||||
if(*p=='C')
|
||||
arm_cpu_name.c=true;
|
||||
else
|
||||
if(p[0]=='A'
|
||||
&&p[1]=='E')
|
||||
arm_cpu_name.ae=true;
|
||||
|
||||
return arm_cpu_name.value;
|
||||
}
|
||||
|
||||
bool ParseARMCpuInfo(ARMCpuInfo *info,const uint32 &cpu_name_id)
|
||||
{
|
||||
if(!info)return(false);
|
||||
if(cpu_name_id==0)return(false);
|
||||
|
||||
info->name.value=cpu_name_id;
|
||||
|
||||
if(info->name.family=='X')
|
||||
{
|
||||
info->support_64bit=true;
|
||||
|
||||
if(info->name.gen==1)
|
||||
{
|
||||
info->support_32bit=true;
|
||||
info->arch=ARMArch::ARMv8_2;
|
||||
}
|
||||
else if(info->name.gen>4)
|
||||
{
|
||||
info->arch=ARMArch::ARMv9_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
info->arch=ARMArch::ARMv9;
|
||||
}
|
||||
}
|
||||
else if(info->name.family=='A')
|
||||
{
|
||||
if(info->name.level<3)
|
||||
{
|
||||
info->support_32bit=true;
|
||||
info->arch=ARMArch::ARMv7;
|
||||
}
|
||||
else
|
||||
if((info->name.level==3&&info->name.gen==4)) //A34
|
||||
{
|
||||
info->support_64bit=true;
|
||||
info->arch=ARMArch::ARMv8;
|
||||
}
|
||||
else
|
||||
if((info->name.level==6&&info->name.gen==5)) //A65
|
||||
{
|
||||
info->support_64bit=true;
|
||||
info->arch=ARMArch::ARMv8_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(info->name.gen>2)
|
||||
info->support_64bit=true;
|
||||
|
||||
if(info->name.gen<10)
|
||||
info->support_32bit=true;
|
||||
|
||||
if((info->name.level==3&&info->name.gen==5) //A35
|
||||
||(info->name.level==5&&info->name.gen==7)) //A57
|
||||
info->arch=ARMArch::ARMv8;
|
||||
else
|
||||
if(info->name.gen<5)
|
||||
info->arch=ARMArch::ARMv8;
|
||||
else
|
||||
if(info->name.gen<10)
|
||||
info->arch=ARMArch::ARMv8_2;
|
||||
else
|
||||
if(info->name.gen<20)
|
||||
info->arch=ARMArch::ARMv9;
|
||||
else
|
||||
ARMArch::ARMv9_2;
|
||||
}
|
||||
}
|
||||
else
|
||||
return(false);
|
||||
|
||||
return(true);
|
||||
}
|
||||
}//namespace hgl
|
@ -5,7 +5,7 @@ using namespace hgl;
|
||||
|
||||
namespace
|
||||
{
|
||||
bool isQualcomm(SOCInfo &soc,const char *soc_name)
|
||||
bool isQualcomm(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Qualcomm ",9);
|
||||
|
||||
@ -36,7 +36,7 @@ namespace
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool isMediaTek(SOCInfo &soc,const char *soc_name)
|
||||
bool isMediaTek(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"MT",2);
|
||||
|
||||
@ -52,7 +52,7 @@ namespace
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool isUnisoc(SOCInfo &soc,const char *soc_name)
|
||||
bool isUnisoc(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Unisoc",6);
|
||||
|
||||
@ -73,7 +73,7 @@ namespace
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool isKirin(SOCInfo &soc,const char *soc_name)
|
||||
bool isKirin(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Kirin",5);
|
||||
|
||||
@ -87,7 +87,7 @@ namespace
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool isExynos(SOCInfo &soc,const char *soc_name)
|
||||
bool isExynos(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Exynos",6);
|
||||
|
||||
@ -105,7 +105,7 @@ namespace
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool isSpreadtrum(SOCInfo &soc,const char *soc_name)
|
||||
bool isSpreadtrum(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Spreadtrum",10);
|
||||
|
||||
@ -123,7 +123,7 @@ namespace
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool isJLQ(SOCInfo &soc,const char *soc_name)
|
||||
bool isJLQ(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"JLQ ",4);
|
||||
|
||||
@ -142,7 +142,7 @@ namespace
|
||||
|
||||
namespace hgl
|
||||
{
|
||||
bool ParseSOCInfo(SOCInfo &soc,const char *soc_name)
|
||||
bool ParseSOCModel(SOCModel &soc,const char *soc_name)
|
||||
{
|
||||
if(hgl::strlen(soc_name)>0)
|
||||
{
|
Loading…
x
Reference in New Issue
Block a user