aboutsummaryrefslogtreecommitdiff
path: root/hw/lumintop/blf-gt
diff options
context:
space:
mode:
Diffstat (limited to 'hw/lumintop/blf-gt')
-rw-r--r--hw/lumintop/blf-gt/cfg.h62
-rw-r--r--hw/lumintop/blf-gt/hwdef.h102
2 files changed, 164 insertions, 0 deletions
diff --git a/hw/lumintop/blf-gt/cfg.h b/hw/lumintop/blf-gt/cfg.h
new file mode 100644
index 0000000..580318a
--- /dev/null
+++ b/hw/lumintop/blf-gt/cfg.h
@@ -0,0 +1,62 @@
+// BLF GT config options for Anduril
+// Copyright (C) 2018-2023 Selene ToyKeeper
+// SPDX-License-Identifier: GPL-3.0-or-later
+#pragma once
+
+#define MODEL_NUMBER "0321"
+#include "hwdef-blf-gt.h"
+// ATTINY: 85
+
+// the button lights up
+#define USE_INDICATOR_LED
+// the button is visible while main LEDs are on
+#define USE_INDICATOR_LED_WHILE_RAMPING
+
+#define RAMP_SIZE 150
+
+// First 60 values: level_calc.py 1 60 7135 4 5.0 255
+// Remainder: all 255 (buck driver at 100% duty cycle)
+#define PWM1_LEVELS 4,5,6,6,7,8,9,11,12,13,15,16,18,19,21,23,25,27,30,32,34,37,40,43,46,49,52,55,59,63,66,70,75,79,83,88,93,98,103,108,114,119,125,131,137,144,150,157,164,171,179,186,194,202,210,219,228,236,246,255, \
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+// First 60 values: all 25 (buck driver at 10% power)
+// Remainder: values 61-150 of level_calc.py 1 150 7135 1 3 3000
+#define PWM2_LEVELS 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, \
+ 26,27,28,29,30,31,32,33,35,36,37,38,40,41,42,44,45,47,48,50,51,53,54,56,58,59,61,63,65,67,69,70,72,74,76,79,81,83,85,87,89,92,94,96,99,101,104,106,109,112,114,117,120,123,125,128,131,134,137,140,143,147,150,153,156,160,163,167,170,174,177,181,184,188,192,196,200,204,208,212,216,220,224,228,233,237,241,246,250,255
+#define POWER_80PX 138 // 2.0 Amps out of maximum 2.5 Amps
+#define MAX_1x7135 60 // where it switches from PWM to current control
+#define DEFAULT_LEVEL 69 // nice
+#define HALFSPEED_LEVEL 17
+#define QUARTERSPEED_LEVEL 6
+
+// use 2.0 A as the ceiling, 2.5 A only for turbo
+// start both ramps at the bottom; even moon throws a long way on the GT
+#define RAMP_SMOOTH_FLOOR 1
+#define RAMP_SMOOTH_CEIL POWER_80PX
+// 1 23 46 [69] 92 115 138
+#define RAMP_DISCRETE_FLOOR 1
+#define RAMP_DISCRETE_CEIL POWER_80PX
+#define RAMP_DISCRETE_STEPS 7
+
+// GT can handle heat well, so don't limit simple mode
+#define SIMPLE_UI_FLOOR RAMP_DISCRETE_FLOOR
+#define SIMPLE_UI_CEIL RAMP_DISCRETE_CEIL
+#define SIMPLE_UI_STEPS 5
+
+// smoother, more wobbly candle
+#define CANDLE_AMPLITUDE 33
+
+// turbo (i.e. "giggles" mode), low, tactical strobe
+#define TACTICAL_LEVELS 150,30,(RAMP_SIZE+2)
+
+// stop panicking at 80% power, this light has plenty of thermal mass
+#define THERM_FASTER_LEVEL POWER_80PX // throttle back faster when high
+
+// don't blink during ramp, it's irrelevant and annoying on this light
+#undef BLINK_AT_RAMP_CEIL
+#undef BLINK_AT_RAMP_MIDDLE
+#undef BLINK_AT_RAMP_FLOOR
+
+// too big, turn off extra features
+//#undef USE_TACTICAL_MODE
+#undef USE_SOS_MODE
+
diff --git a/hw/lumintop/blf-gt/hwdef.h b/hw/lumintop/blf-gt/hwdef.h
new file mode 100644
index 0000000..fdb0cb6
--- /dev/null
+++ b/hw/lumintop/blf-gt/hwdef.h
@@ -0,0 +1,102 @@
+// BLF GT driver layout
+// Copyright (C) 2018-2023 Selene ToyKeeper
+// SPDX-License-Identifier: GPL-3.0-or-later
+#pragma once
+
+/*
+ * ----
+ * Reset -|1 8|- VCC (unused)
+ * eswitch -|2 7|- Voltage divider
+ * AUX LED -|3 6|- Current control (buck level)
+ * GND -|4 5|- PWM (buck output on/off)
+ * ----
+ *
+ * On high modes, the buck regulator's current level is adjusted by pin 6.
+ * On low modes, the buck is set to ~10% power
+ * and its output gets PWM'd by pin 5.
+ */
+
+#define ATTINY 85
+#include <avr/io.h>
+
+#define HWDEF_C_FILE hwdef-emisar-d4.c
+
+// channel modes
+// * 0. main LEDs
+#define NUM_CHANNEL_MODES 1
+enum CHANNEL_MODES {
+ CM_MAIN = 0,
+};
+
+#define DEFAULT_CHANNEL_MODE CM_MAIN
+
+// right-most bit first, modes are in fedcba9876543210 order
+#define CHANNEL_MODES_ENABLED 0b00000001
+
+
+#define PWM_CHANNELS 2 // old, remove this
+
+#define PWM_BITS 8 // attiny85 only supports up to 8 bits
+#define PWM_GET PWM_GET8
+#define PWM_DATATYPE uint8_t
+#define PWM_DATATYPE2 uint16_t
+#define PWM1_DATATYPE uint8_t // low modes (PWM with buck at 10% power)
+#define PWM2_DATATYPE uint8_t // high modes (adjustable constant current)
+
+#define PWM_TOP_INIT 255 // highest value used in top half of ramp
+
+// low modes (PWM turns regulator on/off)
+#define CH1_PIN PB0 // pin 5
+#define CH1_PWM OCR0A // OCR0A is the output compare register for PB0
+
+// high modes (control voltage sets regulator's level)
+#define CH2_PIN PB1 // pin 6
+#define CH2_PWM OCR0B // OCR0B is the output compare register for PB1
+
+#define AUXLED_PIN PB4 // pin 3
+
+// e-switch
+#define SWITCH_PIN PB3 // pin 2
+#define SWITCH_PCINT PCINT3 // pin 2 pin change interrupt
+
+// VCC is regulated, so measure battery on pin 7 instead
+#define USE_VOLTAGE_DIVIDER // use a voltage divider on pin 7, not VCC
+#define VOLTAGE_PIN PB2 // pin 7, voltage ADC
+#define VOLTAGE_CHANNEL 0x01 // MUX 01 corresponds with PB2
+#define VOLTAGE_ADC ADC1D // Digital input disable bit corresponding with PB2
+// inherited from tk-attiny.h
+//#define VOLTAGE_ADC_DIDR DIDR0 // DIDR for ADC1
+// 1.1V reference, left-adjust, ADC1/PB2
+//#define ADMUX_VOLTAGE_DIVIDER ((1 << V_REF) | (1 << ADLAR) | VOLTAGE_CHANNEL)
+// 1.1V reference, no left-adjust, ADC1/PB2
+#define ADMUX_VOLTAGE_DIVIDER ((1 << V_REF) | VOLTAGE_CHANNEL)
+#define ADC_PRSCL 0x07 // clk/128
+
+// Raw ADC readings at 4.4V and 2.2V (in-between, we assume values form a straight line)
+#ifndef ADC_44
+#define ADC_44 (184*4)
+#endif
+#ifndef ADC_22
+#define ADC_22 (92*4)
+#endif
+
+#define FAST 0xA3 // fast PWM both channels
+#define PHASE 0xA1 // phase-correct PWM both channels
+
+
+inline void hwdef_setup() {
+ // configure PWM channels
+ DDRB = (1 << CH1_PIN)
+ | (1 << CH2_PIN);
+
+ TCCR0B = 0x01; // pre-scaler for timer (1 => 1, 2 => 8, 3 => 64...)
+ TCCR0A = PHASE;
+
+ // configure e-switch
+ PORTB = (1 << SWITCH_PIN); // e-switch is the only input
+ PCMSK = (1 << SWITCH_PIN); // pin change interrupt uses this pin
+}
+
+
+#define LAYOUT_DEFINED
+