LoginSignup
14
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-24

判別方法

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

14
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13