[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