楽天Kobo Touchをディスプレイにする
![](http://storage.osdev.info/pub/idmjt/diaryimage/1208/neta120805l1.jpg)
汎用e-inkデバイスとして8000円で売ったら売れるかもね。 というわけで、Kobo Touchで動くVNCビューアをコンパイルしてみた。本来は意地でも一行もコードを書かないという企画だったのだけど、諸般の事情(後述)で十数行のコードが必要になってしまった。。
手持ちの撮影なのでへろへろになってしまった。。三脚的な奴を買ったほうが良いに違いない。
接近版。
ツールチェインの準備
ヘッダファイルの準備
ドキュメントの準備
Freescaleに登録していれば、
●http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX50_SW
から"i.MX50 EVK Linux Documentation Bundle" をダウンロードできる。mx50_linux.pdfに必要な情報は載っている。
まぁ実際にはドキュメントを読まなくても必要な情報はソースコードに十分書かれている。
他の記述も興味深い。地味にOpenVGをサポートしているが、Koboでは使用されていないように見える。
SDLとlibvncclientの準備
罠への対処
ここからが重要なポイント。。
●export SDL_NOMOUSE=1 する
まず、SDLのfbconドライバはマウスがopenできないとクラッシュするという伝統的なバグがある。これを避けるために環境変数SDL_NOMOUSEを指定する必要がある。
●VNCサーバのサイズは800 x 600にする
今回のシステムでは誰もフレームバッファの縮小を実装していないので、最初から800 x 600にしてく必要がある。
他のサイズだと失敗する。
●手動でフレームバッファをアップデートする
今回最大の罠。Koboのカーネルはe-inkフレームバッファに書き込んでも自動的にアップデートを行わない。なので、毎回手動でioctlして画面を更新する必要がある。
#include <fcntl.h> #include <sys/types.h> #include <linux/mxcfb.h> #include <sys/ioctl.h> int mxcfb = -1; static void mxc_damage(int x, int y, int w, inth){ struct mxcfb_update_data param; const int MARKER = 999; int r; if(mxcfb<0){ mxcfb = open("/dev/fb0", O_RDWR); } if(mxcfb<0){ printf("mxcfb open error!\n"); } param.update_region.left = x; param.update_region.top = y; param.update_region.width = w; param.update_region.height = h; param.waveform_mode = WAVEFORM_MODE_AUTO; param.update_mode = UPDATE_MODE_PARTIAL; param.update_marker = MARKER; param.temp = 0; param.flags = 0; /* alt_buffer_data */ r = ioctl(mxcfb, MXCFB_SEND_UPDATE, ¶m); printf("send update = %d\n",r); #if 0 r = ioctl(mxcfb, MXCFB_WAIT_FOR_UPDATE_COMPLETE, &MARKER); printf("wait = %d\n",r); #endif }興味深いのはflagsで、ここの設定によって白黒2値の高速アップデート(PDFやブラウザでスクロールすると発生するアレ)やアップデート時の反転を制御することができる。 今回はflagsにゼロを入れているので、反転無しの16段階グレースケールアップデートになる。なので残像が残って汚い。 あと、今回waitは外している。アップデートにはそれなりに時間が掛かるので、本来はwaitを入れる必要がある。