もりねずみーのやつ

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

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