[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