もりねずみーのやつ

インターネット上でしか生きられません

Nexus 7(2012)にUbuntu 13.04をインストールしてFTDI社のUSBシリアル通信デバイス(USBオシロ)を使うまでの手順

目的

AndroidタブレットUbuntuタブレットにしてFTDIなUSBシリアル通信デバイスを接続して気持ちいいことする。

f:id:aburos:20151126193629j:plain

環境

OS: Windows 8.1+MSYS2 Ubuntuマシン: Nexus 7 2012 16GB WiFiモデル

※ GunZip圧縮形式のものが解凍できること

手順

  • Nexus7をUbuntu入れれるようにしておく
  • Nexus7向けにビルドされたUbuntuイメージをダウンロード/インストール
  • Nexus7のUbuntuLinuxカーネル設定を変更してリビルド
  • USB(OTG)ハブに接続したFTDI社のチップを積んだUSBシリアル通信デバイスのドライバモジュールをロード

事前準備(Nexus7をいい感じにする)

  • Unlockする
  • Root化する
  • カスタムリカバリを入れる

※この辺は既に情報沢山あるのでググればすぐ見つかります。

Nexus7用Ubuntuのダウンロード

以下サイトから、ブートローダイメージ、ユーザーデータイメージをダウンロード

http://cdimage.ubuntu.com/ubuntu/releases/13.04/release/

※リンク先はいつまでも残っているとは限りませんが、cdimage.ubuntu.com内のUbuntuリリースを辿って行くと見つかると思います。

必要なもの

  • ubuntu-13.04-preinstalled-desktop-armhf+nexus7.bootimg
  • ubuntu-13.04-preinstalled-desktop-armhf+nexus7.img.gz

Android SDK内のツールを使用してNexus 7 2012の準備

以下サイトから、Android SDK(Stand-alone)をダウンロード

Download Android Studio and SDK tools  |  Android Developers

必要なもの

※ 環境に応じて適切なものを選択 ※ ダウンロードしたらインストール(ZIPなら適当な場所に解凍して環境変数PATHにパスを通す) ※ Android SDKの詳しい使い方は、色々な所で紹介されているので、そちらをご参考に…。

Nexus7にUbuntuイメージ書き込み

1. 既存のブート領域を削除

$ fastboot erase boot

※1.152秒くらい

2. 既存のユーザーデータ領域を削除

$ fastboot erase userdata

※5.042秒くらい

3. Nexus7用Ubuntuブートイメージを書き込み

$ fastboot flash boot ubuntu-13.04-preinstalled-desktop-armhf+nexus7.bootimg

※2.442秒くらい

4. Nexus7用Ubuntuユーザーデータイメージを書き込み

$ fastboot flash userdata ubuntu-13.04-preinstalled-desktop-armhf+nexus7.img

※131.222秒くらい

5. Nexus7を再起動

$ fastboot reboot

Googleのロゴが出た後、黒い画面に「Preparing the root filesystem, please wait, this will take a few minutes ...」とメッセージが出て、a few minutes(10分くらいかかった)待つ。

無事起動すると、ユーザ作成、タイムゾーン設定などのウィザードが表示される。(ソフトウェアキーボードも、画面回転も使えるのでご安心を)

f:id:aburos:20151126171739j:plain

6. Ubuntuパッケージリポジトリ参照先を変更

使用するNexus7向けUbuntuのイメージが古すぎて、既にサポートされていないリポジトリ参照先となっているため、aptのソースリストを変更。

$ sudo nano /etc/apt/source.list

ports.ubuntu.com/ubuntu-ports
を
old-releases.ubuntu.com/ubuntu
に、置換

参考にした記事

Nexus7上のUbuntuLinuxカーネルを設定してカーネル再構築

今回使用したUbuntuはNexus7用に既に最適化されたものをポンと入れるだけで、かなり快適な環境に整っているのですが、残念ながらUSBシリアル通信を行うためのデバイスドライバ等は用意されていませんでした。

(/dev/ttyUSB0もしくはそれ相当のものが無くて気付いた)

そこで、Nexus7向けUbuntuLinuxカーネルを落としてきて、自分でカーネルを再ビルドする必要がありました。

1. Nexus7向けUbuntuLinuxカーネルをダウンロード

Gitで管理されているため、Gitをインストールし、Linuxカーネルソースを取得

※40分位かかりました

$ sudo apt-get install git
$ git clone git://kernel.ubuntu.com/ubuntu-archive/ubuntu-nexus7.git

2. UbuntuLinuxカーネルビルド環境の用意

Ubuntu上でカーネルビルドするための環境を用意

$ sudo apt-get install libncurses-dev build-essential fakeroot kernel-package

3. UbuntuLinuxカーネル設定

取得したNexus7向けLinuxカーネルソースを以下の手順で設定

$ sudo -s
# cd /usr/src
# mv ubuntu-nexus7(取得したNexus7向けLinuxカーネルソースディレクトリ) ./
# cd ubuntu-nexus7
# make oldconfig
# make menuconfig

Linuxカーネルソースディレクトリ上でmake menuconfigを行うと、カーネル設定するための画面が表示されます。

ここで、 Device Drivers --> USB support --> USB Serial Converter support の順にページを進み、次のように設定します。

--- USB Serial Converter support
[*] USB Serial Console device support
[*] Functions for loading firmware on EZUSB chip ※多分不要
[*] USB Generic Serial Driver
~~~~省略~~~
[M] USB FTDI Single Port Serial Driver
~~~~省略~~~

※カーソルキーで項目を移動、スペースキーで設定変更(""/"M"/"*")できます。

4. UbuntuLinuxカーネル再構築(ビルド)

普通なら、このままmakeすれば良いのですが、ちょっと待って下さい。

もう少し手順を踏む必要があります。

まず、現在のLinuxカーネルのバージョンを確認してください。

$ uname -r

すると、3.1.10-10-nexus7と表示されるかと思います。

しかし、取得したNexus7向けカーネルソースは、3.1.10というカーネルバージョンで、 そのままmakeすると、/bootの下には、vmlinuz-3.1.10というカーネルイメージが作られます。

Nexus7向けに最適化されたLinuxカーネルということと、Nexus7自体のブートローダを弄るはめになるのも嫌なので、ここではあくまでも3.1.10-10-nexus7という名前のカーネルイメージを作りたいです。

そのため、カーネルソースのMakefileを開き、バージョン名を以下のように修正します。

# nano /usr/src/ubuntu-nexus7/Makefile

(修正前)
VERSION = 3
PATCHLEVEL = 1
SUBLEVEL = 10
EXTRAVERSION = 
NAME = "Divemaster Edition"

(修正後)
VERSION = 3
PATCHLEVEL = 1
SUBLEVEL = 10
EXTRAVERSION = -10-nexus7
NAME = "Divemaster Edition"

はい、これで、3.1.10-10-nexus7という名前のカーネルイメージが作られるようになるように見えます。

が、まだこのままでは出来ません。

このままmakeすると、3.1.10-10-nexus7+という名前のカーネルイメージが作成されます。

"+"が付いてしまうのは、バグではないのかと。

make LOCALVERSION=""とすれば消えるそうなのですが、消えません。

Debianのコミュニティでバグ報告として上がっているようですが。

せめてオプションで"+"付けるかどうか選択出来るようにして欲しいのですが。

とまあ、余計なことはこれくらいにして、"+"が付かないように、script/setlocalversionという シェルスクリプトの内容を修正します。

# nano /usr/src/ubuntu-nexus7/script/setlocalversion
※多分最後の方にある

(修正前)
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
        # full scm version string
        res="$res$(scm_version)"
else
        # append a plus sign if the repository is not in a clean
        # annotated or signed tagged state (as git describe only
        # looks at signed or annotated tags - git tag -a/-s) and
        # LOCALVERSION= is not specified
        if test "${LOCALVERSION+set}" != "set"; then
                scm=$(scm_version --short)
                res="$res${scm:++}"
        fi
fi


(修正後)
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
        # full scm version string
        res="$res$(scm_version)"
#else
#        # append a plus sign if the repository is not in a clean
#        # annotated or signed tagged state (as git describe only
#        # looks at signed or annotated tags - git tag -a/-s) and
#        # LOCALVERSION= is not specified
#        if test "${LOCALVERSION+set}" != "set"; then
#                scm=$(scm_version --short)
#                res="$res${scm:++}"
#        fi
fi

はい、ここまで出来たら、ようやくカーネルビルド出来ます。

ビルドは時間かかる(1時間位)ので、流したらしばし放置。

また、Nexus7 2012はデュアルコア(だったはず)なので、-j3オプションでコア2つ使うようにしておきます。

# make -j3 LOCALVERSION="" && make install && make modules_install

ビルドが終わると、/bootディレクトリ内のカーネルイメージなどが更新されているはずです。

カーネルイメージが正しく作成されたら、Nexus7を再起動します。

再起動後、/lib/modules/3.1.10-10-nexus7/kernel/drivers/usb/serialディレクトリ内にftdi_sio.koというモジュールがインストールされていれば成功です。

5. USBシリアル通信デバイスドライバモジュールをロード

前手順で、ftdi_sio.koというモジュールが正常にインストールされていれば、ロード出来るはずです。

$ sudo modprobe usbserial ※これ自体はbuiltinのためmodprobeしなくても良いのかも
$ sudo modprobe ftdi_sio

正常にロードされていれば、FTDI社のUSBシリアル通信デバイスを、Nexus7に挿したUSB-OTGハブに接続してみてください。

lsusbコマンドでデバイスの接続状況、lsmodでモジュールの使用状況(正常ならftdi_sioが0以外、ロードされていない/接続していないなら0になるはず)が確認できます。

f:id:aburos:20151128174039j:plain

で、正常に認識されれば、/dev/ttyUSB0が使えるようになります。

f:id:aburos:20151128174810j:plain

ハマったところ

Nexus 7 2012+Ubuntu」という記事や情報はたくさんあるのだけれど、Nexus 7 2012という端末とNexus7用Ubuntuイメージが古くなってしまっていることから、Nexus7用Ubuntuイメージへのリンクが切れてしまっていたり、「それ、もうずっとメンテナンスされてないから落とせないよ」という情報が多く、中々イメージファイルの場所まで辿り着くのが大変だった。(結局、Ubuntuの公式Imageのサイトからリンクを上の階層に辿り、そこから新しいバージョンから順に一つ一つ「Nexus7…Nexus7どこ…」と探し漁ったら見つかったけど、これもいつ消えるか分からない)

また、Ubuntu自体も今はUbuntu Touchという名前で、スマートフォン/タブレット向けにカスタマイズされたイメージがリリースされていて、Nexus 7向けにカスタマイズされてパッとやってポンだけのUbuntuイメージは13.04のみとなっていた。(13.04が最初で最後?)

ただ、所詮Linuxなので、やろうと思えば、ちょっと頑張れば割りと簡単に出来るようになる。

経緯

なんでこんなことしたか、すごく個人的な理由です。

電子工作するのにオシロスコープを使いたかったのだけど、 持っているオシロスコープはUSB接続タイプのbitscope microというもの。

f:id:aburos:20151122014338j:plain

これは、WindowsOSXLinux、ラズパイでも動作するというのが売りで、はじめはラズパイ2につないで使おうと企んでいた。

けど、ラズパイ2にしても所詮はラズパイ2の性能で、Linuxデスクトップを動かすには、それでも中々動作は重い。

それに、ラズパイだと液晶ディスプレイ、キーボード、あるいはタッチパネル式液晶ディスプレイが必要になるわけで、オシロスコープ使いたいためだけにわざわざそんなゴテゴテした機器一式部屋に置きたくなかった。

物置を掃除していたら、今時では流石にもっさり過ぎて使わなくなっていたNexus 7 2012が出てきて、「あ、そういうやNexus 7Linux動かすのって結構報告上がってたよな…これはイケる。」と確信して、ここまで辿り着きましたとさ。

最終的には、Ubuntuを入れたNexus7にホスト機器への充電も可能なUSBハブを繋いで、そこにbitscopeなどを繋いで、あとはbitscope用のオシロ/ロジアナなどのソフトウェアをインストールして使う。

終わりに

いや、Nexus7+Ubuntu、本当に良いよ。

タブレットの向きを変えれば、ディスプレイ設定も自動的に変わってくれたり、最初からタッチパネルがポインタとして使えるし、文字入力が必要な場面ではソフトウェアキーボードを出してくれる。

正直、Ubuntuがここまでタブレット等のデバイスで快適に使えるレベルだとは思いもしなかった。

Ubuntu Touchが実際どういうデバイスに搭載されているのか知らない(というかこれ調べてて初めてUbuntu Touchという存在に気付いた)けど、ようやくデスクトップLinuxがそこそこ使えるレベル(?)になってきたかなという現状、いや、それ以前からUbuntuがここまでタブレットバイスとして便利なものになってるということを思うと、今後にも期待したい。

ということで、今後電子工作のお供に、オシロ/ロジアナ/計測に使っていきます。

f:id:aburos:20151128180058j:plain

Raspberry Pi向けArch Linux ARMインストールの自動化(一部)

はじめに

用途が少し特殊なため、役に立つ人はごく少数かもしれない。

完全に自分が楽するためだけに作ったものなので、有益な情報になるかどうかわからないけど、役に立ってくれる人がいたら、少し嬉しい。

Arch Linux ARM OSインストール用スクリプト

概要

事前に必要なもの(スクリプト実行環境がArch Linuxの場合)

  • bsdtar
  • dosfs-tools
  • f2fs-tools

ソースコード

https://github.com/morinezumiiii/ArchLinuxARM-installer-for-raspberrypi

使い方

  1. SDカードをPCに挿す。
  2. 以下のようにスクリプトを実行
# cd ArchLinuxARM-installer-for-raspberrypi
# ./install.sh [SDデバイスパス] [IPアドレス] [ゲートウェイ] [DNS]

例:

# ./install.sh /dev/sdX 192.168.0.100 192.168.0.1 192.168.0.1
  1. スクリプトが完了したら、SDカードを抜き、Raspberry Piに挿し、電源を投入。

これで、指定したIPアドレス上のRaspberry PiSSHでログイン出来る。

経緯

Arch Linux(x86/x86_64)とArch Linux ARMのインストールの違い

  • Arch Linuxx86/x86_64(以下x86版)(archlinux.org)
  • Arch Linux ARM:(以下ARM版)(archlinuxarm.org)

両者は、動作するプラットフォームや、パッケージリポジトリの場所が異なったりするが、同じArch Linux

ARM版はARM系プロセッサを積んだマイコンボード向けに、それぞれのARMアーキテクチャ毎にOSイメージの配布を行っている。

Raspberry Pi向けにおいては、ARMv6向け(Raspberry Pi Model A/B/A+/B+)と、ARMv7向け(Raspberry Pi 2 ModelB)に、配布を行っている。

x86版とRaspberry Pi向けARM版では、OSインストールの手順が異なり、ある程度の環境が作られた状態のものをインストールすることになる。

具体的には、archlinuxarm.orgからOSイメージをダウンロードし、bootパーティション/rootパーティションそれぞれをSDカードにコピーして手持ちのRaspberry Piに挿して電源を入れてあげるだけで、SSHで接続できる状態になる。

細かい設定等は、まずそのOSを立ち上げてからの作業となる。

Arch Linux ARMをRaspberry Piにインストール

ARM版公式サイトに、インストール手順がご親切に記載されている。

http://archlinuxarm.org/platforms/armv6/raspberry-pi

個人的な事情

私は、県内で日本Androidの会の茨城支部として、毎月勉強会を主催しています。

その際に、Raspberry Piを使ったワークショップ/ハンズオンを行う場合は、前日までに(現時点で)10台のRaspberry Piをセットアップしておく必要があります。

上記の公式インストール手順を、Raspberry Pi台数分を手作業で行っていると、かなりの時間がかかり、当日トラブルで再セットアップを行う必要があったりした場合も、大きな時間ロスとなり、参加者の方々に迷惑をかけてしまうので、今回自分用にスクリプト化しました。

その他設定

OSインストール後のセットアップ作業は、出来るだけ自動化させたいために、settings/setup.sh内に、スクリプトを用意し、それをRaspberry PiのSDカードのルートディレクトリ直下に配布し、SSHログイン後それを実行することでひと通りの必要なパッケージ類をインストールしたり、設定したりするようにしてあります。

Arch使いなら、arch-chrootpacmanを使ってマウントデバイス上のArch Linuxchrootした後、環境構築も出来るので、全部自動化させれるのだけど、その場合、ホスト側のArch LinuxARMアーキテクチャのものを使って行う必要があるので、断念しました。

ここらへん、もっと改善できるといいのですが。

あと、複数台のSDカードリーダ/ライタを接続して、パラレルでSDカードを焼くというのも考えましたが、接続されたUSBデバイスがどのデバイスで、どのSDカードがどのIPアドレスなのかわからなくなりそうな恐れがあるので、こちらは敢えてやらないようにしました。

おわり

とりあえず、勉強会の準備が、少し、いや、かなり楽になりました。

Node.jsでconfigモジュールの設定ファイル読み込み先を変える

環境

  • ラズパイ
  • Arch Linux ARM
  • Node.js v0.10.36
  • config 1.11.0

環境変数 NODE_CONFIG_DIR を設定

-- 環境変数 NODE_CONFIG_DIR 設定前
$ echo $NODE_CONFIG_DIR

$ node   
> var config = require('config');
WARNING: No configurations found in configuration directory:
WARNING: /home/morinezumiiii/tmp/node-config-test/config
WARNING: See https://www.npmjs.org/package/config for more information.

> config
{}
> config.util.getEnv('NODE_CONFIG_DIR');
'/home/morinezumiiii/tmp/node-config-test/config'
> 
(^C again to quit)
> 


-- 環境変数 NODE_CONFIG_DIR 設定
$ export NODE_CONFIG_DIR=/opt/conf/node-config

-- 環境変数 NODE_CONFIG_DIR 設定後
$ echo $NODE_CONFIG_DIR
/opt/conf/node-config
$ node
> var config = require('config');

> config
{ hoge: 1,
  fuga: 2,
  foo: 'bar' }
> config.util.getEnv('NODE_CONFIG_DIR');
'/opt/conf/node-config'
> 

ただのメモ

Arch Linux ARM(というかSystemd)のresolv.confについて

普段ラズパイでArch Linux ARMを使っていると、たまに(というかしょっちゅう)インターネットに繋がらなくなる。

IPアドレス直接指定では問題なく接続できるが、名前解決が出来ない。

環境

  • ラズパイ(2じゃないやつ)
  • systemd-networkdを使用
  • 静的IPv4
  • DNSサーバアドレスも設定済み

/etc/systemd/network/eth0.network

[Match]
Name=eth0
Host=test.morinezumiiii.jp

[Network]
DHCP=none
DNS=('192.168.0.1','8.8.8.8','8.8.4.4')

[Address]
Address=192.168.0.80/24

[Route]
Gateway=192.168.0.1/24

原因

原因はなんとなく分かっている。

Archを再起動すると、resolv.confがどこからか勝手に書き換えられているから。

でもそれがどこから書き換えているのかわからないので、解決方法がわからない。

ググってみると、同様にFedoraでresolv.confが勝手に書き換えられてしまって困っている人たちはちらほら見かけたが、Archとはちょっと原因が異なりそう(同じ?)

resolv.conf(つながるとき)

# This file is managed by systemd-resolved(8). Do not edit.
#
# Third party programs must not access this file directly, but
# only through the symlink at /etc/resolv.conf. To manage
# resolv.conf(5) in a different way, replace the symlink by a
# static file or a different symlink.

nameserver 8.8.4.4
nameserver 8.8.8.8

resolv.conf(つながらないとき)

# This file is managed by systemd-resolved(8). Do not edit.
#
# Third party programs must not access this file directly, but
# only through the symlink at /etc/resolv.conf. To manage
# resolv.conf(5) in a different way, replace the symlink by a
# static file or a different symlink.

nameserver 8.8.4.4
nameserver 2001:4860:4860::8844 <-- なんかできた
nameserver 8.8.8.8
# Too many DNS servers configured, the following entries may be ignored. <-- なんかできた
nameserver 2001:4860:4860::8888 <-- なんかできた

/etc/resolv.conf(シンボリックリンク)

/etc/resolv.confって、シンボリックリンクだったんですね。知らなかったよ。(白目)

$ ls -la /etc/resolv.conf
lrwxrwxrwx 1 root root 32 Feb  8 16:52 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf

解決方法

まだわかってない。もっとsystemd-networkdを勉強してみる。

こふ

けんこふさんをダラダラ紹介するだけの記事

こふ語 Advent Calendar 2014 - Adventar

こふ語Advent Calendar 2014の9日目(ちょい遅くなったけど)です。 はてなブログにしてから技術系ガン無視な記事書くのこれが初めて。

けんこふとは

ちょっと真面目に紹介すると、Arch Linux使いな人。 最近日本国内でもArch Linux使いが多くなってきた気がするけど、 この人は結構長いイメージある。

不真面目に紹介すると、ド変態。ヤバイ。イッちゃってる。

多分、この人のせいで「Gentoo=こわい」みたいに、 「Arch=変態」というイメージが定着した。

もう一回真面目に書くと、初めてけんこふさんを見つけた時は、Arch関係で調べ物してた時だった。

ただその時は、たまたま記事が古かったので「yaourtか、packerで良いじゃん」「糞の役にも立たねぇな…」「何この六角大王で作ったみたいな自作萌えキャラ…」「キモッ」「キモッ」「きっしょ」と、冷ややかな目で見てた。

いつだったか自分のTLにRTされて流れてきた。

「やばい…kenkovだ…。」

そのけんこふさんがTL上で発する言葉の数々、完全に頭がイッちゃってるんじゃないかと思うほどで、キャラ作りでここまで絶対辿りつけない→かわいそうな人→これがけんこふそのものとして、次第に受け入れるようになってきた。

それがだんだん慣れてきて、ついには、けんこふさんの発言が面白い(ウケる)と思うようになってしまった。

あとアイコン可愛い。

こふ語

けんこふさんが発する言葉として、 「アンッ!アンッ!アンッ!アンッ!」 が、代表的かつ印象的。

そして突如現れた、けんこふさんと相乗効果を生み出す、もへ氏。

もへ氏、彼はすごい。すごいとしか言い様がない。

あのけんこふさんのド変態な発言をド変態な発言で返し会話するという、まさに目には目を。 と、思いきや突如サディストっぷりを発揮してけんこふさんに痛烈なツッコミやむちゃぶり。

f:id:aburos:20141210015615j:plain

このAdvent Calendarでも既に取り上げられているが、けんこふさん×もへ氏のやりとりから、けんこふさんの発言には、だいたいパターンがあることが浮き彫りとなった。

先述した「アンッ!アンッ!アンッ!アンッ!」に加え、「アッ…」、「ア^〜〜〜っ」や、 語尾に"っ"を付けるなど。

どんなバリエーションがあるかは、実際に自分の目でけんこふさんのツイートを見てみると良い。

パターンに慣れてくると、以下のように飲んでもらうことが出来るようになる。

※ただしこれは初歩中の初歩

f:id:aburos:20141210012638j:plain

けんこふさんをべた褒めする気はサラサラ無い。

ただ僕は、けんこふさんは技術力も自分なんかに比べて遥かに高く、尊敬しているし、絵も可愛いし、大好きですマル

おわりに

もうちょっとちゃんとネタ練って面白い記事書こうと思ったけど、皆さん高度で面白い記事書いてるので、めんどくさくてやめた。

f:id:aburos:20141210021405j:plain

We Love Kenkov.

Raspberry Pi Model B+(ArchLinux)でカメラモジュールが使えない件

追記(2018/5/23)

ラズパイ2や3では普通に使えて、I2Cも同時に使えています。

ひょっとしたら今のファームウェアならこの問題は解決してるかも?

モデルB+が悪いわけじゃなさそう

モデルB+を入手してからカメラモジュールを接続してraspstillとか使ってもエラーが出て使えなくて、(・3・)アルェーってなってたんだけど、モデルB+だけじゃなくモデルB、モデルAでもうまく行かなくなってた。

使えなくなってたのは、最近Arch Linuxをインストールしたヤツだけだった。

エラーメッセージは以下の通り。

mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly

このエラーが出る時って、本当にカメラモジュールが物理的につながってない(カメラモジュールのカメラ本体側の正方形のコネクタがしっかりささってない、FPCケーブルが断線してる)が大半なんだけど、今回問題になったのは、ラズパイ向けLinuxカーネル側の仕様かバグかってところっぽい。

ちなみにカーネルは3.12.26-1-ARCH。

以下の情報を探して右往左往してたところ、コレだっていうのが見つかったんだけど、結局のところよく理解してない。

B+ Camera is not detected (workaround available) - Raspberry Pi Forums

どうやら、spi-bcm2708とi2c-bcm2708モジュールがカーネルにロードされてると、カメラモジュールが競合してるのか、使えなくなってしまうっぽい。

Raspberry Pi + Arch Linuxでカメラモジュールを使う(暫定)

とりあえず、偉大なる先人達のお知恵をお借り(ググってただけ)しながら、使えるようにするまでを、まとめておこうかと思う。 (ただ、恐らくLinuxカーネル側の誤りで、後々修正されて必要なくなるのかもしれない…?)

最新ファームウェア/ツールを入れる

Tutorial for updating R-Pi firmware in ARCH LINUX [obsolete] - Raspberry Pi Forums

ここを頼りに、rpi-updateが使えるようにしておく。

# pacman -Syu
# pacman -S git wget
# wget http://raw.github.com/Hexxeh/rpi-update/master/rpi-update -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
# pacman -S ca-certificates
# pacman -S binutils
# pacman -Sy raspberrypi-firmware-bootloader linux-raspberrypi
# rpi-update
# sync
# reboot

vcgencmdが使えるようになり、ラズパイにカメラモジュールが接続されてるか確認出来るようになる。

$ vcgencmd get_camera
supported=1 detected=0

$ vcgencmd get_mem arm
arm=384M

$ vcgencmd get_mem gpu
gpu=128M

ラズパイのカメラモジュールを使う前提として、ArchARM公式Wikiにある通り、GPUへのメモリ割り当てに、最低でも128MBが必要というのと、おまじないがあるそうなので、それを/boot/config.txtに書き込む。

$ sudo vi /boot/config.txt

--- 以下を追記 ---
gpu_mem_512=128
gpu_mem_256=128

start_x=1
start_file=start_x.elf
fixup_file=fixup_x.dat

modprobeのblacklistを作成し、ブート時にロードするモジュールを制御する。

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf

--- ファイルを新規作成し、以下を追記 ---
blacklist spi-bcm2708
blacklist i2c-bcm2708
$ sudo chmod 644 /etc/modprobe.d/raspi-blacklist.conf

再起動

$ sudo reboot

再度、vcgencmdで、カメラモジュールの接続状態を確認

$ vcgencmd get_camera
supported=1 detected=1

認識するはず。これで認識しないとなると、spi-bcm2708、i2c-bcm2708モジュールがまだ読み込まれている状態か(lsmodで確認)、ケーブルが死んでるなどで、本当にカメラモジュールが接続されていないかのどちらか。

detectedが1になっていれば、カメラモジュールが使えるはずなので、

$ raspistill -d

$ raspivid -o -t 3000 hoge.h264

などで、確認してみるといい。

SPIやI2Cは使えなくなる

上記手順で、spi/i2c-bcm12708モジュールをロードしなくしているため、SPI接続やI2C接続の周辺機器等は使えなくなります。 SPI/I2Cといえば、今月の日経Linuxに載っていたような、AdafruitだったりSainSmartだったり、ST7735など液晶ディスプレイは使えなくなります。 この記事を書いている現時点では、両方使用することは出来ません。

(というかDSI接続のディスプレイはいつになったら…)

おわりに

ぶっちゃけ、今回の手順、僕自身まだちゃんと理解してません。なんとなくはわかるんだけど、ca-certificatesがなんなのかとか、その辺り後でちゃんと調べて覚えておく。とりあえず動かしたかったので。

あと、今回、何故ラズパイ向けのLinuxカーネルがこんな状態になってしまったのかが、よくわからない。凡ミスでした、バグでした、となれば、「なんだ、いつものことか。そして相変わらず修正早ぇwwwArch最高やwwww」ってなるんだけど、SPI/I2CとCSIコネクタのカメラモジュールが競合するというのが解せない。カメラモジュール自体がCSIコネクタのSPI接続ってこと?I2CではフルHDサイズで30fpsのデータを転送することは無理だよなぁ…。(この辺まだあまり詳しくないので、分かる方いたら教えて下さい…)

でも、よくよく考えてみると、ST7735をラズパイのディスプレイとして使うためにビルドしたカーネルって、確かカメラモジュール使えなかったような気がするけど、元々そういう仕様で、今回modprobeにblacklistとなるものが入ってなかったから、カメラモジュールが使えない(SPI/I2Cは使える)っていう 状態になったのかなぁ…?(うろ覚え)

まとまりの無い記事で申し訳ないです。

f:id:aburos:20140818223834j:plain

Raspberry Pi Model B+にArch Linux ARM(カーネル3.12.26-1-ARCH)をインストール

Raspberry Pi Type B+買いました

連休に入りました。

連休に入って、こっそりシコシコとアレをナニしてるわけなんですが、進捗ダメですと思われないために、ここらで進捗出しておこうかと…。

Raspberry Pi Type B+買いました。

旧TypeBとの違いは、そこら中で取り上げられているのですが、あまり知られていなく、ものすごく地味にムカつく違いだけ、ちょっと紹介しておきます。

Type Bの場合、M3ネジが通るので、PC自作er御用達なマザボに使うネジ類が使えたわけで、Type B+の場合、何故かM3ネジが通らず、恐らく、M2.6になっている。なんでそんな微妙なサイズにしたのか…。

結局、穴をヤスリで広げてM3ネジ通すようにしたんだけど、M3ネジを止めてみると、microUSBコネクタと干渉したり、チップ抵抗に接触したりと、割と地味にファッキンな仕様になっていました。

まぁそれはさておき、、これを機に、Archをインストールすることになって、Arch ARMを覗くと、またセットアップ方法が変わってたので、自分の防備録として、残しておきたいと思った。

毎回恒例、公式リンク。一番確実なので、以下を参考に。(日本語ページは若干古いので注意)

http://archlinuxarm.org/platforms/armv6/raspberry-pi

https://wiki.archlinux.org/index.php/Raspberry_Pi

前提環境

マシン: Macbook Air 2011 Mid

OS: Arch Linux(3.15.7-1-ARCH)

SDカードの作成(PC側)

作業用ディレクトリ作成

$ mkdir raspberrypi
$ cd raspberrypi
$ mkdir boot
$ mkdir root

最新のArchARMを取得

$ wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz

SDカードの場所を確認

$ lsblk

SDカードの準備(以降rootユーザ) bootパーティションは100MBのFAT32形式、rootパーティションは残り容量でLinux File System形式でパーティションを作成。

$ su
# fdisk /dev/sdc

Welcome to fdisk (util-linux 2.24.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): p
Disk /dev/sdc: 29.2 GiB, 31322013696 bytes, 61175808 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9686be27


Command (m for help): o

Created a new DOS disklabel with disk identifier 0x07befaf8.

Command (m for help): n

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-61175807, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-61175807, default 61175807): +100M

Created a new partition 1 of type 'Linux' and of size 100 MiB.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): c
If you have created or modified any DOS 6.x partitions, please see the fdisk documentation for additional information.
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Command (m for help): n

Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 

Using default response p.
Partition number (2-4, default 2): 
First sector (206848-61175807, default 206848): 
Last sector, +sectors or +size{K,M,G,T,P} (206848-61175807, default 61175807): 

Created a new partition 2 of type 'Linux' and of size 29.1 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

SDカードのフォーマット bootパーティションは、FAT形式で、rootパーティションは、F2FSでフォーマットした。 ※ mkfs.f2fsは pacman -S f2fs-toolsでインストールすることで使えるようになる。

# mkfs.vfat /dev/sdc1
# mkfs.f2fs /dev/sdc2

SDカードをマウントし、ダウンロードしたArchARMをマウント先に展開

# mount /dev/sdc1 boot
# mount /dev/sdc2 root
# tar -xf ArchLinuxARM-rpi-latest.tar.gz -C root
# sync
# mv root/boot/* boot

rootfstypeをF2FSに変更し、Raspberry Piからrootパーティションを読み込めるようにする

# vi boot/cmdline.txt

変更前
elinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=noop rootwait


変更後
elinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=f2fs elevator=noop rootwait

SDカードをマウント解除

# umount boot root

作成したSDカードをRaspberry Piに挿し、電源を入れ、Raspberry PiSSHでログイン

$ ssh root@192.168.0.6
password: root

rootパスワードを変更

# passwd

なぜか、デフォルトのGeo-IPのミラーが繋がらなかったので、USミラーを選択した

# vi /etc/pacman.d/mirrorlist

毎回恒例

# rm /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# echo [hostname] > /etc/hostname
# vi /etc/hosts

ネットワーク接続を、有線LANで、静的IPを設定

# cd /etc/netctl
# cp examples/ethernet-static my_network
# vi my_network
Description='A basic static ethernet connection'
Interface=eth0
Connection=ethernet
IP=static
Address=('192.168.0.11/24'')
#Routes=('192.168.0.0/24 via 192.168.1.2')
Gateway='192.168.0.1'
DNS=('192.168.0.1')

## For IPv6 autoconfiguration
#IP6=stateless

## For IPv6 static address configuration
#IP6=static
#Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
#Routes6=('abcd::1234')
#Gateway6='1234:0:123::abcd'

※後から分かったことで、本バージョンから、デフォルトのDHCP接続が、netctl-ifplud@eth0.serviceではなくなっている様子。どこで設定してあるか後で調べて切っておく。

# systemctl disable netctl-ifplugd@eth0.service
# systemctl enable netctl-ifplugd@my_network.service
# netctl enable my_network

設定ミスってて、後から繋がらないってなると泣きそうになるので、一旦ここで再起動

# reboot

設定したIPで、再度接続

$ ssh root@192.168.0.11

Raspberry Pi用に、パッケージを最新化し、必要なパッケージをインストール。

※ここは、任意。とりあえずデスクトップな環境であれば、以下の通り。

# pacman -Syu
# pacman -S sudo alsa-utils alsa-firmware alsa-lib alsa-plugins xf86-video-fbdev xf86-input-synaptics raspberrypi-firmware raspberrypi-firmware-tools git

ユーザを作成

# useradd -m -g users -G wheel -s /bin/bash morinezumiiii
# passwd morinezumiiii
# gpasswd -a morinezumiiii audio
# gpasswd -a morinezumiiii video
# gpasswd -a morinezumiiii uucp
# gpasswd -a morinezumiiii tty

sudoerファイルを編集

# visudo

以降、通常ユーザで。

# exit
$ ssh morinezumiiii@192.168.0.11

Raspberry Piなアプリケーション(raspividとか)のPATHを通す

$ vi ~/.bash_profile
export PATH=$PATH:/opt/vc/bin

$ source ~/.bash_profile
$ vcgencmd version
Jul 23 2014 21:12:29 
Copyright (c) 2012 Broadcom
version 174cdd77563b98023955a94cb8d072d9c7095d6f (clean) (release)

ちなみに、ここ2ヶ月くらいで、ラズパイに使ったSDカード3枚くらいぶっとびました。

そもそも書き込み回数1万回程度って書いてあるSDカードにOS入れて動かすって事自体が、「んー…」な感じなんだけど、とりあえず、ファイルシステムExt4からF2FSに、スワップ領域を無くし、ログ書き込み先をtmpfsにすることで、ほんの少しでも、延命できるかなと、淡い期待を抱いてる。

ゆくゆくは、ちゃんとramfsにするなり、ストレージは別で用意するなりしたいなぁと思う。

以上、お疲れ様でした。

$ exit