ソフトウェアとハードウェアの境界

ホビー開発に関する誰得情報満載☆

SL811HSのドライバ on KOZOS (未完)

aki-h8/3069f USBホストボードのSL811HSを使う

KOZOSの開発をaki-h8/3069f USBホストボードキット(完成品)(以下USBボード)上で行っていることは、以前のブログにも書いた。
これからUSBホストドライバを書いていこうというところだ。
このUSBボードには一応USBホストのサンプルプログラムが書かれていて、それを参考に作っていこうと思っていた。
そのソースコードを読んでいるのだが、これがなかなか嫌な書き方をしている…。

  • define切ってあるのに、それを使わず直値("0x40"とか)で書いてるところがある。
  • 専用的なプログラムなのに汎用的に書こうとして失敗している。
    (引数にデバイス番号を取る関数がある、それ以外を充実させて欲しかった…)
  • SL811HSを操作する関数と、USBホストとしての関数がきっちり分かれていない
    (SL811の操作とUSB規格の操作は違うんだぜぃ)。

などなど、いくつかの難点がある。
目下、ソースを読むというより解析作業をしていると言ってもいいだろう。

ただ、一から全部を作るのは、それもそれで結構大変な作業となる。
まぁ良いっちゃ良いんやけど、ここに動くものがあるのに一から作るのがなぁ…
と思って、ちょっとづつサンプルプログラムを修正している。

aki-h8/3069f USBホストボードのUSBドライバ

SL811HSというのはUSBホストデバイスでして、そのデバイスドライバを書きまっせぇ。
と小難しいことを言っても、結局のところメモリマップドIOのペリフェラルを操作するわけで、アドレスの読み書きが基本となるので、あるいくつかの儀式を済ませればUSBホストデバイスを通してUSBデバイスを操作することができる。
単純にSL811HSを操作するだけなら、USB規格は全く関係ない(そりゃハードウェアは関係あるけど)。
したがって、SL811HSのドライバを書くことは、それほど脅威ではない。
その上位のUSBホストデーモンプログラムを書くことの方が大変だと思う。
ドライバやアプリの関係を図に表すとこんな感じかな。

  • アプリとデーモンとドライバとOSの図

    f:id:tokixy56:20150718141844j:plain

KOZOS上でIOの操作をする場合には、シリアル通信と同じように、IO操作専用のデーモンを起動して、そいつのメッセージを投げるという作りにすべきだろう。
僕がUSBホストドライバを書いている理由、その目的は、USBマスストレージクラスのUSBデバイスからデータを取得するためである。
とりあえずはUSBマスストレージの取り扱いしか実装するつもりはないが、今後、どんな面白い機能を追加したくなるかわからない。
できる限り機能追加のしやすいよう汎用的に書くように心がけたい。