[v0.98] Merge RPi branch to fix SoC detection issue

This commit is contained in:
Dr-Noob
2021-06-20 23:14:23 +02:00
4 changed files with 103 additions and 13 deletions

View File

@@ -10,6 +10,7 @@
#define min(a,b) (((a)<(b))?(a):(b)) #define min(a,b) (((a)<(b))?(a):(b))
#define STRING_UNKNOWN "Unknown" #define STRING_UNKNOWN "Unknown"
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
static char* soc_trademark_string[] = { static char* soc_trademark_string[] = {
[SOC_VENDOR_SNAPDRAGON] = "Snapdragon ", [SOC_VENDOR_SNAPDRAGON] = "Snapdragon ",
@@ -19,6 +20,13 @@ static char* soc_trademark_string[] = {
[SOC_VENDOR_BROADCOM] = "Broadcom BCM", [SOC_VENDOR_BROADCOM] = "Broadcom BCM",
}; };
static char* soc_rpi_string[] = {
"BCM2835",
"BCM2836",
"BCM2837",
"BCM2711"
};
void fill_soc(struct system_on_chip* soc, char* soc_name, SOC soc_model, int32_t process) { void fill_soc(struct system_on_chip* soc, char* soc_name, SOC soc_model, int32_t process) {
soc->soc_model = soc_model; soc->soc_model = soc_model;
soc->soc_vendor = get_soc_vendor_from_soc(soc_model); soc->soc_vendor = get_soc_vendor_from_soc(soc_model);
@@ -502,7 +510,7 @@ struct system_on_chip* guess_soc_from_android(struct system_on_chip* soc) {
#endif #endif
struct system_on_chip* guess_soc_from_cpuinfo(struct system_on_chip* soc) { struct system_on_chip* guess_soc_from_cpuinfo(struct system_on_chip* soc) {
char* tmp = get_hardware_from_cpuinfo(&strlen); char* tmp = get_hardware_from_cpuinfo();
if(tmp != NULL) { if(tmp != NULL) {
soc->raw_name = tmp; soc->raw_name = tmp;
@@ -512,12 +520,69 @@ struct system_on_chip* guess_soc_from_cpuinfo(struct system_on_chip* soc) {
return soc; return soc;
} }
int hex2int(char c) {
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return -1;
}
// https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
struct system_on_chip* guess_soc_raspbery_pi(struct system_on_chip* soc) {
char* revision = get_revision_from_cpuinfo();
if(revision == NULL) {
printWarn("[RPi] Couldn't find revision field in cpuinfo");
return soc;
}
if(strlen(revision) != 6) {
printWarn("[RPi] Found invalid RPi revision code: '%s'", revision);
return soc;
}
int arr_size = ARRAY_SIZE(soc_rpi_string);
int pppp = hex2int(revision[2]);
if(pppp == -1) {
printErr("[RPi] Found invalid RPi PPPP code: %s", revision[2]);
return soc;
}
if(pppp > arr_size) {
printErr("[RPi] Found invalid RPi PPPP code: %d while max is %d", pppp, arr_size);
return soc;
}
char* soc_raw_name = soc_rpi_string[pppp];
/*int soc_len = strlen(soc_raw_name);
soc->raw_name = malloc(sizeof(char) * (soc_len + 1));
strncpy(soc->raw_name, soc_raw_name, soc_len + 1);*/
match_broadcom(soc_raw_name, soc);
return soc;
}
struct system_on_chip* get_soc() { struct system_on_chip* get_soc() {
struct system_on_chip* soc = malloc(sizeof(struct system_on_chip)); struct system_on_chip* soc = malloc(sizeof(struct system_on_chip));
soc->raw_name = NULL; soc->raw_name = NULL;
soc->soc_vendor = SOC_VENDOR_UNKNOWN; soc->soc_vendor = SOC_VENDOR_UNKNOWN;
soc->process = UNKNOWN; soc->process = UNKNOWN;
bool isRPi = is_raspberry_pi();
if(isRPi) {
soc = guess_soc_raspbery_pi(soc);
if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) {
printWarn("SoC detection failed using revision code");
}
else {
return soc;
}
}
soc = guess_soc_from_cpuinfo(soc); soc = guess_soc_from_cpuinfo(soc);
if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) { if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) {
if(soc->raw_name != NULL) if(soc->raw_name != NULL)

View File

@@ -1,6 +1,7 @@
#include "udev.h" #include "udev.h"
#include "midr.h" #include "midr.h"
#define _PATH_DEVICETREE_MODEL "/sys/firmware/devicetree/base/model"
#define _PATH_CPUS_PRESENT _PATH_SYS_SYSTEM _PATH_SYS_CPU "/present" #define _PATH_CPUS_PRESENT _PATH_SYS_SYSTEM _PATH_SYS_CPU "/present"
#define _PATH_CPUINFO "/proc/cpuinfo" #define _PATH_CPUINFO "/proc/cpuinfo"
//#define _PATH_CPUINFO "cpuinfo_debug" //#define _PATH_CPUINFO "cpuinfo_debug"
@@ -11,6 +12,7 @@
#define CPUINFO_CPU_PART_STR "CPU part\t: " #define CPUINFO_CPU_PART_STR "CPU part\t: "
#define CPUINFO_CPU_REVISION_STR "CPU revision\t: " #define CPUINFO_CPU_REVISION_STR "CPU revision\t: "
#define CPUINFO_HARDWARE_STR "Hardware\t: " #define CPUINFO_HARDWARE_STR "Hardware\t: "
#define CPUINFO_REVISION_STR "Revision\t: "
#define CPUINFO_CPU_STRING "processor" #define CPUINFO_CPU_STRING "processor"
@@ -148,7 +150,7 @@ uint32_t get_midr_from_cpuinfo(uint32_t core, bool* success) {
return midr; return midr;
} }
char* get_hardware_from_cpuinfo() { char* get_field_from_cpuinfo(char* CPUINFO_FIELD) {
int filelen; int filelen;
char* buf; char* buf;
if((buf = read_file(_PATH_CPUINFO, &filelen)) == NULL) { if((buf = read_file(_PATH_CPUINFO, &filelen)) == NULL) {
@@ -156,9 +158,9 @@ char* get_hardware_from_cpuinfo() {
return NULL; return NULL;
} }
char* tmp1 = strstr(buf, CPUINFO_HARDWARE_STR); char* tmp1 = strstr(buf, CPUINFO_FIELD);
if(tmp1 == NULL) return NULL; if(tmp1 == NULL) return NULL;
tmp1 = tmp1 + strlen(CPUINFO_HARDWARE_STR); tmp1 = tmp1 + strlen(CPUINFO_FIELD);
char* tmp2 = strstr(tmp1, "\n"); char* tmp2 = strstr(tmp1, "\n");
int strlen = (1 + (tmp2-tmp1)); int strlen = (1 + (tmp2-tmp1));
@@ -169,3 +171,24 @@ char* get_hardware_from_cpuinfo() {
return hardware; return hardware;
} }
char* get_hardware_from_cpuinfo() {
return get_field_from_cpuinfo(CPUINFO_HARDWARE_STR);
}
char* get_revision_from_cpuinfo() {
return get_field_from_cpuinfo(CPUINFO_REVISION_STR);
}
bool is_raspberry_pi() {
int filelen;
char* buf;
if((buf = read_file(_PATH_DEVICETREE_MODEL, &filelen)) == NULL) {
return false;
}
char* tmp;
if((tmp = strstr(buf, "Raspberry Pi")) == NULL) {
return false;
}
return true;
}

View File

@@ -7,6 +7,8 @@
int get_ncores_from_cpuinfo(); int get_ncores_from_cpuinfo();
uint32_t get_midr_from_cpuinfo(uint32_t core, bool* success); uint32_t get_midr_from_cpuinfo(uint32_t core, bool* success);
char* get_hardware_from_cpuinfo(); char* get_hardware_from_cpuinfo();
char* get_revision_from_cpuinfo();
bool is_raspberry_pi();
#endif #endif

View File

@@ -133,14 +133,14 @@
#define BROADCOM_ASCII \ #define BROADCOM_ASCII \
" \ " \
################ \ ################ \
######################### \ ########################## \
############################### \ ################################ \
################@@@@################ \ ################@@@@################ \
################@@@@@@################ \ ################@@@@@@################ \
#################@@@@@@################ \ #################@@@@@@################# \
#################@@@@@@@@################# \ #################@@@@@@@@################# \
#################@@@@@@@@################# \ #################@@@@@@@@################# \
#################@@@@##@@@@################ \ ################@@@@##@@@@################ \
################@@@@##@@@@################ \ ################@@@@##@@@@################ \
###############@@@@####@@@@############### \ ###############@@@@####@@@@############### \
@@@@@@@@@@####@@@@####@@@@####@@@@@@@@@@ \ @@@@@@@@@@####@@@@####@@@@####@@@@@@@@@@ \