Kobo用アプリ作成 (その1)

 前のエントリで kobo 用の開発環境を整えたので、簡単な kobo 用スタンドアロンアプリを作ってみます。

スタンドアロンアプリの他にも、プラグイン形式でアプリを作ることもできますが、nickel の仕様が公開されておらず、解析しながら実装することになるため、ここでは省きます。

スタンドアロンアプリのスタイルとして以下の2つがあります。

  1. nickel のQWSサーバを利用したスタンドアロンアプリ
  2. nickel なしの完全スタンドアロンアプリ

nickel とは kobo 標準のアプリのことです。

1. nickel の QWS サーバを利用

nickel プロセスの裏側でアプリを立ち上げる形式です。

Qt/Embedded は 1 つのプロセスを I/O 用サーバ(QWSサーバ)として起動させ、他のプロセスはQWSサーバに接続することで、複数のプロセスが Window を作成したりイベントを処理したりすることができるようになっています。

nickel の QWS サーバを利用することで、画面描画処理を nickel に任せることができるようになり、アプリの実装量が少なくなります。

本来なら画面タッチのイベントも QWS サーバがハンドリングしてクライアントに渡すはずなのですが、Kobo では mouse イベントが呼ばれないので、自前で /dev/input/event? を処理する必要があります。

また、後ろで nickel が動いているため、使用可能なメモリ量には限りがあります。

 

2. nickel なしの完全スタンドアロンアプリ

nickel を終了させ、自分自身が QWS サーバになる形式です。

I/O を行なってくれるサーバがいないので、画面描画、タッチやキー入力のイベントハンドリングも自前で行う必要があります。

具体的には、QScreen クラス, QWSMouseHandler クラスを実装する必要があります。

綺麗な作り方としては、QWS サーバに必要な機能は別の .so に分離しておくのですが、nickel ではこのへんの機能は全部 libnickel.so に詰め込んであるため、nickel の実装を流用することができません。

ただ、悪いことばかりではなく、自分で画面描画を制御できるため 2 値モードなども実装すれば使用可能です。

また、nickel がいないため、メモリも広く使うことができます。

 

■ Kobo 用スタンドアロンアプリの注意点

どちらのタイプにも共通の注意点を書いておきます。

まず、日本語フォントが使えません。

有名なモリサワフォントが入っているため、その流用防止のためと思われますが、フォントに暗号化がかかっており普通の Qt ライブラリ経由ではフォントが使用できません。そのため独自にフォントを入れる必要があります。

CFW を前提とするなら、KBMincho (お世話になってます!)が入っているので使用するとよいでしょう。

一部の英文フォントは暗号化されていないようです。

 

■ QWS利用スタンドアロンのサンプル

さて、能書きはこれくらいにしておいて、実際にサンプルアプリを試してみましょう。

Kobo 上でコマンドを実行する必要があるため telnet の環境が必要です。

また、日本語フォントを使うため、CFW 0.95 が入っている必要があります。

前回の環境構築で、作業ディレクトリ内に env.sh というファイルが作られていると思います。これを source します。

$ cd ~/kobo
$ source env.sh
または
$ . env.sh

次にサンプルソース(kobo-standalone-example.tar.gz)をダウンロードし、展開します。

$ wget https://petit-noise.net/system/files/kobo-standalone-example.tar.gz
$ tar xf kobo-standalone-example.tar.gz
$ cd kobo-standalone-example/ 

前回インストールした qt の qmake を実行し、make します。

$ /usr/local/Trolltech/QtEmbedded-4.8.0-arm/bin/qmake
$ make

standalone というファイルができていると思います。

これを kobo へコピーします。PC につないだ時に見える KOBOeReder ドライブのルートディレクトリへコピーしてください。

PC との接続を解除し、telnet で kobo にログインして、以下のコマンドを実行して環境変数を設定します。

# export QWS_MOUSE_PROTO="tslib_nocal:/dev/input/event1"
# export QWS_KEYBOARD=imx508kbd:/dev/input/event0
# export QWS_DISPLAY=Transformed:imx508:Rot90
# export NICKEL_HOME=/mnt/onboard/.kobo
# export LD_LIBRARY_PATH=/usr/local/Kobo:/mnt/onboard/app/
# export LANG=en_US.UTF-8

そして転送した standalone アプリを実行します。

# /mnt/onboard/standalone

以下のような画面が表示されれば成功です。

サンプルソースが非常に汚いですがご勘弁を・・・。

Kobo用開発環境の構築

某所で要望があったのと備忘録も兼ねて、Kobo の開発環境の構築方法をまとめました。

簡単にビルドできるように半自動ビルドスクリプトを用意したので Ubuntu の環境さえ用意すれば用意に構築できるようになっています。

Kobo offcial(?) の Kobo-Reader リポジトリをベースに修正を行なっています。修正したリポジトリは github: t-bucchi/Kobo-Reader で公開しています。

■ 必要なもの

Ubuntu 12.10 をインストールした環境が必要です。32bit, 64bit で確認しています。

おそらく、比較的最近の Ubuntu なら他のバージョンでも問題ないとは思います。

Ubuntu 以外のディストリビューションの場合はビルドスクリプト内で deb パッケージのチェックを行なっているので、その部分をコメントアウトして自前でパッケージを入れてください。

■ 構築手順

Ubuntu がインストールされた PC で作業します。

1. 作業ディレクトリの作成

適当な場所に作業ディレクトリを作成します。ここでは ~/kobo とします。作成後、ディレクトリを移動します。

Qt ライブラリのインストール先を除いて、このディレクトリ以下にだけアクセスします。

$ mkdir ~/kobo
$ cd ~/kobo

2. ビルドスクリプトのダウンロード

以下の URL からビルドスクリプト build.sh をダウンロードし、実行権限を与えます。

$ wget https://petit-noise.net/wp-content/uploads/build.sh
$ chmod +x build.sh

3. Qt インストールディレクトリの作成

Qt は /usr/local/Trolltech 以下にインストールします。

オリジナルの Kobo-Reader のビルド手順では作業ディレクトリ内にインストールするようになっているのですが、スタンドアロンアプリをビルドした時にパスの違いで問題が出たので、Kobo 本体と同じ位置にインストールすることにしました。

# Qt の環境構築に詳しい人で、開発PC上のパスとターゲットのパスが違っても問題ない構築方法をご存じの方は教えてください・・。

root 権限がないと /usr/local/Trolltech ディレクトリは作れないので、事前に作っておきます。

権限は適宜設定してください。ここでは全ユーザに書き込み権限を与えています。

一人で Ubuntu PC を使っている分にはこれで問題ないと思います。

$ sudo mkdir /usr/local/Trolltech
$ sudo chmod a+w /usr/local/Trolltech

補足:

build.sh では安心して使えるように sudo を一切使っていません。

root 権限が必要な操作は手動で行う必要があります。

4. 必要なパッケージのインストール

ビルドに必要なパッケージをインストールします。

$ sudo apt-get install git gettext autoconf libglib2.0-dev libtool build-essential libdbus-1-dev

5. ビルド

./build.sh を実行します。

$ ./build.sh

自動的に toolchain や Kobo-Reader リポジトリをダウンロードし、ビルドを行います。

ダウンロードとビルドには結構な長い時間がかかりますのでご注意ください。PCの性能にもよりますが、数時間というオーダーで時間がかかります。

 

ビルドが成功すると Finished!!! と表示されます。

ビルド時のログが build.log というファイルに保存されますので、エラーが出た場合などには参考にしてください。

 

Kobo glo 用メンテナンスファーム

昨日の kobo Touch 用ファームに引き続き、kobo glo 用も作ってみました。

HWCONFIG と kernel を kobo glo 用に置き換えただけで動いてしまいました。

→ダウンロードはこちら

glo でもメンテナンスファーム起動
glo でもメンテナンスファーム起動

kobo Touch ではホームボタン+電源スイッチの組み合わせでしたが、kobo glo ではライトボタン長押し+電源スイッチの長スライドで起動させることができます。

こちらもヒトバシラーな人大募集です。

バックアップ/リストアだけでなく、Kobo ハッキングのツールとしても使えると思います。これで少しでも独自ファームなどの開発が進めないいなと思ってます。

あと、kobo glo は内蔵 SD として 4GB が載っていますが、実際は 2GB しか使われていません。メンテナンスファームでは fdisk とresize2fs も入れてあります。・・・何が言いたいかわかった人は試してみては? (私はまだ試してませんが・・)

 

次は plugin や独自アプリにでも手を伸ばしてみますかね。

このメンテナンスファームは、2ch の kobo hacking スレの方々の有益な情報を元に作られています。先人たちの苦労と努力に感謝と敬意を表します。ありがとうございました。プロバイダが規制中で書き込めなかったので、こんなところからですいません。

Kobo touch用メンテナンスファームウェア

kobo Touch 用の保守用ファームウェアを作成してみました。

これを使えば裏蓋を開けることなく、内蔵 microSD のバックアップ・リストアやファイル編集などを行うことができます。

ダウンロードと詳しい使い方はこちら

細かい手順はダウンロードページに書いたので、大まかな概要だけ書きます。

kobo Touch では、ホームボタンを押しながら、電源を長スライドさせると外部 microSD から起動させることができます。

これを利用して、メンテナンスファーム起動用の microSD を作り、そこから起動させています。


メンテナンスファームを起動したところ

USBケーブルで PC と接続した状態でメンテナンスファームを起動すると、PCからはネットワークデバイスとして見えるようになります。

認識されれば telnet でログインして kobo を操作することができます。

root でログインできる他、メニュー形式で内蔵 SD のバックアップ・リストアを行う機能も用意しました。

危険なツールですので、使う場合は自己責任でお願いします。ダウンロードページに注意事項なども書いてありますので、よく読んでから使ってください。

自信がない人は実績ができるまでは様子を見ることをお勧めします。

そんな危険なツールを使ってみたい勇敢なヒトバシラーな方、大募集中です。使ってみた方は感想等ご報告いただけるとありがたいです。

今回は kobo Touch 用です。kobo Touch 用がある程度落ち着いたら kobo glo 用も作ろうと思います。

駆け足で書いたので適当な文になってしまった・・・

メンテナンスファームウェア for Kobo

Kobo用メンテナンスF/W

kobo で外部 microSD から起動できるカスタムファームウェアです。

kobo内蔵のストレージをバックアップ・リストアしたり、ファイルの編集をしたりといったことができます。

1. できること

kobo をカラ割りせずに内蔵の SD のバックアップ・リストアが可能です。

kobo の古いファームウェアを手軽にバックアップ・リストアすることが可能です。

また、root shell とある程度のコマンドを用意していますので、知識がある方は、マウントしてスクリプトの編集などを行うことも可能です。

スクリプトの編集ミスで起動しなくなっても、容易に変更することが可能です。

2. 対象機種

kobo mini は外部 microSD スロットが無いので対応不可

3. 必要なもの

  • 起動用 microSD 1 枚 (1〜32GBならなんでもok)
  • データ保存用 microSD 1 枚 (FATフォーマットのもの)

4. Download

5. 起動用microSDの作り方

zipファイルに入っている maintain-touch-v0.1.bin を dd (Linux) や、 DDforWindows (Windows) 等で microSD に書きこんでください。

このバイナリにパーテーション情報も含まれていますので、MBR を含めて書きこむ必要があります。

例: Linux の場合 (/dev/sdb と認識されている場合)

$ sudo umount /dev/sdb*
$ sudo dd if=maintain-touch-v0.1.bin of=/dev/sdb
$ sync
$ sudo eject /dev/sdb

最近のディストリビューションでは microSD などを認識すると自動でマウントするため、最初に必ず umount をおこなってから dd で書き込んでください。

mountしたままで書くと、正しく書き込まれません。

例: Windows の場合 (DDforWindows)

※未記述

6. 起動方法

  1. kobo touch/glo を microUSB で PC と接続する。
  2. kobo touch/glo の電源を切る。電源スイッチの長スライドで電源が切れます。画面に「電源オフ」と表示されればOKです。「スリープ」ではダメです。
  3. 作成した microSD を kobo touch/glo に挿入
  4. Kobo touch なら Homeボタン (銀色のボタン)、Kobo glo ならフロントライトボタンを押しながら電源を長スライドする。電源LEDが緑点滅になるまで、Homeボタン/ライトボタンと電源スイッチを離してはダメ。※注意※  電源を長スライドさせずに戻してしまうとリカバリが実行されてしまうため、内蔵の書籍が消去されてしまいます。特に気をつけて操作してください。
  5. 電源LED が緑点滅から青点灯になり、画面に「Maintenance Firmware」と表示されれば起動完了です。この状態になったら起動用 microSD は抜いても構いません。

7. ドライバのインストール (Windows)

メンテナンスファームウェアを起動すると、Kobo touch/glo は PC から「RNDIS/Network gadget」というネットワークデバイスとして認識されます。

Linux PCの場合は、多くの場合そのまま使用可能になるのですが、Windows の場合はドライバのインストールが必要になります。

以下から .inf ファイルをダウンロードしてドライバのインストールをしてください。

実際のドライバは Windows が標準で持っているので、デバイスを認識させるだけの .inf ファイルになっています。

kobo には DHCP サーバが立ち上げてあるので、ネットワークデバイスとして認識されると、IPアドレスが自動的に割り当てられます。 Kobo の IP アドレスは 192.168.199.1 です。

8. メンテナンスファームの使い方

メニュー形式で操作する方法(初心者向け)と、root shell にログインして操作する方法(上級者向け)があります。

8.1 メニュー形式 (初心者向け)

telnet で 192.168.199.1 に接続します。

Windows の場合は、putty や teraterm などの端末ソフトが必要です。

接続するとユーザ名を聞かれるので、admin と入力します。パスワード無しでログインでき、メニューが表示されます。

8.1.1 メインメニュー

kobo login: admin

=Main menu=

1. Backup
2. Restore
----
0. Logout
r. Reboot
p. Power off

1[Enter] のように、数字 or アルファベット + [Enter] で選択します。

8.1.2 Backup メニュー

内蔵SDのデータをバックアップできます。

==Backup sub menu==

  1. Backup MBR+bootloader+HWCONFIG+kernel (header.bin)
  2. Backup recovery partition (recovery.tgz)
  3. Backup system partition (system.tgz)
  4. Backup .kobo directory (dot-kobo.tgz)
  5. Backup ALL
  ----
  0. return to main menu

それぞれ以下の内容が保存できます。

  1. 内蔵SDの先頭領域 9.5MB 分をそのままバックアップします
  2. recovery パーテーション (第2パーテーション) を tar.gz 形式でバックアップします
  3. system パーテーション (第1パーテーション) を tar.gz 形式でバックアップします
  4. KOBOeReader パーテーション (第3パーテーション) の .kobo ディレクトリを tar.gz 形式でバックアップします。
  5. 1〜4 を全て実行します

バックアップを実行する際には、データ保存用の microSD を Kobo にセットしてから実行してください。起動用 microSD には書き込めません。

バックアップをする分には内蔵 SD への書き込みは発生しませんので安全に実行することができます。

8.1.3 Restore メニュー

バックアップしたデータを内蔵SDにリストアする機能です。

==Restore sub menu==

  1. Restore system partition (from system.tgz)
  2. Restore .kobo directory (from dot-kobo.tgz)
  ----
  x. Dangerous restore menu for expert!!
  0. return to main menu

Restore メニューは比較的安全な機能と危険な機能とに分かれています。上記メニューは起動に関わる部分を書き換えないため比較的安全な機能です。

Restoreメニューでは以下のことが行えます。

  1. system パーテーションのリストア
  2. KOBOeReader パーテーションの .kobo ディレクトリのリストア

これらの操作は失敗してもリカバリ操作 (Homeキーを押しながら電源短スライド) で工場出荷状態には戻せるため、比較的安全です。

より危険な機能を使う場合ははここで x を選びます。

8.1.4 Dangerous Restore メニュー

このメニューにある機能は間違えると Kobo が起動しなくなる可能性がある危険な機能ばかりですので、機能の意味が分からない人は絶対に使わないでください。

==Dangerous restore sub menu (for expert!!)==

  h. Restore bootloader+HWCONFIG (from header.bin)
  k. Restore kernel (from header.bin)
  r. Restore recovery partition (from recovery.tgz)
  m. Restore MBR (from header.bin)
  ----
  0. return to restore sub menu

このメニューでは以下の機能を実行できます。

  • h. MBRと kernel を除く、内蔵SDの先頭部分をリストアしますこれには u-boot, u-boot の環境変数、HW CONFIG が含まれます。
  • k. Linux kernel だけをリストアします
  • r. Recovery パーテーションをリストアします
  • m. MBR をリストアします

通常であればこれらの機能を使うことはないでしょう。

MBR, bootloader 関係が壊れると、メンテナンスFWを起動できなくなります。kobo を開けて microSD を取り出して復旧しない限り起動しなくなりますので、十分注意してください。

Linux kernel, Recovery パーテーションは壊れていても、外部 microSD からメンテナンスFWを起動できます。

8.2 root shell (上級者向け)

telnet で 192.168.199.1 に接続し、ユーザ名 root でログインします。パスワードはありません。

root権限を持っているので mount, cp, vi (機能限定版) などで自由に操作可能です。

ちなみに、内蔵SD は /dev/mmcblk0、外部microSD は /dev/mmcblk1 に認識されます。

9. 電源の切り方

何も処理をしていない状態ならいつでも電源を切ることができます。電源を長スライド(10秒くらい)してください。LED が消えれば電源が切れています。

または、メニュー形式でログイン中、メインメニューから「p」を選択しても電源を切ることができます。

メンテナンスファームウェアが起動している間はスリープしませんので、使い終わったら必ず電源を切ってください。切らないと知らない間にバッテリが空になってしまいます。

 

10. 注意事項

  • お約束ですが、At own risk でお願いします。危険なツールですので、いかなる損害も責任は負い兼ねます。
  • 内蔵SDの bootloader が壊れている状態では起動できません。このファームでは、完全に文鎮になった場合の復旧はできないことを意味します。その場合はカラ割りして microSD を復旧させてください。
  • メンテナンスファームウェアが起動している状態でUSBケーブルの抜き差しをしないでください。USB Etherのドライバにバグがあるようで、抜き差しするとkernel panic でハングアップします。無反応になった場合は電源長スライドで電源を切って下さい。

履歴