1
#ifndef HWDEF_NOCTIGON_KR4_H
2
#define HWDEF_NOCTIGON_KR4_H
1
// Noctigon KR4 / D4V2.5 driver layout (attiny1634)
2
// Copyright (C) 2020-2023 Selene ToyKeeper
3
// SPDX-License-Identifier: GPL-3.0-or-later
4
/* Noctigon KR4 / D4V2.5 driver layout (attiny1634)
6
7
* Pin / Name / Function
7
* 1 PA6 FET PWM (direct drive) (PWM1B)
8
* 1 PA6 FET PWM (direct drive) (PWM1B) (on some models)
8
9
* 2 PA5 R: red aux LED (PWM0B)
9
10
* 3 PA4 G: green aux LED
10
11
* 4 PA3 B: blue aux LED
11
* 5 PA2 button LED (D4V2.5 only)
12
* 5 PA2 L: button LED (on some models)
29
30
* Main LED power uses one pin to turn the Opamp on/off,
30
31
* and one pin to control Opamp power level.
31
* Main brightness control uses the power level pin, with 4 kHz 10-bit PWM.
32
* Linear brightness control uses the power level pin, with dynamic PWM.
32
33
* The on/off pin is only used to turn the main LED on and off,
33
34
* not to change brightness.
34
35
* Some models also have a direct-drive FET for turbo.
40
38
#define ATTINY 1634
41
39
#include <avr/io.h>
43
#define PWM_CHANNELS 2
44
#define PWM_BITS 10 // 0 to 1023 at 4 kHz, not 0 to 255 at 16 kHz
42
#define HWDEF_C_FILE hwdef-noctigon-kr4.c
45
// allow using aux LEDs as extra channel modes
46
#include "chan-rgbaux.h"
49
// * 0. linear + DD FET stacked
51
#define NUM_CHANNEL_MODES (1 + NUM_RGB_AUX_CHANNEL_MODES)
57
#define DEFAULT_CHANNEL_MODE CM_MAIN
59
// right-most bit first, modes are in fedcba9876543210 order
60
#define CHANNEL_MODES_ENABLED 0b0000000000000001
62
//#define USE_CHANNEL_MODE_ARGS
63
//#define CHANNEL_MODE_ARGS 0,0,0,0,0,0,0,0
66
#define PWM_CHANNELS 2 // old, remove this
68
#define PWM_BITS 16 // dynamic 16-bit, but never goes over 255
69
#define PWM_GET PWM_GET8
70
#define PWM_DATATYPE uint16_t // is used for PWM_TOPS (which goes way over 255)
71
#define PWM_DATATYPE2 uint16_t // only needs 32-bit if ramp values go over 255
72
#define PWM1_DATATYPE uint8_t // linear ramp
73
#define PWM2_DATATYPE uint8_t // DD FET ramp
75
// PWM parameters of both channels are tied together because they share a counter
76
#define PWM_TOP ICR1 // holds the TOP value for variable-resolution PWM
77
#define PWM_TOP_INIT 255 // highest value used in top half of ramp
78
#define PWM_CNT TCNT1 // for dynamic PWM, reset phase
81
#define CH1_PIN PB3 // pin 16, Opamp reference
82
#define CH1_PWM OCR1A // OCR1A is the output compare register for PB3
83
#define CH1_ENABLE_PIN PB0 // pin 19, Opamp power
84
#define CH1_ENABLE_PORT PORTB // control port for PB0
87
#define CH2_PIN PA6 // pin 1, DD FET PWM
88
#define CH2_PWM OCR1B // OCR1B is the output compare register for PA6
47
91
#define SWITCH_PIN PB2 // pin 17
48
92
#define SWITCH_PCINT PCINT10 // pin 17 pin change interrupt
49
93
#define SWITCH_PCIE PCIE1 // PCIE1 is for PCINT[11:8]
50
94
#define SWITCH_PCMSK PCMSK1 // PCMSK1 is for PCINT[11:8]
51
95
#define SWITCH_PORT PINB // PINA or PINB or PINC
96
#define SWITCH_PUE PUEB // pullup group B
52
97
#define PCINT_vect PCINT1_vect // ISR for PCINT[11:8]
54
99
// the button tends to short out the voltage divider,
55
100
// so ignore voltage while the button is being held
56
101
//#define NO_LVP_WHILE_BUTTON_PRESSED
59
#define PWM1_PIN PB3 // pin 16, Opamp reference
60
#define PWM1_LVL OCR1A // OCR1A is the output compare register for PB3
62
#define PWM2_PIN PA6 // pin 1, DD FET PWM
63
#define PWM2_LVL OCR1B // OCR1B is the output compare register for PA6
65
#define LED_ENABLE_PIN PB0 // pin 19, Opamp power
66
#define LED_ENABLE_PORT PORTB // control port for PB0
69
103
#define USE_VOLTAGE_DIVIDER // use a dedicated pin, not VCC, because VCC input is flattened
70
104
#define VOLTAGE_PIN PB1 // Pin 18 / PB1 / ADC6
71
105
// pin to ADC mappings are in DS table 19-4
109
143
#define BUTTON_LED_DDR DDRA // for all "PA" pins
110
144
#define BUTTON_LED_PUE PUEA // for all "PA" pins
112
// with so many pins, doing this all with #ifdefs gets awkward...
113
// ... so just hardcode it in each hwdef file instead
146
// this light has three aux LED channels: R, G, B
147
#define USE_AUX_RGB_LEDS
148
// some variants also have an independent LED in the button
149
#define USE_BUTTON_LED
150
// the aux LEDs are front-facing, so turn them off while main LEDs are on
151
#ifdef USE_INDICATOR_LED_WHILE_RAMPING
152
#undef USE_INDICATOR_LED_WHILE_RAMPING
114
156
inline void hwdef_setup() {
115
// enable output ports
116
// Opamp level and Opamp on/off
117
DDRB = (1 << PWM1_PIN)
118
| (1 << LED_ENABLE_PIN);
119
// DD FET PWM, aux R/G/B, button LED
120
DDRA = (1 << PWM2_PIN)
121
| (1 << AUXLED_R_PIN)
122
| (1 << AUXLED_G_PIN)
123
| (1 << AUXLED_B_PIN)
124
| (1 << BUTTON_LED_PIN)
128
// Setup PWM. F_pwm = F_clkio / 2 / N / TOP, where N = prescale factor, TOP = top of counter
129
// pre-scale for timer: N = 1
130
// WGM1[3:0]: 0,0,1,1: PWM, Phase Correct, 10-bit (DS table 12-5)
131
// CS1[2:0]: 0,0,1: clk/1 (No prescaling) (DS table 12-6)
132
// COM1A[1:0]: 1,0: PWM OC1A in the normal direction (DS table 12-4)
133
// COM1B[1:0]: 1,0: PWM OC1B in the normal direction (DS table 12-4)
134
TCCR1A = (1<<WGM11) | (1<<WGM10) // 10-bit (TOP=0x03FF) (DS table 12-5)
135
| (1<<COM1A1) | (0<<COM1A0) // PWM 1A in normal direction (DS table 12-4)
136
| (1<<COM1B1) | (0<<COM1B0) // PWM 1B in normal direction (DS table 12-4)
138
TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) // clk/1 (no prescaling) (DS table 12-6)
139
| (0<<WGM13) | (0<<WGM12) // phase-correct PWM (DS table 12-5)
143
//PORTB = (1 << SWITCH_PIN); // TODO: configure PORTA / PORTB / PORTC?
144
PUEB = (1 << SWITCH_PIN); // pull-up for e-switch
145
SWITCH_PCMSK = (1 << SWITCH_PCINT); // enable pin change interrupt
157
// enable output ports
158
// Opamp level and Opamp on/off
159
DDRB = (1 << CH1_PIN)
160
| (1 << CH1_ENABLE_PIN);
161
// DD FET PWM, aux R/G/B, button LED
162
DDRA = (1 << CH2_PIN)
163
| (1 << AUXLED_R_PIN)
164
| (1 << AUXLED_G_PIN)
165
| (1 << AUXLED_B_PIN)
166
| (1 << BUTTON_LED_PIN)
170
// Setup PWM. F_pwm = F_clkio / 2 / N / TOP, where N = prescale factor, TOP = top of counter
171
// pre-scale for timer: N = 1
172
// WGM1[3:0]: 1,0,1,0: PWM, Phase Correct, adjustable (DS table 12-5)
173
// CS1[2:0]: 0,0,1: clk/1 (No prescaling) (DS table 12-6)
174
// COM1A[1:0]: 1,0: PWM OC1A in the normal direction (DS table 12-4)
175
// COM1B[1:0]: 1,0: PWM OC1B in the normal direction (DS table 12-4)
176
TCCR1A = (1<<WGM11) | (0<<WGM10) // adjustable PWM (TOP=ICR1) (DS table 12-5)
177
| (1<<COM1A1) | (0<<COM1A0) // PWM 1A in normal direction (DS table 12-4)
178
| (1<<COM1B1) | (0<<COM1B0) // PWM 1B in normal direction (DS table 12-4)
180
TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) // clk/1 (no prescaling) (DS table 12-6)
181
| (1<<WGM13) | (0<<WGM12) // phase-correct adjustable PWM (DS table 12-5)
184
// set PWM resolution
185
PWM_TOP = PWM_TOP_INIT;
188
SWITCH_PUE = (1 << SWITCH_PIN); // pull-up for e-switch
189
SWITCH_PCMSK = (1 << SWITCH_PCINT); // enable pin change interrupt
148
193
#define LAYOUT_DEFINED