[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: fake poweroff(vr41xx)
竹村です。
-----Original Message-----
差出人 : SATO Kazumi <sato@ba2.so-net.ne.jp>
宛先 : port-hpcmips-ja@jp.netbsd.org <port-hpcmips-ja@jp.netbsd.org>
日時 : 1999年11月28日 20:12
件名 : fake poweroff(vr41xx)
>佐藤です。
>
>竹村さんがrebootをcommitしてくれたので、
>不完全ではありますが手持ちの電源が切れたふりをするコードを
>commitしました。
>
>vr41xxのHIBERNATEモードにすることによりシステム各所へのクロック供給を停止し
>一見電源が切れているように見せます。
やっぱり HIBERNATE を実行すると、電源 sw で再起動しませんか。
R500 だからかと思ったのですが、R300 や R510 でも同じなのですね。
VR の CPU のユーザガイドをみると、HIBERNATE を実行した後は
電源 sw を押すだけでシステムがリセットされるように読めるのですが、
実際にはうんともすんともいわなくなって、リセット sw を押すしかなくなります。
PMU のところを読んでも関係のありそうな設定がなさそうなのですが、
どうすればいいのでしょう?
なにか試してみることなどあれば教えてください。
(PMU はすこしつついてみましたが、いまのところダメです)
気になるところといえば、HIBERNATE 後、最初に電源 sw を押したときに
0.5 秒ぐらいバックライトが ON になるようです。その後は何度押しても
なにも起きません。
ところで、
vr_reboot の引数、howto には RB_POWERDOWN のビットがあるので、
struct platform に powerdown エントリを追加するよりも、以下のように
したいのですが、どうでしょうか。
void
vr_reboot(howto, bootstr)
int howto;
char *bootstr;
{
if (howto & RB_POWERDOWN) {
if ((howto & RB_POWERDOWN) == RB_HALT) {
splhigh();
while (1);
}
__asm(".set noreorder");
__asm(__CONCAT(".word ",___STRING(VR_OPCODE_HIBERNATE)));
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
}
#if NVRDSU
vrdsu_reset();
#else
printf("%s(%d): There is no DSU.", __FILE__, __LINE__);
#endif
splhigh();
while (1);
}
VR_OPCODE_HIBERNATE は hpcmips/vr/vr.h に入れました。
Takemura