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

RE: fake poweroff(vr41xx)



佐藤です。

> VR の CPU のユーザガイドをみると、HIBERNATE を実行した後は
> 電源 sw を押すだけでシステムがリセットされるように読めるのですが、
> 実際にはうんともすんともいわなくなって、リセット sw を押すしかなくなります。
> PMU のところを読んでも関係のありそうな設定がなさそうなのですが、
> どうすればいいのでしょう?
> なにか試してみることなどあれば教えてください。
> (PMU はすこしつついてみましたが、いまのところダメです)
今 platform.reboot()やplatform.powerdownを読んでいるところではすでに
splhigh()になっているのでそのせいかなとおもっていました。
マニュアルはHIBERNATEを実行するとpower swの割り込みで
脱出してリセットがかかるのだと解釈していました。
私もいろいろやって駄目だったのでそのままになっています。

> 気になるところといえば、HIBERNATE 後、最初に電源 sw を押したときに
> 0.5 秒ぐらいバックライトが ON になるようです。その後は何度押しても
> なにも起きません。
これは気がつきませんでした。

> ところで、
> vr_reboot の引数、howto には RB_POWERDOWN のビットがあるので、
> struct platform に powerdown エントリを追加するよりも、以下のように
> したいのですが、どうでしょうか。
alphaの実装が halt/rebootとpowerdownが別になっていたのでそれと同じに
しただけです。
alphaと同じくpowerdownをサポートしない機種ではunimpl_....でpanicするのでは
なく何もしないという動作にしてあります。

#現在はplatform.rebootを登録しないとunimpl_reboot()へいってしまうと思いますが、
#これはなにもしないで従来のコードに落としたほうがいいと思う。(while (1);するだけ)

とはいえ、一緒にするのに反対する理由は特にありません。
いっしょにするならplatform.rebootではなくplatform.haltにしたいかなと
いう気分はありますが..

> void
> vr_reboot(howto, bootstr)
>         int howto;
>         char *bootstr;
> {
>         if (howto & RB_POWERDOWN) { /* powerdown or halt */
>                 if ((howto & RB_POWERDOWN) == RB_HALT) {
>                         splhigh();
                          while (1) {
                              __asm(".set noreorder");
                              __asm(__CONCAT(".word   
",___STRING(VR_OPCODE_STANDBY)));
                              __asm("nop");
                              __asm("nop");
                              __asm("nop");
                              __asm("nop");
                              __asm("nop");
                              __asm("nop");
                              __adm(".set reorder");
                          };
>                 }
>                 __asm(".set noreorder");
>                 __asm(__CONCAT(".word   ",___STRING(VR_OPCODE_HIBERNATE)));
>                 __asm("nop");
>                 __asm("nop");
>                 __asm("nop");
>                 __asm("nop");
>                 __asm("nop");
>                 __asm("nop");
                  __adm(".set reorder");
>         }
> 
> #if NVRDSU
>         vrdsu_reset();
> #else
>         printf("%s(%d): There is no DSU.", __FILE__, __LINE__);
> #endif
>         splhigh();
>         while (1);
> }

sato