カテゴリー別アーカイブ: RaspberryPi

[RPi] Pi Zero W

Raspberry Pi 3 を入手して間もないですが、海外通販にて Pi Zero W を入手しました。PIROMONI にて注文掛けていたのですが6日で無事到着しました。Anniversary 期間に間に合ったので £10 で入手でき(通常は £12)、せっかくなので Pibow ケースや Speaker pHAT も追加しました。送料は £5.5 です。

SoC は RPi 無印と同じ BCM2835 で ARM1176 コア、RAMは 512MB の Elpida チップが SoC 上にボンディングされています。外部端子は micro USB(OTG)、mini HDMI、micro SD カード、GPIO ピン、と RPi の互換を保ちながら最小構成でできています。Pi Zero W ではさらに Wi-Fi と Bluetooth が内蔵されています。

まずは動作確認

Raspberry Pi 3 の入手ですでにイメージは micro SD カードに作成済なので、移し替えるだけです。ただ外部端子が mini HDMI と micro USB なので、ディスプレイやUSBキーボードを接続するにはそれぞれ変換ケーブルが必要になります。

ネットワークへの接続は Ethernet がないので Wi-Fi を使用します。通常 wpa-supplicant の設定が必要ですが、とりあえず動かすなら GUI で設定した方が楽です。

$ dmesg
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.35+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #1014 Fri Jun 30 14:34:49 BST 2017
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] OF: fdt:Machine model: Raspberry Pi Zero W Rev 1.1
...

Pibow ケースの組み立て

今回 Pibow ケースを同時に入手しました。積層型のパーツがボードを囲む形で見た目に面白いです。組み立てに取り掛かる前に PIROMONI ページで組み立て方を確認しておいた方がよいかと思います。たぶん確認しないとどの順番で積むのかよく分かりません^^;

GPIO ピン部分はくりぬかれていて pHAT に合わせてあるため、ケースを付けたまま pHAT を取付けられます。外部端子は干渉しないコネクタを選ぶ必要がありますが、ケースのまま取付けられます。残念ながら micro SD カードの入れ替えだけは一度ケースをばらす必要があります。

Speaker pHAT の組み立て

Speaker pHAT はパーツで提供されているので、assembly guide に従って組み立てます。pin ヘッダとスピーカへの配線は半田付けが必要です。

Speaker pHAT を使うためにはいろいろパッケージを導入する必要がありますが、PIROMONI で用意されているスクリプトを本体から直接実行することで全て導入することができます。

# curl -sS https://get.pimoroni.com/speakerphat | bash

alsa device としては default の hw:0,0 で見えています。aplay を使って音出しの動作確認ができれば OK です。LED メータも同期して光ります。mp3 など PCM 以外のフォーマットはデコードする必要があるため、mpg321 などのデコードできるプレーヤーを導入します。

# aplay /usr/share/sounds/alsa/Front_Center.wav

 

[RPi][Linux] boot upstream Linux from U-boot on Raspberry Pi 3

U-boot を Raspberry Pi 3 に導入して、ビルドした mainline Linux kernel を起動してみました。Raspberry Pi は 既存の bootloader が提供されているので、SDカードの FATパーティションに kernel image を置けば起動するのですが、ビルドした kernel を直接投入するには network 経由で起動したくなるものです。

clone & build

U-boot を clone してビルドします。

$ git clone git://git.denx.de/u-boot.git
$ cd u-boot
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CONFIG_EFI=y rpi_3_defconfig
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
$ cd -

Linux kernel を clone してビルドします。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/qemu.org/torvalds/linux.git
$ cd linux
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image dtbs
$ cd -

tftp サーバを用意します。手順は省略しますが、ここではサーバディレクトリを /tftpboot とします。kernel image と devicetree を tftp サーバへコピーします。

$ cp linux/arch/arm64/boot/Image /tftpboot/
$ cp linux/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dtb /tftpboot/

ここでは Linaro が提供する rootfs image を取得して tftp サーバへコピーします。取得する image は initramfs の uboot で読める形式で、armv8 のものを選択します。

$ wget http://releases.linaro.org/openembedded/images/minimal-initramfs-armv8/latest/linaro-image-minimal-initramfs-genericarmv8-20170127-888.rootfs.cpio.gz.u-boot
$ cp linaro-image-minimal-initramfs-genericarmv8-20170127-888.rootfs.cpio.gz.u-boot /tftpboot/rootfs.cpio.gz.u-boot

SD カードを host PC に接続し、パーティションを作成して FAT でフォーマットしマウントします。フォーマットまでは Windows で用意してもよいです。ここでは SD カードは /dev/sdX で認識されたものとしますが、dmesg などで確認して間違えないように注意してください。

※ パーティション分割やフォーマットについての詳細は他の解説にお任せします。情報は Web で探すと出てくると思います…。

$ sudo fdisk /dev/sdX
...
(パーティションを作成)
...
$ sudo mkfs.vfat -v -c -F 32 /dev/sdX1
$ sudo mount -t vfat /dev/sdX1 /mnt

github で提供されている firmware を clone して SD カードにコピーします。

$ git clone git://github.com/raspberrypi/firmware
$ cp -a firmware/boot/* /mnt/

u-boot image をSDカードにコピーし、boot 設定ファイルを作成します。

  • arm_control=0x200 を指定すると arm64 モードで起動するようになります。
  • enable_uart=1 で GPIO 端子上の Serial を有効にします。Linux では ttyS0 として見えます。
  • kernel=u-boot.bin は起動する image のファイル名を指定します。default は(arm64モードの場合) kernel8.img です。

詳しくは RPiconfig にいろいろ解説があります。

$ cp u-boot.bin /mnt/
$ cat > config.txt <<EOF
arm_control=0x200
enable_uart=1
kernel=u-boot.bin
EOF

マウントを解除して SDカードを PC から外し、Raspberry Pi 3 本体に挿入します。

$ sync
$ sudo umount /mnt

console は Serial を使うため、GPIO 端子から 接続する必要があります。今回は手持ちの FTDI chip 搭載の TTL-232r-3v3 を使用しました。Raspberry Pi 初代でも使っていた USB-Serial 変換ケーブルです。直接接続できないので、GPIO 端子を 40pin リボンケーブル(余っていた IDE ケーブル!) を介しています。

※ Raspberry Pi 3 の接続端子の詳細は他の解説にお任せします。情報は Web で探すと出てくると思います…。

また、Ethernet ケーブルで host PC との接続も行っておきます。当たり前ですが、ストレートケーブルは直結できないのでローカル LAN などに接続することになりますので、ローカル LAN の IP アドレス情報は知っておく必要があります。

電源を入れると serial に U-boot のログが出ます。一旦キーを押して止めます。

U-Boot 2017.07-00001-g13e3ef2 (Aug 13 2017 - 23:46:40 +0900)

DRAM:  944 MiB
RPI 3 Model B (0xa32082)
MMC:   sdhci@7e300000: 0
reading uboot.env
In:    serial
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
starting USB...
USB0:   Core Release: 2.80a
scanning bus 0 for devices... 3 USB Device(s) found
     scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0
U-Boot> 

ネットワークの設定を行います。ipaddr に target(Raspberry Pi 3) の IP アドレス、serverip に tftp サーバを立ち上げた host PC の IP アドレスを指定します。以下は手元で行った例ですので、自分の環境に合わせて設定します。

U-boot> setenv ipaddr 192.168.1.200            # target(RPi3) の IP アドレス
U-boot> setenv serverip 192.168.1.135          # tftp サーバの IP アドレス
U-boot> setenv netmask 255.255.255.0
U-boot> setenv bootargs root=/dev/ram0 rw console=ttyS0,115200

tftp で kernel image、devicetree、rootfs image をメモリへ転送し、kernel を起動します。

U-Boot> tftp 0x80000 Image
U-Boot> tftp 0x08000000 bcm2837-rpi-3-b.dtb
U-Boot> tftp 0x08008000 rootfs.cpio.gz.u-boot
U-Boot> booti 0x80000 0x08008000 0x08000000

以下のように起動が確認できました。

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.13.0-rc4 (kunih@ubuntu) (gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)) #1 SMP PREEMPT Fri Aug 11 11:06:59 JST 2017
[    0.000000] Boot CPU: AArch64 Processor [410fd034]
[    0.000000] Machine model: Raspberry Pi 3 Model B
...
[    2.229403] Freeing unused kernel memory: 1088K
linaro-test [rc=0]# 

Raspberry Pi の Ethernet Host は USB で接続されているようですが、現時点での kernel では USB(dwc2) の DMA に問題がありエラーで認識しませんでした。contribute が少ないためか device の mainline への対応はまだまだのようです。

参考

[RPi] Raspberry Pi 3

以前 Raspberri Pi を15か月も待って購入したのですが、なかなかいじる時間がなく、他にも放置してるガジェットがあるので Raspberri Pi 3はいいかなと思ってたのですが、手元に最新環境が扱えるプラットフォームがないのもいまいちなので、遅ればせながら共立電子で購入しました。AC アダプタは定格以上のものを用意しないと不安定になるとのことで、お店推奨の 5V/4A の変換コネクタつきを購入しています。

内蔵のeMMC に書き込みが必要なボードが多い中、micro SDカードで直接立ち上がるのはいろいろ便利です。

まずは動作確認

とりあえず Raspbian で動作確認してみます。公式サイトからのダウンロードは1時間以上かかるので mirror から取得します。

zip ファイルがダウンロードできたら、展開して得られた img ファイルを dd か Windows なら Win32DiskImager などで micro SD カードに書き込みます。遅いカードだとかなり時間が掛かります。

あとは本体に micro SD カードをセットし、HDMI・USBキーボードを挿して、ACアダプタから電源を投入して無事動作が確認できました。簡単すぎる…

中身を少し確認

RPi3 は Broadcom の SoC BCM2837 を搭載していて 1.2GHz の Cortex-A53 4 Core を内蔵していますが、dmesg と uname を見るとやはり kernel も userland も ARMv7 compat mode で動作していました。kernel は現時点の最新 LTS  4.9 を update して使っているようです。

pi@raspberrypi:~ $ dmesg | head
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.35-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #1014 SMP Fri Jun 30 14:47:43 BST 2017
[    0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7), cr=10c5383d
[    0.000000] CPU: div instructions available: patching division code
...
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux

Raspbian image は 第一パーティションを FAT32 にして boot blob、kernel image、devicetree blob などを、第二パーティションに ext4 で rootfs を置いています。fdtdump が入っているので、/boot にある dtb ファイルを覗いてデバイスの構成を見ることができます。

pi@raspberrypi:~ $ df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
/dev/root      ext4       7530028 4018864   3144436  57% /
devtmpfs       devtmpfs    468148       0    468148   0% /dev
tmpfs          tmpfs       472756       0    472756   0% /dev/shm
tmpfs          tmpfs       472756    6440    466316   2% /run
tmpfs          tmpfs         5120       4      5116   1% /run/lock
tmpfs          tmpfs       472756       0    472756   0% /sys/fs/cgroup
/dev/mmcblk0p1 vfat         42030   21419     20611  51% /boot
tmpfs          tmpfs        94552       0     94552   0% /run/user/1000
pi@raspberrypi:~ $ fdtdump /boot/bcm2710-rpi-3-b.dtb
/dts-v1/;
...
/memreserve/ 0 0x1000;
/ {
    compatible = "brcm,bcm2837", "brcm,bcm2836";
    model = "Raspberry Pi 3 Model B";
...

電源遮断の罠

最初の起動直後は初期処理を行うのでファイル更新を行います。そのため電源をいきなり切ると rootfs の更新ができていないままになり、次の起動でファイルが壊れたことでデスクトップが起動しなくなります。

特に user の openbox の lxde-pi-rc.xml が壊れるようで、ググるといくつか同じような質問をしているのが見つかります。当たり前ですが電源切る前の sync と shutdown コマンドは忘れずに。