diff options
author | Jack Humbert <jack.humb@gmail.com> | 2015-03-16 12:01:35 -0400 |
---|---|---|
committer | Jack Humbert <jack.humb@gmail.com> | 2015-03-16 12:01:35 -0400 |
commit | 9307a0a3e415d33d0858283f67fcba4c59a042ff (patch) | |
tree | 45252e53439dde1122945646f4fa340cf0a8923e /keyboard/hhkb_rn42/rn42/battery.c | |
parent | be86aefdbda560d6810f9594169fee4385c1422d (diff) | |
parent | c35c4283b9c2c65d62fe8dc5e4b7ca49a8f5af33 (diff) |
Merge pull request #6 from tmk/master
pulling from tmk
Diffstat (limited to 'keyboard/hhkb_rn42/rn42/battery.c')
-rw-r--r-- | keyboard/hhkb_rn42/rn42/battery.c | 136 |
1 files changed, 0 insertions, 136 deletions
diff --git a/keyboard/hhkb_rn42/rn42/battery.c b/keyboard/hhkb_rn42/rn42/battery.c deleted file mode 100644 index 0320e1baf1..0000000000 --- a/keyboard/hhkb_rn42/rn42/battery.c +++ /dev/null @@ -1,136 +0,0 @@ -#include <avr/io.h> -#include <util/delay.h> -#include "battery.h" - - -/* - * Battery - */ -void battery_init(void) -{ - // blink - battery_led(LED_ON); _delay_ms(500); - battery_led(LED_OFF); _delay_ms(500); - battery_led(LED_ON); _delay_ms(500); - battery_led(LED_OFF); _delay_ms(500); - // LED indicates charger status - battery_led(LED_CHARGER); - - // ADC setting for voltage monitor - // Ref:2.56V band-gap, Input:ADC0(PF0), Prescale:128(16MHz/128=125KHz) - 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 -void battery_led(battery_led_t val) -{ - if (val == LED_TOGGLE) { - // Toggle LED - DDRF |= (1<<5); - PINF |= (1<<5); - } else if (val == LED_ON) { - // On overriding charger status - DDRF |= (1<<5); - PORTF &= ~(1<<5); - } else if (val == LED_OFF) { - // Off overriding charger status - DDRF |= (1<<5); - PORTF |= (1<<5); - } else { - // Display charger status - DDRF &= ~(1<<5); - PORTF &= ~(1<<5); - } -} - -bool battery_charging(void) -{ - if (!(USBSTA&(1<<VBUS))) return false; - - // 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; - uint8_t portf_prev = PORTF; - - // Input with pullup - DDRF &= ~(1<<5); - PORTF |= (1<<5); - _delay_ms(1); - bool charging = PINF&(1<<5) ? false : true; - - // restore last register status - 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); - - // discard first result - ADCSRA |= (1<<ADSC); - while (ADCSRA & (1<<ADSC)) ; - bat = ADC; - - // discard second result - ADCSRA |= (1<<ADSC); - while (ADCSRA & (1<<ADSC)) ; - bat = ADC; - - ADCSRA |= (1<<ADSC); - while (ADCSRA & (1<<ADSC)) ; - bat = ADC; - - //ADCSRA &= ~(1<<ADEN); - - // ADC disable voltate divider(PF4) - DDRF |= (1<<4); - PORTF &= ~(1<<4); - - return (bat - BATTERY_ADC_OFFSET) * BATTERY_ADC_RESOLUTION; -} - -static bool low_voltage(void) { - static bool low = false; - uint16_t v = battery_voltage(); - if (v < BATTERY_VOLTAGE_LOW_LIMIT) { - low = true; - } else if (v > BATTERY_VOLTAGE_LOW_RECOVERY) { - low = false; - } - return low; -} - -battery_status_t battery_status(void) -{ - if (USBSTA&(1<<VBUS)) { - /* powered */ - return battery_charging() ? CHARGING : FULL_CHARGED; - } else { - /* not powered */ - return low_voltage() ? LOW_VOLTAGE : DISCHARGING; - } -} |