Created
September 21, 2020 20:19
-
-
Save lovesegfault/f60b85b58c90822eb97c0495fa45dee7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int get_rpi_info(rpi_info *info) | |
{ | |
FILE *fp; | |
char buffer[1024]; | |
char hardware[1024]; | |
char revision[1024]; | |
int found = 0; | |
int len; | |
if ((fp = fopen("/proc/device-tree/system/linux,revision", "r"))) { | |
uint32_t n; | |
if (fread(&n, sizeof(n), 1, fp) != 1) { | |
fclose(fp); | |
return -1; | |
} | |
sprintf(revision, "%x", ntohl(n)); | |
found = 1; | |
} | |
else if ((fp = fopen("/proc/cpuinfo", "r"))) { | |
while(!feof(fp) && fgets(buffer, sizeof(buffer), fp)) { | |
sscanf(buffer, "Hardware : %s", hardware); | |
if (strcmp(hardware, "BCM2708") == 0 || | |
strcmp(hardware, "BCM2709") == 0 || | |
strcmp(hardware, "BCM2835") == 0 || | |
strcmp(hardware, "BCM2836") == 0 || | |
strcmp(hardware, "BCM2837") == 0 ) { | |
found = 1; | |
} | |
sscanf(buffer, "Revision : %s", revision); | |
} | |
} | |
else | |
return -1; | |
fclose(fp); | |
if (!found) | |
return -1; | |
if ((len = strlen(revision)) == 0) | |
return -1; | |
if (len >= 6 && strtol((char[]){revision[len-6],0}, NULL, 16) & 8) { | |
// new scheme | |
//info->rev = revision[len-1]-'0'; | |
strcpy(info->revision, revision); | |
switch (revision[len-3]) { | |
case '0' : | |
switch (revision[len-2]) { | |
case '0': info->type = "Model A"; info->p1_revision = 2; break; | |
case '1': info->type = "Model B"; info->p1_revision = 2; break; | |
case '2': info->type = "Model A+"; info->p1_revision = 3; break; | |
case '3': info->type = "Model B+"; info->p1_revision = 3; break; | |
case '4': info->type = "Pi 2 Model B"; info->p1_revision = 3; break; | |
case '5': info->type = "Alpha"; info->p1_revision = 3; break; | |
case '6': info->type = "Compute Module 1"; info->p1_revision = 0; break; | |
case '8': info->type = "Pi 3 Model B"; info->p1_revision = 3; break; | |
case '9': info->type = "Zero"; info->p1_revision = 3; break; | |
case 'a': info->type = "Compute Module 3"; info->p1_revision = 0; break; | |
case 'c': info->type = "Zero W"; info->p1_revision = 3; break; | |
case 'd': info->type = "Pi 3 Model B+"; info->p1_revision = 3; break; | |
case 'e': info->type = "Pi 3 Model A+"; info->p1_revision = 3; break; | |
default : info->type = "Unknown"; info->p1_revision = 3; break; | |
} break; | |
case '1': | |
switch (revision[len-2]) { | |
case '0': info->type = "Compute Module 3+"; info->p1_revision = 0; break; | |
case '1': info->type = "Pi 4 Model B"; info->p1_revision = 3; break; | |
default : info->type = "Unknown"; info->p1_revision = 3; break; | |
} break; | |
default: info->type = "Unknown"; info->p1_revision = 3; break; | |
} | |
switch (revision[len-4]) { | |
case '0': info->processor = "BCM2835"; break; | |
case '1': info->processor = "BCM2836"; break; | |
case '2': info->processor = "BCM2837"; break; | |
case '3': info->processor = "BCM2711"; break; | |
default : info->processor = "Unknown"; break; | |
} | |
switch (revision[len-5]) { | |
case '0': info->manufacturer = "Sony"; break; | |
case '1': info->manufacturer = "Egoman"; break; | |
case '2': info->manufacturer = "Embest"; break; | |
case '3': info->manufacturer = "Sony Japan"; break; | |
case '4': info->manufacturer = "Embest"; break; | |
case '5': info->manufacturer = "Stadium"; break; | |
default : info->manufacturer = "Unknown"; break; | |
} | |
switch (strtol((char[]){revision[len-6],0}, NULL, 16) & 7) { | |
case 0: info->ram = "256M"; break; | |
case 1: info->ram = "512M"; break; | |
case 2: info->ram = "1G"; break; | |
case 3: info->ram = "2G"; break; | |
case 4: info->ram = "4G"; break; | |
default: info->ram = "Unknown"; break; | |
} | |
} else { | |
// old scheme | |
info->ram = "Unknown"; | |
info->manufacturer = "Unknown"; | |
info->processor = "Unknown"; | |
info->type = "Unknown"; | |
strcpy(info->revision, revision); | |
uint64_t rev; | |
sscanf(revision, "%llx", &rev); | |
rev = rev & 0xefffffff; // ignore preceeding 1000 for overvolt | |
if (rev == 0x0002 || rev == 0x0003) { | |
info->type = "Model B"; | |
info->p1_revision = 1; | |
info->ram = "256M"; | |
info->manufacturer = "Egoman"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0004) { | |
info->type = "Model B"; | |
info->p1_revision = 2; | |
info->ram = "256M"; | |
info->manufacturer = "Sony UK"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0005) { | |
info->type = "Model B"; | |
info->p1_revision = 2; | |
info->ram = "256M"; | |
info->manufacturer = "Qisda"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0006) { | |
info->type = "Model B"; | |
info->p1_revision = 2; | |
info->ram = "256M"; | |
info->manufacturer = "Egoman"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0007) { | |
info->type = "Model A"; | |
info->p1_revision = 2; | |
info->ram = "256M"; | |
info->manufacturer = "Egoman"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0008) { | |
info->type = "Model A"; | |
info->p1_revision = 2; | |
info->ram = "256M"; | |
info->manufacturer = "Sony UK"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0009) { | |
info->type = "Model A"; | |
info->p1_revision = 2; | |
info->ram = "256M"; | |
info->manufacturer = "Qisda"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x000d) { | |
info->type = "Model B"; | |
info->p1_revision = 2; | |
info->ram = "512M"; | |
info->manufacturer = "Egoman"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x000e) { | |
info->type = "Model B"; | |
info->p1_revision = 2; | |
info->ram = "512M"; | |
info->manufacturer = "Sony UK"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x000f) { | |
info->type = "Model B"; | |
info->p1_revision = 2; | |
info->ram = "512M"; | |
info->manufacturer = "Qisda"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0010) { | |
info->type = "Model B+"; | |
info->p1_revision = 3; | |
info->ram = "512M"; | |
info->manufacturer = "Sony UK"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0011) { | |
info->type = "Compute Module 1"; | |
info->p1_revision = 0; | |
info->ram = "512M"; | |
info->manufacturer = "Sony UK"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0012) { | |
info->type = "Model A+"; | |
info->p1_revision = 3; | |
info->ram = "256M"; | |
info->manufacturer = "Sony UK"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0013) { | |
info->type = "Model B+"; | |
info->p1_revision = 3; | |
info->ram = "512M"; | |
info->manufacturer = "Embest"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0014) { | |
info->type = "Compute Module 1"; | |
info->p1_revision = 0; | |
info->ram = "512M"; | |
info->manufacturer = "Embest"; | |
info->processor = "BCM2835"; | |
} else if (rev == 0x0015) { | |
info->type = "Model A+"; | |
info->p1_revision = 3; | |
info->ram = "Unknown"; | |
info->manufacturer = "Embest"; | |
info->processor = "BCM2835"; | |
} else { // don't know - assume revision 3 p1 connector | |
info->p1_revision = 3; | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment