/* Pwrsave.c: How to use CPU(AM188ES)'s power save mode. Compiler: BC++ 3.1, Turbo C ++ 1.01(3.01) (free from http://community.borland.com/museum) Compile mode: large Project: Pwrsave.c ..\Lib\(8000E.Lib,7188XAL.Lib,7188XBL.Lib,7188XL.Lib or 7188EL.Lib) Detail description: when INIT* pin is connect to GND,--> go to power save mode. when INIT* pin is floatting or connect to VCC --> back to normal mode. User must install the new Timer ISR, must to reset WDT in 0.8 sec. or the system will be reset by WDT. [26 May,2005] by Bill */ #include #include"..\lib\7188xa.h" #define INT_EOI 0xff22 #define EOITYPE_TMR2 0x08 //extern unsigned char far *WdtFlag; extern unsigned long far *IntVect=(unsigned long far *)0L; unsigned long far *TickCount=(unsigned long far *)0x0040006cL; int PowerSaveMode=0; /* 0 : normal mode, 1: save mode */ unsigned clk_divide=7; unsigned TickSize=1; extern unsigned char far *WdtFlag; /* function: SetToPowerSaveMode input: mode: range 0-7, --> the system clock is divide by: 0 --> 1 1 --> 2 2 --> 4 3 --> 8 4 --> 16 5 --> 32 6 --> 64 7 --> 128 */ void SetToPowerSaveMode(int mode) { unsigned syscon; mode&=7; /* */ syscon=inpw(0xfff0); syscon &= (~7); syscon |= mode+0x8000; outpw(0xfff0,syscon); TickSize=1<=700) { if(*WdtFlag) { RefreshWDT(); Print("cntwdt==%d\n\r",cntwdt); } cntwdt=0; } // test for power save if(ReadInitPin()) { /* INIT pin is not open */ unsigned data; if(!PowerSaveMode) { PowerSaveMode=1; TickSize=1<='0' && argv[i][2]<='7') { clk_divide=argv[i][2]-'0'; clk_divide&=7; } break; } } } LedOn(); InstallTimer(); ShowNormal(); while(!quit) { while(PowerSaveMode) { if(psmode!=PowerSaveMode) { psmode=PowerSaveMode; ShowSave(); LedOff(); } _asm hlt } if(psmode!=PowerSaveMode) { psmode=PowerSaveMode; ShowNormal(); LedOn(); } if(Kbhit()) { key=Getch(); switch(key) { case 'q': quit=1; break; default: Putch(key); break; } } } RestoreTimer(); SetToPowerNormalMode(); LedOn(); }