From 37fa338586e7f01770b6a17b4d268af271a8f357 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Wed, 12 Jul 2023 19:14:51 +0800 Subject: [PATCH] added codes about AndroidVersion and SOC --- inc/hgl/platform/Android.h | 18 ++++ inc/hgl/platform/SOC.h | 35 ++++++++ src/Android/AndroidVersion.cpp | 63 +++++++++++++ src/CMakeLists.txt | 12 +++ src/SOC.cpp | 159 +++++++++++++++++++++++++++++++++ 5 files changed, 287 insertions(+) create mode 100644 inc/hgl/platform/Android.h create mode 100644 inc/hgl/platform/SOC.h create mode 100644 src/Android/AndroidVersion.cpp create mode 100644 src/SOC.cpp diff --git a/inc/hgl/platform/Android.h b/inc/hgl/platform/Android.h new file mode 100644 index 0000000..2616df1 --- /dev/null +++ b/inc/hgl/platform/Android.h @@ -0,0 +1,18 @@ +#pragma once + +namespace hgl +{ + struct AndroidVersion + { + unsigned int major; + unsigned int minor; + unsigned int patch; + + char postfix; + }; + + /** + * 根据版本号取得Android的APILevel,如若出错返回-1 + */ + const int GetAndroidAPILevel(const AndroidVersion &); +}//namespace hgl diff --git a/inc/hgl/platform/SOC.h b/inc/hgl/platform/SOC.h new file mode 100644 index 0000000..82c7ff1 --- /dev/null +++ b/inc/hgl/platform/SOC.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +namespace hgl +{ + enum class SOCVendor + { + Unknow=0, + + Qualcomm, ///<高通 + Hisilicon, ///<海思 + Samsung, ///<三星 + MediaTek, ///<联发科 + //Rockchip, ///<瑞芯微 + //Intel, ///<英特尔 + Unisoc, ///<展锐 + Spreadtrum, ///<展讯 + JLQ, ///<瓴盛 + //TI, ///<德州仪器 + + ENUM_CLASS_RANGE(Unknow,JLQ) + }; + + struct SOCInfo + { + SOCVendor vendor; + char model[16]; + }; + + /** + * 根据收集到的SOC信息,解晰具体的SOC厂商和主要型号 + */ + bool ParseSOCInfo(SOCInfo &,const char *); +}//namespace hgl diff --git a/src/Android/AndroidVersion.cpp b/src/Android/AndroidVersion.cpp new file mode 100644 index 0000000..989a060 --- /dev/null +++ b/src/Android/AndroidVersion.cpp @@ -0,0 +1,63 @@ +#include + +namespace hgl +{ + /* + https://apilevels.com/ + */ + + const int GetAndroidAPILevel(const AndroidVersion &av) + { + int api_level=-1; + + if(av.major==1) + { + if(av.minor==0)api_level=1;else + if(av.minor==1)api_level=2;else + if(av.minor==5)api_level=3;else + if(av.minor==6)api_level=4; + } + else + if(av.major==2) + { + if(av.minor==0)api_level=(av.patch>=1)?6:5;else + if(av.minor==1)api_level=7;else + if(av.minor==2)api_level=8;else + if(av.minor==3)api_level=(av.patch>=3)?10:9; + } + else + if(av.major==3) + { + if(av.minor==0)api_level=11;else + if(av.minor==1)api_level=12;else + api_level=13; + } + else + if(av.major==4) + { + if(av.minor==0)api_level=(av.patch>=3)?15:14;else + if(av.minor==1)api_level=16;else + if(av.minor==2)api_level=17;else + if(av.minor==3)api_level=18;else + if(av.minor==4)api_level=(av.postfix=='W')?20:19; + } + else + if(av.major==5) + { + if(av.minor==0)api_level=21;else + if(av.minor==1)api_level=22; + } + else + if(av.major==6)api_level=23;else + if(av.major==7)api_level=(av.minor==0)?24:25;else + if(av.major==8)api_level=(av.minor==0)?26:27;else + if(av.major==9)api_level=28;else + if(av.major==10)api_level=29;else + if(av.major==11)api_level=30;else + if(av.major==12)api_level=(av.postfix=='L')?32:31;else + if(av.major==13)api_level=33;else + if(av.major>=14)api_level=34; + + return(api_level); + } +}//namespace hgl diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 882185a..7d578d3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -120,6 +120,16 @@ SOURCE_GROUP("Window" FILES ${PLATFORM_WINDOW_SOURCE}) SOURCE_GROUP("Hardware\\Cpuinfo" FILES ${CPU_INFO_HEADER} ${CPU_INFO_SOURCE}) +SET(ANDROID_ABOUT_SOURCE ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/Android.h + Android/AndroidVersion.cpp) + +SOURCE_GROUP("Android\\Version" FILES ${ANDROID_ABOUT_SOURCE}) + +SET(SOC_SOURCE ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/SOC.h + SOC.cpp) + +SOURCE_GROUP("SOC" FILES ${SOC_SOURCE}) + SET(PLATFORM_SOURCE ${PLATFORM_SOURCE} ${PLATFORM_FILE_SOURCE} ${PLATFORM_CODEPAGE_SOURCE} @@ -135,6 +145,8 @@ SET(PLATFORM_SOURCE ${PLATFORM_SOURCE} ${CPU_INFO_HEADER} ${CPU_INFO_SOURCE} + ${ANDROID_ABOUT_SOURCE} + ${SOC_SOURCE} ) add_cm_library(CMPlatform "CM" ${PLATFORM_SOURCE}) diff --git a/src/SOC.cpp b/src/SOC.cpp new file mode 100644 index 0000000..6c76019 --- /dev/null +++ b/src/SOC.cpp @@ -0,0 +1,159 @@ +#include +#include + +using namespace hgl; + +namespace +{ + bool isQualcomm(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Qualcomm ",9); + + if(!p) + return(false); + + soc.vendor=SOCVendor::Qualcomm; + + p+=9; + if(*p=='T') //"Qualcomm Technologies, Inc" 但是里面有写逗号的有写句号的,所以我找最后的Inc + { + p=hgl::stristr(p,hgl::strlen(p),"Inc ",4); + + if(!p) + return(false); + + p+=4; + + hgl::strcpy(soc.model,sizeof(soc.model),p); + } + else //如“Qualcomm APQ8084”这种 + { + hgl::strcpy(soc.model,sizeof(soc.model),p); + } + + return(true); + } + + bool isMediaTek(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"MT",2); + + if(!p) + return(false); + + soc.vendor=SOCVendor::MediaTek; + + p+=2; + + hgl::strcpy(soc.model,sizeof(soc.model),p,4); + + return(true); + } + + bool isUnisoc(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Unisoc",6); + + if(!p) + return(false); + + soc.vendor=SOCVendor::Unisoc; + + if(p==soc_name) //就在最前面,"Unisoc ...."结构 + { + hgl::strcpy(soc.model,sizeof(soc.model),p+7); + } + else //在型号后面,"Txxx-Unisoc"结构 + { + hgl::strcpy(soc.model,sizeof(soc.model),soc_name,p-soc_name-1); + } + + return(true); + } + + bool isKirin(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Kirin",5); + + if(!p) + return(false); + + soc.vendor=SOCVendor::Hisilicon; + + hgl::strcpy(soc.model,sizeof(soc.model),p+5); + + return(true); + } + + bool isExynos(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Exynos",6); + + if(!p) + return(false); + + soc.vendor=SOCVendor::Samsung; + + p+=6; + + if(*p==' ')++p; + + hgl::strcpy(soc.model,sizeof(soc.model),p); + + return(true); + } + + bool isSpreadtrum(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"Spreadtrum",10); + + if(!p) + return(false); + + soc.vendor=SOCVendor::Spreadtrum; + + p+=10; + + if(*p==' ')++p; + + hgl::strcpy(soc.model,sizeof(soc.model),p); + + return(true); + } + + bool isJLQ(SOCInfo &soc,const char *soc_name) + { + const char *p=hgl::stristr(soc_name,hgl::strlen(soc_name),"JLQ ",4); + + if(!p) + return(false); + + soc.vendor=SOCVendor::JLQ; + + p+=4; + + hgl::strcpy(soc.model,sizeof(soc.model),p); + + return(true); + } +}//namespace + +namespace hgl +{ + bool ParseSOCInfo(SOCInfo &soc,const char *soc_name) + { + if(hgl::strlen(soc_name)>0) + { + if(isQualcomm (soc,soc_name))return(true); + if(isKirin (soc,soc_name))return(true); + if(isMediaTek (soc,soc_name))return(true); + if(isUnisoc (soc,soc_name))return(true); + if(isExynos (soc,soc_name))return(true); + if(isSpreadtrum (soc,soc_name))return(true); + if(isJLQ (soc,soc_name))return(true); + } + + soc.vendor=SOCVendor::Unknow; + return(false); + } +}//namespace hgl