Skip to content

Instantly share code, notes, and snippets.

@lovesegfault
Created September 21, 2020 20:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lovesegfault/f60b85b58c90822eb97c0495fa45dee7 to your computer and use it in GitHub Desktop.
Save lovesegfault/f60b85b58c90822eb97c0495fa45dee7 to your computer and use it in GitHub Desktop.
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