OSDN Git Service

[POWER] Shutdown EX-RF-AMP on turning off power, now still use 3mA.
[openi2cradio/OpenI2CRadio.git] / power.c
1 /*
2  * OpenI2CRADIO
3  * Power switch.
4  * Copyright (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
5  * License: GPL2+LE
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2,
10  *  or (at your option) any later version.
11  *  This library / program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *  See the GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this library; see the file COPYING. If not, write to the
18  *  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
19  *  MA 02110-1301, USA.
20  *
21  *  As a special exception, if you link this(includeed from sdcc) library
22  *  with other files, some of which are compiled with SDCC,
23  *  to produce an executable, this library does not by itself cause
24  *  the resulting executable to be covered by the GNU General Public License.
25  *  This exception does not however invalidate any other reasons why
26  *  the executable file might be covered by the GNU General Public License.
27  */
28
29 #include "commondef.h"
30 #include "lcd_acm1602.h"
31 #include "power.h"
32 #include "menu.h"
33
34 /*
35  * Detect reset condition.
36  */
37 unsigned char chk_reset(void)
38 {
39
40 #ifdef __SDCC
41     union {
42         __RCONbits_t b;
43         unsigned char byte;
44     } rcon;
45     union {
46         __STKPTRbits_t b;
47         unsigned char byte;
48     } stkptr;
49 #else
50     union {
51         RCONbits_t b;
52         unsigned char byte;
53     } rcon;
54     union {
55         STKPTRbits_t b;
56         unsigned char byte;
57     } stkptr;
58 #endif
59     rcon.byte = RCON;
60     stkptr.byte = STKPTR;
61     RCON |= 0b01010011; // SBOREN,*RI,*POR,*BOR = '1'.
62     if((rcon.b.POR ==0) && (rcon.b.BOR == 0)) {
63         return RESET_POR;
64     }
65
66     if(rcon.b.BOR == 0) return RESET_BOR;
67     if(rcon.b.RI == 0) return RESET_SOFTWARE;
68     if(rcon.b.TO == 0) return RESET_WDT;
69     if(rcon.b.PD == 0) return RESET_POWERDOWN;
70     if(stkptr.b.STKOVF) return RESET_STACK_FULL;
71     if(stkptr.b.STKUNF) return RESET_STACK_UNDER;
72     return RESET_MCLR;
73 }
74
75 void power_on_inthook(void)
76 {
77
78     IOCB = 0x00;
79 //    IOCBbits.IOCB4 = 1;
80     INTCONbits.RBIE = 0;
81     INTCONbits.RBIF = 0;
82     INTCONbits.GIE = 1;
83     INTCONbits.PEIE = 1;
84 }
85
86 void power_on(unsigned char f)
87 {
88     if(f == 0x00){
89         set_examp_mute(1);
90         idle_time_ms(200);
91         set_radiopower(0);
92     } else {
93         set_examp_mute(0);
94         idle_time_ms(100);
95         set_radiopower(1);
96     }
97 }
98
99 void rfamp_power(unsigned char b)
100 {
101     __bitops_t bx;
102     
103     bx.byte = b;
104     if(bx.b0) {
105         _RFAMP_SEL_B0 = 1;
106     } else {
107         _RFAMP_SEL_B0 = 0;
108     }
109     if(bx.b1) {
110         _RFAMP_SEL_B1 = 1;
111     } else {
112         _RFAMP_SEL_B1 = 0;
113     }
114
115 }
116
117 unsigned char chk_powerbutton(void)
118 {
119     unsigned char count = 0;
120     char i;
121     for(i = 0; i < 24; i++) {  // 10*24=240ms.
122         if(PORTBbits.RB4) count++;
123         _POWER_DELAY();
124         ClrWdt();
125     }
126     if(count <= 12) { // 120ms
127         return 0xff; // Pressed
128     }
129     return 0; // Not pressed
130 }
131
132 void shutdown(unsigned char save)
133 {
134 //    _CLS();
135  //   _LOCATE(0,0);
136 //    printstr("Bye...");
137 //    idle_time_ms(1500); // 1.5Sec
138     rfamp_power(RFAMP_OFF);
139 //    _CLS();
140     acm1602_suspend(LCD_I2CADDR);
141     power_off(save);
142 }
143
144 void power_off(unsigned char save)
145 {
146     unsigned char sts;
147
148     if(save != 0) save_eeprom();
149
150     lcd_setbacklight(0, 0);
151     set_powerlamp(0);
152     _AM_STATLAMP = 0;
153     _FM_STATLAMP = 0;
154     power_on(0);
155
156     WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
157     sts = 0;
158     do {
159         IOCB = 0x00;
160         IOCBbits.IOCB4 = 1; // IOCB4 ONLY.
161         OSCCONbits.IDLEN = 0; // Not Idle.
162         INTCON2bits.RBIP = 1; // Priority = HIGH;
163         INTCONbits.RBIF = 0;
164         INTCONbits.GIE = 0;
165         INTCONbits.PEIE = 0;
166         INTCONbits.RBIE = 1;
167         Sleep();
168         // Wake up
169         if(INTCONbits.RBIF) {
170                 sts = chk_powerbutton();
171         }
172     } while(sts == 0);
173     
174     INTCONbits.RBIF = 0;
175     INTCONbits.RBIE = 0;
176     OSCCONbits.IDLEN = 1; // Not Idle.
177
178     INTCONbits.GIE = 1;
179     INTCONbits.PEIE = 1;
180     WDTCONbits.SWDTEN = 1; //WDT ON.
181
182     // Button pressed, software reset.
183     Reset();
184 }