Adding Musical Notes
This commit is contained in:
		
						commit
						4aea806aa8
					
				
					 23 changed files with 1072 additions and 336 deletions
				
			
		
							
								
								
									
										148
									
								
								quantum/audio.c
									
										
									
									
									
								
							
							
						
						
									
										148
									
								
								quantum/audio.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -8,6 +8,8 @@
 | 
			
		|||
#include "audio.h"
 | 
			
		||||
#include "keymap_common.h"
 | 
			
		||||
 | 
			
		||||
#include "eeconfig.h"
 | 
			
		||||
 | 
			
		||||
#define PI 3.14159265
 | 
			
		||||
 | 
			
		||||
// #define PWM_AUDIO
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +32,8 @@ int voice_place = 0;
 | 
			
		|||
double frequency = 0;
 | 
			
		||||
int volume = 0;
 | 
			
		||||
long position = 0;
 | 
			
		||||
int duty_place = 1;
 | 
			
		||||
int duty_counter = 0;
 | 
			
		||||
 | 
			
		||||
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +61,25 @@ uint8_t notes_length;
 | 
			
		|||
bool notes_repeat;
 | 
			
		||||
uint8_t current_note = 0;
 | 
			
		||||
 | 
			
		||||
audio_config_t audio_config;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void audio_toggle(void) {
 | 
			
		||||
    audio_config.enable ^= 1;
 | 
			
		||||
    eeconfig_write_audio(audio_config.raw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void audio_on(void) {
 | 
			
		||||
    audio_config.enable = 1;
 | 
			
		||||
    eeconfig_write_audio(audio_config.raw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void audio_off(void) {
 | 
			
		||||
    audio_config.enable = 0;
 | 
			
		||||
    eeconfig_write_audio(audio_config.raw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void stop_all_notes() {
 | 
			
		||||
    voices = 0;
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
| 
						 | 
				
			
			@ -77,58 +100,66 @@ void stop_all_notes() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void stop_note(double freq) {
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        freq = freq / SAMPLE_RATE;
 | 
			
		||||
    #endif
 | 
			
		||||
    for (int i = 7; i >= 0; i--) {
 | 
			
		||||
        if (frequencies[i] == freq) {
 | 
			
		||||
            frequencies[i] = 0;
 | 
			
		||||
            volumes[i] = 0;
 | 
			
		||||
            for (int j = i; (j < 7); j++) {
 | 
			
		||||
                frequencies[j] = frequencies[j+1];
 | 
			
		||||
                frequencies[j+1] = 0;
 | 
			
		||||
                volumes[j] = volumes[j+1];
 | 
			
		||||
                volumes[j+1] = 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    voices--;
 | 
			
		||||
    if (voices < 0)
 | 
			
		||||
        voices = 0;
 | 
			
		||||
    if (voices == 0) {
 | 
			
		||||
    if (note) {
 | 
			
		||||
        #ifdef PWM_AUDIO
 | 
			
		||||
            TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
        #else
 | 
			
		||||
            TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
            TCCR3A &= ~_BV(COM3A1);
 | 
			
		||||
            freq = freq / SAMPLE_RATE;
 | 
			
		||||
        #endif
 | 
			
		||||
        frequency = 0;
 | 
			
		||||
        volume = 0;
 | 
			
		||||
        note = false;
 | 
			
		||||
    } else {
 | 
			
		||||
        double freq = frequencies[voices - 1];
 | 
			
		||||
        int vol = volumes[voices - 1];
 | 
			
		||||
        double starting_f = frequency;
 | 
			
		||||
        if (frequency < freq) {
 | 
			
		||||
            sliding = true;
 | 
			
		||||
            for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
 | 
			
		||||
                frequency = f;
 | 
			
		||||
        for (int i = 7; i >= 0; i--) {
 | 
			
		||||
            if (frequencies[i] == freq) {
 | 
			
		||||
                frequencies[i] = 0;
 | 
			
		||||
                volumes[i] = 0;
 | 
			
		||||
                for (int j = i; (j < 7); j++) {
 | 
			
		||||
                    frequencies[j] = frequencies[j+1];
 | 
			
		||||
                    frequencies[j+1] = 0;
 | 
			
		||||
                    volumes[j] = volumes[j+1];
 | 
			
		||||
                    volumes[j+1] = 0;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            sliding = false;
 | 
			
		||||
        } else if (frequency > freq) {
 | 
			
		||||
            sliding = true;
 | 
			
		||||
            for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
 | 
			
		||||
                frequency = f;
 | 
			
		||||
            }
 | 
			
		||||
            sliding = false;
 | 
			
		||||
        }
 | 
			
		||||
        frequency = freq;
 | 
			
		||||
        volume = vol;
 | 
			
		||||
        voices--;
 | 
			
		||||
        if (voices < 0)
 | 
			
		||||
            voices = 0;
 | 
			
		||||
        if (voices == 0) {
 | 
			
		||||
            #ifdef PWM_AUDIO
 | 
			
		||||
                TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
            #else
 | 
			
		||||
                TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
                TCCR3A &= ~_BV(COM3A1);
 | 
			
		||||
            #endif
 | 
			
		||||
            frequency = 0;
 | 
			
		||||
            volume = 0;
 | 
			
		||||
            note = false;
 | 
			
		||||
        } else {
 | 
			
		||||
            double freq = frequencies[voices - 1];
 | 
			
		||||
            int vol = volumes[voices - 1];
 | 
			
		||||
            double starting_f = frequency;
 | 
			
		||||
            if (frequency < freq) {
 | 
			
		||||
                sliding = true;
 | 
			
		||||
                for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
 | 
			
		||||
                    frequency = f;
 | 
			
		||||
                }
 | 
			
		||||
                sliding = false;
 | 
			
		||||
            } else if (frequency > freq) {
 | 
			
		||||
                sliding = true;
 | 
			
		||||
                for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
 | 
			
		||||
                    frequency = f;
 | 
			
		||||
                }
 | 
			
		||||
                sliding = false;
 | 
			
		||||
            }
 | 
			
		||||
            frequency = freq;
 | 
			
		||||
            volume = vol;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void init_notes() {
 | 
			
		||||
 | 
			
		||||
    /* check signature */
 | 
			
		||||
    if (!eeconfig_is_enabled()) {
 | 
			
		||||
        eeconfig_init();
 | 
			
		||||
    }
 | 
			
		||||
    audio_config.raw = eeconfig_read_audio();
 | 
			
		||||
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        PLLFRQ = _BV(PDIV2);
 | 
			
		||||
        PLLCSR = _BV(PLLE);
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +191,6 @@ void init_notes() {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
ISR(TIMER3_COMPA_vect) {
 | 
			
		||||
 | 
			
		||||
    if (note) {
 | 
			
		||||
        #ifdef PWM_AUDIO
 | 
			
		||||
            if (voices == 1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -213,13 +243,19 @@ ISR(TIMER3_COMPA_vect) {
 | 
			
		|||
            if (frequency > 0) {
 | 
			
		||||
                // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
 | 
			
		||||
                // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
 | 
			
		||||
                if (place > 10) {
 | 
			
		||||
                voice_place %= voices;
 | 
			
		||||
                if (place > (frequencies[voice_place] / 500)) {
 | 
			
		||||
                    voice_place = (voice_place + 1) % voices;
 | 
			
		||||
                    place = 0.0;
 | 
			
		||||
                }
 | 
			
		||||
                ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
 | 
			
		||||
                OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period
 | 
			
		||||
                OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period
 | 
			
		||||
                place++;
 | 
			
		||||
                // if (duty_counter > (frequencies[voice_place] / 500)) {
 | 
			
		||||
                //     duty_place = (duty_place % 3) + 1;
 | 
			
		||||
                //     duty_counter = 0;
 | 
			
		||||
                // }
 | 
			
		||||
                // duty_counter++;
 | 
			
		||||
            }
 | 
			
		||||
        #endif
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -288,9 +324,16 @@ ISR(TIMER3_COMPA_vect) {
 | 
			
		|||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!audio_config.enable) {
 | 
			
		||||
        notes = false;
 | 
			
		||||
        note = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
 | 
			
		||||
 | 
			
		||||
if (audio_config.enable) {
 | 
			
		||||
 | 
			
		||||
    if (note)
 | 
			
		||||
        stop_all_notes();
 | 
			
		||||
    notes = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -319,7 +362,12 @@ void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
 | 
			
		|||
    #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_sample(uint8_t * s, uint16_t l, bool r) {
 | 
			
		||||
 | 
			
		||||
if (audio_config.enable) {
 | 
			
		||||
 | 
			
		||||
    stop_all_notes();
 | 
			
		||||
    place_int = 0;
 | 
			
		||||
    sample = s;
 | 
			
		||||
| 
						 | 
				
			
			@ -330,9 +378,15 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
 | 
			
		|||
        TIMSK3 |= _BV(OCIE3A);
 | 
			
		||||
    #else
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_note(double freq, int vol) {
 | 
			
		||||
 | 
			
		||||
if (audio_config.enable && voices < 8) {
 | 
			
		||||
 | 
			
		||||
    if (notes)
 | 
			
		||||
        stop_all_notes();
 | 
			
		||||
    note = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -367,4 +421,6 @@ void play_note(double freq, int vol) {
 | 
			
		|||
        TCCR3A |= _BV(COM3A1);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3,9 +3,21 @@
 | 
			
		|||
#include <avr/io.h>
 | 
			
		||||
#include <util/delay.h>
 | 
			
		||||
 | 
			
		||||
typedef union {
 | 
			
		||||
    uint8_t raw;
 | 
			
		||||
    struct {
 | 
			
		||||
        bool    enable :1;
 | 
			
		||||
        uint8_t level  :7;
 | 
			
		||||
    };
 | 
			
		||||
} audio_config_t;
 | 
			
		||||
 | 
			
		||||
void audio_toggle(void);
 | 
			
		||||
void audio_on(void);
 | 
			
		||||
void audio_off(void);
 | 
			
		||||
 | 
			
		||||
void play_sample(uint8_t * s, uint16_t l, bool r);
 | 
			
		||||
void play_note(double freq, int vol);
 | 
			
		||||
void stop_note(double freq);
 | 
			
		||||
void stop_all_notes(void);
 | 
			
		||||
void init_notes(void);
 | 
			
		||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
 | 
			
		||||
void stop_all_notes();
 | 
			
		||||
void init_notes();
 | 
			
		||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#include "keymap_midi.h"
 | 
			
		||||
#include "bootloader.h"
 | 
			
		||||
 | 
			
		||||
extern keymap_config_t keymap_config;
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
#ifdef AUDIO_ENABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -47,120 +49,9 @@ action_t action_for_key(uint8_t layer, keypos_t key)
 | 
			
		|||
	// 16bit keycodes - important
 | 
			
		||||
    uint16_t keycode = keymap_key_to_keycode(layer, key);
 | 
			
		||||
 | 
			
		||||
    if (keycode >= 0x0100 && keycode < 0x2000) {
 | 
			
		||||
    	// Has a modifier
 | 
			
		||||
    	action_t action;
 | 
			
		||||
    	// Split it up
 | 
			
		||||
    	action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
 | 
			
		||||
    	return action;
 | 
			
		||||
	} else if (keycode >= 0x2000 && keycode < 0x3000) {
 | 
			
		||||
        // Is a shortcut for function layer, pull last 12bits
 | 
			
		||||
        // This means we have 4,096 FN macros at our disposal
 | 
			
		||||
        return keymap_func_to_action(keycode & 0xFFF);
 | 
			
		||||
	} else if (keycode >= 0x3000 && keycode < 0x4000) {
 | 
			
		||||
      // When the code starts with 3, it's an action macro.
 | 
			
		||||
    	action_t action;
 | 
			
		||||
    	action.code = ACTION_MACRO(keycode & 0xFF);
 | 
			
		||||
    	return action;
 | 
			
		||||
#ifdef BACKLIGHT_ENABLE
 | 
			
		||||
	} else if (keycode >= BL_0 && keycode <= BL_15) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode == BL_DEC) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_BACKLIGHT_DECREASE();
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode == BL_INC) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_BACKLIGHT_INCREASE();
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode == BL_TOGG) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_BACKLIGHT_TOGGLE();
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode == BL_STEP) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_BACKLIGHT_STEP();
 | 
			
		||||
        return action;
 | 
			
		||||
#endif
 | 
			
		||||
    } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
 | 
			
		||||
    	action_t action;
 | 
			
		||||
        clear_keyboard();
 | 
			
		||||
        #ifdef AUDIO_ENABLE
 | 
			
		||||
            play_notes(&goodbye, 3, false);
 | 
			
		||||
        #endif
 | 
			
		||||
        _delay_ms(250);
 | 
			
		||||
        #ifdef ATREUS_ASTAR
 | 
			
		||||
            *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
 | 
			
		||||
        #endif
 | 
			
		||||
        bootloader_jump();
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode == DEBUG) { // DEBUG is 0x5001
 | 
			
		||||
      // TODO: Does this actually work?
 | 
			
		||||
        action_t action;
 | 
			
		||||
        print("\nDEBUG: enabled.\n");
 | 
			
		||||
        debug_enable = true;
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode >= 0x5000 && keycode < 0x6000) {
 | 
			
		||||
        // Layer movement shortcuts
 | 
			
		||||
        // See .h to see constraints/usage
 | 
			
		||||
        int type = (keycode >> 0x8) & 0xF;
 | 
			
		||||
        if (type == 0x1) {
 | 
			
		||||
            // Layer set "GOTO"
 | 
			
		||||
            int when = (keycode >> 0x4) & 0x3;
 | 
			
		||||
            int layer = keycode & 0xF;
 | 
			
		||||
            action_t action;
 | 
			
		||||
            action.code = ACTION_LAYER_SET(layer, when);
 | 
			
		||||
            return action;
 | 
			
		||||
        } else if (type == 0x2) {
 | 
			
		||||
            // Momentary layer
 | 
			
		||||
            int layer = keycode & 0xFF;
 | 
			
		||||
            action_t action;
 | 
			
		||||
            action.code = ACTION_LAYER_MOMENTARY(layer);
 | 
			
		||||
            return action;
 | 
			
		||||
        } else if (type == 0x3) {
 | 
			
		||||
            // Set default layer
 | 
			
		||||
            int layer = keycode & 0xFF;
 | 
			
		||||
            action_t action;
 | 
			
		||||
            action.code = ACTION_DEFAULT_LAYER_SET(layer);
 | 
			
		||||
            return action;
 | 
			
		||||
        } else if (type == 0x4) {
 | 
			
		||||
            // Set default layer
 | 
			
		||||
            int layer = keycode & 0xFF;
 | 
			
		||||
            action_t action;
 | 
			
		||||
            action.code = ACTION_LAYER_TOGGLE(layer);
 | 
			
		||||
            return action;
 | 
			
		||||
        }
 | 
			
		||||
#ifdef MIDI_ENABLE
 | 
			
		||||
    } else if (keycode >= 0x6000 && keycode < 0x7000) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code =  ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
 | 
			
		||||
        return action;
 | 
			
		||||
#endif
 | 
			
		||||
    } else if (keycode >= 0x7000 && keycode < 0x8000) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
 | 
			
		||||
        return action;
 | 
			
		||||
    } else if (keycode >= 0x8000 && keycode < 0x9000) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
 | 
			
		||||
        return action;
 | 
			
		||||
#ifdef UNICODE_ENABLE
 | 
			
		||||
    } else if (keycode >= 0x8000000) {
 | 
			
		||||
        action_t action;
 | 
			
		||||
        uint16_t unicode = keycode & ~(0x8000);
 | 
			
		||||
        action.code =  ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
 | 
			
		||||
        return action;
 | 
			
		||||
#endif
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    switch (keycode) {
 | 
			
		||||
        case KC_FN0 ... KC_FN31:
 | 
			
		||||
            return keymap_fn_to_action(keycode);
 | 
			
		||||
#ifdef BOOTMAGIC_ENABLE
 | 
			
		||||
        case KC_CAPSLOCK:
 | 
			
		||||
        case KC_LOCKING_CAPS:
 | 
			
		||||
            if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
 | 
			
		||||
| 
						 | 
				
			
			@ -224,7 +115,6 @@ action_t action_for_key(uint8_t layer, keypos_t key)
 | 
			
		|||
                return keycode_to_action(KC_BSLASH);
 | 
			
		||||
            }
 | 
			
		||||
            return keycode_to_action(KC_BSPACE);
 | 
			
		||||
#endif
 | 
			
		||||
        default:
 | 
			
		||||
            return keycode_to_action(keycode);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -265,6 +155,142 @@ static action_t keycode_to_action(uint16_t keycode)
 | 
			
		|||
        case KC_TRNS:
 | 
			
		||||
            action.code = ACTION_TRANSPARENT;
 | 
			
		||||
            break;
 | 
			
		||||
        case 0x0100 ... 0x1FFF: ;
 | 
			
		||||
            // Has a modifier
 | 
			
		||||
            // Split it up
 | 
			
		||||
            action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
 | 
			
		||||
            break;
 | 
			
		||||
        case 0x2000 ... 0x2FFF:
 | 
			
		||||
            // Is a shortcut for function layer, pull last 12bits
 | 
			
		||||
            // This means we have 4,096 FN macros at our disposal
 | 
			
		||||
            return keymap_func_to_action(keycode & 0xFFF);
 | 
			
		||||
            break;
 | 
			
		||||
        case 0x3000 ... 0x3FFF: ;
 | 
			
		||||
            // When the code starts with 3, it's an action macro.
 | 
			
		||||
            action.code = ACTION_MACRO(keycode & 0xFF);
 | 
			
		||||
            break;
 | 
			
		||||
    #ifdef BACKLIGHT_ENABLE
 | 
			
		||||
        case BL_0 ... BL_15:
 | 
			
		||||
            action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
 | 
			
		||||
            break;
 | 
			
		||||
        case BL_DEC:
 | 
			
		||||
            action.code = ACTION_BACKLIGHT_DECREASE();
 | 
			
		||||
            break;
 | 
			
		||||
        case BL_INC:
 | 
			
		||||
            action.code = ACTION_BACKLIGHT_INCREASE();
 | 
			
		||||
            break;
 | 
			
		||||
        case BL_TOGG:
 | 
			
		||||
            action.code = ACTION_BACKLIGHT_TOGGLE();
 | 
			
		||||
            break;
 | 
			
		||||
        case BL_STEP:
 | 
			
		||||
            action.code = ACTION_BACKLIGHT_STEP();
 | 
			
		||||
            break;
 | 
			
		||||
    #endif
 | 
			
		||||
        case RESET: ; // RESET is 0x5000, which is why this is here
 | 
			
		||||
            clear_keyboard();
 | 
			
		||||
            #ifdef AUDIO_ENABLE
 | 
			
		||||
                play_notes(&goodbye, 3, false);
 | 
			
		||||
            #endif
 | 
			
		||||
            _delay_ms(250);
 | 
			
		||||
            #ifdef ATREUS_ASTAR
 | 
			
		||||
                *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
 | 
			
		||||
            #endif
 | 
			
		||||
            bootloader_jump();
 | 
			
		||||
            break;
 | 
			
		||||
        case DEBUG: ; // DEBUG is 0x5001
 | 
			
		||||
            print("\nDEBUG: enabled.\n");
 | 
			
		||||
            debug_enable = true;
 | 
			
		||||
            break;
 | 
			
		||||
        case 0x5002 ... 0x50FF:
 | 
			
		||||
            // MAGIC actions (BOOTMAGIC without the boot)   
 | 
			
		||||
            if (!eeconfig_is_enabled()) {
 | 
			
		||||
                eeconfig_init();
 | 
			
		||||
            }
 | 
			
		||||
            /* keymap config */
 | 
			
		||||
            keymap_config.raw = eeconfig_read_keymap();
 | 
			
		||||
            if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
 | 
			
		||||
                keymap_config.swap_control_capslock = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
 | 
			
		||||
                keymap_config.capslock_to_control = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_SWAP_LALT_LGUI) {
 | 
			
		||||
                keymap_config.swap_lalt_lgui = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_SWAP_RALT_RGUI) {
 | 
			
		||||
                keymap_config.swap_ralt_rgui = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_NO_GUI) {
 | 
			
		||||
                keymap_config.no_gui = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
 | 
			
		||||
                keymap_config.swap_grave_esc = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
 | 
			
		||||
                keymap_config.swap_backslash_backspace = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_HOST_NKRO) {
 | 
			
		||||
                keymap_config.nkro = 1;
 | 
			
		||||
            } else if (keycode == MAGIC_SWAP_ALT_GUI) {
 | 
			
		||||
                keymap_config.swap_lalt_lgui = 1;
 | 
			
		||||
                keymap_config.swap_ralt_rgui = 1;
 | 
			
		||||
            }
 | 
			
		||||
            /* UNs */
 | 
			
		||||
            else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
 | 
			
		||||
                keymap_config.swap_control_capslock = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
 | 
			
		||||
                keymap_config.capslock_to_control = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
 | 
			
		||||
                keymap_config.swap_lalt_lgui = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
 | 
			
		||||
                keymap_config.swap_ralt_rgui = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNNO_GUI) {
 | 
			
		||||
                keymap_config.no_gui = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
 | 
			
		||||
                keymap_config.swap_grave_esc = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
 | 
			
		||||
                keymap_config.swap_backslash_backspace = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNHOST_NKRO) {
 | 
			
		||||
                keymap_config.nkro = 0;
 | 
			
		||||
            } else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
 | 
			
		||||
                keymap_config.swap_lalt_lgui = 0;
 | 
			
		||||
                keymap_config.swap_ralt_rgui = 0;
 | 
			
		||||
            }
 | 
			
		||||
            eeconfig_write_keymap(keymap_config.raw);
 | 
			
		||||
            break;
 | 
			
		||||
        case 0x5100 ... 0x5FFF: ;
 | 
			
		||||
            // Layer movement shortcuts
 | 
			
		||||
            // See .h to see constraints/usage
 | 
			
		||||
            int type = (keycode >> 0x8) & 0xF;
 | 
			
		||||
            if (type == 0x1) {
 | 
			
		||||
                // Layer set "GOTO"
 | 
			
		||||
                int when = (keycode >> 0x4) & 0x3;
 | 
			
		||||
                int layer = keycode & 0xF;
 | 
			
		||||
                action.code = ACTION_LAYER_SET(layer, when);
 | 
			
		||||
            } else if (type == 0x2) {
 | 
			
		||||
                // Momentary layer
 | 
			
		||||
                int layer = keycode & 0xFF;
 | 
			
		||||
                action.code = ACTION_LAYER_MOMENTARY(layer);
 | 
			
		||||
            } else if (type == 0x3) {
 | 
			
		||||
                // Set default layer
 | 
			
		||||
                int layer = keycode & 0xFF;
 | 
			
		||||
                action.code = ACTION_DEFAULT_LAYER_SET(layer);
 | 
			
		||||
            } else if (type == 0x4) {
 | 
			
		||||
                // Set default layer
 | 
			
		||||
                int layer = keycode & 0xFF;
 | 
			
		||||
                action.code = ACTION_LAYER_TOGGLE(layer);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
    #ifdef MIDI_ENABLE
 | 
			
		||||
        case 0x6000 ... 0x6FFF:
 | 
			
		||||
            action.code =  ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
 | 
			
		||||
            break;
 | 
			
		||||
    #endif
 | 
			
		||||
        case 0x7000 ... 0x7FFF:
 | 
			
		||||
            action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
 | 
			
		||||
            break;
 | 
			
		||||
        case 0x8000 ... 0x8FFF:
 | 
			
		||||
            action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
 | 
			
		||||
            break;
 | 
			
		||||
    #ifdef UNICODE_ENABLE
 | 
			
		||||
        case 0x8000000 ... 0x8FFFFFF:
 | 
			
		||||
            uint16_t unicode = keycode & ~(0x8000);
 | 
			
		||||
            action.code =  ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
 | 
			
		||||
            break;
 | 
			
		||||
    #endif
 | 
			
		||||
        default:
 | 
			
		||||
            action.code = ACTION_NO;
 | 
			
		||||
            break;
 | 
			
		||||
| 
						 | 
				
			
			@ -291,3 +317,11 @@ action_t keymap_func_to_action(uint16_t keycode)
 | 
			
		|||
	// For FUNC without 8bit limit
 | 
			
		||||
    return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
 | 
			
		||||
  if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
 | 
			
		||||
    layer_on(layer3);
 | 
			
		||||
  } else {
 | 
			
		||||
    layer_off(layer3);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
// #include "print.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
#ifdef BOOTMAGIC_ENABLE
 | 
			
		||||
/* NOTE: Not portable. Bit field order depends on implementation */
 | 
			
		||||
typedef union {
 | 
			
		||||
    uint16_t raw;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,8 +44,6 @@ typedef union {
 | 
			
		|||
        bool nkro:1;
 | 
			
		||||
    };
 | 
			
		||||
} keymap_config_t;
 | 
			
		||||
keymap_config_t keymap_config;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* translates key to keycode */
 | 
			
		||||
| 
						 | 
				
			
			@ -168,6 +165,30 @@ extern const uint16_t fn_actions[];
 | 
			
		|||
#define RESET 0x5000
 | 
			
		||||
#define DEBUG 0x5001
 | 
			
		||||
 | 
			
		||||
// MAGIC keycodes
 | 
			
		||||
#define MAGIC_SWAP_CONTROL_CAPSLOCK      0x5002
 | 
			
		||||
#define MAGIC_UNSWAP_CONTROL_CAPSLOCK    0x5003
 | 
			
		||||
#define MAGIC_CAPSLOCK_TO_CONTROL        0x5004
 | 
			
		||||
#define MAGIC_UNCAPSLOCK_TO_CONTROL      0x5005
 | 
			
		||||
#define MAGIC_SWAP_LALT_LGUI             0x5006
 | 
			
		||||
#define MAGIC_UNSWAP_LALT_LGUI           0x5007
 | 
			
		||||
#define MAGIC_SWAP_RALT_RGUI             0x5008
 | 
			
		||||
#define MAGIC_UNSWAP_RALT_RGUI           0x5009
 | 
			
		||||
#define MAGIC_NO_GUI                     0x500a
 | 
			
		||||
#define MAGIC_UNNO_GUI                   0x500b
 | 
			
		||||
#define MAGIC_SWAP_GRAVE_ESC             0x500c
 | 
			
		||||
#define MAGIC_UNSWAP_GRAVE_ESC           0x500d
 | 
			
		||||
#define MAGIC_SWAP_BACKSLASH_BACKSPACE   0x500e
 | 
			
		||||
#define MAGIC_UNSWAP_BACKSLASH_BACKSPACE 0x500f
 | 
			
		||||
#define MAGIC_HOST_NKRO                  0x5010
 | 
			
		||||
#define MAGIC_UNHOST_NKRO                0x5011
 | 
			
		||||
#define MAGIC_SWAP_ALT_GUI               0x5012
 | 
			
		||||
#define MAGIC_UNSWAP_ALT_GUI             0x5013
 | 
			
		||||
 | 
			
		||||
#define AG_SWAP MAGIC_SWAP_ALT_GUI
 | 
			
		||||
#define AG_NORM MAGIC_UNSWAP_ALT_GUI
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// GOTO layer - 16 layers max
 | 
			
		||||
// when:
 | 
			
		||||
// ON_PRESS    = 1
 | 
			
		||||
| 
						 | 
				
			
			@ -208,5 +229,10 @@ extern const uint16_t fn_actions[];
 | 
			
		|||
#define UNICODE(n) (n | 0x8000)
 | 
			
		||||
#define UC(n) UNICODE(n)
 | 
			
		||||
 | 
			
		||||
// For tri-layer
 | 
			
		||||
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
 | 
			
		||||
#define IS_LAYER_ON(layer)  ((layer_state) & (1UL<<(layer)))
 | 
			
		||||
#define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										182
									
								
								quantum/musical_notes.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								quantum/musical_notes.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,182 @@
 | 
			
		|||
#ifndef MUSICAL_NOTES_H
 | 
			
		||||
#define MUSICAL_NOTES_H
 | 
			
		||||
 | 
			
		||||
// Tempo Placeholder
 | 
			
		||||
#define TEMPO 120
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Note Types
 | 
			
		||||
#define WHOLE_NOTE(note)     {(NOTE##note), 64}
 | 
			
		||||
#define HALF_NOTE(note)      {(NOTE##note), 32}
 | 
			
		||||
#define QUARTER_NOTE(note)   {(NOTE##note), 16}
 | 
			
		||||
#define EIGTH_NOTE(note)     {(NOTE##note), 8}
 | 
			
		||||
#define SIXTEENTH_NOTE(note) {(NOTE##note), 4}
 | 
			
		||||
 | 
			
		||||
// Note Types Short
 | 
			
		||||
#define W_NOTE(n) WHOLE_NOTE(n)
 | 
			
		||||
#define H_NOTE(n) HALF_NOTE(n)
 | 
			
		||||
#define Q_NOTE(n) QUARTER_NOTE(n)
 | 
			
		||||
#define E_NOTE(n) EIGTH_NOTE(n)
 | 
			
		||||
#define S_NOTE(n) SIXTEENTH_NOTE(n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Notes - # = Octave
 | 
			
		||||
#define NOTE_REST         0.00
 | 
			
		||||
#define NOTE_C0          16.35
 | 
			
		||||
#define NOTE_CS0         17.32
 | 
			
		||||
#define NOTE_D0          18.35
 | 
			
		||||
#define NOTE_DS0         19.45
 | 
			
		||||
#define NOTE_E0          20.60
 | 
			
		||||
#define NOTE_F0          21.83
 | 
			
		||||
#define NOTE_FS0         23.12
 | 
			
		||||
#define NOTE_G0          24.50
 | 
			
		||||
#define NOTE_GS0         25.96
 | 
			
		||||
#define NOTE_A0          27.50
 | 
			
		||||
#define NOTE_AS0         29.14
 | 
			
		||||
#define NOTE_B0          30.87
 | 
			
		||||
#define NOTE_C1          32.70
 | 
			
		||||
#define NOTE_CS1         34.65
 | 
			
		||||
#define NOTE_D1          36.71
 | 
			
		||||
#define NOTE_DS1         38.89
 | 
			
		||||
#define NOTE_E1          41.20
 | 
			
		||||
#define NOTE_F1          43.65
 | 
			
		||||
#define NOTE_FS1         46.25
 | 
			
		||||
#define NOTE_G1          49.00
 | 
			
		||||
#define NOTE_GS1         51.91
 | 
			
		||||
#define NOTE_A1          55.00
 | 
			
		||||
#define NOTE_AS1         58.27
 | 
			
		||||
#define NOTE_B1          61.74
 | 
			
		||||
#define NOTE_C2          65.41
 | 
			
		||||
#define NOTE_CS2         69.30
 | 
			
		||||
#define NOTE_D2          73.42
 | 
			
		||||
#define NOTE_DS2         77.78
 | 
			
		||||
#define NOTE_E2          82.41
 | 
			
		||||
#define NOTE_F2          87.31
 | 
			
		||||
#define NOTE_FS2         92.50
 | 
			
		||||
#define NOTE_G2          98.00
 | 
			
		||||
#define NOTE_GS2        103.83
 | 
			
		||||
#define NOTE_A2         110.00
 | 
			
		||||
#define NOTE_AS2        116.54
 | 
			
		||||
#define NOTE_B2         123.47
 | 
			
		||||
#define NOTE_C3         130.81
 | 
			
		||||
#define NOTE_CS3        138.59
 | 
			
		||||
#define NOTE_D3         146.83
 | 
			
		||||
#define NOTE_DS3        155.56
 | 
			
		||||
#define NOTE_E3         164.81
 | 
			
		||||
#define NOTE_F3         174.61
 | 
			
		||||
#define NOTE_FS3        185.00
 | 
			
		||||
#define NOTE_G3         196.00
 | 
			
		||||
#define NOTE_GS3        207.65
 | 
			
		||||
#define NOTE_A3         220.00
 | 
			
		||||
#define NOTE_AS3        233.08
 | 
			
		||||
#define NOTE_B3         246.94
 | 
			
		||||
#define NOTE_C4         261.63
 | 
			
		||||
#define NOTE_CS4        277.18
 | 
			
		||||
#define NOTE_D4         293.66
 | 
			
		||||
#define NOTE_DS4        311.13
 | 
			
		||||
#define NOTE_E4         329.63
 | 
			
		||||
#define NOTE_F4         349.23
 | 
			
		||||
#define NOTE_FS4        369.99
 | 
			
		||||
#define NOTE_G4         392.00
 | 
			
		||||
#define NOTE_GS4        415.30
 | 
			
		||||
#define NOTE_A4         440.00
 | 
			
		||||
#define NOTE_AS4        466.16
 | 
			
		||||
#define NOTE_B4         493.88
 | 
			
		||||
#define NOTE_C5         523.25
 | 
			
		||||
#define NOTE_CS5        554.37
 | 
			
		||||
#define NOTE_D5         587.33
 | 
			
		||||
#define NOTE_DS5        622.25
 | 
			
		||||
#define NOTE_E5         659.26
 | 
			
		||||
#define NOTE_F5         698.46
 | 
			
		||||
#define NOTE_FS5        739.99
 | 
			
		||||
#define NOTE_G5         783.99
 | 
			
		||||
#define NOTE_GS5        830.61
 | 
			
		||||
#define NOTE_A5         880.00
 | 
			
		||||
#define NOTE_AS5        932.33
 | 
			
		||||
#define NOTE_B5         987.77
 | 
			
		||||
#define NOTE_C6        1046.50
 | 
			
		||||
#define NOTE_CS6       1108.73
 | 
			
		||||
#define NOTE_D6        1174.66
 | 
			
		||||
#define NOTE_DS6       1244.51
 | 
			
		||||
#define NOTE_E6        1318.51
 | 
			
		||||
#define NOTE_F6        1396.91
 | 
			
		||||
#define NOTE_FS6       1479.98
 | 
			
		||||
#define NOTE_G6        1567.98
 | 
			
		||||
#define NOTE_GS6       1661.22
 | 
			
		||||
#define NOTE_A6        1760.00
 | 
			
		||||
#define NOTE_AS6       1864.66
 | 
			
		||||
#define NOTE_B6        1975.53
 | 
			
		||||
#define NOTE_C7        2093.00
 | 
			
		||||
#define NOTE_CS7       2217.46
 | 
			
		||||
#define NOTE_D7        2349.32
 | 
			
		||||
#define NOTE_DS7       2489.02
 | 
			
		||||
#define NOTE_E7        2637.02
 | 
			
		||||
#define NOTE_F7        2793.83
 | 
			
		||||
#define NOTE_FS7       2959.96
 | 
			
		||||
#define NOTE_G7        3135.96
 | 
			
		||||
#define NOTE_GS7       3322.44
 | 
			
		||||
#define NOTE_A7        3520.00
 | 
			
		||||
#define NOTE_AS7       3729.31
 | 
			
		||||
#define NOTE_B7        3951.07
 | 
			
		||||
#define NOTE_C8        4186.01
 | 
			
		||||
#define NOTE_CS8       4434.92
 | 
			
		||||
#define NOTE_D8        4698.64
 | 
			
		||||
#define NOTE_DS8       4978.03
 | 
			
		||||
#define NOTE_E8        5274.04
 | 
			
		||||
#define NOTE_F8        5587.65
 | 
			
		||||
#define NOTE_FS8       5919.91
 | 
			
		||||
#define NOTE_G8        6271.93
 | 
			
		||||
#define NOTE_GS8       6644.88
 | 
			
		||||
#define NOTE_A8        7040.00
 | 
			
		||||
#define NOTE_AS8       7458.62
 | 
			
		||||
#define NOTE_B8        7902.13
 | 
			
		||||
 | 
			
		||||
// Flat Aliases
 | 
			
		||||
#define NOTE_DF0 NOTE_CS0
 | 
			
		||||
#define NOTE_EF0 NOTE_DS0
 | 
			
		||||
#define NOTE_GF0 NOTE_FS0
 | 
			
		||||
#define NOTE_AF0 NOTE_GS0
 | 
			
		||||
#define NOTE_BF0 NOTE_AS0
 | 
			
		||||
#define NOTE_DF1 NOTE_CS1
 | 
			
		||||
#define NOTE_EF1 NOTE_DS1
 | 
			
		||||
#define NOTE_GF1 NOTE_FS1
 | 
			
		||||
#define NOTE_AF1 NOTE_GS1
 | 
			
		||||
#define NOTE_BF1 NOTE_AS1
 | 
			
		||||
#define NOTE_DF2 NOTE_CS2
 | 
			
		||||
#define NOTE_EF2 NOTE_DS2
 | 
			
		||||
#define NOTE_GF2 NOTE_FS2
 | 
			
		||||
#define NOTE_AF2 NOTE_GS2
 | 
			
		||||
#define NOTE_BF2 NOTE_AS2
 | 
			
		||||
#define NOTE_DF3 NOTE_CS3
 | 
			
		||||
#define NOTE_EF3 NOTE_DS3
 | 
			
		||||
#define NOTE_GF3 NOTE_FS3
 | 
			
		||||
#define NOTE_AF3 NOTE_GS3
 | 
			
		||||
#define NOTE_BF3 NOTE_AS3
 | 
			
		||||
#define NOTE_DF4 NOTE_CS4
 | 
			
		||||
#define NOTE_EF4 NOTE_DS4
 | 
			
		||||
#define NOTE_GF4 NOTE_FS4
 | 
			
		||||
#define NOTE_AF4 NOTE_GS4
 | 
			
		||||
#define NOTE_BF4 NOTE_AS4
 | 
			
		||||
#define NOTE_DF5 NOTE_CS5
 | 
			
		||||
#define NOTE_EF5 NOTE_DS5
 | 
			
		||||
#define NOTE_GF5 NOTE_FS5
 | 
			
		||||
#define NOTE_AF5 NOTE_GS5
 | 
			
		||||
#define NOTE_BF5 NOTE_AS5
 | 
			
		||||
#define NOTE_DF6 NOTE_CS6
 | 
			
		||||
#define NOTE_EF6 NOTE_DS6
 | 
			
		||||
#define NOTE_GF6 NOTE_FS6
 | 
			
		||||
#define NOTE_AF6 NOTE_GS6
 | 
			
		||||
#define NOTE_BF6 NOTE_AS6
 | 
			
		||||
#define NOTE_DF7 NOTE_CS7
 | 
			
		||||
#define NOTE_EF7 NOTE_DS7
 | 
			
		||||
#define NOTE_GF7 NOTE_FS7
 | 
			
		||||
#define NOTE_AF7 NOTE_GS7
 | 
			
		||||
#define NOTE_BF7 NOTE_AS7
 | 
			
		||||
#define NOTE_DF8 NOTE_CS8
 | 
			
		||||
#define NOTE_EF8 NOTE_DS8
 | 
			
		||||
#define NOTE_GF8 NOTE_FS8
 | 
			
		||||
#define NOTE_AF8 NOTE_GS8
 | 
			
		||||
#define NOTE_BF8 NOTE_AS8
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +46,7 @@ endif
 | 
			
		|||
 | 
			
		||||
# Search Path
 | 
			
		||||
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
 | 
			
		||||
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras
 | 
			
		||||
 | 
			
		||||
include $(TMK_DIR)/protocol/lufa.mk
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								quantum/tools/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								quantum/tools/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this:
 | 
			
		||||
 | 
			
		||||
    dfu-programmer atmega32u4 erase
 | 
			
		||||
    dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin
 | 
			
		||||
 | 
			
		||||
 You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom.
 | 
			
		||||
							
								
								
									
										9
									
								
								quantum/tools/eeprom_reset.hex
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								quantum/tools/eeprom_reset.hex
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
 | 
			
		||||
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
 | 
			
		||||
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
 | 
			
		||||
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
 | 
			
		||||
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
 | 
			
		||||
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
 | 
			
		||||
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
 | 
			
		||||
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
 | 
			
		||||
:00000001FF
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue