added ARMCpuInfo.cpp

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-07-17 20:36:05 +08:00
parent 22070d4169
commit dc22dc4d85
4 changed files with 243 additions and 12 deletions

View File

@ -29,18 +29,112 @@ namespace hgl
ENUM_CLASS_RANGE(Unknow,JLQ) 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
{
//如A76level为7,gen为6
//A710level为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; SOCVendor vendor;
char model[32]; char model[32];
public: public:
CompOperatorMemcmp(const SOCInfo &); CompOperatorMemcmp(const SOCModel &);
}; };
/** /**
* SOC信息SOC厂商和主要型号 * SOC信息SOC厂商和主要型号
*/ */
bool ParseSOCInfo(SOCInfo &,const char *); bool ParseSOCModel(SOCModel &,const char *);
}//namespace hgl }//namespace hgl

View File

@ -126,7 +126,10 @@ SET(ANDROID_ABOUT_SOURCE ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/Android
SOURCE_GROUP("Android\\Version" FILES ${ANDROID_ABOUT_SOURCE}) SOURCE_GROUP("Android\\Version" FILES ${ANDROID_ABOUT_SOURCE})
SET(SOC_SOURCE ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/SOC.h 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}) SOURCE_GROUP("SOC" FILES ${SOC_SOURCE})

134
src/SOC/ARMCpuInfo.cpp Normal file
View 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

View File

@ -5,7 +5,7 @@ using namespace hgl;
namespace 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Qualcomm ",9);
@ -36,7 +36,7 @@ namespace
return(true); 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"MT",2);
@ -52,7 +52,7 @@ namespace
return(true); 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Unisoc",6);
@ -73,7 +73,7 @@ namespace
return(true); 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Kirin",5);
@ -87,7 +87,7 @@ namespace
return(true); 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Exynos",6);
@ -105,7 +105,7 @@ namespace
return(true); 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Spreadtrum",10);
@ -123,7 +123,7 @@ namespace
return(true); 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); const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"JLQ ",4);
@ -142,7 +142,7 @@ namespace
namespace hgl namespace hgl
{ {
bool ParseSOCInfo(SOCInfo &soc,const char *soc_name) bool ParseSOCModel(SOCModel &soc,const char *soc_name)
{ {
if(hgl::strlen(soc_name)>0) if(hgl::strlen(soc_name)>0)
{ {