]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - keyboard/hhkb_rn42/rn42/battery.c
Add FET swtich for battery ADC
[tmk_firmware.git] / keyboard / hhkb_rn42 / rn42 / battery.c
index 32de86448136bca3fd3539631ae87413d0aebe60..0320e1baf1aa7a3c28b05bbc7ff70f9fd84e0209 100644 (file)
@@ -21,6 +21,10 @@ void battery_init(void)
     ADMUX = (1<<REFS1) | (1<<REFS0);
     ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
     ADCSRA |= (1<<ADEN);
+
+    // ADC disable voltate divider(PF4)
+    DDRF  |=  (1<<4);
+    PORTF &= ~(1<<4);
 }
 
 // Indicator for battery
@@ -49,10 +53,11 @@ bool battery_charging(void)
 {
     if (!(USBSTA&(1<<VBUS))) return false;
 
-    // MCP73831:STAT
-    //   HiZ:    Shutdown/No Battery
-    //   Low:    Charging
-    //   Hi:     Charged
+    // Charger Status:
+    //   MCP73831   MCP73832   LTC4054  Status
+    //   Hi-Z       Hi-Z       Hi-Z     Shutdown/No Battery
+    //   Low        Low        Low      Charging
+    //   Hi         Hi-Z       Hi-Z     Charged
 
     // preserve last register status
     uint8_t ddrf_prev  = DDRF;
@@ -68,12 +73,20 @@ bool battery_charging(void)
     DDRF  = (DDRF&~(1<<5))  | (ddrf_prev&(1<<5));
     PORTF = (PORTF&~(1<<5)) | (portf_prev&(1<<5));
 
+    // TODO: With MCP73831 this can not get stable status when charging.
+    // LED is powered from PSEL line(USB or Lipo)
+    // due to weak low output of STAT pin?
+    // due to pull-up'd via resitor and LED?
     return charging;
 }
 
 // Returns voltage in mV
 uint16_t battery_voltage(void)
 {
+    // ADC disable voltate divider(PF4)
+    DDRF  |=  (1<<4);
+    PORTF |=  (1<<4);
+
     volatile uint16_t bat;
     //ADCSRA |= (1<<ADEN);
 
@@ -93,6 +106,10 @@ uint16_t battery_voltage(void)
 
     //ADCSRA &= ~(1<<ADEN);
 
+    // ADC disable voltate divider(PF4)
+    DDRF  |=  (1<<4);
+    PORTF &= ~(1<<4);
+
     return (bat - BATTERY_ADC_OFFSET) * BATTERY_ADC_RESOLUTION;
 }