ブログトップ 記事一覧 ログイン 無料ブログ開設

組み込みの人。


2015-10-31

FreescaleのCortex-Mシリーズマイコンの開発環境をLinux上にセットアップする

f:id:embedded:20151031135006j:image

FreescaleのCortex-M0のMCUの評価ボードであるFRDM-KL02Z を動かしてみました。

Linux(Ubuntu 14.04 x86_64)の上に開発環境を構築しました。

準備

SDKインストール

以下のサイトからFreescale kinetisのSDKをダウンロードして展開します。

http://www.freescale.com/tools/software-and-tools/run-time-software/kinetis-software-and-tools/development-platforms-with-mbed/software-development-kit-for-kinetis-mcus:KINETIS-SDK

$ WORK=$PWD
$ tar xf Kinetis\ SDK\ 1.3.0\ Mainline\ -\ Linux.tar.gz 

以降SDKの中のドキュメント"Getting Started with Kinetis SDK (KSDK) v.1.3.pdf"に沿って進めて行くのですが、このドキュメントはWindows向けに書かれているので、けっこう苦労しました。

作業用のトップディレクトリは $WORK と表記します。


GNUツールチェインのインストール

以下のサイトからダウンロードして/usr/localの下に展開します。

https://launchpad.net/gcc-arm-embedded

$ sudo tar xf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2 -C /usr/local
$ sudo apt-get install cmake
$ sudo apt-get install lib32ncurses5

ダウンロードしたツールチェインは32bit用にビルドされているので、32bitの標準ライブラリが必要です。lib32ncurses5をインストールするとlib32用のlibcなど必要なものが揃います。

環境変数のセット
$ cd $WORK/KSDK_1.3.0/
$ cat env.sh 
export ARMGCC_DIR=/usr/local/gcc-arm-none-eabi-4_9-2015q3/
export PATH=$ARMGCC_DIR/bin:$PATH

SDKの中のビルドスクリプト環境変数ARMGCC_DIRでツールチェインのありかを参照しているので、これをセットします。

$ source env.sh

ビルド

ライブラリビルド
$ cd $WORK/KSDK_1.3.0/lib/ksdk_platform_lib/armgcc/KL02Z4/
$ ./build_all.sh
hello_worldのデモアプリビルド
$ cd $WORK/KSDK_1.3.0/examples/frdmkl02z/demo_apps/hello_world/armgcc/
$ ./build_all.sh

以下のようにファイルができれいればビルド成功。

$ ls -l debug release
debug:
total 452
-rwxrwxr-x 1 koba koba  18976 Oct 30 12:13 hello_world.bin
-rwxrwxr-x 1 koba koba 190613 Oct 30 12:13 hello_world.elf
-rw-rw-r-- 1 koba koba  51103 Oct 30 12:13 hello_world.hex
-rw-rw-r-- 1 koba koba 229412 Oct 30 12:13 hello_world.map

release:
total 172
-rwxrwxr-x 1 koba koba   6676 Oct 30 12:13 hello_world.bin
-rwxrwxr-x 1 koba koba  76881 Oct 30 12:13 hello_world.elf
-rw-rw-r-- 1 koba koba  16506 Oct 30 12:13 hello_world.hex
-rw-rw-r-- 1 koba koba 115515 Oct 30 12:13 hello_world.map

実機で実行

デバッガの準備

JLinkGDBServer は以下のサイトから入手できます。

https://www.segger.com/jlink-software.html

$ cd $WORK
$ tar xf JLink_Linux_V502f_x86_64.tgz 

FRDM-KL02ZをUSBケーブルで挿したときにできるデバイスファイルを一般ユーザでもアクセスできるようにudevのルールを追加しておきます。

$ cat /etc/udev/rules.d/99-jlink.rules 
ENV{ID_BUS}=="usb", ENV{ID_MODEL}=="J-Link", MODE="666"
ファームウェアアップデート

FRDM-KL02ZはデフォルトではP&E Micro OpenSDAのファームウェアが書かれています。KL02のデバッグインタフェース仕様は OpenSDA v1.0 なので、これに対応したJLink用のファームウェアアップデートします。

https://www.segger.com/opensda.html からJLink_OpenSDA_2015-10-13.zipをダウンロードします。zipの中身はJLink_OpenSDA_2015-10-13.sdaというひとつのファイル。

FRDM-KL02Z をリセットボタンを押しながらUSBに接続するとファームウェアアップデートのモードになり、PC側からUSBストレージとして見えるボリュームの名称がBOOTLOADERになります。

そこに、JLink_OpenSDA_2015-10-13.sda をドラッグ&ドロップします。書き込みに成功するとLASTSTAT.TXTの内容がCompletedになります。

ドキュメントにはWindowsLinuxのどちらでもこのファームウェアアップデートはできると書いてあったのですが、実際にはLinuxではうまくいかなくて、Windwos7でやったら成功しました。

ファームウェアアップデートが完了したら、USBケーブルを一度抜いて挿し直します。これで通常モードになります。

(2015.11.13 追記)

LinuxからでもGUIでなくてコマンドラインで以下のようにコピーしたらアップデートできました。

$ cp JLink_OpenSDA_2015-10-13.sda /media/koba/BOOTLOADER/

(追記 ここまで)

シリアルコンソールを開く

別のターミナル評価ボードのシリアルコンソールを開いておく。

$ screen /dev/ttyACM0 115200

このコマンドの終了は ^Ak

JLinkGDBserverの起動

別のターミナル

$ cd $WORK/JLink_Linux_V502f_x86_64
$ ./JLinkGDBServer -select USB -device MKL02Z32xxx4 -if SWD -speed 1000
SEGGER J-Link GDB Server V5.02f Command Line Version

JLinkARM.dll V5.02f (DLL compiled Oct  2 2015 20:53:57)

-----GDB Server start settings-----
GDBInit file:                  none
GDB Server Listening port:     2331
SWO raw output listening port: 2332
Terminal I/O port:             2333
Accept remote connection:      yes
Generate logfile:              off
Verify download:               off
Init regs on start:            off
Silent mode:                   off
Single run mode:               off
Target connection timeout:     0 ms
------J-Link related settings------
J-Link Host interface:         USB
J-Link script:                 none
J-Link settings file:          none
------Target related settings------
Target device:                 MKL02Z32xxx4
Target interface:              SWD
Target interface speed:        1000kHz
Target endian:                 little

Connecting to J-Link...
J-Link is connected.
Firmware: J-Link OpenSDA compiled Oct 13 2015 12:09:57
Hardware: V1.00
S/N: 621000000
Checking target voltage...
Target voltage: 3.30 V
Listening on TCP/IP port 2331
Connecting to target...Connected to target
Waiting for GDB connection...

ファームウェアアップデートしていないと、J-Link is connected.のあたりで失敗します。

gdbの起動

debug用にビルドしたオブジェクトのあるディレクトリに移動して

$ cd $WORK/KSDK_1.3.0/examples/frdmkl02z/demo_apps/hello_world/armgcc/debug
$ arm-none-eabi-gdb hello_world.elf

gdbのプロンプトで

target remote localhost:2331
monitor reset
monitor halt
load
monitor reset
monitor halt
b main
c

これでフラッシュメモリにロードしてmain関数のところまで実行して止まります。

この内容を.gdbinit に書いておけば、次回から自動で実行されます。

c

これでmain関数の中が実行されます。シリアルコンソールに"Hello, world" が表示され、LEDが点滅すれば成功です。

2015-10-25

Raspberry Pi 2でAndroidのUSBテザリングを使う

Raspbian jessieを使っています。

Nexus One (Android 2.3.6)をUSBケーブルでつなぎ、Androidの設定でUSBテザリングを有効にするとそれだけで使えました。

$ dmesg |tail
[12881.591125] usb 1-1.5: USB disconnect, device number 7
[12881.871995] usb 1-1.5: new high-speed USB device number 8 using dwc_otg
[12881.985095] usb 1-1.5: New USB device found, idVendor=18d1, idProduct=4e13
[12881.985123] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12881.985140] usb 1-1.5: Product: Nexus One
[12881.985155] usb 1-1.5: Manufacturer: Google, Inc.
[12881.985172] usb 1-1.5: SerialNumber: HT015P803242
[12882.009486] usbcore: registered new interface driver cdc_ether
[12882.028650] rndis_host 1-1.5:1.0 usb0: register 'rndis_host' at usb-3f980000.usb-1.5, RNDIS device, a2:cd:1a:a1:66:8a
[12882.028851] usbcore: registered new interface driver rndis_host

新しくusb0というインタフェースができています。

$ ifconfig -s
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0       493      0      0 0           388      0      0      0 BMU
lo        65536 0       136      0      0 0           136      0      0      0 LRU
usb0       1500 0      6443      0      0 0          4149      0      0      0 BMRU
$ ifconfig usb0
usb0      Link encap:Ethernet  HWaddr a2:cd:1a:a1:66:8a  
          inet addr:192.168.42.204  Bcast:192.168.42.255  Mask:255.255.255.0
          inet6 addr: fe80::a0cd:1aff:fea1:668a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6443 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4149 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9455321 (9.0 MiB)  TX bytes:494963 (483.3 KiB)

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.42.129  0.0.0.0         UG    205    0        0 usb0
192.168.42.0    *               255.255.255.0   U     205    0        0 usb0

Raspberry Pi 2でiPhoneのUSBテザリングを使う

Raspbian jessie を使っています。

iPhoneUSBテザリングについては以下のページに情報がありますが、この方法ではwheezyではうまくいきましたが、jessieではダメでした。

How to Tether Your Raspberry Pi with your iPhone 5 | DaveConroy.com

Raspberry Pi How To: Tether to iPhone 5

でもうまくいく方法を見つけました。

準備。

$ sudo apt-get install ipheth-utils libimobiledevice-utils ifuse usbmuxd
$ sudo mkdir /media/iphone

iPhoneUSBケーブルでつなぎます。私が試したのはiPhone6

$ sudo ifuse /media/iphone

これでテザリングできるようになります。

iPhoneをつなげたときに、自動でifuseを実行するようにするためには上記のページを参考にしてudevのスクリプトを修正すればよいはずです。


以下はメモ

このページの手順をなぞってみる

Raspberry Pi How To: Tether to iPhone 5

$ sudo apt-get install ipheth-utils libimobiledevice-utils ifuse

ここでiphoneUSBケーブルでつなぐ。

$ ifconfig -s
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0       344      0      0 0           290      0      0      0 BMRU
lo        65536 0       136      0      0 0           136      0      0      0 LRU

インタフェースが増えてない。

$ dmesg |tail 
[   33.030589] cfg80211: Calling CRDA to update world regulatory domain
[   36.190643] cfg80211: Calling CRDA to update world regulatory domain
[   39.350699] cfg80211: Calling CRDA to update world regulatory domain
[   42.510714] cfg80211: Exceeded CRDA call max attempts. Not calling CRDA
[  306.713474] usb 1-1.5: new high-speed USB device number 4 using dwc_otg
[  306.816790] usb 1-1.5: New USB device found, idVendor=05ac, idProduct=12a8
[  306.816816] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  306.816833] usb 1-1.5: Product: iPhone
[  306.816849] usb 1-1.5: Manufacturer: Apple Inc.
[  306.816866] usb 1-1.5: SerialNumber: 4c6f6a8607e5231b47ae51381dc55f2306b1120e

なんか反応が薄い。ipheth が登録されていない。

手動でmodprobeしてみる。

$ sudo modprobe ipheth
$ dmesg |tail
[   36.190643] cfg80211: Calling CRDA to update world regulatory domain
[   39.350699] cfg80211: Calling CRDA to update world regulatory domain
[   42.510714] cfg80211: Exceeded CRDA call max attempts. Not calling CRDA
[  306.713474] usb 1-1.5: new high-speed USB device number 4 using dwc_otg
[  306.816790] usb 1-1.5: New USB device found, idVendor=05ac, idProduct=12a8
[  306.816816] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  306.816833] usb 1-1.5: Product: iPhone
[  306.816849] usb 1-1.5: Manufacturer: Apple Inc.
[  306.816866] usb 1-1.5: SerialNumber: 4c6f6a8607e5231b47ae51381dc55f2306b1120e
[  432.201372] usbcore: registered new interface driver ipheth
$ ifconfig -s
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0       344      0      0 0           290      0      0      0 BMRU
lo        65536 0       136      0      0 0           136      0      0      0 LRU

まだダメ。udevから起動されるはずの/lib/udev/ipheth-pairを手動で動かしてみる。

$ sudo /lib/udev/ipheth-pair 
/lib/udev/ipheth-pair: -3: cannot get default device

なんかエラーになっているので、straceで見てみる。

$ sudo strace -o /tmp/strace.log /lib/udev/ipheth-pair 
/lib/udev/ipheth-pair: -3: cannot get default device
  ... 
 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 0}, ru_stime={0, 20000}, ...}) = 0
 read(3, "\3351\243}]\325\326\202\231\202\337\211\tX%\2626\6\254\230fMp\261\2507\223\310\373\347E1", 32) = 32
 read(3, "#\246\301a\375\336\247N\177\320\277BzhXQ\\2\264\360\206\262(\254\364<\234\307=A*\317", 32) = 32
 read(3, "\214\316\305\352z\":\345", 8)  = 8
 fstat64(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 9), ...}) = 0
 futex(0x76f4c3a4, FUTEX_WAKE_PRIVATE, 2147483647) = 0
 stat64("/var/run/usbmuxd", 0x7eeb59c8)  = -1 ENOENT (No such file or directory)
 write(2, "/lib/udev/ipheth-pair: -3: canno"..., 53) = 53
 futex(0x76f4c3a8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
 close(3)                                = 0
 exit_group(-1)                          = ?
 +++ exited with 255 +++

"/var/run/usbmuxd"が無いのが直接の原因。ネットでusbmuxdを検索するとそういうパッケージがあることがわかる。

$ sudo apt-get install usbmuxd

このパッケージがインストールされていなかった。

これでiPhoneを抜いて、挿し直すと

$ ifconfig -s
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0       434      0      0 0           358      0      0      0 BMRU
eth1       1500 0         0      0      0 0             3      2      0      0 BMRU
lo        65536 0       136      0      0 0           136      0      0      0 LRU

eth1ができた。

$ sudo mkdir /media/iphone
$ sudo ifuse /media/iphone

iPhoneの画面に「このコンピュータを信頼しますか?」というダイアログが出ているので、とりあえず「信頼する」のボタンを押す。

$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr d2:4f:7e:c4:26:f7  
          inet addr:172.20.10.3  Bcast:172.20.10.15  Mask:255.255.255.240
          inet6 addr: fe80::d04f:7eff:fec4:26f7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:272 errors:0 dropped:1 overruns:0 frame:0
          TX packets:271 errors:17 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:52399 (51.1 KiB)  TX bytes:39804 (38.8 KiB)

使えるようになった。

要するに、usbmuxd も必要だった。

2015-10-24

Raspberry Pi 2で現在のカーネルのコンフィグを確認する

Raspbian jessi のカーネルでは/proc/config.gz がありません。

$ ls /proc/config.gz
ls: cannot access /proc/config.gz: No such file or directory

でも以下のようにconfigs.koをロードすれば大丈夫。

$ sudo modprobe configs
$ ls /proc/config.gz
/proc/config.gz

これで現在のカーネルのコンフィグを確認できます。

$ zcat /proc/config.gz |grep IKCONFIG
CONFIG_IKCONFIG=m
CONFIG_IKCONFIG_PROC=y

ちなみに、CONFIG_IKCONFIG=y でカーネルビルドしておくと常に/proc/config.gz があるようになります。

Raspbian jessie で起動時にGUIのログイン画面を出さないようにする方法

Raspberry Pi 2 Raspbian jessie をシリアルコンソールで使っています。

ふとps axでプロセスを見るとXサーバーとか不要なプロセスがたくさん動いているのに気がつきました。確かRaspbian wheezy では明示的にstartxコマンドを実行しないとこれらのプロセスは起動されなかったはずです。jessieになってからこのあたりが変わってしまいました。

最初に結論

余計なプロセスが動いているのは嫌なので、これらを止めます。

一時的に止めるには

$ sudo systemctl stop lightdm

起動時にlightdmが動かないようにするには

$ sudo systemctl set-default multi-user.target

元に戻すときには

$ sudo systemctl set-default graphical.target

以下はメモ

Raspbian jessie ではデフォルトで以下のようなプロセスが動いていました。

$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:04 /sbin/init
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:00 [ksoftirqd/0]
    5 ?        S<     0:00 [kworker/0:0H]
    6 ?        S      0:00 [kworker/u8:0]
    7 ?        S      0:00 [rcu_preempt]
    8 ?        S      0:00 [rcu_sched]
    9 ?        S      0:00 [rcu_bh]
   10 ?        S      0:00 [migration/0]
   11 ?        S      0:00 [migration/1]
   12 ?        S      0:00 [ksoftirqd/1]
   14 ?        S<     0:00 [kworker/1:0H]
   15 ?        S      0:00 [migration/2]
   16 ?        S      0:00 [ksoftirqd/2]
   19 ?        S      0:00 [migration/3]
   20 ?        S      0:00 [ksoftirqd/3]
   22 ?        S<     0:00 [kworker/3:0H]
   23 ?        S<     0:00 [khelper]
   24 ?        S      0:00 [kdevtmpfs]
   25 ?        S<     0:00 [netns]
   26 ?        S<     0:00 [perf]
   27 ?        S      0:00 [khungtaskd]
   28 ?        S<     0:00 [writeback]
   29 ?        S<     0:00 [crypto]
   30 ?        S<     0:00 [bioset]
   31 ?        S<     0:00 [kblockd]
   32 ?        S      0:00 [kworker/1:1]
   33 ?        S<     0:00 [rpciod]
   34 ?        S      0:00 [kswapd0]
   35 ?        S      0:00 [fsnotify_mark]
   36 ?        S<     0:00 [nfsiod]
   42 ?        S<     0:00 [kthrotld]
   43 ?        S      0:00 [kworker/0:1]
   44 ?        S<     0:00 [VCHIQ-0]
   45 ?        S<     0:00 [VCHIQr-0]
   46 ?        S<     0:00 [VCHIQs-0]
   47 ?        S<     0:00 [iscsi_eh]
   48 ?        S<     0:00 [dwc_otg]
   49 ?        S<     0:00 [DWC Notificatio]
   51 ?        S      0:00 [VCHIQka-0]
   52 ?        S<     0:00 [SMIO]
   53 ?        S<     0:00 [deferwq]
   54 ?        S      0:00 [kworker/u8:2]
   55 ?        S      0:00 [mmcqd/0]
   57 ?        S      0:00 [kworker/2:1]
   58 ?        S<     0:01 [kworker/0:1H]
   59 ?        S<     0:00 [kworker/1:1H]
   60 ?        S<     0:00 [ipv6_addrconf]
   71 ?        S<     0:00 [kworker/3:1H]
   72 ?        S<     0:00 [kworker/2:1H]
   95 ?        D      0:00 [kworker/0:2]
  104 ?        Ss     0:00 /lib/systemd/systemd-journald
  107 ?        Ss     0:00 /lib/systemd/systemd-udevd
  211 ?        S      0:00 [kworker/3:2]
  233 ?        S      0:00 [kworker/2:2]
  290 ?        S      0:00 [kworker/1:3]
  407 ?        S<     0:00 [cfg80211]
  497 ?        S      0:00 [kworker/3:3]
  499 ?        Ss     0:00 avahi-daemon: running [raspberrypi.local]
  501 ?        Ss     0:00 /usr/sbin/cron -f
  502 ?        Ssl    0:00 /usr/sbin/rsyslogd -n
  503 ?        Ss     0:00 /lib/systemd/systemd-logind
  504 ?        Ss     0:00 /usr/bin/dbus-daemon --system --address=systemd: --no
  505 ?        Ss     0:00 /sbin/dhcpcd -q -b
  507 ?        S      0:00 avahi-daemon: chroot helper
  536 ?        Ss     0:00 /usr/sbin/thd --daemon --triggers /etc/triggerhappy/t
  540 ?        Ss     0:00 /usr/sbin/sshd -D
  549 ?        Ssl    0:00 /usr/sbin/lightdm
  571 tty1     Ss     0:00 /bin/login -f   
  575 ?        Ss     0:00 /bin/login --   
  590 ?        S      0:00 /usr/sbin/ifplugd -i eth0 -q -f -u0 -d10 -w -I
  613 ?        Ss     0:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 107:112
  637 tty7     Ss+    0:01 /usr/bin/X :0 -seat seat0 -auth /var/run/lightdm/root
  710 ?        Ss     0:00 /lib/systemd/systemd --user
  718 ?        S      0:00 (sd-pam)  
  726 ?        Sl     0:00 lightdm --session-child 13 16
  729 tty1     S+     0:00 -bash
  746 ?        Ssl    0:00 /usr/bin/lxsession -s LXDE-pi -e LXDE
  777 ?        Ss     0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-s
  780 ?        S      0:00 /usr/bin/dbus-launch --exit-with-session x-session-ma
  781 ?        Ss     0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-add
  788 ?        Sl     0:00 /usr/lib/gvfs/gvfsd
  792 ?        Sl     0:00 /usr/lib/gvfs/gvfsd-fuse /run/user/1000/gvfs -f -o bi
  802 ?        S      0:00 openbox --config-file /home/pi/.config/openbox/lxde-p
  803 ?        Sl     0:00 lxpolkit
  806 ?        Sl     0:04 lxpanel --profile LXDE-pi
  808 ?        Sl     0:01 pcmanfm --desktop --profile LXDE-pi
  814 ?        Ss     0:00 /usr/bin/ssh-agent -s
  818 ?        Ssl    0:00 /usr/lib/policykit-1/polkitd --no-debug
  824 ?        Sl     0:00 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
  832 ?        Ssl    0:00 /usr/lib/udisks2/udisksd --no-debug
  842 ?        S<l    0:00 /usr/bin/pulseaudio --start
  843 ?        SNsl   0:00 /usr/lib/rtkit/rtkit-daemon
  855 ?        Sl     0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
  867 ?        Sl     0:00 /usr/lib/gvfs/gvfs-goa-volume-monitor
  868 ttyAMA0  S      0:00 -bash
  874 ?        Sl     0:00 /usr/lib/gvfs/gvfs-mtp-volume-monitor
  879 ?        Sl     0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
  882 ?        S<     0:00 [kworker/2:2H]
  900 ?        Ssl    0:00 /usr/lib/menu-cache/menu-cached /tmp/.menu-cached-:0-
  902 ?        S      0:00 /bin/sh /usr/bin/start-pulseaudio-x11
  903 ?        S      0:00 /usr/bin/xprop -root -spy
  905 ?        Sl     0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.1 /org/gtk/gvf
 1792 ?        S      0:00 [kworker/0:0]
 1793 ?        S      0:00 [kworker/1:0]
 1872 ttyAMA0  R+     0:00 ps ax

/usr/bin/X がXサーバシリアルコンソールだけで使っているなら不要なので、止めたい。

プロセスの親子関係を調べる。

$ pstree
systemd─┬─avahi-daemon───avahi-daemon
        ├─cron
        ├─2*[dbus-daemon]
        ├─dbus-launch
        ├─dhcpcd
        ├─gvfs-afc-volume─┬─{gdbus}
        │                 └─{gvfs-afc-volume}
        ├─gvfs-goa-volume───{gdbus}
        ├─gvfs-gphoto2-vo───{gdbus}
        ├─gvfs-mtp-volume───{gdbus}
        ├─gvfs-udisks2-vo─┬─{gdbus}
        │                 └─{gmain}
        ├─gvfsd───{gdbus}
        ├─gvfsd-fuse─┬─{gdbus}
        │            ├─{gvfs-fuse-sub}
        │            └─2*[{gvfsd-fuse}]
        ├─gvfsd-trash─┬─{gdbus}
        │             └─{gmain}
        ├─ifplugd
        ├─lightdm─┬─Xorg
        │         ├─lightdm─┬─lxsession─┬─lxpanel─┬─{gdbus}
        │         │         │           │         ├─{gmain}
        │         │         │           │         ├─{menu-cache-io}
        │         │         │           │         ├─{task0}
        │         │         │           │         └─{task1}
        │         │         │           ├─lxpolkit───{gdbus}
        │         │         │           ├─openbox
        │         │         │           ├─pcmanfm─┬─{gdbus}
        │         │         │           │         └─{gmain}
        │         │         │           ├─ssh-agent
        │         │         │           ├─{gdbus}
        │         │         │           └─{gmain}
        │         │         ├─{gdbus}
        │         │         └─{gmain}
        │         ├─{gdbus}
        │         └─{gmain}
        ├─login───bash
        ├─login───bash───pstree
        ├─menu-cached─┬─{gdbus}
        │             └─{gmain}
        ├─ntpd
        ├─polkitd─┬─{gdbus}
        │         └─{gmain}
        ├─pulseaudio───{alsa-sink-bcm28}
        ├─rsyslogd─┬─{in:imklog}
        │          ├─{in:imuxsock}
        │          └─{rs:main Q:Reg}
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─ssh-agent
        ├─sshd
        ├─start-pulseaudi───xprop
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─thd
        └─udisksd─┬─{cleanup}
                  ├─{gdbus}
                  ├─{gmain}
                  └─{probing-thread}

systemdがlightdmを起動するのを止めればよさそう。

$ sudo systemctl stop lightdm
$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:04 /sbin/init
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:00 [ksoftirqd/0]
    5 ?        S<     0:00 [kworker/0:0H]
    6 ?        S      0:00 [kworker/u8:0]
    7 ?        S      0:00 [rcu_preempt]
    8 ?        S      0:00 [rcu_sched]
    9 ?        S      0:00 [rcu_bh]
   10 ?        S      0:00 [migration/0]
   11 ?        S      0:00 [migration/1]
   12 ?        S      0:00 [ksoftirqd/1]
   14 ?        S<     0:00 [kworker/1:0H]
   15 ?        S      0:00 [migration/2]
   16 ?        S      0:00 [ksoftirqd/2]
   19 ?        S      0:00 [migration/3]
   20 ?        S      0:00 [ksoftirqd/3]
   22 ?        S<     0:00 [kworker/3:0H]
   23 ?        S<     0:00 [khelper]
   24 ?        S      0:00 [kdevtmpfs]
   25 ?        S<     0:00 [netns]
   26 ?        S<     0:00 [perf]
   27 ?        S      0:00 [khungtaskd]
   28 ?        S<     0:00 [writeback]
   29 ?        S<     0:00 [crypto]
   30 ?        S<     0:00 [bioset]
   31 ?        S<     0:00 [kblockd]
   32 ?        S      0:00 [kworker/1:1]
   33 ?        S<     0:00 [rpciod]
   34 ?        S      0:00 [kswapd0]
   35 ?        S      0:00 [fsnotify_mark]
   36 ?        S<     0:00 [nfsiod]
   42 ?        S<     0:00 [kthrotld]
   44 ?        S<     0:00 [VCHIQ-0]
   45 ?        S<     0:00 [VCHIQr-0]
   46 ?        S<     0:00 [VCHIQs-0]
   47 ?        S<     0:00 [iscsi_eh]
   48 ?        S<     0:00 [dwc_otg]
   49 ?        S<     0:00 [DWC Notificatio]
   51 ?        S      0:00 [VCHIQka-0]
   52 ?        S<     0:00 [SMIO]
   53 ?        S<     0:00 [deferwq]
   54 ?        S      0:00 [kworker/u8:2]
   55 ?        S      0:00 [mmcqd/0]
   57 ?        S      0:00 [kworker/2:1]
   58 ?        S<     0:01 [kworker/0:1H]
   59 ?        S<     0:00 [kworker/1:1H]
   60 ?        S<     0:00 [ipv6_addrconf]
   71 ?        S<     0:00 [kworker/3:1H]
   72 ?        S<     0:00 [kworker/2:1H]
   95 ?        S      0:00 [kworker/0:2]
  104 ?        Ss     0:00 /lib/systemd/systemd-journald
  107 ?        Ss     0:00 /lib/systemd/systemd-udevd
  211 ?        S      0:00 [kworker/3:2]
  233 ?        S      0:00 [kworker/2:2]
  407 ?        S<     0:00 [cfg80211]
  497 ?        S      0:00 [kworker/3:3]
  499 ?        Ss     0:00 avahi-daemon: running [raspberrypi.local]
  501 ?        Ss     0:00 /usr/sbin/cron -f
  502 ?        Ssl    0:00 /usr/sbin/rsyslogd -n
  503 ?        Ss     0:00 /lib/systemd/systemd-logind
  504 ?        Ss     0:00 /usr/bin/dbus-daemon --system --address=systemd: --no
  505 ?        Ss     0:00 /sbin/dhcpcd -q -b
  507 ?        S      0:00 avahi-daemon: chroot helper
  536 ?        Ss     0:00 /usr/sbin/thd --daemon --triggers /etc/triggerhappy/t
  540 ?        Ss     0:00 /usr/sbin/sshd -D
  571 tty1     Ss     0:00 /bin/login -f   
  575 ?        Ss     0:00 /bin/login --   
  590 ?        S      0:00 /usr/sbin/ifplugd -i eth0 -q -f -u0 -d10 -w -I
  613 ?        Ss     0:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 107:112
  710 ?        Ss     0:00 /lib/systemd/systemd --user
  718 ?        S      0:00 (sd-pam)  
  729 tty1     S+     0:00 -bash
  814 ?        Ss     0:00 /usr/bin/ssh-agent -s
  818 ?        Ssl    0:00 /usr/lib/policykit-1/polkitd --no-debug
  832 ?        Ssl    0:00 /usr/lib/udisks2/udisksd --no-debug
  843 ?        SNsl   0:00 /usr/lib/rtkit/rtkit-daemon
  868 ttyAMA0  S      0:00 -bash
  882 ?        S<     0:00 [kworker/2:2H]
 1792 ?        S      0:00 [kworker/0:0]
 1793 ?        S      0:00 [kworker/1:0]
 2130 ?        S      0:00 [kworker/3:0]
 2133 ?        S      0:00 [kworker/0:1]
 2173 ttyAMA0  R+     0:00 ps ax

これでスッキリしました。

最初から動かないようにしたいので、

$ sudo systemctl disable lightdm

としてみたけど、リブートするとまだlightdm以下いろいろなプロセスが起動されてしまって効果無し。

ネットで調べて以下のページを発見。

Debian User Forums • View topic - [SOLVED] systemd, masked services, and disabling lightdm

$ systemctl get-default
graphical.target

となっていたので、以下のようにして解決。

$ sudo systemctl set-default multi-user.target
Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/multi-user.target.

2015-10-18

Raspberry Pi 2でWiFiドングル BUFFALO WI-U2-433DMを使う

Raspbian jessi, kernel 4.1.10-v7+ を使っています。

エアステーション 11ac/n/a/g/b 433/150Mbps USB2.0用 無線LAN子機 : WI-U2-433DM | BUFFALO バッファロー

このWiFiドングルのチップはrtl8811auで、そのドライバは以下のサイトから入手できます。

https://github.com/gnab/rtl8812au

$ git clone https://github.com/gnab/rtl8812au.git
$ cd rtl8812au

クロスコンパイルするために以下のようにMakefileを変更します。

diff --git a/Makefile b/Makefile
index b79a7d8..564efd8 100644
--- a/Makefile
+++ b/Makefile
@@ -49,13 +49,14 @@ CONFIG_EXT_CLK = n
 CONFIG_FTP_PROTECT = n
 CONFIG_WOWLAN = n
 
-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_JB_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
 CONFIG_PLATFORM_ARM_PXA2XX = n
 CONFIG_PLATFORM_ARM_S3C6K4 = n
 CONFIG_PLATFORM_ARM_RPI = n
+CONFIG_PLATFORM_ARM_RPI_CROSS = y
 CONFIG_PLATFORM_MIPS_RMI = n
 CONFIG_PLATFORM_RTD2880B = n
 CONFIG_PLATFORM_MIPS_AR9132 = n
@@ -738,6 +739,15 @@ KSRC ?= /lib/modules/$(KVER)/build
 MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
 endif
 
+ifeq ($(CONFIG_PLATFORM_ARM_RPI_CROSS), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+ARCH := arm
+CROSS_COMPILE := arm-linux-gnueabihf-
+KVER  := 4.1.10-v7+
+KSRC ?= $(HOME)/work/raspi/linux
+MODDESTDIR := 
+endif
+
 ifeq ($(CONFIG_PLATFORM_RTD2880B), y)
 EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN -DCONFIG_PLATFORM_RTD2880B
 ARCH:=

make してできた8812au.ko をRaspberry Pi 2 の /lib/modules/4.1.10-v7+/ にコピーし、

$ sudo depmod

を実行して、モジュールの依存関係を更新します。

WiFiアクセスポイント登録Raspberry Pi 2でWiFiを使う - 組み込みの人。の通り。

BUFFALO WI-U2-433DMを挿したときのカーネルログは以下の通り。

[  160.521582] usb 1-1.5: new high-speed USB device number 4 using dwc_otg
[  160.622988] usb 1-1.5: New USB device found, idVendor=0411, idProduct=0242
[  160.623017] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  160.623035] usb 1-1.5: Product: 802.11ac WLAN Adapter 
[  160.623051] usb 1-1.5: Manufacturer: Realtek 
[  160.623068] usb 1-1.5: SerialNumber: 00e04c000001
[  161.213418] usbcore: registered new interface driver rtl8812au
[  161.747741] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
[  162.416979] RTL871X: set bssid:00:00:00:00:00:00
[  162.418093] RTL871X: set ssid [g\xffffffc6isQ\xffffffffJ\xffffffec)ͺ\xffffffab\xfffffff2\xfffffffb\xffffffe3F|\xffffffc2T\xfffffff8xffffffe8\xffffffe7\xffffff8dvZ.c3\xffffff9fɚ ] fw_state=0x00000008
[  165.718720] RTL871X: set ssid [0024A52FB295] fw_state=0x00000008
[  165.718911] RTL871X: set bssid:00:24:a5:2f:b2:95
[  165.950915] RTL871X: start auth
[  165.960182] RTL871X: auth success, start assoc
[  165.967813] RTL871X: assoc success
[  165.969984] UpdateHalRAMask8812A => mac_id:0, networkType:0x0b, mask:0x000fffff
	 ==> rssi_level:0, rate_bitmap:0x000ff005
[  165.993282] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[  166.090729] RTL871X: send eapol packet
[  166.149026] RTL871X: send eapol packet
[  166.157988] RTL871X: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:4
[  166.158044] RTL871X: set group key to hw: alg:2(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:2
[  171.744734] UpdateHalRAMask8812A => mac_id:0, networkType:0x0b, mask:0x000fffff
	 ==> rssi_level:1, rate_bitmap:0x000f0000

接続して使用可能になりました。

関連

Raspberry Pi 2でWiFiを使う - 組み込みの人。

Raspberry Pi 2のカーネルをビルドしてみた - 組み込みの人。

Raspberry Pi 2でWiFiドングル PLANEX GW-450Dを使う

Raspbian jessi, kernel 4.1.10-v7+ を使っています。

neuralassemblyのメモ: Raspberry Pi 2 + kernel 4.1 / 4.4 系列で5GHz対応WifiドングルGW-450Dを動かした を参考にさせていただき、同じソースコード、同じパッチを使いました。

ただしセルフビルドでなくクロスビルドのために以下の変更をしました。

$ diff -u Makefile.org Makefile
--- Makefile.org	2013-09-16 23:03:08.000000000 +0900
+++ Makefile	2015-10-18 16:59:23.386655463 +0900
@@ -32,7 +32,7 @@
 RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(MODULE)
 
 #PLATFORM: Target platform
-PLATFORM = PC
+#PLATFORM = PC
 #PLATFORM = 5VT
 #PLATFORM = IKANOS_V160
 #PLATFORM = IKANOS_V180
@@ -68,6 +68,7 @@
 #PLATFORM = RALINK_3352
 #PLATFORM = UBICOM_IPX8
 #PLATFORM = INTELP6
+PLATFORM = RASPBERRY_PI
 
 #APSOC
 ifeq ($(MODULE),3050)
@@ -105,6 +106,13 @@
 export MODULE
 endif
 
+ifeq ($(PLATFORM),RASPBERRY_PI)
+LINUX_SRC = $(HOME)/work/raspi/linux
+ARCH = arm
+export ARCH
+CROSS_COMPILE = arm-linux-gnueabihf-
+endif
+
 ifeq ($(PLATFORM),5VT)
 LINUX_SRC = /home/ralink-2860-sdk-5vt-distribution/linux-2.6.17
 CROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux-
$ diff -u os/linux/config.mk.org os/linux/config.mk
--- os/linux/config.mk.org	2015-10-18 15:20:30.000000000 +0900
+++ os/linux/config.mk	2015-10-18 17:08:20.186201077 +0900
@@ -941,6 +941,10 @@
 WFLAGS += -DST
 endif
 
+ifeq ($(PLATFORM),RASPBERRY_PI)
+EXTRA_CFLAGS := $(WFLAGS)
+endif
+
 #kernel build options for 2.4
 # move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star

できたos/linux/mt7650u_sta.koをRaspberry Pi 2 の/lib/modules/4.1.10-v7+/ にコピーし、

$ sudo depmod

を実行して、モジュールの依存関係を更新します。

また、設定ファイルもRaspberry Pi 2にコピーします。

$ sudo mkdir -p /etc/Wireless/RT2870STA
$ sudo cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat

/etc/network/interface に以下の行を追加します。

auto ra0
allow-hotplug ra0
iface ra0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

WiFiアクセスポイント登録Raspberry Pi 2でWiFiを使う - 組み込みの人。の通り。

これでPLANEX GW-450Dを挿したときのカーネルログは以下。

[  291.872361] usb 1-1.5: new high-speed USB device number 4 using dwc_otg
[  291.988871] usb 1-1.5: New USB device found, idVendor=2019, idProduct=ab31
[  291.988899] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  291.988917] usb 1-1.5: Product: GW-450D
[  291.988933] usb 1-1.5: Manufacturer: Planex
[  291.988949] usb 1-1.5: SerialNumber: 1.0
[  294.903179] rtusb init rt2870 --->
[  294.904227] 

=== pAd = bd282000, size = 857568 ===

[  294.904301] <-- RTMPAllocTxRxRingMemory, Status=0
[  294.904821] <-- RTMPAllocAdapterBlock, Status=0
[  294.905048] ==>RT65xx_WLAN_ChipOnOff(): OnOff:1, Reset= 0, pAd->WlanFunCtrl:0x0, Reg-WlanFunCtrl=0xff000002
[  294.906147] MCUType = 2
[  294.906396] NVM is EFUSE
[  294.906406] Endpoint(8) is for In-band Command
[  294.906415] Endpoint(4) is for WMM0 AC0
[  294.906422] Endpoint(5) is for WMM0 AC1
[  294.906430] Endpoint(6) is for WMM0 AC2
[  294.906437] Endpoint(7) is for WMM0 AC3
[  294.906444] Endpoint(9) is for WMM1 AC0
[  294.906451] Endpoint(84) is for Data-In
[  294.906459] Endpoint(85) is for Command Rsp
[  294.907663] usbcore: registered new interface driver rt2870
[  295.045978] -->RTUSBVenderReset
[  295.046095] <--RTUSBVenderReset
[  295.051116] fw version:0.1.00 build:7640
[  295.051135] build time:201308221655____
[  295.051180] ilm length = 68780(bytes)
[  295.051189] dlm length = 11476(bytes)
[  295.072423] #
[  295.080056] loading fw......
[  295.152448] #
[  295.371566] RTMP_TimerListAdd: add timer obj bd300b84!
[  295.371595] RTMP_TimerListAdd: add timer obj bd300bcc!
[  295.371605] RTMP_TimerListAdd: add timer obj bd300c14!
[  295.371614] RTMP_TimerListAdd: add timer obj bd300b3c!
[  295.371627] RTMP_TimerListAdd: add timer obj bd300a64!
[  295.371636] RTMP_TimerListAdd: add timer obj bd300aac!
[  295.371649] RTMP_TimerListAdd: add timer obj bd294c2c!
[  295.371659] RTMP_TimerListAdd: add timer obj bd28403c!
[  295.371668] RTMP_TimerListAdd: add timer obj bd284088!
[  295.371678] RTMP_TimerListAdd: add timer obj bd294d14!
[  295.371691] RTMP_TimerListAdd: add timer obj bd294b9c!
[  295.371707] RTMP_TimerListAdd: add timer obj bd294ccc!
[  295.382926] cfg_mode=5
[  295.382950] wmode_band_equal(): Band Not Equal!
[  295.383529] Key1Str is Invalid key length(0) or Type(0)
[  295.383591] Key2Str is Invalid key length(0) or Type(0)
[  295.383652] Key3Str is Invalid key length(0) or Type(0)
[  295.383715] Key4Str is Invalid key length(0) or Type(0)
[  295.384919] 1. Phy Mode = 31
[  295.384928] 2. Phy Mode = 31
[  295.384938] NVM is Efuse and its size =1d[1e0-1fc] 
[  295.396012] /home/koba/work/raspi/gw-450d_driver_linux_v3002/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../chips/mt76x0.c:2114 assert (pAd->TxPower[choffset].Channel == 36)failed
[  295.406380] ERROR!!! E2PROM: WRONG VERSION 0x2, should be 1
[  295.410472] mt76x0_read_tx_alc_info_from_eeprom: EEPROM_MT76x0_TEMPERATURE_OFFSET (0xD1) = 0xf8
[  295.410483] mt76x0_read_tx_alc_info_from_eeprom: TemperatureOffset = 0xfffffff8
[  295.410491] Temperature Tx ALC not enabled
[  295.427483] 3. Phy Mode = 31
[  295.427499] AntCfgInit: primary/secondary ant 0/1
[  295.432937] RTMPSetPhyMode: channel is out of range, use first channel=1 
[  295.434454] MCS Set = ff 00 00 00 01
[  295.444494] <==== rt28xx_init, Status=0
[  295.445463] 0x1300 = 00064300
[  295.445474] RTMPDrvSTAOpen(1):Check if PDMA is idle!
[  295.445795] RTMPDrvSTAOpen(2):Check if PDMA is idle!
[  295.449133] IOCTL::unknown IOCTL's cmd = 0x00008947
[  296.126395] /home/koba/work/raspi/gw-450d_driver_linux_v3002/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../common/cmm_asic.c:2112 assert KeyIdx < 4failed
[  296.126825] /home/koba/work/raspi/gw-450d_driver_linux_v3002/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../common/cmm_asic.c:2112 assert KeyIdx < 4failed
[  299.749434] ===>rt_ioctl_giwscan. 6(6) BSS returned, data->length = 957
[  299.750764] ==>rt_ioctl_siwfreq::SIOCSIWFREQ(Channel=8)
[  299.878216] PeerBeaconAtJoinAction(): HT-CtrlChannel=8, CentralChannel=>8
[  299.878236] PeerBeaconAtJoinAction(): Set CentralChannel=8
[  299.878253] AdjustChannelRelatedValue(): Input BW=0, rf_channel=8, vht_bw=1, Channel=8, vht_cent_ch=0!
[  300.149464] Rcv Wcid(1) AddBAReq
[  300.149486] Start Seq = 00000000
[  300.149502] RTMP_TimerListAdd: add timer obj bd34df0c!
[  300.222457] RTMP_TimerListAdd: add timer obj bd34b2f8!
[  305.672520] RTMP_TimerListAdd: add timer obj bd34b350!

assertionのfailed がいくつか出ていて気持ち悪いですが、とりあえず接続して使用可能です。

関連

Raspberry Pi 2でWiFiを使う - 組み込みの人。

Raspberry Pi 2のカーネルをビルドしてみた - 組み込みの人。

Raspbian のアップデート

Raspbian jessieをインストールしたときのカーネルのバージョンは 4.1.7-v7+ でした。

以前、Raspbian wheezyを使っていたときに、sudo apt-get update; sudo apt-get upgrade としたらカーネルバージョンアップされたのですが、起動できなくなってしまったことがありました。

どうやら正しくはrpi-updateコマンドを使うようです。

$ sudo rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10206  100 10206    0     0  20977      0 --:--:-- --:--:-- --:--:-- 20956
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Backing up firmware
 *** Backing up modules 4.1.7-v7+
#############################################################
This update bumps to rpi-4.1.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=113753
##############################################################
 *** Downloading specific firmware revision (this will take a few minutes)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    212      0 --:--:-- --:--:-- --:--:--   212
100 48.2M  100 48.2M    0     0   567k      0  0:01:27  0:01:27 --:--:--  498k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 4.1.10-v7+
 *** depmod 4.1.10+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to 260bc9c7589b3359485fc02fed8f56d4c5eaad9a
 *** A reboot is needed to activate the new firmware
pi@raspberrypi:~$ 

rebootしてからカーネルバージョンを確認すると、4.1.10 に上がっていました。

$ cat /proc/version
Linux version 4.1.10-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #821 SMP PREEMPT Sat Oct 10 00:16:28 BST 2015

Raspberry Pi 2でWiFiを使う

Raspberry Pi 2 のRaspbian jessie を使っています。

まずは、Linuxカーネルで標準サポートされているであろう少し古いWiFiドングルで試します。今回使用したのはBUFFALOのWLI-UC-GN。

WiFiドングルを挿してみてカーネルの反応を見ます。

$ dmesg |tail -20
  ... 
[ 1143.178911] usb 1-1.5: new high-speed USB device number 4 using dwc_otg
[ 1143.296458] usb 1-1.5: New USB device found, idVendor=0411, idProduct=015d
[ 1143.296485] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1143.296502] usb 1-1.5: Product: 802.11 n WLAN
[ 1143.296519] usb 1-1.5: Manufacturer: Ralink
[ 1143.296534] usb 1-1.5: SerialNumber: 1.0
[ 1143.718897] usb 1-1.5: reset high-speed USB device number 4 using dwc_otg
[ 1143.829525] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
[ 1143.883948] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0005 detected
[ 1144.082664] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 1144.084402] usbcore: registered new interface driver rt2800usb
[ 1144.314294] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
[ 1144.328254] ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29
[ 1144.777172] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready

認識したようです。

$ iwconfig
wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0 というのができています。

$ sudo iwlist wlan0 scan |grep ESSID
                    ...
                    ESSID:"0024A52FB295-1"
                    ESSID:"0024A52FB295"
                    ...

こんなふうにこれから接続しようとするWiFiアクセスポイントが見えていればOK。WiFiドライバは正しく動いていそうです。

$ ps ax |grep wpa
 2273 ?        Ss     0:00 /sbin/wpa_supplicant -s -B -P /run/wpa_supplicant.wlan0.pid -i wlan0 -D nl80211,wext -c /etc/wpa_supplicant/wpa_supplicant.conf
 3018 ttyAMA0  S+     0:00 grep --color=auto wpa

wpa_supplicant も起動済みなので、後はWiFiの認証だけです。

GUIは使わずにwpa_cliを使います。

$ wpa_cli
wpa_cli v2.3
Copyright (c) 2004-2014, Jouni Malinen <j@w1.fi> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.


Selected interface 'wlan0'

Interactive mode

> 

'>' のプロンプトにコマンドを入力していきます。

アクセスポイントの確認。(入力したのは赤字の部分。)

> scan
OK
<3>CTRL-EVENT-SCAN-STARTED 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
> scan_result
bssid / frequency / signal level / flags / ssid
06:24:a5:2f:b2:95	2447	-49	[WPA-PSK-CCMP][ESS]	0024A52FB295-1
00:24:a5:2f:b2:95	2447	-49	[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]	0024A52FB295
> 

SSID "0024A52FB295", パスワード "xxxxxxxx" を登録します。

> add_network
0
> set_network 0 ssid "0024A52FB295"
OK
> set_network 0 psk "xxxxxxxx"
OK
> enable_network 0
OK
<3>CTRL-EVENT-SCAN-STARTED 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>SME: Trying to authenticate with 00:24:a5:2f:b2:95 (SSID='0024A52FB295' freq=2447 MHz)
<3>Trying to associate with 00:24:a5:2f:b2:95 (SSID='0024A52FB295' freq=2447 MHz)
<3>Associated with 00:24:a5:2f:b2:95
<3>WPA: Key negotiation completed with 00:24:a5:2f:b2:95 [PTK=CCMP GTK=TKIP]
<3>CTRL-EVENT-CONNECTED - Connection to 00:24:a5:2f:b2:95 completed [id=0 id_str=]
> save_config
OK
> quit
$

wlan0の接続は成功して、以下のようにIPアドレスが割り当てられています。

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:24:a5:7e:e4:7f  
          inet addr:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::a1d:3d6f:e6df:ae25/64 Scope:Link
          inet6 addr: 240f:16:6d51:1:a15a:8fe7:49dd:ae77/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:313 errors:0 dropped:0 overruns:0 frame:0
          TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:89509 (87.4 KiB)  TX bytes:11524 (11.2 KiB)

設定は以下のところに保存されています。次回からはWiFiドングルを挿したら自動的にこの設定で接続されます。

$ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="0024A52FB295"
	psk="xxxxxxxx"
}

参考にしたのは以下のページ。

https://wiki.archlinuxjp.org/index.php/WPA_supplicant

2015-10-12

Raspbian jessie でperfコマンドをビルドする

Raspbian jessie ではperfコマンドが含まれる linux-tools パッケージが正しくメンテされていないようで、カーネルのバージョンと食い違ったperf_3.16というコマンドがインストールされてしまいます。

pi@raspberrypi:~/work/kernel/linux$ sudo apt-get install linux-tools
 ...
pi@raspberrypi:~/work/kernel/linux$ which perf
/usr/bin/perf
pi@raspberrypi:~/work/kernel/linux$ perf
/usr/bin/perf: line 24: exec: perf_4.1: not found
E: linux-tools-4.1 is not installed.
pi@raspberrypi:~/work/kernel/linux$ sudo apt-get install linux-tools-4.1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package linux-tools-4.1
E: Couldn't find any package by regex 'linux-tools-4.1'
pi@raspberrypi:~/work/kernel/linux$ ls /usr/bin/perf*
/usr/bin/perf  /usr/bin/perf_3.16

待っていればそのうち解決されるかもしれませんが、自力でperfコマンドをビルドしました。

以前もやったことありましたし。

perfコマンドをソースからビルドする - 組み込みの人。

まず必要なライブラリを用意します。

$ sudo apt-get install  flex bison python pkg-config libaudit-dev \
binutils-dev  libelf-dev python-dev libpython-dev libperl-dev  \
libslang2-dev libdw-dev libiberty-dev libunwind-dev liblzma-dev

カーネルソースを取ってきます。--depth=1 をつけるとリポジトリ全部でなく最新だけになります。

$ mkdir kernel
$ cd kernel/
$ git clone --depth=1 https://github.com/raspberrypi/linux

ビルド

$ cd linux/
$ cd tools/perf/
$ make 2>&1 |tee make.log

インストール

$ make install

自分のホームディレクトリインストールされます。一度ログアウトしてから再度ログインすると、~/bin にPATHが追加されます。

perfコマンドの試し打ち。

$ which perf
/home/pi/bin/perf
$ perf stat pwd
/home/pi/work/kernel/linux/tools/perf

 Performance counter stats for 'pwd':

          6.080886      task-clock (msec)         #    0.152 CPUs utilized          
                 6      context-switches          #    0.987 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
                56      page-faults               #    0.009 M/sec                  
         3,603,787      cycles                    #    0.593 GHz                    
   <not supported>      stalled-cycles-frontend  
   <not supported>      stalled-cycles-backend   
           964,216      instructions              #    0.27  insns per cycle        
           107,687      branches                  #   17.709 M/sec                  
            27,999      branch-misses             #   26.00% of all branches        

       0.040087712 seconds time elapsed

追記。

最初はインストールとして/usr/bin/perf_4.1 にコピーするようにかきましたが、make install のほうがよさそうなので修正しました。

Raspberry Pi 2 でWebcamの映像音声を録画する

前回の続きで、映像だけでなく音声も一緒にmp4ファイルに録画するようにしました。

#!/bin/sh

if [ $# -ne 1 ]; then
  echo "Usage: " $0 " output_file" 1>&2
  echo "Hit ^C to stop." 1>&2
  exit 1
fi
output_file=$1

gst-launch-1.0 -e \
  v4l2src  ! "video/x-raw,width=640,height=480,framerate=30/1" ! \
    omxh264enc target-bitrate=1000000 control-rate=variable ! \
    video/x-h264,profile=high ! h264parse ! queue ! \
    mp4mux name=mux \
  alsasrc device=hw:1 ! audioresample ! audio/x-raw,rate=48000 ! \
    queue ! voaacenc bitrate=32000 ! queue ! mux. \
  mux. ! filesink location=$output_file

使用しているWebcamはLogicool c270でその内蔵マイクはモノラルです。

録画したファイルのffprobeの結果。

$ ffprobe out3.mp4 
ffprobe version 2.7.2 Copyright (c) 2007-2015 the FFmpeg developers
  built with gcc 4.9.2 (Raspbian 4.9.2-10)
  configuration: --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.100
  libpostproc    53.  3.100 / 53.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x13abfb0] Invalid timestamps stream=0, pts=-421387831, dts=0, size=5601
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out3.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomiso2
    creation_time   : 2015-10-12 02:57:00
  Duration: 00:00:19.83, start: -140462.610333, bitrate: 1031 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, 992 kb/s, 29.81 fps, 29.97 tbr, 3k tbn, 6k tbc (default)
    Metadata:
      creation_time   : 2015-10-12 02:57:00
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 32 kb/s (default)
    Metadata:
      creation_time   : 2015-10-12 02:57:00
      handler_name    : SoundHandler

参考にしたページ

Streaming with nginx-rtmp-module: GStreamer and Raspberry Pi

Raspberry Pi 2でH.264ハードウェアエンコーダを試してみた

Raspberry Pi 1/2 にはH.264ハードウェアエンコーダが載っているとスペックシートには書いてあります。それをどうやって使うのか調べました。

参考にさせてもらったのは以下のページ

Connecting The Dots: Raspberry Piでgstreamerを使ったh264エンコード

raspbian - Hardware h.264 encoding and decoding on the GPU core - Raspberry Pi Stack Exchange

GStreamer-devel - Stopping a gst-launch-ed pipeline

H.264ハードウェアエンコーダはgstreamerのomxh264encに実装されているということです。

Raspbian jessie では必要なものは以下のコマンド一発で揃います。

$ sudo apt-get install gstreamer1.0-*

以下のコマンドで、USB Webcamの映像をH.264エンコードしてmp4の動画ファイルとして保存することができます。

gst-launch-1.0 -e \
v4l2src device=/dev/video0 ! "video/x-raw,width=640,height=480,framerate=30/1" ! \
omxh264enc ! "video/x-h264,profile=high" ! \
h264parse ! queue max-size-bytes=10000000 ! \
mp4mux ! \
filesink location=test1.mp4

これをcap1.sh に書いておいて実行し、コントロールCで止めます。

$ ./cap1.sh 
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
^Chandling interrupt.
Interrupt: Stopping pipeline ...
EOS on shutdown enabled -- Forcing EOS on the pipeline
Waiting for EOS...
Got EOS from element "pipeline0".
EOS received - stopping pipeline...
Execution ended after 0:01:36.699275713
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

mp4にmuxする場合は、gst-launch-1.0に -eオプションをつけておく必要があります。そうでないとコントロールCで止めたときに中途半端に切れたmp4ファイルができて再生不能になります。

エンコードの最中にtopコマンドでCPUの負荷をみるとidleが90%以上でした。確かにハードウェアエンコードしていると思われます。

できたtest1.mp4をffprobeで調べると以下の通り。

$ ffprobe test1.mp4 
ffprobe version 2.7.2 Copyright (c) 2007-2015 the FFmpeg developers
  built with gcc 4.9.2 (Raspbian 4.9.2-10)
  configuration: --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.100
  libpostproc    53.  3.100 / 53.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x2d8bfb0] Invalid timestamps stream=0, pts=-421387831, dts=0, size=4307
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomiso2
    creation_time   : 2015-10-11 23:51:53
  Duration: 00:01:36.67, start: -140462.610333, bitrate: 189 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, 186 kb/s, 27.69 fps, 29.75 tbr, 3k tbn, 6k tbc (default)
    Metadata:
      creation_time   : 2015-10-11 23:51:53
      handler_name    : VideoHandler

タイプスタンプがおかしい箇所があるようですが、このファイルは普通に再生できました。

続きを書きました。

Raspberry Pi 2 でWebcamの映像音声を録画する - 組み込みの人。