Edited at

メモ:Raspberry Piのボードリビジョンを判別する方法

More than 1 year has passed since last update.


判別方法

http://elinux.org/RPi_HardwareHistory

/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されている。


setup.c

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 で、基板のリビジョンをモジュールパラメータとして受け取っている。


bcm2708.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から読み取っている。


board_bcm2835.c

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からの読出し処理が含まれているのだろう。多分。