Skip to content

Instantly share code, notes, and snippets.

@kc2zgu
Last active September 25, 2023 15:04
Show Gist options
  • Save kc2zgu/219047bf8aa1e3c158e379481a605687 to your computer and use it in GitHub Desktop.
Save kc2zgu/219047bf8aa1e3c158e379481a605687 to your computer and use it in GitHub Desktop.
Raspbery Pi revision decoder
#!/usr/bin/perl
use strict;
use warnings;
open my $cpuinfo, '<', '/proc/cpuinfo';
my $rev;
while (my $line = <$cpuinfo>)
{
if ($line =~ /^Revision\s+:\s+([0-9a-f]+)$/i)
{
$rev = $1;
}
}
$rev = hex $rev;
printf "Current Revision: %06x\n", $rev;
print "NOQuuuWuFMMMCCCCPPPPTTTTTTTTRRRR\n";
printf "%032b\n", $rev;
my $ovolt_bit = ($rev >> 31) & 0x1;
my $otp_prog_bit = ($rev >> 30) & 0x1;
my $otp_read_bit = ($rev >> 29) & 0x1;
my $warranty_bit = ($rev >> 25) & 0x1;
my $new_bit = ($rev >> 23) & 0x1;
my $mem = ($rev >> 20) & 0x7;
my $mfr = ($rev >> 16) & 0xf;
my $cpu = ($rev >> 12) & 0xf;
my $board = ($rev >> 4) & 0xff;
my $revision = $rev & 0xf;
my $ovolt_status = $ovolt_bit ? "disallowed" : "allowed";
print "Overvoltage: $ovolt_status ($ovolt_bit)\n";
my $otp_prog_status = $otp_prog_bit ? "disallowed" : "allowed";
print "OTP Programming: $otp_prog_status ($otp_prog_bit)\n";
my $otp_read_status = $otp_read_bit ? "disallowed" : "allowed";
print "OTP Read: $otp_read_status ($otp_read_bit)\n";
my $warranty_status = $warranty_bit ? "VOID" : "warranty intact";
print "warranty: $warranty_status ($warranty_bit)\n";
my $new_style_status = $new_bit ? "New-style revision" : "Old-style revision";
print "new style: $new_style_status ($new_bit)\n";
my @memory_vals = (256, 512, 1024, 2048, 4096, 8192);
print "memory: $memory_vals[$mem]MB ($mem)\n";
my @mfr_vals = ("Sony UK", "Egoman", "Embest", "Sony Japan", "Embest", "Stadium");
print "mfr: $mfr_vals[$mfr] ($mfr)\n";
my @cpu_vals = ("BCM2835", "BCM2836", "BCM2837", "BCM2711");
print "cpu: $cpu_vals[$cpu] ($cpu)\n";
my @board_vals = ("A", "B", "A+", "B+", "2B", "alpha prototype", "CM1", "???",
"3B", "Zero", "CM3", "???", "Zero W", "3B+", "3A+", "???",
"CM3+", "4B", "Zero 2 W", "400", "CM4", "CM4S");
print "board type: $board_vals[$board] ($board)\n";
print "revision: $revision\n";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment