判別方法
/proc/cpuinfoを読めばいいらしい。
自前のRaspberry Pi Model B(Kernel 4.4系列)の場合。
Hardware : BCM2708
Revision : 000e
Q4 2012 (Mfg by Sony)版らしい。
もう一つ自前のRaspberry Pi 2 Model B(Kernel 4.4系列)の場合。
Hardware : BCM2709
Revision : a21041
こちらはQ1 2015版。
仕組み
cpuinfoの表示は、kernelソースの arch/arm/kernel/setup.c の中で行われていて、変数 system_rev がEXPORT_SYMBOLされている。
unsigned int system_rev;
EXPORT_SYMBOL(system_rev);
/* (中略) */
static int c_show(struct seq_file *m, void *v)
{
/* (中略) */
seq_printf(m, "Hardware\t: %s\n", machine_name);
seq_printf(m, "Revision\t: %04x\n", system_rev);
seq_printf(m, "Serial\t\t: %08x%08x\n",
system_serial_high, system_serial_low);
return 0;
}
Kernel 4.4系列の場合の仕組み
arch/arm/mach-bcm2708/bcm2708.c 、および arch/arm/mach-bcm2709/bcm2709.c で、基板のリビジョンをモジュールパラメータとして受け取っている。
void __init bcm2708_init(void)
{
/* (中略) */
system_rev = boardrev;
/* (中略) */
}
/* (中略) */
module_param(boardrev, uint, 0644);
実際には、モジュールパラメータがkernelのコマンドラインから渡せる仕組みを利用して、ブート時にブートローダから、kernelのコマンドラインのパラメータとして渡されている。
$ cat /proc/cmdline
dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0xe bcm2708.serial=0xNNNNNNNN smsc95xx.macaddr=NN:NN:NN:NN:NN:NN bcm2708_fb.fbswap=1 sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
シリアル番号や、MACアドレスもブートローダから引き渡されているっぽい。
ブートローダに、NVRAMからの読出し処理が含まれているのだろう。多分。
Kernel 4.9系列の場合の仕組み
arch/arm/mach-bcm/board_bcm2835.c で、基板のリビジョンをDevice Treeから読み取っている。
static void __init bcm2835_init(void)
{
/* (中略) */
if (!of_property_read_u32(np, "linux,revision", &val))
system_rev = val;
if (!of_property_read_u64(np, "linux,serial", &val64))
system_serial_low = val64;
}
なので、/proc/devicetree/以下から読めなくもない。
$ cd /proc/device-tree/system
$ ls -la
合計 0
drwxr-xr-x 2 root root 0 2月 25 12:48 .
drwxr-xr-x 14 root root 0 2月 25 12:48 ..
-r--r--r-- 1 root root 4 2月 25 12:57 linux,revision
-r--r--r-- 1 root root 8 2月 25 12:57 linux,serial
-r--r--r-- 1 root root 7 2月 25 12:57 name
$ od -t x linux,revision
0000000 0e000000
0000004
ブートローダに、NVRAMからの読出し処理が含まれているのだろう。多分。