int piBoardRev (void) { FILE *cpuFd ; char line [120] ; char *c, lastChar ; static int boardRev = -1 ; // No point checking twice... if (boardRev != -1) return boardRev ; if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) return -1 ; while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) break ; fclose (cpuFd) ; if (line == NULL) piBoardRevOops ("No \"Revision\" line") ; line [strlen (line) - 1] = 0 ; // Chomp LF if (wiringPiDebug) printf ("piboardRev: Revision string: %s\n", line) ; for (c = line ; *c ; ++c) if (isdigit (*c)) break ; if (!isdigit (*c)) piBoardRevOops ("No numeric revision string") ; // If you have overvolted the Pi, then it appears that the revision // has 100000 added to it! if (wiringPiDebug) if (strlen (c) != 4) printf ("piboardRev: This Pi has/is overvolted!\n") ; lastChar = line [strlen (line) - 1] ; if (wiringPiDebug) printf ("piboardRev: lastChar is: '%c' (%d, 0x%02X)\n", lastChar, lastChar, lastChar) ; /**/ if ((lastChar == '2') || (lastChar == '3')) boardRev = 1 ; else boardRev = 2 ; if (wiringPiDebug) printf ("piBoardRev: Returning revision: %d\n", boardRev) ; return boardRev ; }
void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) { FILE *cpuFd ; char line [120] ; char *c ; // Will deal with the properly later on - for now, lets just get it going... // unsigned int modelNum ; (void)piBoardRev () ; // Call this first to make sure all's OK. Don't care about the result. if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) piBoardRevOops ("Unable to open /proc/cpuinfo") ; while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) break ; fclose (cpuFd) ; if (strncmp (line, "Revision", 8) != 0) piBoardRevOops ("No \"Revision\" line") ; // Chomp trailing CR/NL for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) *c = 0 ; //if (wiringPiDebug) //printf ("piboardId: Revision string: %s\n", line) ; if (piModel2) { // Scan to the colon for (c = line ; *c ; ++c) if (*c == ':') break ; if (*c != ':') piBoardRevOops ("Bogus \"Revision\" line") ; // modelNum = (unsigned int)strtol (++c, NULL, 16) ; // Hex number with no leading 0x *model = PI_MODEL_2 ; *rev = PI_VERSION_1_1 ; *mem = 1024 ; *maker = PI_MAKER_SONY ; } else { // Scan to first digit for (c = line ; *c ; ++c) if (isdigit (*c)) break ; // Make sure its long enough if (strlen (c) < 4) piBoardRevOops ("Bogus \"Revision\" line") ; // If longer than 4, we'll assume it's been overvolted *overVolted = strlen (c) > 4 ; // Extract last 4 characters: c = c + strlen (c) - 4 ; // Fill out the replys as appropriate /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; } else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; } else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; } else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_MBEST ; } else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; } } }
int piBoardRev (void) { FILE *cpuFd ; char line [120] ; char *c ; static int boardRev = -1 ; if (boardRev != -1) // No point checking twice return boardRev ; if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) piBoardRevOops ("Unable to open /proc/cpuinfo") ; // Start by looking for the Architecture, then we can look for a B2 revision.... while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Hardware", 8) == 0) break ; if (strncmp (line, "Hardware", 8) != 0) piBoardRevOops ("No \"Hardware\" line") ; // See if it's BCM2708 or BCM2709 if (strstr (line, "BCM2709") != NULL) piModel2 = TRUE ; else if (strstr (line, "BCM2708") == NULL) { fprintf (stderr, "Unable to determine hardware version. I see: %s,\n", line) ; fprintf (stderr, " - expecting BCM2708 or BCM2709. Please report this to [email protected]\n") ; exit (EXIT_FAILURE) ; } // Now do the rest of it as before rewind (cpuFd) ; while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) break ; fclose (cpuFd) ; if (strncmp (line, "Revision", 8) != 0) piBoardRevOops ("No \"Revision\" line") ; // Chomp trailing CR/NL for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) *c = 0 ; //if (wiringPiDebug) //printf ("piboardRev: Revision string: %s\n", line) ; // Scan to first digit for (c = line ; *c ; ++c) if (isdigit (*c)) break ; if (!isdigit (*c)) piBoardRevOops ("No numeric revision string") ; // Make sure its long enough if (strlen (c) < 4) piBoardRevOops ("Bogus \"Revision\" line (too small)") ; // If you have overvolted the Pi, then it appears that the revision // has 100000 added to it! // The actual condition for it being set is: // (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0 //if (wiringPiDebug) //if (strlen (c) != 4) //printf ("piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0\n") ; // Isolate last 4 characters: c = c + strlen (c) - 4 ; if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0)) boardRev = 1 ; else boardRev = 2 ; return boardRev ; }