[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:102118] Re: 組込Linuxドライバの作成方法


川辺と申します。

>>>>> "えのきださん" == Yuichi Enokida <enokida@xxxxxxxxxxxxx> writes:

えのきださん> おはようございます。えのきだです。

すっかり夜です、ごめんなさい。(夜にならないと観ないことが多いので....)

えのきださん> ところで、この手のデバイス制御を行う場合、デバイスの割込
えのきださん> 解除はどのタイミングで行うべきでしょうか?

割り込み解除は速やかにだと思いますが、問題は割り込みハンドラとreadのエ
ントリとの関係だと思いますよ。

readで何を読み出そうとしているのか今一つ分からないのですが、割り込みハ
ンドラ内で割り込みが入ったこととハンドラ内で処理したデータを何処かに記
録し、それをreadで返すことで取りあえずのことは出来るとは思います。
(って滅茶苦茶基礎を抽象的に書いてますね。)

具体的には、[linux-users:102100]で"Naoto Shimazaki"さんが書いている様に

> Linux ではなんらかの既存のデバイス抽象化レイヤとインタフェースするか、
> さもなければ read, write, select (poll) でインタフェースするしか
> ないので、その先が pthread かどうかはあんまり関係ないというか。

デバイスのカテゴリ毎に抽象化するためのレイヤ(関数セットとか共通のデー
タ構造とか)が用意されていて、それを利用してしまう方が良いかと思います。

紹介した drivers/isdn/hisax/isac.c は、ISDNボード関係の共通インタフェ
イスにのっとって書かれています。

これは、 Documentation/isdn の下のドキュメント(特にINTERFACEと
README.HiSax)に説明が書かれています。

で、それを使わないとすると、自分で似たような仕掛けを用意しないといけま
せん。が、取りあえず、試すだけと言うレベルでしたら、

static int  interrupt_count = 0;
static int  interrupt_count_old = 0;

void
xxxx_intrerrupt_handler(…)
{
  ……

  interrupt_count ++;
  wake_up_interruptible(…);
  ……
}

int
xxxx_read(struct file *file, char *buf, size_t count, loff_t * off)
{
    int  intr_cnt;
    ……

    割り込み禁止と他との排他
    intr_cnt = interrupt_count;
    if(intr_cnt <= interrupt_count_old) {
        ……
        interruptible_sleep_on(…);
        ……
    }
    割り込み解除と他との排他
    ……

    if(copy_to_user(buf, &intr_cnt, sizeof(intr_cnt))) {
        エラー
    }
    ……
}

とかすれば、少なくとも割り込みの発生を read で得ることは出来ると思いま
す。(とにかくはしょって書いてますが。)

ですが、これは最悪な例です。あくまで、実験用以上のものではありません。

アプリケーションで求めるものに適したやり方があるでしょうし、既存の
Linuxアプリケーションでも使えるドライバを目指す(その方が試験の面でも楽
だと思います)のならやはり既存の仕掛け(デバイスの抽象化レイヤ?)にのっ
とったものにした方がいいと思います。

で、PEB-3086がPEB-2085と大きな機能差が無ければ、あのドライバを元に
(PEB-3086向けに)改造すると動くのではないでしょうか。

で、先のソースですが、中途半端な紹介で申しわけ無かったのですが、
drivers/isdn/hisax/isac.c
は、
drivers/isdn/hisax/hisax_isac.c
とセットで見ないといけないですね。もちろん、README.HiSaxを読んでからの
方が良さそうです。(使う上でのオペレーション等色々書かれています。)
--------
  Kawabe,Yoshihiro <ripula@xxxxxxxxxxxxxxx>
  Who is calling me from where?
  Knock on my shell and my mind? from Pearl song.

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
References: