[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Porting NetBSD to L-Card+



フォローできずすみません。

At Mon, 30 Dec 2002 17:30:51 +0900,
TAKEMURA Shin wrote:

> csの割り込みをrising edge/holdからlevel/highに変えたところ、
> エラーも出ずに調子よく動作するようになりました。

CS8900A の割り込み要求は H で割り込み要求状態のレベル
トリガですので、これで正しいはずです。エッジトリガじゃないのは
認識していたのですが、直すのを忘れてました。


> この2つがどう違うのかイマイチ理解できませんが...
> とりあえずmulti userで起動できました。

VR4181 は割り込み入力をエッジトリガにしておくと、

	1. ソフトウェアが割り込み要求をクリアした後に、
	2. 外部からの割り込み入力のエッジを検出すると、
	3. CPU core に割り込み要求を行い、
	4. ソフトウェアが割り込み要求をクリアするまで、
	5. core への要求を保持する。
		(たとえ外部からの割り込み入力が変化しても)

という動作をします。

一方レベルトリガにしておくと、外部からの割り込み入力が
そのまま CPU core への割り込み要求となります。

今回の場合、次のようなことが起こっていたのではないかと
思います。

	1. デバイスが割り込みを要求。(IRQ が H に)
	2. 割り込みハンドラが実行される。一旦デバイスの割り込みは
	   クリアされる。(IRQ が L に)
	3. 割り込みハンドラがディスパッチャまで復帰、しかし
	   VR4181 内部の割り込み要求はまだクリアされていない。
	4. デバイスが新たな割り込みを要求。(IRQ が H に)
	5. 割り込みディスパッチャが VR4181 内部の割り込み要求を
	   クリア。(VR4181GIU_INTSTAT_REG_W への書き込み)
	6. 割り込みから復帰。
	7. 4 での割り込みの要求は継続 (IRQ は依然 H) するも、
	   5 のクリア処理で CPU core には要求が行っていない。

こうなると、デバイスは割り込みを要求しているにもかかわらず
CPU はそれを認識しない状態になってしまいます。

レベルトリガの場合、割り込みクリア処理は意味を持ちませんので、
割り込みハンドラの復帰直前にデバイスが新たな割り込みを要求した場合、
割り込みから復帰すると直ちに新しい割り込みが CPU core へ要求され、
無事割り込みに応答できます。


こうなってしまう原因は、割り込みクリアのタイミングが遅すぎること
です。割り込み要求クリアは割り込みハンドラの呼び出しより先に
行わなくてはならないのに、vr4181giu.c:vr4181giu_intr() では
後で行っています。

バグですね、これは、、、、:-)

--
Naoto Shimazaki