2013年10月29日火曜日

Raspberry PiにlibdloをインストールしてDisplayLinkモニタを動かす

巷には、PCにUSB接続するLCDのサブモニターやグラフィックアダプタ(参考:Amazon)というものがあります。これらに採用されているのがDisplayLink社のデバイスコントローラです。公式のドライバはWindowsとMac用なんですが、Freedesktop.orgでLinuxドライバの対応が行われているので、実はLinuxでも動かすことはできます。

今回はうちにあるIODATAのLCD-USB10XB-TをRaspberry Piに接続して、libdloライブラリを導入してテスト表示が映るところまでやってみたので、手順をメモっておきます。

DisplayLinkデバイスを何らかのLinuxディストリビューションで動かす話をぐぐってみるといろいろな登場人物が出てきてややこしいんですが、私なりに整理すると、
  • udlfb: デバイスドライバ
  • libdlo: DisplayLinkに描画するためのユーザスペースライブラリ
  • xf86-video-displaylink: udlfbのクライアントとなるX Server
って感じだと思います。たぶんに誤解を含むと思いますが。。中にはlibdloがドライバっていう記述もあったりしますが、libdloをビルドしてもカーネルモジュールは生成されません。でもudlfbなしに表示を試せたりしちゃいます。この辺のソフトウェアスタックがどうなってるのか、あまり詳しく調べてないのでよくわかりません。規模も大きくないので、そのうちソースでも読んでみようかとも思います。

さて、今回はlibdloをインストールして表示のテストを。

まずは所要のライブラリをインストール。
次にlibdlo本体をダウンロード、続けてアーカイブ展開し、いつものようにconfigureとmakeでビルド。
ビルドができたら表示のテストをしてみます。DisplayLinkデバイスをUSB接続し、
とコマンドしてモニタに何か表示されれば成功です。次のように直接バイナリをたたいてもOKです。


参考情報

libdlo - Freedesktop.org
What is udlfb? - kernel.org
DisplayLink - archlinux

MarsBoardでSATA接続に挑戦 (3)

今までの話:
 [MarsBoardでSATA接続に挑戦]
 [MarsBoardでSATA接続に挑戦 (2)]

とりあえずRomanさんのMinimal Debian "Server"をSDブートしてHDDをSATA接続してみたMarsBoard。今回はfdiskでフォーマットしてからmountしてファイル読み書きできるようにしたのでメモ。

まずはHDDを接続してからdmesgでアタッチされたデバイスを調べる。
続いてfdisk。pコマンドで現在のパーティションを見てみる。
dコマンドでパーティションを削除。
nでパーティション作成。
ここで、tでパーティションタイプを選択できますが、今回はLinuxでOKなので何もしないまま、wコマンドで書き込みます。
これでfdiskの作業は終了。次にmkfsでファイルシステムを初期化します。
んで早速マウント。
ファイルを書いてみます。
おk。じゃぁunmountしてさようなら。

2013年10月27日日曜日

Raspberry Pi で DirectFB

Raspberry Pi で DirectFB を動かしてみたいと思います。本当は別マシンでクロスコンパイルしてRPiにロードするのがかっこいいと思うんですが、なかなかうまくいかなかったので妥協してオンターゲットでやっちゃいます。
なおOSはRaspbian wheezyの2013-09-25版です。

まずDirectFBの公式より、本体とExamplesをダウンロードしておきます。
で、ビルドをしていきます。
もしconfigureで
というエラーが出る場合は、
をしてからもう一度。
ビルドができたら、まず
でライブラリを認識させます。これを忘れると
というようなエラーが出ます。
インストールしたライブラリの認識ができたら、
とコマンドしてみます。dfbinfoはDirectFBのユーティリティの一つで、ScreenとInputデバイスの一覧が表示されます。/dev/fb0はvideoグループで、Raspbianのデフォルトユーザのpiはvideoグループに属しているのでアクセスできるはずですが、rootグループの/dev/tty0を使う必要があるらしく、sudoで呼ばないと失敗します。
次にExamplesのインストール。本体と同様に、
でおk。

HDMIを繋いで再起動します。んで仮想コンソールなりSSHなりから、
と打ってみます。ペンギン(Tux?)が大量発生してうじゃうじゃ動き回ってる映像が出れば成功です。仮想コンソールなら[ESC]キーで終了できます。SSHからの終了はよくわかりません。

参考情報

Steps to setup DirectFB dev enviroment on Ubuntu - Sun Wei's space

MarsBoardでSATA接続に挑戦 (2)

前回の続きで。

Allwinner A10でSATAを使っている事例はないかとぐぐってたら、RomanさんのサイトでSATAデバイスからDebianをブートする記事を見つけました。
同氏がポーティングしたMinimal Debian "Server"のイメージはSATAが有効なようなので、とりあえずSDブートしてからHDDにSATAを接続してみます。

まずはここから最新のイメージをダウンロード。

続いてダウンロードしたイメージをbz2アーカイブから解凍して取り出します。こちらの手順の2に書いてあるように、bzip2による解凍をSDカードのデバイスファイルにリダイレクトしてもいいと思うんですが、なぜか私の環境ではパーミッションエラーになったので、代わりにWindows上でCygwinのbzip2により解凍した後、Win32 Disk ImageによりSDカードへ書き込みました。なおSDカードの容量は2GB~でOK。

んでUARTでコンソールを繋ぎつつブートしてみる。上記の手順ページに書いてあるユーザ名とパスワードでログイン。バージョンは

ここでSATAに接続したHDDの電源を入れてみる。なぜか標準出力にもカーネルメッセージっぽいのがだだ漏れてくるけど、気にせずdmesgで接続後に出たメッセージを拾うと、

それから、今度はHDDの電源をOFFしたとき。

ってな感じ。

2013年10月26日土曜日

MarsBoardでSATA接続に挑戦


Allwinner A10搭載のローコストARMボードMarsBoardでちょっと遊んでみたいと思います。

同じA10搭載のCubieBoardもそうなんですが(CubieBoardのほうがコミュニティが盛り上がってて楽しそう・・・)、MarsBoardの特徴の一つはSATAコネクタを搭載していること。

OSは公式で配布されてるLinaro版ARM Linux(linaro-alip-armhf-t4.img)をSDカードに焼いてブート。バージョンは
です。
HDMIは使わずピンヘッダ用ホールからUARTを引っ張ってきて、ホストPCのターミナルからCUIアクセスします。

とりあえずSATAコネクタに、部屋に転がってた2.5インチHDDをつないでみる。電源はUSB-SATAアダプタ付属のAC電源を流用。

んでホットプラグしてみたり、リブートしてみたりしつつ、
とか
とか打ってみるけど、何の痕跡も見当たらない。
もちろん
でもHDDっぽいのは見当たらないし、/dev下にもそれっぽい名前のデバイスファイルはない。

カーネルはSATAが使えるようなコンフィギュレーションでビルドされてるのか、と思って調べてみると、
ということで、なんとなくOKそうだが。

でもlsmodではそれっぽいドライバは見当たらない。んで/lib/modulesの下を掘ってみると、/lib/modules/3.0.36-t3+/kernel/drivers/ata/sw_ahci_platform.koなんてのが見つかる。ためしに
してみると、
なんていうエラーメッセージらしきものを標準出力に延々垂れ流し始める。んでSATAを外すと(あるいは外した状態でinsmodすると)、
とだけ、一発返す。

う~ん。

Invalid module formatと格闘

Linuxデバイスドライバを作ってみようかな、と思い立って、Free Software Magazineのチュートリアルをウォークスルーしてみる。

曰く、まずは空のソースコードをコンパイルしてカーネルモジュールを作り、insmodしてみましょうと。
んで、カーネルモジュールのコンパイル時に、そのロード先と同じカーネルが必要とのこと。今回はクロスコンパイルではなくホストシステムをそのままターゲットにするので、ホストと同じカーネルのソースが必要になる。

ホストのLinuxバージョンは
とりあえずKernel/Compile - Community Ubuntu Documentationを参考に
ツール類のインストール
カーネル取得
終わるとカレントディレクトリの下にカーネルのディレクトリができるので、入る。
んで現システムで使われているconfigを持ってきてoldconfigした後、make。
ひとまずこれでビルドOK

ということで、カーネルモジュールを作ってみる。 # 移動、ソース作成
しかし
とのこと。
enakai00さんの記事によれば、vermagicの不整合がまずいらしい。

modinfoコマンドでカーネルモジュールを調べてみる。
う~ん、vermagicがちょいと新しくないか?
いまいちど、カーネルのディレクトリに行って、バージョンを確認してみる。手順はここのQA参考。
あれ、思ってたのと違うお。。
Makefileを見てみると、
うん、やっぱり変だな。

クレバーじゃないと思いつつ、カーネルのMakefileのバージョン指定を無理やり変えてビルドしてみる。
で、カーネルモジュールのディレクトリに移動してもう一度ビルド。それからmodinfoしてみる。 ということで、vermagicはそろったものの、insmodしてみると うーむ、以前状況は変わらず。

そんで悩んで行き着いたのがStack OverflowのこのQA。なんでも、
で行けるっぽい。調べてみると、このbuildってのは/usr/src/linux-headers-$(uname -r)へのシンボリックリンクになっている。linux-headersがインストールしてあればOKなんですな。
成功したぽい。