From dc22dc4d85c71bcfc237c54d2b6c006ded86ba92 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Mon, 17 Jul 2023 20:36:05 +0800 Subject: [PATCH] added ARMCpuInfo.cpp --- inc/hgl/platform/SOC.h | 100 +++++++++++++++++++++++++++++- src/CMakeLists.txt | 5 +- src/SOC/ARMCpuInfo.cpp | 134 +++++++++++++++++++++++++++++++++++++++++ src/{ => SOC}/SOC.cpp | 16 ++--- 4 files changed, 243 insertions(+), 12 deletions(-) create mode 100644 src/SOC/ARMCpuInfo.cpp rename src/{ => SOC}/SOC.cpp (88%) diff --git a/inc/hgl/platform/SOC.h b/inc/hgl/platform/SOC.h index 51969fe..e98e921 100644 --- a/inc/hgl/platform/SOC.h +++ b/inc/hgl/platform/SOC.h @@ -29,18 +29,112 @@ namespace hgl ENUM_CLASS_RANGE(Unknow,JLQ) }; - struct SOCInfo + enum class CpuArch + { + Unknow=0, + + ARMv7, /// + * 注:这里的频率单位为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 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7d578d3..6bef940 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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}) diff --git a/src/SOC/ARMCpuInfo.cpp b/src/SOC/ARMCpuInfo.cpp new file mode 100644 index 0000000..412d8f1 --- /dev/null +++ b/src/SOC/ARMCpuInfo.cpp @@ -0,0 +1,134 @@ +#include +#include + +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 diff --git a/src/SOC.cpp b/src/SOC/SOC.cpp similarity index 88% rename from src/SOC.cpp rename to src/SOC/SOC.cpp index 94c6906..6db01ab 100644 --- a/src/SOC.cpp +++ b/src/SOC/SOC.cpp @@ -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) {