forked from mfulz_github/qmk_firmware
		
	Cleans up quantum/keymap situation, removes extra lufa folders (#416)
* sorts out keycodes * move midi around * remove mbed * replaces keymap with qmk/keymap_common * fixes keymap.h * keymap, config, quantum rearrange * removes unneeded lufa stuff
This commit is contained in:
		
							parent
							
								
									1923cffd41
								
							
						
					
					
						commit
						db32864ce7
					
				
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							| @ -80,7 +80,8 @@ endif | ||||
| SRC += $(KEYBOARD_FILE) \
 | ||||
| 	$(KEYMAP_FILE) \
 | ||||
| 	$(QUANTUM_DIR)/quantum.c \
 | ||||
| 	$(QUANTUM_DIR)/keymap_common.c \
 | ||||
| 	$(QUANTUM_DIR)/keymap.c \
 | ||||
| 	$(QUANTUM_DIR)/keycode_config.c \
 | ||||
| 	$(QUANTUM_DIR)/led.c | ||||
| 
 | ||||
| ifndef CUSTOM_MATRIX | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define ARROW_PAD_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #ifdef BACKLIGHT_ENABLE | ||||
| 	#include "backlight.h" | ||||
| #endif | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define ATREUS_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "backlight.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define BANTAM44_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "backlight.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define CLUEBOARD1_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define CLUEBOARD2_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define CLUEPAD_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #include "ergodox_ez.h" | ||||
| #include "action_layer.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "keymap_extras/keymap_german.h" | ||||
| 
 | ||||
| #define UC_ASYMPTOTICALLY_EQUAL_TO 0 | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| #include "action_layer.h" | ||||
| #include "action_util.h" | ||||
| #include "led.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "timer.h" | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define GH60_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "backlight.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define HHKB_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| //#include "backlight.h"
 | ||||
| #include <stddef.h> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define JD45_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "backlight.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define KC60_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #ifdef BACKLIGHT_ENABLE | ||||
| #include "backlight.h" | ||||
| #endif | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define PHANTOM_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "planck.h" | ||||
| #include "backlight.h" | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|     [0] = { /* Native */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "keymap_colemak.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* BASE */ | ||||
|  | ||||
| @ -8,7 +8,7 @@ The "Gaming" layer is mainly customized for CS:GO. | ||||
| If you have any question about this keymap feel free to shoot me a message on reddit! | ||||
| */ | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "keymap_extras/keymap_german.h" | ||||
| #include "backlight.h" | ||||
| #include "debug.h" | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = { /* Qwerty */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP(  | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP(  | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( /* Jack */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( /* Joe qwerty */ | ||||
|  | ||||
| @ -20,7 +20,7 @@ | ||||
| `-----------------------------------------------------------------------------------------------' | ||||
| */ | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|   /* 0: dvorak */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| // Author: Nathan Ross Powell <nathanrospowell@gmail.com>
 | ||||
| // https://github.com/nathanrosspowell/tmk_keyboard/blob/planck-jack/keyboard/planck/keymap_nathan.c
 | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|    /* 0: main layer
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( /* Paul */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|     [0] = KEYMAP( /* Native */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * BUILD: | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|     [0] = KEYMAP( /* Matrix Dvorak */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "action_layer.h" | ||||
| #include "action.h" | ||||
| #include "action_util.h" | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( /* Jack */ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| [0] = KEYMAP( /* Wilba */ | ||||
|  | ||||
| @ -14,7 +14,7 @@ GNU General Public License for more details. | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| 
 | ||||
| /* translates key to keycode */ | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define RETRO_REFIT_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "led.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define SATAN_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| #include <avr/io.h> | ||||
| #include "print.h" | ||||
| #include "audio.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| #include "eeconfig.h" | ||||
| 
 | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| #include <avr/io.h> | ||||
| #include "print.h" | ||||
| #include "audio.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| #include "eeconfig.h" | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										74
									
								
								quantum/keycode_config.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								quantum/keycode_config.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,74 @@ | ||||
| #include "keycode_config.h" | ||||
| 
 | ||||
| extern keymap_config_t keymap_config; | ||||
| 
 | ||||
| uint16_t keycode_config(uint16_t keycode) { | ||||
| 
 | ||||
|     switch (keycode) { | ||||
|         case KC_CAPSLOCK: | ||||
|         case KC_LOCKING_CAPS: | ||||
|             if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { | ||||
|                 return KC_LCTL; | ||||
|             } | ||||
|             return keycode; | ||||
|         case KC_LCTL: | ||||
|             if (keymap_config.swap_control_capslock) { | ||||
|                 return KC_CAPSLOCK; | ||||
|             } | ||||
|             return KC_LCTL; | ||||
|         case KC_LALT: | ||||
|             if (keymap_config.swap_lalt_lgui) { | ||||
|                 if (keymap_config.no_gui) { | ||||
|                     return KC_NO; | ||||
|                 } | ||||
|                 return KC_LGUI; | ||||
|             } | ||||
|             return KC_LALT; | ||||
|         case KC_LGUI: | ||||
|             if (keymap_config.swap_lalt_lgui) { | ||||
|                 return KC_LALT; | ||||
|             } | ||||
|             if (keymap_config.no_gui) { | ||||
|                 return KC_NO; | ||||
|             } | ||||
|             return KC_LGUI; | ||||
|         case KC_RALT: | ||||
|             if (keymap_config.swap_ralt_rgui) { | ||||
|                 if (keymap_config.no_gui) { | ||||
|                     return KC_NO; | ||||
|                 } | ||||
|                 return KC_RGUI; | ||||
|             } | ||||
|             return KC_RALT; | ||||
|         case KC_RGUI: | ||||
|             if (keymap_config.swap_ralt_rgui) { | ||||
|                 return KC_RALT; | ||||
|             } | ||||
|             if (keymap_config.no_gui) { | ||||
|                 return KC_NO; | ||||
|             } | ||||
|             return KC_RGUI; | ||||
|         case KC_GRAVE: | ||||
|             if (keymap_config.swap_grave_esc) { | ||||
|                 return KC_ESC; | ||||
|             } | ||||
|             return KC_GRAVE; | ||||
|         case KC_ESC: | ||||
|             if (keymap_config.swap_grave_esc) { | ||||
|                 return KC_GRAVE; | ||||
|             } | ||||
|             return KC_ESC; | ||||
|         case KC_BSLASH: | ||||
|             if (keymap_config.swap_backslash_backspace) { | ||||
|                 return KC_BSPACE; | ||||
|             } | ||||
|             return KC_BSLASH; | ||||
|         case KC_BSPACE: | ||||
|             if (keymap_config.swap_backslash_backspace) { | ||||
|                 return KC_BSLASH; | ||||
|             } | ||||
|             return KC_BSPACE; | ||||
|         default: | ||||
|             return keycode; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										21
									
								
								quantum/keycode_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								quantum/keycode_config.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| #include "eeconfig.h" | ||||
| #include "keycode.h" | ||||
| 
 | ||||
| uint16_t keycode_config(uint16_t keycode); | ||||
| 
 | ||||
| /* NOTE: Not portable. Bit field order depends on implementation */ | ||||
| typedef union { | ||||
|     uint16_t raw; | ||||
|     struct { | ||||
|         bool swap_control_capslock:1; | ||||
|         bool capslock_to_control:1; | ||||
|         bool swap_lalt_lgui:1; | ||||
|         bool swap_ralt_rgui:1; | ||||
|         bool no_gui:1; | ||||
|         bool swap_grave_esc:1; | ||||
|         bool swap_backslash_backspace:1; | ||||
|         bool nkro:1; | ||||
|     }; | ||||
| } keymap_config_t; | ||||
| 
 | ||||
| keymap_config_t keymap_config; | ||||
							
								
								
									
										163
									
								
								quantum/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								quantum/keymap.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,163 @@ | ||||
| /*
 | ||||
| Copyright 2012,2013 Jun Wako <wakojun@gmail.com> | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| #include "keymap.h" | ||||
| #include "report.h" | ||||
| #include "keycode.h" | ||||
| #include "action_layer.h" | ||||
| #include <util/delay.h> | ||||
| #include "action.h" | ||||
| #include "action_macro.h" | ||||
| #include "debug.h" | ||||
| #include "backlight.h" | ||||
| #include "quantum.h" | ||||
| 
 | ||||
| #ifdef MIDI_ENABLE | ||||
| 	#include "keymap_midi.h" | ||||
| #endif | ||||
| 
 | ||||
| extern keymap_config_t keymap_config; | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <inttypes.h> | ||||
| 
 | ||||
| /* converts key to action */ | ||||
| action_t action_for_key(uint8_t layer, keypos_t key) | ||||
| { | ||||
|     // 16bit keycodes - important
 | ||||
|     uint16_t keycode = keymap_key_to_keycode(layer, key); | ||||
| 
 | ||||
|     // keycode remapping
 | ||||
|     keycode = keycode_config(keycode); | ||||
| 
 | ||||
|     action_t action; | ||||
|     uint8_t action_layer, when, mod; | ||||
| 
 | ||||
|     switch (keycode) { | ||||
|         case KC_FN0 ... KC_FN31: | ||||
|             action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); | ||||
|             break; | ||||
|         case KC_A ... KC_EXSEL: | ||||
|         case KC_LCTRL ... KC_RGUI: | ||||
|             action.code = ACTION_KEY(keycode); | ||||
|             break; | ||||
|         case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | ||||
|             action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); | ||||
|             break; | ||||
|         case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | ||||
|             action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); | ||||
|             break; | ||||
|         case KC_MS_UP ... KC_MS_ACCEL2: | ||||
|             action.code = ACTION_MOUSEKEY(keycode); | ||||
|             break; | ||||
|         case KC_TRNS: | ||||
|             action.code = ACTION_TRANSPARENT; | ||||
|             break; | ||||
|         case QK_MODS ... QK_MODS_MAX: ; | ||||
|             // Has a modifier
 | ||||
|             // Split it up
 | ||||
|             action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
 | ||||
|             break; | ||||
|         case QK_FUNCTION ... QK_FUNCTION_MAX: ; | ||||
|             // Is a shortcut for function action_layer, pull last 12bits
 | ||||
|             // This means we have 4,096 FN macros at our disposal
 | ||||
|             action.code = pgm_read_word(&fn_actions[(int)keycode & 0xFFF]); | ||||
|             break; | ||||
|         case QK_MACRO ... QK_MACRO_MAX: | ||||
|             action.code = ACTION_MACRO(keycode & 0xFF); | ||||
|             break; | ||||
|         case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: | ||||
|             action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||||
|             break; | ||||
|         case QK_TO ... QK_TO_MAX: ; | ||||
|             // Layer set "GOTO"
 | ||||
|             when = (keycode >> 0x4) & 0x3; | ||||
|             action_layer = keycode & 0xF; | ||||
|             action.code = ACTION_LAYER_SET(action_layer, when); | ||||
|             break; | ||||
|         case QK_MOMENTARY ... QK_MOMENTARY_MAX: ; | ||||
|             // Momentary action_layer
 | ||||
|             action_layer = keycode & 0xFF; | ||||
|             action.code = ACTION_LAYER_MOMENTARY(action_layer); | ||||
|             break; | ||||
|         case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: ; | ||||
|             // Set default action_layer
 | ||||
|             action_layer = keycode & 0xFF; | ||||
|             action.code = ACTION_DEFAULT_LAYER_SET(action_layer); | ||||
|             break; | ||||
|         case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: ; | ||||
|             // Set toggle
 | ||||
|             action_layer = keycode & 0xFF; | ||||
|             action.code = ACTION_LAYER_TOGGLE(action_layer); | ||||
|             break; | ||||
|         case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: ; | ||||
|             // OSL(action_layer) - One-shot action_layer
 | ||||
|             action_layer = keycode & 0xFF; | ||||
|             action.code = ACTION_LAYER_ONESHOT(action_layer); | ||||
|             break; | ||||
|         case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: ; | ||||
|             // OSM(mod) - One-shot mod
 | ||||
|             mod = keycode & 0xFF; | ||||
|             action.code = ACTION_MODS_ONESHOT(mod); | ||||
|             break; | ||||
|         case QK_MOD_TAP ... QK_MOD_TAP_MAX: | ||||
|             action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||||
|             break; | ||||
|     #ifdef BACKLIGHT_ENABLE | ||||
|         case BL_0 ... BL_15: | ||||
|             action.code = ACTION_BACKLIGHT_LEVEL(keycode - BL_0); | ||||
|             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 | ||||
|         default: | ||||
|             action.code = ACTION_NO; | ||||
|             break; | ||||
|     } | ||||
|     return action; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Macro */ | ||||
| __attribute__ ((weak)) | ||||
| const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
|     return MACRO_NONE; | ||||
| } | ||||
| 
 | ||||
| /* Function */ | ||||
| __attribute__ ((weak)) | ||||
| void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /* translates key to keycode */ | ||||
| uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) | ||||
| { | ||||
|     // Read entire word (16bits)
 | ||||
|     return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); | ||||
| } | ||||
							
								
								
									
										315
									
								
								quantum/keymap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										315
									
								
								quantum/keymap.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,315 @@ | ||||
| /*
 | ||||
| Copyright 2012,2013 Jun Wako <wakojun@gmail.com> | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| #ifndef KEYMAP_H | ||||
| #define KEYMAP_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include "action.h" | ||||
| #include <avr/pgmspace.h> | ||||
| #include "keycode.h" | ||||
| #include "action_macro.h" | ||||
| #include "report.h" | ||||
| #include "host.h" | ||||
| // #include "print.h"
 | ||||
| #include "debug.h" | ||||
| #include "keycode_config.h" | ||||
| 
 | ||||
| /* translates key to keycode */ | ||||
| uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); | ||||
| 
 | ||||
| /* translates Fn keycode to action */ | ||||
| action_t keymap_fn_to_action(uint16_t keycode); | ||||
| 
 | ||||
| extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; | ||||
| extern const uint16_t fn_actions[]; | ||||
| 
 | ||||
| enum quantum_keycodes { | ||||
|     // Ranges used in shortucuts - not to be used directly
 | ||||
|     QK_TMK                = 0x0000, | ||||
|     QK_TMK_MAX            = 0x00FF, | ||||
|     QK_MODS               = 0x0100, | ||||
|     QK_LCTL               = 0x0100, | ||||
|     QK_LSFT               = 0x0200, | ||||
|     QK_LALT               = 0x0400, | ||||
|     QK_LGUI               = 0x0800, | ||||
|     QK_RCTL               = 0x1100, | ||||
|     QK_RSFT               = 0x1200, | ||||
|     QK_RALT               = 0x1400, | ||||
|     QK_RGUI               = 0x1800, | ||||
|     QK_MODS_MAX           = 0x1FFF, | ||||
|     QK_FUNCTION           = 0x2000, | ||||
|     QK_FUNCTION_MAX       = 0x2FFF, | ||||
|     QK_MACRO              = 0x3000, | ||||
|     QK_MACRO_MAX          = 0x3FFF, | ||||
|     QK_LAYER_TAP          = 0x4000, | ||||
|     QK_LAYER_TAP_MAX      = 0x4FFF, | ||||
|     QK_TO                 = 0x5000, | ||||
|     QK_TO_MAX             = 0x50FF, | ||||
|     QK_MOMENTARY          = 0x5100, | ||||
|     QK_MOMENTARY_MAX      = 0x51FF, | ||||
|     QK_DEF_LAYER          = 0x5200, | ||||
|     QK_DEF_LAYER_MAX      = 0x52FF, | ||||
|     QK_TOGGLE_LAYER       = 0x5300, | ||||
|     QK_TOGGLE_LAYER_MAX   = 0x53FF, | ||||
|     QK_ONE_SHOT_LAYER     = 0x5400, | ||||
|     QK_ONE_SHOT_LAYER_MAX = 0x54FF, | ||||
|     QK_ONE_SHOT_MOD       = 0x5500, | ||||
|     QK_ONE_SHOT_MOD_MAX   = 0x55FF, | ||||
| #ifndef DISABLE_CHORDING | ||||
|     QK_CHORDING           = 0x5600, | ||||
|     QK_CHORDING_MAX       = 0x56FF, | ||||
| #endif | ||||
|     QK_MOD_TAP            = 0x6000, | ||||
|     QK_MOD_TAP_MAX        = 0x6FFF, | ||||
| #ifdef UNICODE_ENABLE | ||||
|     QK_UNICODE            = 0x8000, | ||||
|     QK_UNICODE_MAX        = 0xFFFF, | ||||
| #endif | ||||
| 
 | ||||
|     // Loose keycodes - to be used directly
 | ||||
| 
 | ||||
|     RESET = 0x7000, | ||||
|     DEBUG, | ||||
|     MAGIC_SWAP_CONTROL_CAPSLOCK, | ||||
|     MAGIC_CAPSLOCK_TO_CONTROL, | ||||
|     MAGIC_SWAP_LALT_LGUI, | ||||
|     MAGIC_SWAP_RALT_RGUI, | ||||
|     MAGIC_NO_GUI, | ||||
|     MAGIC_SWAP_GRAVE_ESC, | ||||
|     MAGIC_SWAP_BACKSLASH_BACKSPACE, | ||||
|     MAGIC_HOST_NKRO, | ||||
|     MAGIC_SWAP_ALT_GUI, | ||||
|     MAGIC_UNSWAP_CONTROL_CAPSLOCK, | ||||
|     MAGIC_UNCAPSLOCK_TO_CONTROL, | ||||
|     MAGIC_UNSWAP_LALT_LGUI, | ||||
|     MAGIC_UNSWAP_RALT_RGUI, | ||||
|     MAGIC_UNNO_GUI, | ||||
|     MAGIC_UNSWAP_GRAVE_ESC, | ||||
|     MAGIC_UNSWAP_BACKSLASH_BACKSPACE, | ||||
|     MAGIC_UNHOST_NKRO, | ||||
|     MAGIC_UNSWAP_ALT_GUI, | ||||
| 
 | ||||
|     // Leader key
 | ||||
| #ifndef DISABLE_LEADER | ||||
|     KC_LEAD, | ||||
| #endif | ||||
| 
 | ||||
|     // Audio on/off/toggle
 | ||||
|     AU_ON, | ||||
|     AU_OFF, | ||||
|     AU_TOG, | ||||
| 
 | ||||
|     // Music mode on/off/toggle
 | ||||
|     MU_ON, | ||||
|     MU_OFF, | ||||
|     MU_TOG, | ||||
| 
 | ||||
|     // Music voice iterate
 | ||||
|     MUV_IN, | ||||
|     MUV_DE, | ||||
| 
 | ||||
|     // Midi mode on/off
 | ||||
|     MI_ON, | ||||
|     MI_OFF, | ||||
| 
 | ||||
|     // Backlight functionality
 | ||||
|     BL_0, | ||||
|     BL_1, | ||||
|     BL_2, | ||||
|     BL_3, | ||||
|     BL_4, | ||||
|     BL_5, | ||||
|     BL_6, | ||||
|     BL_7, | ||||
|     BL_8, | ||||
|     BL_9, | ||||
|     BL_10, | ||||
|     BL_11, | ||||
|     BL_12, | ||||
|     BL_13, | ||||
|     BL_14, | ||||
|     BL_15, | ||||
|     BL_DEC, | ||||
|     BL_INC, | ||||
|     BL_TOGG, | ||||
|     BL_STEP, | ||||
| 
 | ||||
|     // Left shift, open paren
 | ||||
|     KC_LSPO, | ||||
| 
 | ||||
|     // Right shift, close paren
 | ||||
|     KC_RSPC, | ||||
| }; | ||||
| 
 | ||||
| // Ability to use mods in layouts
 | ||||
| #define LCTL(kc) (kc | QK_LCTL) | ||||
| #define LSFT(kc) (kc | QK_LSFT) | ||||
| #define LALT(kc) (kc | QK_LALT) | ||||
| #define LGUI(kc) (kc | QK_LGUI) | ||||
| #define RCTL(kc) (kc | QK_RCTL) | ||||
| #define RSFT(kc) (kc | QK_RSFT) | ||||
| #define RALT(kc) (kc | QK_RALT) | ||||
| #define RGUI(kc) (kc | QK_RGUI) | ||||
| 
 | ||||
| #define HYPR(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI) | ||||
| #define MEH(kc)  (kc | QK_LCTL | QK_LSFT | QK_LALT) | ||||
| #define LCAG(kc) (kc | QK_LCTL | QK_LALT | QK_LGUI) | ||||
| 
 | ||||
| #define MOD_HYPR 0xf | ||||
| #define MOD_MEH 0x7 | ||||
| 
 | ||||
| 
 | ||||
| // Aliases for shifted symbols
 | ||||
| // Each key has a 4-letter code, and some have longer aliases too.
 | ||||
| // While the long aliases are descriptive, the 4-letter codes
 | ||||
| // make for nicer grid layouts (everything lines up), and are
 | ||||
| // the preferred style for Quantum.
 | ||||
| #define KC_TILD LSFT(KC_GRV)    // ~
 | ||||
| #define KC_TILDE    KC_TILD | ||||
| 
 | ||||
| #define KC_EXLM LSFT(KC_1)      // !
 | ||||
| #define KC_EXCLAIM  KC_EXLM | ||||
| 
 | ||||
| #define KC_AT   LSFT(KC_2)      // @
 | ||||
| 
 | ||||
| #define KC_HASH LSFT(KC_3)      // #
 | ||||
| 
 | ||||
| #define KC_DLR  LSFT(KC_4)      // $
 | ||||
| #define KC_DOLLAR   KC_DLR | ||||
| 
 | ||||
| #define KC_PERC LSFT(KC_5)      // %
 | ||||
| #define KC_PERCENT  KC_PERC | ||||
| 
 | ||||
| #define KC_CIRC LSFT(KC_6)      // ^
 | ||||
| #define KC_CIRCUMFLEX   KC_CIRC | ||||
| 
 | ||||
| #define KC_AMPR LSFT(KC_7)      // &
 | ||||
| #define KC_AMPERSAND    KC_AMPR | ||||
| 
 | ||||
| #define KC_ASTR LSFT(KC_8)      // *
 | ||||
| #define KC_ASTERISK KC_ASTR | ||||
| 
 | ||||
| #define KC_LPRN LSFT(KC_9)      // (
 | ||||
| #define KC_LEFT_PAREN   KC_LPRN | ||||
| 
 | ||||
| #define KC_RPRN LSFT(KC_0)      // )
 | ||||
| #define KC_RIGHT_PAREN  KC_RPRN | ||||
| 
 | ||||
| #define KC_UNDS LSFT(KC_MINS)   // _
 | ||||
| #define KC_UNDERSCORE   KC_UNDS | ||||
| 
 | ||||
| #define KC_PLUS LSFT(KC_EQL)    // +
 | ||||
| 
 | ||||
| #define KC_LCBR LSFT(KC_LBRC)   // {
 | ||||
| #define KC_LEFT_CURLY_BRACE KC_LCBR | ||||
| 
 | ||||
| #define KC_RCBR LSFT(KC_RBRC)   // }
 | ||||
| #define KC_RIGHT_CURLY_BRACE    KC_RCBR | ||||
| 
 | ||||
| #define KC_LABK LSFT(KC_COMM)   // <
 | ||||
| #define KC_LEFT_ANGLE_BRACKET   KC_LABK | ||||
| 
 | ||||
| #define KC_RABK LSFT(KC_DOT)    // >
 | ||||
| #define KC_RIGHT_ANGLE_BRACKET  KC_RABK | ||||
| 
 | ||||
| #define KC_COLN LSFT(KC_SCLN)   // :
 | ||||
| #define KC_COLON    KC_COLN | ||||
| 
 | ||||
| #define KC_PIPE LSFT(KC_BSLS)   // |
 | ||||
| 
 | ||||
| #define KC_LT LSFT(KC_COMM)     // <
 | ||||
| 
 | ||||
| #define KC_GT LSFT(KC_DOT)      // >
 | ||||
| 
 | ||||
| #define KC_QUES LSFT(KC_SLSH)   // ?
 | ||||
| #define KC_QUESTION KC_QUES | ||||
| 
 | ||||
| #define KC_DQT LSFT(KC_QUOT)   // "
 | ||||
| #define KC_DOUBLE_QUOTE KC_DQT | ||||
| #define KC_DQUO KC_DQT | ||||
| 
 | ||||
| #define KC_DELT KC_DELETE // Del key (four letter code)
 | ||||
| 
 | ||||
| // Alias for function layers than expand past FN31
 | ||||
| #define FUNC(kc) (kc | QK_FUNCTION) | ||||
| 
 | ||||
| // Aliases
 | ||||
| #define S(kc) LSFT(kc) | ||||
| #define F(kc) FUNC(kc) | ||||
| 
 | ||||
| #define M(kc) (kc | QK_MACRO) | ||||
| 
 | ||||
| #define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) | ||||
| 
 | ||||
| // L-ayer, T-ap - 256 keycode max, 16 layer max
 | ||||
| #define LT(layer, kc) (kc | QK_LAYER_TAP | ((layer & 0xF) << 8)) | ||||
| 
 | ||||
| #define AG_SWAP MAGIC_SWAP_ALT_GUI | ||||
| #define AG_NORM MAGIC_UNSWAP_ALT_GUI | ||||
| 
 | ||||
| #define BL_ON  BL_9 | ||||
| #define BL_OFF BL_0 | ||||
| 
 | ||||
| // GOTO layer - 16 layers max
 | ||||
| // when:
 | ||||
| // ON_PRESS    = 1
 | ||||
| // ON_RELEASE  = 2
 | ||||
| // Unless you have a good reason not to do so, prefer  ON_PRESS (1) as your default.
 | ||||
| #define TO(layer, when) (layer | QK_TO | (when << 0x4)) | ||||
| 
 | ||||
| // Momentary switch layer - 256 layer max
 | ||||
| #define MO(layer) (layer | QK_MOMENTARY) | ||||
| 
 | ||||
| // Set default layer - 256 layer max
 | ||||
| #define DF(layer) (layer | QK_DEF_LAYER) | ||||
| 
 | ||||
| // Toggle to layer - 256 layer max
 | ||||
| #define TG(layer) (layer | QK_TOGGLE_LAYER) | ||||
| 
 | ||||
| // One-shot layer - 256 layer max
 | ||||
| #define OSL(layer) (layer | QK_ONE_SHOT_LAYER) | ||||
| 
 | ||||
| // One-shot mod
 | ||||
| #define OSM(layer) (layer | QK_ONE_SHOT_MOD) | ||||
| 
 | ||||
| // M-od, T-ap - 256 keycode max
 | ||||
| #define MT(mod, kc) (kc | QK_MOD_TAP | ((mod & 0xF) << 8)) | ||||
| #define CTL_T(kc) MT(MOD_LCTL, kc) | ||||
| #define SFT_T(kc) MT(MOD_LSFT, kc) | ||||
| #define ALT_T(kc) MT(MOD_LALT, kc) | ||||
| #define GUI_T(kc) MT(MOD_LGUI, kc) | ||||
| #define C_S_T(kc) MT(MOD_LCTL | MOD_LSFT, kc) // Control + Shift e.g. for gnome-terminal
 | ||||
| #define MEH_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl
 | ||||
| #define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc) // Left control alt and gui
 | ||||
| #define ALL_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/
 | ||||
| 
 | ||||
| // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap
 | ||||
| #define KC_HYPR HYPR(KC_NO) | ||||
| #define KC_MEH  MEH(KC_NO) | ||||
| 
 | ||||
| #ifdef UNICODE_ENABLE | ||||
|     // For sending unicode codes.
 | ||||
|     // You may not send codes over 7FFF -- this supports most of UTF8.
 | ||||
|     // To have a key that sends out Œ, go UC(0x0152)
 | ||||
|     #define UNICODE(n) (n | QK_UNICODE) | ||||
|     #define UC(n) UNICODE(n) | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
| @ -1,323 +0,0 @@ | ||||
| /*
 | ||||
| Copyright 2012,2013 Jun Wako <wakojun@gmail.com> | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "report.h" | ||||
| #include "keycode.h" | ||||
| #include "action_layer.h" | ||||
| #include <util/delay.h> | ||||
| #include "action.h" | ||||
| #include "action_macro.h" | ||||
| #include "debug.h" | ||||
| #include "backlight.h" | ||||
| #include "bootloader.h" | ||||
| #include "eeconfig.h" | ||||
| #include "quantum.h" | ||||
| 
 | ||||
| #ifdef MIDI_ENABLE | ||||
| 	#include "keymap_midi.h" | ||||
| #endif | ||||
| 
 | ||||
| extern keymap_config_t keymap_config; | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <inttypes.h> | ||||
| #ifdef AUDIO_ENABLE | ||||
|     #include "audio.h" | ||||
| #endif /* AUDIO_ENABLE */ | ||||
| 
 | ||||
| static action_t keycode_to_action(uint16_t keycode); | ||||
| 
 | ||||
| /* converts key to action */ | ||||
| action_t action_for_key(uint8_t layer, keypos_t key) | ||||
| { | ||||
|     // 16bit keycodes - important
 | ||||
|     uint16_t keycode = keymap_key_to_keycode(layer, key); | ||||
| 
 | ||||
|     switch (keycode) { | ||||
|         case KC_FN0 ... KC_FN31: | ||||
|             return keymap_fn_to_action(keycode); | ||||
|         case KC_CAPSLOCK: | ||||
|         case KC_LOCKING_CAPS: | ||||
|             if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { | ||||
|                 return keycode_to_action(KC_LCTL); | ||||
|             } | ||||
|             return keycode_to_action(keycode); | ||||
|         case KC_LCTL: | ||||
|             if (keymap_config.swap_control_capslock) { | ||||
|                 return keycode_to_action(KC_CAPSLOCK); | ||||
|             } | ||||
|             return keycode_to_action(KC_LCTL); | ||||
|         case KC_LALT: | ||||
|             if (keymap_config.swap_lalt_lgui) { | ||||
|                 if (keymap_config.no_gui) { | ||||
|                     return keycode_to_action(ACTION_NO); | ||||
|                 } | ||||
|                 return keycode_to_action(KC_LGUI); | ||||
|             } | ||||
|             return keycode_to_action(KC_LALT); | ||||
|         case KC_LGUI: | ||||
|             if (keymap_config.swap_lalt_lgui) { | ||||
|                 return keycode_to_action(KC_LALT); | ||||
|             } | ||||
|             if (keymap_config.no_gui) { | ||||
|                 return keycode_to_action(ACTION_NO); | ||||
|             } | ||||
|             return keycode_to_action(KC_LGUI); | ||||
|         case KC_RALT: | ||||
|             if (keymap_config.swap_ralt_rgui) { | ||||
|                 if (keymap_config.no_gui) { | ||||
|                     return keycode_to_action(ACTION_NO); | ||||
|                 } | ||||
|                 return keycode_to_action(KC_RGUI); | ||||
|             } | ||||
|             return keycode_to_action(KC_RALT); | ||||
|         case KC_RGUI: | ||||
|             if (keymap_config.swap_ralt_rgui) { | ||||
|                 return keycode_to_action(KC_RALT); | ||||
|             } | ||||
|             if (keymap_config.no_gui) { | ||||
|                 return keycode_to_action(ACTION_NO); | ||||
|             } | ||||
|             return keycode_to_action(KC_RGUI); | ||||
|         case KC_GRAVE: | ||||
|             if (keymap_config.swap_grave_esc) { | ||||
|                 return keycode_to_action(KC_ESC); | ||||
|             } | ||||
|             return keycode_to_action(KC_GRAVE); | ||||
|         case KC_ESC: | ||||
|             if (keymap_config.swap_grave_esc) { | ||||
|                 return keycode_to_action(KC_GRAVE); | ||||
|             } | ||||
|             return keycode_to_action(KC_ESC); | ||||
|         case KC_BSLASH: | ||||
|             if (keymap_config.swap_backslash_backspace) { | ||||
|                 return keycode_to_action(KC_BSPACE); | ||||
|             } | ||||
|             return keycode_to_action(KC_BSLASH); | ||||
|         case KC_BSPACE: | ||||
|             if (keymap_config.swap_backslash_backspace) { | ||||
|                 return keycode_to_action(KC_BSLASH); | ||||
|             } | ||||
|             return keycode_to_action(KC_BSPACE); | ||||
|         default: | ||||
|             return keycode_to_action(keycode); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Macro */ | ||||
| __attribute__ ((weak)) | ||||
| const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
|     return MACRO_NONE; | ||||
| } | ||||
| 
 | ||||
| /* Function */ | ||||
| __attribute__ ((weak)) | ||||
| void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /* translates keycode to action */ | ||||
| static action_t keycode_to_action(uint16_t keycode) | ||||
| { | ||||
|     action_t action; | ||||
|     switch (keycode) { | ||||
|         case KC_A ... KC_EXSEL: | ||||
|         case KC_LCTRL ... KC_RGUI: | ||||
|             action.code = ACTION_KEY(keycode); | ||||
|             break; | ||||
|         case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | ||||
|             action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); | ||||
|             break; | ||||
|         case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | ||||
|             action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); | ||||
|             break; | ||||
|         case KC_MS_UP ... KC_MS_ACCEL2: | ||||
|             action.code = ACTION_MOUSEKEY(keycode); | ||||
|             break; | ||||
|         case KC_TRNS: | ||||
|             action.code = ACTION_TRANSPARENT; | ||||
|             break; | ||||
|         case LCTL(0) ... 0x1FFF: ; | ||||
|             // Has a modifier
 | ||||
|             // Split it up
 | ||||
|             action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
 | ||||
|             break; | ||||
|         case FUNC(0) ... FUNC(0xFFF): ; | ||||
|             // 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 M(0) ... M(0xFF): | ||||
|             action.code = ACTION_MACRO(keycode & 0xFF); | ||||
|             break; | ||||
|         case LT(0, 0) ... LT(0xFF, 0xF): | ||||
|             action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, 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 | ||||
|                 stop_all_notes(); | ||||
|                 shutdown_user(); | ||||
|             #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 MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI: | ||||
|             // 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_update_keymap(keymap_config.raw); | ||||
|             break; | ||||
|         case TO(0, 1) ... OSM(0xFF): ; | ||||
|             // 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); | ||||
|             } else if (type == 0x5) { | ||||
|                 // OSL(layer) - One-shot layer
 | ||||
|                 int layer = keycode & 0xFF; | ||||
|                 action.code = ACTION_LAYER_ONESHOT(layer); | ||||
|             } else if (type == 0x6) { | ||||
|                 // OSM(mod) - One-shot mod
 | ||||
|                 int mod = keycode & 0xFF; | ||||
|                 action.code = ACTION_MODS_ONESHOT(mod); | ||||
|             } | ||||
|             break; | ||||
|         case MT(0, 0) ... MT(0xF, 0xFF): | ||||
|             action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||||
|             break; | ||||
|         default: | ||||
|             action.code = ACTION_NO; | ||||
|             break; | ||||
|     } | ||||
|     return action; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* translates key to keycode */ | ||||
| uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) | ||||
| { | ||||
|     // Read entire word (16bits)
 | ||||
|     return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); | ||||
| } | ||||
| 
 | ||||
| /* translates Fn keycode to action */ | ||||
| action_t keymap_fn_to_action(uint16_t keycode) | ||||
| { | ||||
|     return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; | ||||
| } | ||||
| 
 | ||||
| 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); | ||||
|   } | ||||
| } | ||||
| @ -1,292 +0,0 @@ | ||||
| /*
 | ||||
| Copyright 2012,2013 Jun Wako <wakojun@gmail.com> | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| #ifndef KEYMAP_H | ||||
| #define KEYMAP_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include "action.h" | ||||
| #include <avr/pgmspace.h> | ||||
| #include "keycode.h" | ||||
| #include "keymap.h" | ||||
| #include "action_macro.h" | ||||
| #include "report.h" | ||||
| #include "host.h" | ||||
| // #include "print.h"
 | ||||
| #include "debug.h" | ||||
| 
 | ||||
| /* NOTE: Not portable. Bit field order depends on implementation */ | ||||
| typedef union { | ||||
|     uint16_t raw; | ||||
|     struct { | ||||
|         bool swap_control_capslock:1; | ||||
|         bool capslock_to_control:1; | ||||
|         bool swap_lalt_lgui:1; | ||||
|         bool swap_ralt_rgui:1; | ||||
|         bool no_gui:1; | ||||
|         bool swap_grave_esc:1; | ||||
|         bool swap_backslash_backspace:1; | ||||
|         bool nkro:1; | ||||
|     }; | ||||
| } keymap_config_t; | ||||
| 
 | ||||
| 
 | ||||
| /* translates key to keycode */ | ||||
| uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); | ||||
| 
 | ||||
| /* translates Fn keycode to action */ | ||||
| action_t keymap_fn_to_action(uint16_t keycode); | ||||
| 
 | ||||
| /* translates Fn keycode to action */ | ||||
| action_t keymap_func_to_action(uint16_t keycode); | ||||
| 
 | ||||
| extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; | ||||
| extern const uint16_t fn_actions[]; | ||||
| 
 | ||||
| // Ability to use mods in layouts
 | ||||
| #define LCTL(kc) kc | 0x0100 | ||||
| #define LSFT(kc) kc | 0x0200 | ||||
| #define LALT(kc) kc | 0x0400 | ||||
| #define LGUI(kc) kc | 0x0800 | ||||
| #define HYPR(kc) kc | 0x0F00 | ||||
| #define MEH(kc) kc  | 0x0700 | ||||
| #define LCAG(kc) kc  | 0x0D00 // Modifier Ctrl Alt and GUI
 | ||||
| 
 | ||||
| #define MOD_HYPR 0xf | ||||
| #define MOD_MEH 0x7 | ||||
| 
 | ||||
| #define RCTL(kc) kc | 0x1100 | ||||
| #define RSFT(kc) kc | 0x1200 | ||||
| #define RALT(kc) kc | 0x1400 | ||||
| #define RGUI(kc) kc | 0x1800 | ||||
| 
 | ||||
| // Aliases for shifted symbols
 | ||||
| // Each key has a 4-letter code, and some have longer aliases too.
 | ||||
| // While the long aliases are descriptive, the 4-letter codes
 | ||||
| // make for nicer grid layouts (everything lines up), and are
 | ||||
| // the preferred style for Quantum.
 | ||||
| #define KC_TILD LSFT(KC_GRV)    // ~
 | ||||
| #define KC_TILDE    KC_TILD | ||||
| 
 | ||||
| #define KC_EXLM LSFT(KC_1)      // !
 | ||||
| #define KC_EXCLAIM  KC_EXLM | ||||
| 
 | ||||
| #define KC_AT   LSFT(KC_2)      // @
 | ||||
| 
 | ||||
| #define KC_HASH LSFT(KC_3)      // #
 | ||||
| 
 | ||||
| #define KC_DLR  LSFT(KC_4)      // $
 | ||||
| #define KC_DOLLAR   KC_DLR | ||||
| 
 | ||||
| #define KC_PERC LSFT(KC_5)      // %
 | ||||
| #define KC_PERCENT  KC_PERC | ||||
| 
 | ||||
| #define KC_CIRC LSFT(KC_6)      // ^
 | ||||
| #define KC_CIRCUMFLEX   KC_CIRC | ||||
| 
 | ||||
| #define KC_AMPR LSFT(KC_7)      // &
 | ||||
| #define KC_AMPERSAND    KC_AMPR | ||||
| 
 | ||||
| #define KC_ASTR LSFT(KC_8)      // *
 | ||||
| #define KC_ASTERISK KC_ASTR | ||||
| 
 | ||||
| #define KC_LPRN LSFT(KC_9)      // (
 | ||||
| #define KC_LEFT_PAREN   KC_LPRN | ||||
| 
 | ||||
| #define KC_RPRN LSFT(KC_0)      // )
 | ||||
| #define KC_RIGHT_PAREN  KC_RPRN | ||||
| 
 | ||||
| #define KC_UNDS LSFT(KC_MINS)   // _
 | ||||
| #define KC_UNDERSCORE   KC_UNDS | ||||
| 
 | ||||
| #define KC_PLUS LSFT(KC_EQL)    // +
 | ||||
| 
 | ||||
| #define KC_LCBR LSFT(KC_LBRC)   // {
 | ||||
| #define KC_LEFT_CURLY_BRACE KC_LCBR | ||||
| 
 | ||||
| #define KC_RCBR LSFT(KC_RBRC)   // }
 | ||||
| #define KC_RIGHT_CURLY_BRACE    KC_RCBR | ||||
| 
 | ||||
| #define KC_LABK LSFT(KC_COMM)   // <
 | ||||
| #define KC_LEFT_ANGLE_BRACKET   KC_LABK | ||||
| 
 | ||||
| #define KC_RABK LSFT(KC_DOT)    // >
 | ||||
| #define KC_RIGHT_ANGLE_BRACKET  KC_RABK | ||||
| 
 | ||||
| #define KC_COLN LSFT(KC_SCLN)   // :
 | ||||
| #define KC_COLON    KC_COLN | ||||
| 
 | ||||
| #define KC_PIPE LSFT(KC_BSLS)   // |
 | ||||
| 
 | ||||
| #define KC_LT LSFT(KC_COMM)     // <
 | ||||
| 
 | ||||
| #define KC_GT LSFT(KC_DOT)      // >
 | ||||
| 
 | ||||
| #define KC_QUES LSFT(KC_SLSH)   // ?
 | ||||
| #define KC_QUESTION KC_QUES | ||||
| 
 | ||||
| #define KC_DQT LSFT(KC_QUOT)   // "
 | ||||
| #define KC_DOUBLE_QUOTE KC_DQT | ||||
| #define KC_DQUO KC_DQT | ||||
| 
 | ||||
| #define KC_DELT KC_DELETE // Del key (four letter code)
 | ||||
| 
 | ||||
| // Alias for function layers than expand past FN31
 | ||||
| #define FUNC(kc) kc | 0x2000 | ||||
| 
 | ||||
| // Aliases
 | ||||
| #define S(kc) LSFT(kc) | ||||
| #define F(kc) FUNC(kc) | ||||
| 
 | ||||
| #define M(kc) (kc | 0x3000) | ||||
| 
 | ||||
| #define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) | ||||
| 
 | ||||
| // 0x3100+ is free
 | ||||
| 
 | ||||
| // L-ayer, T-ap - 256 keycode max, 16 layer max
 | ||||
| #define LT(layer, kc) (kc | 0x4000 | ((layer & 0xF) << 8)) | ||||
| 
 | ||||
| #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 | ||||
| 
 | ||||
| #define KC_LEAD 0x5014 | ||||
| 
 | ||||
| // Audio on/off
 | ||||
| #define AU_ON  0x5020 | ||||
| #define AU_OFF 0x5021 | ||||
| #define AU_TOG 0x5022 | ||||
| 
 | ||||
| // Music mode on/off
 | ||||
| #define MU_ON  0x5023 | ||||
| #define MU_OFF 0x5024 | ||||
| #define MU_TOG 0x5025 | ||||
| 
 | ||||
| // Music voice iterate
 | ||||
| #define MUV_IN 0x5026 | ||||
| #define MUV_DE 0x5027 | ||||
| 
 | ||||
| // Midi mode on/off
 | ||||
| #define MI_ON  0x5028 | ||||
| #define MI_OFF 0x5029 | ||||
| 
 | ||||
| // These affect the backlight (if your keyboard has one).
 | ||||
| // We don't need to comment them out if your keyboard doesn't have a backlight,
 | ||||
| // since they don't take up any space.
 | ||||
| #define BL_ON 0x5079 | ||||
| #define BL_OFF 0x5070 | ||||
| #define BL_0 0x5070 | ||||
| #define BL_1 0x5071 | ||||
| #define BL_2 0x5072 | ||||
| #define BL_3 0x5073 | ||||
| #define BL_4 0x5074 | ||||
| #define BL_5 0x5075 | ||||
| #define BL_6 0x5076 | ||||
| #define BL_7 0x5077 | ||||
| #define BL_8 0x5078 | ||||
| #define BL_9 0x5079 | ||||
| #define BL_10 0x507A | ||||
| #define BL_11 0x507B | ||||
| #define BL_12 0x507C | ||||
| #define BL_13 0x507D | ||||
| #define BL_14 0x507E | ||||
| #define BL_15 0x507F | ||||
| #define BL_DEC 0x5080 | ||||
| #define BL_INC 0x5081 | ||||
| #define BL_TOGG 0x5082 | ||||
| #define BL_STEP 0x5083 | ||||
| 
 | ||||
| #define KC_LSPO 0x5084 // Left shift, open parens when tapped
 | ||||
| #define KC_RSPC 0x5085 // Right shift, close parens when tapped
 | ||||
| // GOTO layer - 16 layers max
 | ||||
| // when:
 | ||||
| // ON_PRESS    = 1
 | ||||
| // ON_RELEASE  = 2
 | ||||
| // Unless you have a good reason not to do so, prefer  ON_PRESS (1) as your default.
 | ||||
| #define TO(layer, when) (layer | 0x5100 | (when << 0x4)) | ||||
| 
 | ||||
| // Momentary switch layer - 256 layer max
 | ||||
| #define MO(layer) (layer | 0x5200) | ||||
| 
 | ||||
| // Set default layer - 256 layer max
 | ||||
| #define DF(layer) (layer | 0x5300) | ||||
| 
 | ||||
| // Toggle to layer - 256 layer max
 | ||||
| #define TG(layer) (layer | 0x5400) | ||||
| 
 | ||||
| // One-shot layer - 256 layer max
 | ||||
| #define OSL(layer) (layer | 0x5500) | ||||
| 
 | ||||
| // One-shot mod
 | ||||
| #define OSM(layer) (layer | 0x5600) | ||||
| 
 | ||||
| // chording is currently at 0x57xx
 | ||||
| 
 | ||||
| // M-od, T-ap - 256 keycode max
 | ||||
| #define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8)) | ||||
| #define CTL_T(kc) MT(0x1, kc) | ||||
| #define SFT_T(kc) MT(0x2, kc) | ||||
| #define ALT_T(kc) MT(0x4, kc) | ||||
| #define GUI_T(kc) MT(0x8, kc) | ||||
| #define C_S_T(kc) MT(0x3, kc) // Control + Shift e.g. for gnome-terminal
 | ||||
| #define MEH_T(kc) MT(0x7, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl
 | ||||
| #define LCAG_T(kc) MT(0xD, kc) // Left control alt and gui
 | ||||
| #define ALL_T(kc) MT(0xF, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/
 | ||||
| 
 | ||||
| // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap
 | ||||
| #define KC_HYPR HYPR(KC_NO) | ||||
| #define KC_MEH  MEH(KC_NO) | ||||
| 
 | ||||
| #ifdef UNICODE_ENABLE | ||||
|     // For sending unicode codes.
 | ||||
|     // You may not send codes over 7FFF -- this supports most of UTF8.
 | ||||
|     // To have a key that sends out Œ, go UC(0x0152)
 | ||||
|     #define UNICODE(n) (n | 0x8000) | ||||
|     #define UC(n) UNICODE(n) | ||||
| #endif | ||||
| 
 | ||||
| // 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 | ||||
| @ -2,7 +2,7 @@ | ||||
| #ifndef KEYMAP_BEPO_H | ||||
| #define KEYMAP_BEPO_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #ifndef ALTGR | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_COLEMAK_H | ||||
| #define KEYMAP_COLEMAK_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| // For software implementation of colemak
 | ||||
| #define CM_Q    KC_Q | ||||
| #define CM_W    KC_W | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_DVORAK_H | ||||
| #define KEYMAP_DVORAK_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Normal characters
 | ||||
| #define DV_GRV	KC_GRV | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_FR_CH | ||||
| #define KEYMAP_FR_CH | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_FRENCH_H | ||||
| #define KEYMAP_FRENCH_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_FRENCH_OSX_H | ||||
| #define KEYMAP_FRENCH_OSX_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Normal characters
 | ||||
| #define FR_AT 	KC_GRV | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_GERMAN | ||||
| #define KEYMAP_GERMAN | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_SWISS_GERMAN | ||||
| #define KEYMAP_SWISS_GERMAN | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
| #ifdef KEYMAP_GERMAN | ||||
| 	#warning redefining german keys | ||||
| #endif | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_NEO2 | ||||
| #define KEYMAP_NEO2 | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "keymap_extras/keymap_german.h" | ||||
| 
 | ||||
| #define NEO_A KC_D | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_NORDIC_H | ||||
| #define KEYMAP_NORDIC_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_PLOVER_H | ||||
| #define KEYMAP_PLOVER_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| #define PV_NUM  KC_1 | ||||
| #define PV_LS   KC_Q | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_SPANISH_H | ||||
| #define KEYMAP_SPANISH_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #ifndef KEYMAP_UK_H | ||||
| #define KEYMAP_UK_H | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| 
 | ||||
| // Alt gr
 | ||||
| #define ALGR(kc) kc | 0x1400 | ||||
|  | ||||
| @ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #include "keymap_midi.h" | ||||
| 
 | ||||
| uint8_t starting_note = 0x0C; | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| #include "quantum.h" | ||||
| #include "timer.h" | ||||
| 
 | ||||
| __attribute__ ((weak)) | ||||
| void matrix_init_kb(void) {} | ||||
| @ -35,15 +34,15 @@ int offset = 7; | ||||
| #ifdef AUDIO_ENABLE | ||||
|   bool music_activated = false; | ||||
| 
 | ||||
| // music sequencer
 | ||||
| static bool music_sequence_recording = false; | ||||
| static bool music_sequence_playing = false; | ||||
| static float music_sequence[16] = {0}; | ||||
| static uint8_t music_sequence_count = 0; | ||||
| static uint8_t music_sequence_position = 0; | ||||
|   // music sequencer
 | ||||
|   static bool music_sequence_recording = false; | ||||
|   static bool music_sequence_playing = false; | ||||
|   static float music_sequence[16] = {0}; | ||||
|   static uint8_t music_sequence_count = 0; | ||||
|   static uint8_t music_sequence_position = 0; | ||||
| 
 | ||||
| static uint16_t music_sequence_timer = 0; | ||||
| static uint16_t music_sequence_interval = 100; | ||||
|   static uint16_t music_sequence_timer = 0; | ||||
|   static uint16_t music_sequence_interval = 100; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| @ -172,10 +171,6 @@ bool process_record_quantum(keyrecord_t *record) { | ||||
|           if (record->event.pressed) { | ||||
|               starting_note++; // Change key
 | ||||
|               midi_send_cc(&midi_device, 0, 0x7B, 0); | ||||
|               // midi_send_cc(&midi_device, 1, 0x7B, 0);
 | ||||
|               // midi_send_cc(&midi_device, 2, 0x7B, 0);
 | ||||
|               // midi_send_cc(&midi_device, 3, 0x7B, 0);
 | ||||
|               // midi_send_cc(&midi_device, 4, 0x7B, 0);
 | ||||
|           } | ||||
|           return false; | ||||
|       } | ||||
| @ -183,29 +178,17 @@ bool process_record_quantum(keyrecord_t *record) { | ||||
|           if (record->event.pressed) { | ||||
|               starting_note--; // Change key
 | ||||
|               midi_send_cc(&midi_device, 0, 0x7B, 0); | ||||
|               // midi_send_cc(&midi_device, 1, 0x7B, 0);
 | ||||
|               // midi_send_cc(&midi_device, 2, 0x7B, 0);
 | ||||
|               // midi_send_cc(&midi_device, 3, 0x7B, 0);
 | ||||
|               // midi_send_cc(&midi_device, 4, 0x7B, 0);
 | ||||
|           } | ||||
|           return false; | ||||
|       } | ||||
|       if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { | ||||
|           offset++; // Change scale
 | ||||
|           midi_send_cc(&midi_device, 0, 0x7B, 0); | ||||
|           // midi_send_cc(&midi_device, 1, 0x7B, 0);
 | ||||
|           // midi_send_cc(&midi_device, 2, 0x7B, 0);
 | ||||
|           // midi_send_cc(&midi_device, 3, 0x7B, 0);
 | ||||
|           // midi_send_cc(&midi_device, 4, 0x7B, 0);
 | ||||
|           return false; | ||||
|       } | ||||
|       if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { | ||||
|           offset--; // Change scale
 | ||||
|           midi_send_cc(&midi_device, 0, 0x7B, 0); | ||||
|           // midi_send_cc(&midi_device, 1, 0x7B, 0);
 | ||||
|           // midi_send_cc(&midi_device, 2, 0x7B, 0);
 | ||||
|           // midi_send_cc(&midi_device, 3, 0x7B, 0);
 | ||||
|           // midi_send_cc(&midi_device, 4, 0x7B, 0);
 | ||||
|           return false; | ||||
|       } | ||||
|       // basic
 | ||||
| @ -365,7 +348,7 @@ bool process_record_quantum(keyrecord_t *record) { | ||||
| #define DISABLE_CHORDING | ||||
| #ifndef DISABLE_CHORDING | ||||
| 
 | ||||
|   if (keycode >= 0x5700 && keycode <= 0x57FF) { | ||||
|   if (keycode >= QK_CHORDING && keycode <= QK_CHORDING_MAX) { | ||||
|     if (record->event.pressed) { | ||||
|       if (!chording) { | ||||
|         chording = true; | ||||
| @ -403,7 +386,7 @@ bool process_record_quantum(keyrecord_t *record) { | ||||
| 
 | ||||
| #ifdef UNICODE_ENABLE | ||||
| 
 | ||||
|   if (keycode > UNICODE(0) && record->event.pressed) { | ||||
|   if (keycode > QK_UNICODE && record->event.pressed) { | ||||
|     uint16_t unicode = keycode & 0x7FFF; | ||||
|     switch(input_mode) { | ||||
|       case UC_OSX: | ||||
| @ -443,42 +426,117 @@ bool process_record_quantum(keyrecord_t *record) { | ||||
|   // Shift / paren setup
 | ||||
| 
 | ||||
|   switch(keycode) { | ||||
|     case RESET: | ||||
|       if (record->event.pressed) { | ||||
|         clear_keyboard(); | ||||
|         #ifdef AUDIO_ENABLE | ||||
|           stop_all_notes(); | ||||
|           shutdown_user(); | ||||
|         #endif | ||||
|         _delay_ms(250); | ||||
|         #ifdef ATREUS_ASTAR | ||||
|             *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
 | ||||
|         #endif | ||||
|         bootloader_jump(); | ||||
|         return false; | ||||
|       } | ||||
|       break; | ||||
|     case DEBUG: | ||||
|       if (record->event.pressed) { | ||||
|           print("\nDEBUG: enabled.\n"); | ||||
|           debug_enable = true; | ||||
|           return false; | ||||
|       } | ||||
|       break; | ||||
|     case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI: | ||||
|       if (record->event.pressed) { | ||||
|         // 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_update_keymap(keymap_config.raw); | ||||
|         return false; | ||||
|       } | ||||
|       break; | ||||
|     case KC_LSPO: { | ||||
|                     if (record->event.pressed) { | ||||
|                       shift_interrupted[0] = false; | ||||
|                       register_mods(MOD_LSFT); | ||||
|                     } | ||||
|                     else { | ||||
|                       if (!shift_interrupted[0]) { | ||||
|                         register_code(LSPO_KEY); | ||||
|                         unregister_code(LSPO_KEY); | ||||
|                       } | ||||
|                       unregister_mods(MOD_LSFT); | ||||
|                     } | ||||
|                     return false; | ||||
|                     break; | ||||
|                   } | ||||
|       if (record->event.pressed) { | ||||
|         shift_interrupted[0] = false; | ||||
|         register_mods(MOD_LSFT); | ||||
|       } | ||||
|       else { | ||||
|         if (!shift_interrupted[0]) { | ||||
|           register_code(LSPO_KEY); | ||||
|           unregister_code(LSPO_KEY); | ||||
|         } | ||||
|         unregister_mods(MOD_LSFT); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     } | ||||
| 
 | ||||
|     case KC_RSPC: { | ||||
|                     if (record->event.pressed) { | ||||
|                       shift_interrupted[1] = false; | ||||
|                       register_mods(MOD_RSFT); | ||||
|                     } | ||||
|                     else { | ||||
|                       if (!shift_interrupted[1]) { | ||||
|                         register_code(RSPC_KEY); | ||||
|                         unregister_code(RSPC_KEY); | ||||
|                       } | ||||
|                       unregister_mods(MOD_RSFT); | ||||
|                     } | ||||
|                     return false; | ||||
|                     break; | ||||
|                   } | ||||
|       if (record->event.pressed) { | ||||
|         shift_interrupted[1] = false; | ||||
|         register_mods(MOD_RSFT); | ||||
|       } | ||||
|       else { | ||||
|         if (!shift_interrupted[1]) { | ||||
|           register_code(RSPC_KEY); | ||||
|           unregister_code(RSPC_KEY); | ||||
|         } | ||||
|         unregister_mods(MOD_RSFT); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     } | ||||
|     default: { | ||||
|                shift_interrupted[0] = true; | ||||
|                shift_interrupted[1] = true; | ||||
|                break; | ||||
|              } | ||||
|       shift_interrupted[0] = true; | ||||
|       shift_interrupted[1] = true; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return process_action_kb(record); | ||||
| @ -586,6 +644,13 @@ void send_string(const char *str) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 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); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void matrix_init_quantum() { | ||||
|   matrix_init_kb(); | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| 
 | ||||
| #include <avr/pgmspace.h> | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #ifdef BACKLIGHT_ENABLE | ||||
|     #include "backlight.h" | ||||
| #endif | ||||
| @ -25,8 +25,8 @@ | ||||
| #include <stddef.h> | ||||
| #include <avr/io.h> | ||||
| #include <util/delay.h> | ||||
| 
 | ||||
| #define SEND_STRING(str) send_string(PSTR(str)) | ||||
| #include "bootloader.h" | ||||
| #include "timer.h" | ||||
| 
 | ||||
| extern uint32_t default_layer_state; | ||||
| 
 | ||||
| @ -62,15 +62,20 @@ extern uint32_t default_layer_state; | ||||
| 	#define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT) | ||||
| #endif | ||||
| 
 | ||||
| #define SEND_STRING(str) send_string(PSTR(str)) | ||||
| void send_string(const char *str); | ||||
| 
 | ||||
| // 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))) | ||||
| 
 | ||||
| void matrix_init_kb(void); | ||||
| void matrix_scan_kb(void); | ||||
| bool process_action_kb(keyrecord_t *record); | ||||
| bool process_record_kb(uint16_t keycode, keyrecord_t *record); | ||||
| bool process_record_user(uint16_t keycode, keyrecord_t *record); | ||||
| 
 | ||||
| 
 | ||||
| bool is_music_on(void); | ||||
| void music_toggle(void); | ||||
| void music_on(void); | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| #define %KEYBOARD_UPPERCASE%_H | ||||
| 
 | ||||
| #include "matrix.h" | ||||
| #include "keymap_common.h" | ||||
| #include "keymap.h" | ||||
| #ifdef BACKLIGHT_ENABLE | ||||
| 	#include "backlight.h" | ||||
| #endif | ||||
|  | ||||
| @ -6,7 +6,6 @@ SRC +=	$(COMMON_DIR)/host.c \ | ||||
| 	$(COMMON_DIR)/action_macro.c \
 | ||||
| 	$(COMMON_DIR)/action_layer.c \
 | ||||
| 	$(COMMON_DIR)/action_util.c \
 | ||||
| 	$(COMMON_DIR)/keymap.c \
 | ||||
| 	$(COMMON_DIR)/print.c \
 | ||||
| 	$(COMMON_DIR)/debug.c \
 | ||||
| 	$(COMMON_DIR)/util.c \
 | ||||
|  | ||||
| @ -1,193 +0,0 @@ | ||||
| /*
 | ||||
| Copyright 2013 Jun Wako <wakojun@gmail.com> | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| #include "keymap.h" | ||||
| #include "report.h" | ||||
| #include "keycode.h" | ||||
| #include "action_layer.h" | ||||
| #include "action.h" | ||||
| #include "action_macro.h" | ||||
| #include "wait.h" | ||||
| #include "debug.h" | ||||
| #include "bootloader.h" | ||||
| 
 | ||||
| static action_t keycode_to_action(uint8_t keycode); | ||||
| 
 | ||||
| 
 | ||||
| /* converts key to action */ | ||||
| __attribute__ ((weak)) | ||||
| action_t action_for_key(uint8_t layer, keypos_t key) | ||||
| { | ||||
|     uint8_t keycode = keymap_key_to_keycode(layer, key); | ||||
|     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) { | ||||
|                 return keycode_to_action(KC_LCTL); | ||||
|             } | ||||
|             return keycode_to_action(keycode); | ||||
|         case KC_LCTL: | ||||
|             if (keymap_config.swap_control_capslock) { | ||||
|                 return keycode_to_action(KC_CAPSLOCK); | ||||
|             } | ||||
|             return keycode_to_action(KC_LCTL); | ||||
|         case KC_LALT: | ||||
|             if (keymap_config.swap_lalt_lgui) { | ||||
|                 if (keymap_config.no_gui) { | ||||
|                     return keycode_to_action(ACTION_NO); | ||||
|                 } | ||||
|                 return keycode_to_action(KC_LGUI); | ||||
|             } | ||||
|             return keycode_to_action(KC_LALT); | ||||
|         case KC_LGUI: | ||||
|             if (keymap_config.swap_lalt_lgui) { | ||||
|                 return keycode_to_action(KC_LALT); | ||||
|             } | ||||
|             if (keymap_config.no_gui) { | ||||
|                 return keycode_to_action(ACTION_NO); | ||||
|             } | ||||
|             return keycode_to_action(KC_LGUI); | ||||
|         case KC_RALT: | ||||
|             if (keymap_config.swap_ralt_rgui) { | ||||
|                 if (keymap_config.no_gui) { | ||||
|                     return keycode_to_action(ACTION_NO); | ||||
|                 } | ||||
|                 return keycode_to_action(KC_RGUI); | ||||
|             } | ||||
|             return keycode_to_action(KC_RALT); | ||||
|         case KC_RGUI: | ||||
|             if (keymap_config.swap_ralt_rgui) { | ||||
|                 return keycode_to_action(KC_RALT); | ||||
|             } | ||||
|             if (keymap_config.no_gui) { | ||||
|                 return keycode_to_action(ACTION_NO); | ||||
|             } | ||||
|             return keycode_to_action(KC_RGUI); | ||||
|         case KC_GRAVE: | ||||
|             if (keymap_config.swap_grave_esc) { | ||||
|                 return keycode_to_action(KC_ESC); | ||||
|             } | ||||
|             return keycode_to_action(KC_GRAVE); | ||||
|         case KC_ESC: | ||||
|             if (keymap_config.swap_grave_esc) { | ||||
|                 return keycode_to_action(KC_GRAVE); | ||||
|             } | ||||
|             return keycode_to_action(KC_ESC); | ||||
|         case KC_BSLASH: | ||||
|             if (keymap_config.swap_backslash_backspace) { | ||||
|                 return keycode_to_action(KC_BSPACE); | ||||
|             } | ||||
|             return keycode_to_action(KC_BSLASH); | ||||
|         case KC_BSPACE: | ||||
|             if (keymap_config.swap_backslash_backspace) { | ||||
|                 return keycode_to_action(KC_BSLASH); | ||||
|             } | ||||
|             return keycode_to_action(KC_BSPACE); | ||||
| #endif | ||||
|         default: | ||||
|             return keycode_to_action(keycode); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Macro */ | ||||
| __attribute__ ((weak)) | ||||
| const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
|     return MACRO_NONE; | ||||
| } | ||||
| 
 | ||||
| /* Function */ | ||||
| __attribute__ ((weak)) | ||||
| void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* translates keycode to action */ | ||||
| static action_t keycode_to_action(uint8_t keycode) | ||||
| { | ||||
|     action_t action; | ||||
|     switch (keycode) { | ||||
|         case KC_A ... KC_EXSEL: | ||||
|         case KC_LCTRL ... KC_RGUI: | ||||
|             action.code = ACTION_KEY(keycode); | ||||
|             break; | ||||
|         case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | ||||
|             action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); | ||||
|             break; | ||||
|         case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: | ||||
|             action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); | ||||
|             break; | ||||
|         case KC_MS_UP ... KC_MS_ACCEL2: | ||||
|             action.code = ACTION_MOUSEKEY(keycode); | ||||
|             break; | ||||
|         case KC_TRNS: | ||||
|             action.code = ACTION_TRANSPARENT; | ||||
|             break; | ||||
|         case KC_BOOTLOADER: | ||||
|         	action.code = ACTION_NO; | ||||
|             clear_keyboard(); | ||||
|             wait_ms(50); | ||||
|             bootloader_jump(); // not return
 | ||||
|             break; | ||||
|         default: | ||||
|             action.code = ACTION_NO; | ||||
|             break; | ||||
|     } | ||||
|     return action; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifdef USE_LEGACY_KEYMAP | ||||
| /*
 | ||||
|  * Legacy keymap support | ||||
|  *      Consider using new keymap API instead. | ||||
|  */ | ||||
| __attribute__ ((weak)) | ||||
| uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) | ||||
| { | ||||
|     return keymap_get_keycode(layer, key.row, key.col); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Legacy keymap support */ | ||||
| __attribute__ ((weak)) | ||||
| action_t keymap_fn_to_action(uint8_t keycode) | ||||
| { | ||||
|     action_t action = { .code = ACTION_NO }; | ||||
|     switch (keycode) { | ||||
|         case KC_FN0 ... KC_FN31: | ||||
|             { | ||||
|                 uint8_t layer = keymap_fn_layer(FN_INDEX(keycode)); | ||||
|                 uint8_t key = keymap_fn_keycode(FN_INDEX(keycode)); | ||||
|                 if (key) { | ||||
|                     action.code = ACTION_LAYER_TAP_KEY(layer, key); | ||||
|                 } else { | ||||
|                     action.code = ACTION_LAYER_MOMENTARY(layer); | ||||
|                 } | ||||
|             } | ||||
|             return action; | ||||
|         default: | ||||
|             return action; | ||||
|     } | ||||
| } | ||||
| #endif | ||||
| @ -1,68 +0,0 @@ | ||||
| /*
 | ||||
| Copyright 2011 Jun Wako <wakojun@gmail.com> | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| #ifndef KEYMAP_H | ||||
| #define KEYMAP_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include "action.h" | ||||
| 
 | ||||
| /* NOTE: Not portable. Bit field order depends on implementation */ | ||||
| typedef union { | ||||
|     uint8_t raw; | ||||
|     struct { | ||||
|         bool swap_control_capslock:1; | ||||
|         bool capslock_to_control:1; | ||||
|         bool swap_lalt_lgui:1; | ||||
|         bool swap_ralt_rgui:1; | ||||
|         bool no_gui:1; | ||||
|         bool swap_grave_esc:1; | ||||
|         bool swap_backslash_backspace:1; | ||||
|         bool nkro:1; | ||||
|     }; | ||||
| } keymap_config_t; | ||||
| keymap_config_t keymap_config; | ||||
| 
 | ||||
| 
 | ||||
| /* translates key to keycode */ | ||||
| uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key); | ||||
| 
 | ||||
| /* translates Fn keycode to action */ | ||||
| action_t keymap_fn_to_action(uint8_t keycode); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifdef USE_LEGACY_KEYMAP | ||||
| /* 
 | ||||
|  * Legacy keymap | ||||
|  *      Consider using new keymap API above instead. | ||||
|  */ | ||||
| /* keycode of key */ | ||||
| __attribute__ ((deprecated)) | ||||
| uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col); | ||||
| 
 | ||||
| /* layer to move during press Fn key */ | ||||
| __attribute__ ((deprecated)) | ||||
| uint8_t keymap_fn_layer(uint8_t fn_bits); | ||||
| 
 | ||||
| /* keycode to send when release Fn key without using */ | ||||
| __attribute__ ((deprecated)) | ||||
| uint8_t keymap_fn_keycode(uint8_t fn_bits); | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -18,11 +18,7 @@ LUFA_SRC = lufa.c \ | ||||
| 	   $(LUFA_SRC_USB) | ||||
| 
 | ||||
| ifeq ($(strip $(MIDI_ENABLE)), yes) | ||||
| 	LUFA_SRC += midi/midi.c \
 | ||||
| 	   midi/midi_device.c \
 | ||||
| 	   midi/bytequeue/bytequeue.c \
 | ||||
| 	   midi/bytequeue/interrupt_setting.c \
 | ||||
| 	   $(LUFA_SRC_USBCLASS) | ||||
| 	include $(TMK_PATH)/protocol/midi.mk | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | ||||
|  | ||||
| @ -1,274 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Main source file for the AudioInput demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
| 
 | ||||
| #include "AudioInput.h" | ||||
| 
 | ||||
| /** LUFA Audio Class driver interface configuration and state information. This structure is
 | ||||
|  *  passed to all Audio Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_Audio_Device_t Microphone_Audio_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.ControlInterfaceNumber   = INTERFACE_ID_AudioControl, | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = AUDIO_STREAM_EPADDR, | ||||
| 						.Size             = AUDIO_STREAM_EPSIZE, | ||||
| 						.Banks            = 2, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
| 
 | ||||
| /** Current audio sampling frequency of the streaming audio endpoint. */ | ||||
| static uint32_t CurrentAudioSampleFrequency = 48000; | ||||
| 
 | ||||
| 
 | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial
 | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
| 
 | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		Audio_Device_USBTask(&Microphone_Audio_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
| 
 | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #endif | ||||
| 
 | ||||
| 	/* Hardware Initialization */ | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32); | ||||
| 	ADC_SetupChannel(MIC_IN_ADC_CHANNEL); | ||||
| 	USB_Init(); | ||||
| 
 | ||||
| 	/* Start the ADC conversion in free running mode */ | ||||
| 	ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_GET_CHANNEL_MASK(MIC_IN_ADC_CHANNEL)); | ||||
| } | ||||
| 
 | ||||
| /** ISR to handle the reloading of the data endpoint with the next sample. */ | ||||
| ISR(TIMER0_COMPA_vect, ISR_BLOCK) | ||||
| { | ||||
| 	uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); | ||||
| 
 | ||||
| 	/* Check that the USB bus is ready for the next sample to write */ | ||||
| 	if (Audio_Device_IsReadyForNextSample(&Microphone_Audio_Interface)) | ||||
| 	{ | ||||
| 		int16_t AudioSample; | ||||
| 
 | ||||
| 		#if defined(USE_TEST_TONE) | ||||
| 			static uint8_t SquareWaveSampleCount; | ||||
| 			static int16_t CurrentWaveValue; | ||||
| 
 | ||||
| 			/* In test tone mode, generate a square wave at 1/256 of the sample rate */ | ||||
| 			if (SquareWaveSampleCount++ == 0xFF) | ||||
| 			  CurrentWaveValue ^= 0x8000; | ||||
| 
 | ||||
| 			/* Only generate audio if the board button is being pressed */ | ||||
| 			AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0; | ||||
| 		#else | ||||
| 			/* Audio sample is ADC value scaled to fit the entire range */ | ||||
| 			AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult()); | ||||
| 
 | ||||
| 			#if defined(MICROPHONE_BIASED_TO_HALF_RAIL) | ||||
| 			/* Microphone is biased to half rail voltage, subtract the bias from the sample value */ | ||||
| 			AudioSample -= (SAMPLE_MAX_RANGE / 2); | ||||
| 			#endif | ||||
| 		#endif | ||||
| 
 | ||||
| 		Audio_Device_WriteSample16(&Microphone_Audio_Interface, AudioSample); | ||||
| 	} | ||||
| 
 | ||||
| 	Endpoint_SelectEndpoint(PrevEndpoint); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| 
 | ||||
| 	/* Sample reload timer initialization */ | ||||
| 	TIMSK0  = (1 << OCIE0A); | ||||
| 	OCR0A   = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 	TCCR0A  = (1 << WGM01);  // CTC mode
 | ||||
| 	TCCR0B  = (1 << CS01);   // Fcpu/8 speed
 | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	/* Stop the sample reload timer */ | ||||
| 	TCCR0B = 0; | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
| 
 | ||||
| 	ConfigSuccess &= Audio_Device_ConfigureEndpoints(&Microphone_Audio_Interface); | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	Audio_Device_ProcessControlRequest(&Microphone_Audio_Interface); | ||||
| } | ||||
| 
 | ||||
| /** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented
 | ||||
|  *  in the user application to handle property manipulations on streaming audio endpoints. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced. | ||||
|  *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from Audio_EndpointControls_t. | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property get/set was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                   const uint8_t EndpointProperty, | ||||
|                                                   const uint8_t EndpointAddress, | ||||
|                                                   const uint8_t EndpointControl, | ||||
|                                                   uint16_t* const DataLength, | ||||
|                                                   uint8_t* Data) | ||||
| { | ||||
| 	/* Check the requested endpoint to see if a supported endpoint is being manipulated */ | ||||
| 	if (EndpointAddress == Microphone_Audio_Interface.Config.DataINEndpoint.Address) | ||||
| 	{ | ||||
| 		/* Check the requested control to see if a supported control is being manipulated */ | ||||
| 		if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq) | ||||
| 		{ | ||||
| 			switch (EndpointProperty) | ||||
| 			{ | ||||
| 				case AUDIO_REQ_SetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually adjusting it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						/* Set the new sampling frequency to the value given by the host */ | ||||
| 						CurrentAudioSampleFrequency = (((uint32_t)Data[2] << 16) | ((uint32_t)Data[1] << 8) | (uint32_t)Data[0]); | ||||
| 
 | ||||
| 						/* Adjust sample reload timer to the new frequency */ | ||||
| 						OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 					} | ||||
| 
 | ||||
| 					return true; | ||||
| 				case AUDIO_REQ_GetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually reading it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						*DataLength = 3; | ||||
| 
 | ||||
| 						Data[2] = (CurrentAudioSampleFrequency >> 16); | ||||
| 						Data[1] = (CurrentAudioSampleFrequency >> 8); | ||||
| 						Data[0] = (CurrentAudioSampleFrequency &  0xFF); | ||||
| 					} | ||||
| 
 | ||||
| 					return true; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| /** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented
 | ||||
|  *  in the user application to handle property manipulations on streaming audio interfaces. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     Property            Property of the interface to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EntityAddress       Address of the audio entity whose property is being referenced. | ||||
|  *  \param[in]     Parameter           Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification). | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                    const uint8_t Property, | ||||
|                                                    const uint8_t EntityAddress, | ||||
|                                                    const uint16_t Parameter, | ||||
|                                                    uint16_t* const DataLength, | ||||
|                                                    uint8_t* Data) | ||||
| { | ||||
| 	/* No audio interface entities in the device descriptor, thus no properties to get or set. */ | ||||
| 	return false; | ||||
| } | ||||
| @ -1,94 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Header file for AudioInput.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _AUDIO_INPUT_H_ | ||||
| #define _AUDIO_INPUT_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 
 | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/Peripheral/ADC.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
| 
 | ||||
| 		#include "Descriptors.h" | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** Maximum audio sample value for the microphone input. */ | ||||
| 		#define SAMPLE_MAX_RANGE          0xFFFF | ||||
| 
 | ||||
| 		/** Maximum ADC range for the microphone input. */ | ||||
| 		#define ADC_MAX_RANGE             0x3FF | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
| 
 | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 
 | ||||
| 		bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                  const uint8_t EndpointProperty, | ||||
| 		                                                  const uint8_t EndpointAddress, | ||||
| 		                                                  const uint8_t EndpointControl, | ||||
| 		                                                  uint16_t* const DataLength, | ||||
| 		                                                  uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); | ||||
| 		bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                   const uint8_t Property, | ||||
| 		                                                   const uint8_t EntityAddress, | ||||
| 		                                                   const uint16_t Parameter, | ||||
| 		                                                   uint16_t* const DataLength, | ||||
| 		                                                   uint8_t* Data); | ||||
| #endif | ||||
| 
 | ||||
| @ -1,92 +0,0 @@ | ||||
| /** \file | ||||
|  * | ||||
|  *  This file contains special DoxyGen information for the generation of the main page and other special | ||||
|  *  documentation pages. It is not a project source file. | ||||
|  */ | ||||
| 
 | ||||
| /** \mainpage Audio Input Device Demo | ||||
|  * | ||||
|  *  \section Sec_Compat Demo Compatibility: | ||||
|  * | ||||
|  *  The following list indicates what microcontrollers are compatible with this demo. | ||||
|  * | ||||
|  *  \li Series 7 USB AVRs (AT90USBxxx7) | ||||
|  *  \li Series 6 USB AVRs (AT90USBxxx6) | ||||
|  *  \li Series 4 USB AVRs (ATMEGAxxU4) | ||||
|  * | ||||
|  *  \section Sec_Info USB Information: | ||||
|  * | ||||
|  *  The following table gives a rundown of the USB utilization of this demo. | ||||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Mode:</b></td> | ||||
|  *    <td>Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Class:</b></td> | ||||
|  *    <td>Audio Class</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Standard Audio Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Audio 1.0 Class Specification \n | ||||
|  *        USBIF Audio 1.0 Class Terminal Types Specification \n | ||||
|  *        USBIF Audio 1.0 Data Formats Specification</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Audio demonstration application. This gives a simple reference | ||||
|  *  application for implementing a USB Audio Input device using the | ||||
|  *  basic USB Audio 1.0 drivers in all modern OSes (i.e. no special drivers | ||||
|  *  required). | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function as a | ||||
|  *  USB microphone. By default, the demo will produce a square wave test tone | ||||
|  *  when the board button is pressed. If USE_TEST_TONE is not defined in the | ||||
|  *  project makefile, incoming audio from the ADC channel 1 will be sampled | ||||
|  *  and sent to the host computer instead. | ||||
|  * | ||||
|  *  When in microphone mode, connect a microphone to the ADC channel 2. | ||||
|  * | ||||
|  *  Under Windows, if a driver request dialogue pops up, select the option | ||||
|  *  to automatically install the appropriate drivers. | ||||
|  * | ||||
|  *  \section Sec_Options Project Options | ||||
|  * | ||||
|  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. | ||||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <th><b>Define Name:</b></th> | ||||
|  *    <th><b>Location:</b></th> | ||||
|  *    <th><b>Description:</b></th> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>MIC_IN_ADC_CHANNEL</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>Sets the ADC channel used by the demo for the input audio samples from an attached microphone.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>USE_TEST_TONE</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed | ||||
|  *        instead of sampling the board microphone.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>MICROPHONE_BIASED_TO_HALF_RAIL</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
| 
 | ||||
| @ -1,51 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  *  \brief Application Configuration Header File | ||||
|  * | ||||
|  *  This is a header file which is be used to configure some of | ||||
|  *  the application's compile time options, as an alternative to | ||||
|  *  specifying the compile time constants supplied through a | ||||
|  *  makefile or build system. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the | ||||
|  *  \ref Sec_Options section of the application documentation. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _APP_CONFIG_H_ | ||||
| #define _APP_CONFIG_H_ | ||||
| 
 | ||||
| 	#define MIC_IN_ADC_CHANNEL               2 | ||||
| 
 | ||||
| 	#define MICROPHONE_BIASED_TO_HALF_RAIL | ||||
| 	#define USE_TEST_TONE | ||||
| 
 | ||||
| #endif | ||||
| @ -1,93 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  *  \brief LUFA Library Configuration Header File | ||||
|  * | ||||
|  *  This header file is used to configure LUFA's compile time options, | ||||
|  *  as an alternative to the compile time constants supplied through | ||||
|  *  a makefile. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the LUFA | ||||
|  *  manual section "Summary of Compile Tokens". | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _LUFA_CONFIG_H_ | ||||
| #define _LUFA_CONFIG_H_ | ||||
| 
 | ||||
| 	#if (ARCH == ARCH_AVR8) | ||||
| 
 | ||||
| 		/* Non-USB Related Configuration Tokens: */ | ||||
| //		#define DISABLE_TERMINAL_CODES
 | ||||
| 
 | ||||
| 		/* USB Class Driver Related Tokens: */ | ||||
| //		#define HID_HOST_BOOT_PROTOCOL_ONLY
 | ||||
| //		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
 | ||||
| //		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
 | ||||
| //		#define HID_MAX_COLLECTIONS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORTITEMS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORT_IDS               {Insert Value Here}
 | ||||
| //		#define NO_CLASS_DRIVER_AUTOFLUSH
 | ||||
| 
 | ||||
| 		/* General USB Driver Related Tokens: */ | ||||
| //		#define ORDERED_EP_CONFIG
 | ||||
| 		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) | ||||
| 		#define USB_DEVICE_ONLY | ||||
| //		#define USB_HOST_ONLY
 | ||||
| //		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
 | ||||
| //		#define NO_LIMITED_CONTROLLER_CONNECT
 | ||||
| //		#define NO_SOF_EVENTS
 | ||||
| 
 | ||||
| 		/* USB Device Mode Driver Related Tokens: */ | ||||
| //		#define USE_RAM_DESCRIPTORS
 | ||||
| 		#define USE_FLASH_DESCRIPTORS | ||||
| //		#define USE_EEPROM_DESCRIPTORS
 | ||||
| //		#define NO_INTERNAL_SERIAL
 | ||||
| 		#define FIXED_CONTROL_ENDPOINT_SIZE      8 | ||||
| //		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}
 | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE
 | ||||
| //		#define INTERRUPT_CONTROL_ENDPOINT
 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP
 | ||||
| //		#define NO_DEVICE_SELF_POWER
 | ||||
| 
 | ||||
| 		/* USB Host Mode Driver Related Tokens: */ | ||||
| //		#define HOST_STATE_AS_GPIOR              {Insert Value Here}
 | ||||
| //		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}
 | ||||
| //		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}
 | ||||
| //		#define NO_AUTO_VBUS_MANAGEMENT
 | ||||
| //		#define INVERTED_VBUS_ENABLE_LINE
 | ||||
| 
 | ||||
| 	#else | ||||
| 
 | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
| 
 | ||||
| 	#endif | ||||
| #endif | ||||
| @ -1,312 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special | ||||
|  *  computer-readable structures which the host requests upon device enumeration, to determine | ||||
|  *  the device's capabilities and functions. | ||||
|  */ | ||||
| 
 | ||||
| #include "Descriptors.h" | ||||
| 
 | ||||
| /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 | ||||
|  *  device characteristics, including the supported USB version, control endpoint size and the | ||||
|  *  number of device configurations. The descriptor is read out by the USB host when the enumeration | ||||
|  *  process begins. | ||||
|  */ | ||||
| const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
| 
 | ||||
| 	.USBSpecification       = VERSION_BCD(2,0,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
| 
 | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
| 
 | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2047, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,2), | ||||
| 
 | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.SerialNumStrIndex      = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS | ||||
| }; | ||||
| 
 | ||||
| /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 | ||||
|  *  of the device in one of its supported configurations, including information about any device interfaces | ||||
|  *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting | ||||
|  *  a configuration so that the host may correctly communicate with the USB device. | ||||
|  */ | ||||
| const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | ||||
| { | ||||
| 	.Config = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | ||||
| 
 | ||||
| 			.TotalConfigurationSize   = sizeof(USB_Descriptor_Configuration_t), | ||||
| 			.TotalInterfaces          = 2, | ||||
| 
 | ||||
| 			.ConfigurationNumber      = 1, | ||||
| 			.ConfigurationStrIndex    = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 			.ConfigAttributes         = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
| 
 | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 0, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
| 
 | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = (sizeof(USB_Audio_Descriptor_Interface_AC_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_InputTerminal_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_OutputTerminal_t)), | ||||
| 
 | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_InputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_InputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
| 
 | ||||
| 			.TerminalID               = 0x01, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_IN_MIC, | ||||
| 			.AssociatedOutputTerminal = 0x00, | ||||
| 
 | ||||
| 			.TotalChannels            = 1, | ||||
| 			.ChannelConfig            = 0, | ||||
| 
 | ||||
| 			.ChannelStrIndex          = NO_DESCRIPTOR, | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_OutputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_OutputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
| 
 | ||||
| 			.TerminalID               = 0x02, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_STREAMING, | ||||
| 			.AssociatedInputTerminal  = 0x00, | ||||
| 
 | ||||
| 			.SourceID                 = 0x01, | ||||
| 
 | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_Alt0 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 0, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_Alt1 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 1, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 1, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
| 
 | ||||
| 			.TerminalLink             = 0x02, | ||||
| 
 | ||||
| 			.FrameDelay               = 1, | ||||
| 			.AudioFormat              = 0x0001 | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_AudioFormat = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Format_t) + | ||||
| 			                                     sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates), | ||||
| 			                             .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_FormatType, | ||||
| 
 | ||||
| 			.FormatType               = 0x01, | ||||
| 			.Channels                 = 0x01, | ||||
| 
 | ||||
| 			.SubFrameSize             = 0x02, | ||||
| 			.BitResolution            = 16, | ||||
| 
 | ||||
| 			.TotalDiscreteSampleRates = (sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates) / sizeof(USB_Audio_SampleFreq_t)) | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_AudioFormatSampleRates = | ||||
| 		{ | ||||
| 			AUDIO_SAMPLE_FREQ(8000), | ||||
| 			AUDIO_SAMPLE_FREQ(11025), | ||||
| 			AUDIO_SAMPLE_FREQ(22050), | ||||
| 			AUDIO_SAMPLE_FREQ(44100), | ||||
| 			AUDIO_SAMPLE_FREQ(48000), | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamEndpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 					.EndpointAddress     = AUDIO_STREAM_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = AUDIO_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x01 | ||||
| 				}, | ||||
| 
 | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamEndpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
| 
 | ||||
| 			.Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL), | ||||
| 
 | ||||
| 			.LockDelayUnits           = 0x00, | ||||
| 			.LockDelay                = 0x0000 | ||||
| 		} | ||||
| }; | ||||
| 
 | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
 | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); | ||||
| 
 | ||||
| /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
 | ||||
|  *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||
|  *  Descriptor. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"Dean Camera"); | ||||
| 
 | ||||
| /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
 | ||||
|  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||
|  *  Descriptor. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Audio In Demo"); | ||||
| 
 | ||||
| /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 | ||||
|  *  documentation) by the application code so that the address and size of a requested descriptor can be given | ||||
|  *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function | ||||
|  *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the | ||||
|  *  USB host. | ||||
|  */ | ||||
| uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
|                                     const uint8_t wIndex, | ||||
|                                     const void** const DescriptorAddress) | ||||
| { | ||||
| 	const uint8_t  DescriptorType   = (wValue >> 8); | ||||
| 	const uint8_t  DescriptorNumber = (wValue & 0xFF); | ||||
| 
 | ||||
| 	const void* Address = NULL; | ||||
| 	uint16_t    Size    = NO_DESCRIPTOR; | ||||
| 
 | ||||
| 	switch (DescriptorType) | ||||
| 	{ | ||||
| 		case DTYPE_Device: | ||||
| 			Address = &DeviceDescriptor; | ||||
| 			Size    = sizeof(USB_Descriptor_Device_t); | ||||
| 			break; | ||||
| 		case DTYPE_Configuration: | ||||
| 			Address = &ConfigurationDescriptor; | ||||
| 			Size    = sizeof(USB_Descriptor_Configuration_t); | ||||
| 			break; | ||||
| 		case DTYPE_String: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
| 
 | ||||
| @ -1,106 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Header file for Descriptors.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DESCRIPTORS_H_ | ||||
| #define _DESCRIPTORS_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 
 | ||||
| 		#include <avr/pgmspace.h> | ||||
| 
 | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Audio isochronous streaming data IN endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPADDR           (ENDPOINT_DIR_IN | 1) | ||||
| 
 | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPSIZE           256 | ||||
| 
 | ||||
| 	/* Type Defines: */ | ||||
| 		/** Type define for the device configuration descriptor structure. This must be defined in the
 | ||||
| 		 *  application code, as the configuration descriptor contains several sub-descriptors which | ||||
| 		 *  vary between devices, and which describe the device's usage to the host. | ||||
| 		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			USB_Descriptor_Configuration_Header_t     Config; | ||||
| 
 | ||||
| 			// Audio Control Interface
 | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
| 			USB_Audio_Descriptor_InputTerminal_t      Audio_InputTerminal; | ||||
| 			USB_Audio_Descriptor_OutputTerminal_t     Audio_OutputTerminal; | ||||
| 
 | ||||
| 			// Audio Streaming Interface
 | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt0; | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt1; | ||||
| 			USB_Audio_Descriptor_Interface_AS_t       Audio_StreamInterface_SPC; | ||||
| 			USB_Audio_Descriptor_Format_t             Audio_AudioFormat; | ||||
| 			USB_Audio_SampleFreq_t                    Audio_AudioFormatSampleRates[5]; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t Audio_StreamEndpoint; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Spc_t Audio_StreamEndpoint_SPC; | ||||
| 		} USB_Descriptor_Configuration_t; | ||||
| 
 | ||||
| 		/** Enum for the device interface descriptor IDs within the device. Each interface descriptor
 | ||||
| 		 *  should have a unique ID index associated with it, which can be used to refer to the | ||||
| 		 *  interface from other descriptors. | ||||
| 		 */ | ||||
| 		enum InterfaceDescriptors_t | ||||
| 		{ | ||||
| 			INTERFACE_ID_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio stream interface descriptor ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 		/** Enum for the device string descriptor IDs within the device. Each string descriptor should
 | ||||
| 		 *  have a unique ID index associated with it, which can be used to refer to the string from | ||||
| 		 *  other descriptors. | ||||
| 		 */ | ||||
| 		enum StringDescriptors_t | ||||
| 		{ | ||||
| 			STRING_ID_Language     = 0, /**< Supported Languages string descriptor ID (must be zero) */ | ||||
| 			STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */ | ||||
| 			STRING_ID_Product      = 2, /**< Product string ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
| 		                                    const uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| @ -1,52 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Audio Input Device Demo (Class Driver APIs)" id="lufa.demos.device.class.audio_input.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.audio_input"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<module type="application" id="lufa.demos.device.class.audio_input" caption="Audio Input Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Audio 1.0 Input device demo, implementing a basic USB microphone. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
| 
 | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
| 
 | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="Audio Class"/> | ||||
| 		</info> | ||||
| 
 | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
| 
 | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="AudioInput.txt"/> | ||||
| 
 | ||||
| 		<build type="c-source" value="AudioInput.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="AudioInput.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
| 
 | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="module-config" subtype="required-header-file" value="AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
| 
 | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.peripheral.adc"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,38 +0,0 @@ | ||||
| #
 | ||||
| #             LUFA Library
 | ||||
| #     Copyright (C) Dean Camera, 2014.
 | ||||
| #
 | ||||
| #  dean [at] fourwalledcubicle [dot] com
 | ||||
| #           www.lufa-lib.org
 | ||||
| #
 | ||||
| # --------------------------------------
 | ||||
| #         LUFA Project Makefile.
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
| # Run "make help" for target help.
 | ||||
| 
 | ||||
| MCU          = at90usb1287 | ||||
| ARCH         = AVR8 | ||||
| BOARD        = USBKEY | ||||
| F_CPU        = 8000000 | ||||
| F_USB        = $(F_CPU) | ||||
| OPTIMIZATION = s | ||||
| TARGET       = AudioInput | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
| 
 | ||||
| # Default target
 | ||||
| all: | ||||
| 
 | ||||
| # Include LUFA build script makefiles
 | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @ -1,311 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Main source file for the AudioOutput demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
| 
 | ||||
| #include "AudioOutput.h" | ||||
| 
 | ||||
| /** LUFA Audio Class driver interface configuration and state information. This structure is
 | ||||
|  *  passed to all Audio Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_Audio_Device_t Speaker_Audio_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.ControlInterfaceNumber   = INTERFACE_ID_AudioControl, | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataOUTEndpoint          = | ||||
| 					{ | ||||
| 						.Address          = AUDIO_STREAM_EPADDR, | ||||
| 						.Size             = AUDIO_STREAM_EPSIZE, | ||||
| 						.Banks            = 2, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
| 
 | ||||
| /** Current audio sampling frequency of the streaming audio endpoint. */ | ||||
| static uint32_t CurrentAudioSampleFrequency = 48000; | ||||
| 
 | ||||
| 
 | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial
 | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
| 
 | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		Audio_Device_USBTask(&Speaker_Audio_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
| 
 | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #endif | ||||
| 
 | ||||
| 	/* Hardware Initialization */ | ||||
| 	LEDs_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
| 
 | ||||
| /** ISR to handle the reloading of the PWM timer with the next sample. */ | ||||
| ISR(TIMER0_COMPA_vect, ISR_BLOCK) | ||||
| { | ||||
| 	uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); | ||||
| 
 | ||||
| 	/* Check that the USB bus is ready for the next sample to read */ | ||||
| 	if (Audio_Device_IsSampleReceived(&Speaker_Audio_Interface)) | ||||
| 	{ | ||||
| 		/* Retrieve the signed 16-bit left and right audio samples, convert to 8-bit */ | ||||
| 		int8_t LeftSample_8Bit  = (Audio_Device_ReadSample16(&Speaker_Audio_Interface) >> 8); | ||||
| 		int8_t RightSample_8Bit = (Audio_Device_ReadSample16(&Speaker_Audio_Interface) >> 8); | ||||
| 
 | ||||
| 		/* Mix the two channels together to produce a mono, 8-bit sample */ | ||||
| 		int8_t MixedSample_8Bit = (((int16_t)LeftSample_8Bit + (int16_t)RightSample_8Bit) >> 1); | ||||
| 
 | ||||
| 		#if defined(AUDIO_OUT_MONO) | ||||
| 		/* Load the sample into the PWM timer channel */ | ||||
| 		OCR3A = (MixedSample_8Bit ^ (1 << 7)); | ||||
| 		#elif defined(AUDIO_OUT_STEREO) | ||||
| 		/* Load the dual 8-bit samples into the PWM timer channels */ | ||||
| 		OCR3A = (LeftSample_8Bit  ^ (1 << 7)); | ||||
| 		OCR3B = (RightSample_8Bit ^ (1 << 7)); | ||||
| 		#elif defined(AUDIO_OUT_PORTC) | ||||
| 		/* Load the 8-bit mixed sample into PORTC */ | ||||
| 		PORTC = MixedSample_8Bit; | ||||
| 		#endif | ||||
| 
 | ||||
| 		uint8_t LEDMask = LEDS_NO_LEDS; | ||||
| 
 | ||||
| 		/* Turn on LEDs as the sample amplitude increases */ | ||||
| 		if (MixedSample_8Bit > 16) | ||||
| 		  LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); | ||||
| 		else if (MixedSample_8Bit > 8) | ||||
| 		  LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); | ||||
| 		else if (MixedSample_8Bit > 4) | ||||
| 		  LEDMask = (LEDS_LED1 | LEDS_LED2); | ||||
| 		else if (MixedSample_8Bit > 2) | ||||
| 		  LEDMask = (LEDS_LED1); | ||||
| 
 | ||||
| 		LEDs_SetAllLEDs(LEDMask); | ||||
| 	} | ||||
| 
 | ||||
| 	Endpoint_SelectEndpoint(PrevEndpoint); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| 
 | ||||
| 	/* Sample reload timer initialization */ | ||||
| 	TIMSK0  = (1 << OCIE0A); | ||||
| 	OCR0A   = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 	TCCR0A  = (1 << WGM01);  // CTC mode
 | ||||
| 	TCCR0B  = (1 << CS01);   // Fcpu/8 speed
 | ||||
| 
 | ||||
| 	#if defined(AUDIO_OUT_MONO) | ||||
| 	/* Set speaker as output */ | ||||
| 	DDRC   |= (1 << 6); | ||||
| 	#elif defined(AUDIO_OUT_STEREO) | ||||
| 	/* Set speakers as outputs */ | ||||
| 	DDRC   |= ((1 << 6) | (1 << 5)); | ||||
| 	#elif defined(AUDIO_OUT_PORTC) | ||||
| 	/* Set PORTC as outputs */ | ||||
| 	DDRC   |= 0xFF; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) | ||||
| 	/* PWM speaker timer initialization */ | ||||
| 	TCCR3A  = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0) | ||||
| 	        | (1 << COM3B1) | (1 << COM3B0)); // Set on match, clear on TOP
 | ||||
| 	TCCR3B  = ((1 << WGM32) | (1 << CS30));  // Fast 8-Bit PWM, F_CPU speed
 | ||||
| 	#endif | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 
 | ||||
| 	/* Stop the sample reload timer */ | ||||
| 	TCCR0B = 0; | ||||
| 
 | ||||
| 	#if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) | ||||
| 	/* Stop the PWM generation timer */ | ||||
| 	TCCR3B = 0; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if defined(AUDIO_OUT_MONO) | ||||
| 	/* Set speaker as input to reduce current draw */ | ||||
| 	DDRC  &= ~(1 << 6); | ||||
| 	#elif defined(AUDIO_OUT_STEREO) | ||||
| 	/* Set speakers as inputs to reduce current draw */ | ||||
| 	DDRC  &= ~((1 << 6) | (1 << 5)); | ||||
| 	#elif defined(AUDIO_OUT_PORTC) | ||||
| 	/* Set PORTC low */ | ||||
| 	PORTC = 0x00; | ||||
| 	#endif | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
| 
 | ||||
| 	ConfigSuccess &= Audio_Device_ConfigureEndpoints(&Speaker_Audio_Interface); | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	Audio_Device_ProcessControlRequest(&Speaker_Audio_Interface); | ||||
| } | ||||
| 
 | ||||
| /** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented
 | ||||
|  *  in the user application to handle property manipulations on streaming audio endpoints. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced. | ||||
|  *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from Audio_EndpointControls_t. | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property get/set was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                   const uint8_t EndpointProperty, | ||||
|                                                   const uint8_t EndpointAddress, | ||||
|                                                   const uint8_t EndpointControl, | ||||
|                                                   uint16_t* const DataLength, | ||||
|                                                   uint8_t* Data) | ||||
| { | ||||
| 	/* Check the requested endpoint to see if a supported endpoint is being manipulated */ | ||||
| 	if (EndpointAddress == Speaker_Audio_Interface.Config.DataOUTEndpoint.Address) | ||||
| 	{ | ||||
| 		/* Check the requested control to see if a supported control is being manipulated */ | ||||
| 		if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq) | ||||
| 		{ | ||||
| 			switch (EndpointProperty) | ||||
| 			{ | ||||
| 				case AUDIO_REQ_SetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually adjusting it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						/* Set the new sampling frequency to the value given by the host */ | ||||
| 						CurrentAudioSampleFrequency = (((uint32_t)Data[2] << 16) | ((uint32_t)Data[1] << 8) | (uint32_t)Data[0]); | ||||
| 
 | ||||
| 						/* Adjust sample reload timer to the new frequency */ | ||||
| 						OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 					} | ||||
| 
 | ||||
| 					return true; | ||||
| 				case AUDIO_REQ_GetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually reading it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						*DataLength = 3; | ||||
| 
 | ||||
| 						Data[2] = (CurrentAudioSampleFrequency >> 16); | ||||
| 						Data[1] = (CurrentAudioSampleFrequency >> 8); | ||||
| 						Data[0] = (CurrentAudioSampleFrequency &  0xFF); | ||||
| 					} | ||||
| 
 | ||||
| 					return true; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| /** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented
 | ||||
|  *  in the user application to handle property manipulations on streaming audio interfaces. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     Property            Property of the interface to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EntityAddress       Address of the audio entity whose property is being referenced. | ||||
|  *  \param[in]     Parameter           Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification). | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                    const uint8_t Property, | ||||
|                                                    const uint8_t EntityAddress, | ||||
|                                                    const uint16_t Parameter, | ||||
|                                                    uint16_t* const DataLength, | ||||
|                                                    uint8_t* Data) | ||||
| { | ||||
| 	/* No audio interface entities in the device descriptor, thus no properties to get or set. */ | ||||
| 	return false; | ||||
| } | ||||
| @ -1,87 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Header file for AudioOutput.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _AUDIO_OUTPUT_H_ | ||||
| #define _AUDIO_OUTPUT_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdlib.h> | ||||
| 
 | ||||
| 		#include "Descriptors.h" | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
| 
 | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 
 | ||||
| 		bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                  const uint8_t EndpointProperty, | ||||
| 		                                                  const uint8_t EndpointAddress, | ||||
| 		                                                  const uint8_t EndpointControl, | ||||
| 		                                                  uint16_t* const DataLength, | ||||
| 		                                                  uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); | ||||
| 		bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                   const uint8_t Property, | ||||
| 		                                                   const uint8_t EntityAddress, | ||||
| 		                                                   const uint16_t Parameter, | ||||
| 		                                                   uint16_t* const DataLength, | ||||
| 		                                                   uint8_t* Data); | ||||
| #endif | ||||
| 
 | ||||
| @ -1,92 +0,0 @@ | ||||
| /** \file | ||||
|  * | ||||
|  *  This file contains special DoxyGen information for the generation of the main page and other special | ||||
|  *  documentation pages. It is not a project source file. | ||||
|  */ | ||||
| 
 | ||||
| /** \mainpage Audio Output Device Demo | ||||
|  * | ||||
|  *  \section Sec_Compat Demo Compatibility: | ||||
|  * | ||||
|  *  The following list indicates what microcontrollers are compatible with this demo. | ||||
|  * | ||||
|  *  \li Series 7 USB AVRs (AT90USBxxx7) | ||||
|  *  \li Series 6 USB AVRs (AT90USBxxx6) | ||||
|  *  \li Series 4 USB AVRs (ATMEGAxxU4) | ||||
|  * | ||||
|  *  \section Sec_Info USB Information: | ||||
|  * | ||||
|  *  The following table gives a rundown of the USB utilization of this demo. | ||||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Mode:</b></td> | ||||
|  *    <td>Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Class:</b></td> | ||||
|  *    <td>Audio Class</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Standard Audio Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Audio 1.0 Class Specification \n | ||||
|  *        USBIF Audio 1.0 Class Terminal Types Specification \n | ||||
|  *        USBIF Audio 1.0 Data Formats Specification</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Audio demonstration application. This gives a simple reference | ||||
|  *  application for implementing a USB Audio Output device using the | ||||
|  *  basic USB Audio 1.0 drivers in all modern OSes (i.e. no special drivers | ||||
|  *  required). | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function | ||||
|  *  as a USB speaker. Outgoing audio will output in 8-bit PWM onto | ||||
|  *  the timer 3 output compare channel A for AUDIO_OUT_MONO mode, on | ||||
|  *  timer 3 channels A and B for AUDIO_OUT_STEREO and on PORTC as a signed | ||||
|  *  mono sample for AUDIO_OUT_PORTC. Audio output will also be indicated on | ||||
|  *  the board LEDs in all modes. Decouple audio outputs with a capacitor and | ||||
|  *  attach to a speaker to hear the audio. | ||||
|  * | ||||
|  *  Under Windows, if a driver request dialogue pops up, select the option | ||||
|  *  to automatically install the appropriate drivers. | ||||
|  * | ||||
|  *  \section Sec_Options Project Options | ||||
|  * | ||||
|  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. | ||||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <th><b>Define Name:</b></th> | ||||
|  *    <th><b>Location:</b></th> | ||||
|  *    <th><b>Description:</b></th> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>AUDIO_OUT_STEREO</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this outputs the audio samples in stereo to the timer output pins of the microcontroller.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>AUDIO_OUT_MONO</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this outputs the audio samples in mono to the timer output pin of the microcontroller.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>AUDIO_OUT_PORTC</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this outputs the audio samples in mono to port C of the microcontroller, for connection to an | ||||
|  *        external DAC.</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
| 
 | ||||
| @ -1,50 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  *  \brief Application Configuration Header File | ||||
|  * | ||||
|  *  This is a header file which is be used to configure some of | ||||
|  *  the application's compile time options, as an alternative to | ||||
|  *  specifying the compile time constants supplied through a | ||||
|  *  makefile or build system. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the | ||||
|  *  \ref Sec_Options section of the application documentation. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _APP_CONFIG_H_ | ||||
| #define _APP_CONFIG_H_ | ||||
| 
 | ||||
| 	#define AUDIO_OUT_STEREO | ||||
| //	#define AUDIO_OUT_MONO
 | ||||
| //	#define AUDIO_OUT_PORTC
 | ||||
| 
 | ||||
| #endif | ||||
| @ -1,93 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  *  \brief LUFA Library Configuration Header File | ||||
|  * | ||||
|  *  This header file is used to configure LUFA's compile time options, | ||||
|  *  as an alternative to the compile time constants supplied through | ||||
|  *  a makefile. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the LUFA | ||||
|  *  manual section "Summary of Compile Tokens". | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _LUFA_CONFIG_H_ | ||||
| #define _LUFA_CONFIG_H_ | ||||
| 
 | ||||
| 	#if (ARCH == ARCH_AVR8) | ||||
| 
 | ||||
| 		/* Non-USB Related Configuration Tokens: */ | ||||
| //		#define DISABLE_TERMINAL_CODES
 | ||||
| 
 | ||||
| 		/* USB Class Driver Related Tokens: */ | ||||
| //		#define HID_HOST_BOOT_PROTOCOL_ONLY
 | ||||
| //		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
 | ||||
| //		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
 | ||||
| //		#define HID_MAX_COLLECTIONS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORTITEMS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORT_IDS               {Insert Value Here}
 | ||||
| //		#define NO_CLASS_DRIVER_AUTOFLUSH
 | ||||
| 
 | ||||
| 		/* General USB Driver Related Tokens: */ | ||||
| //		#define ORDERED_EP_CONFIG
 | ||||
| 		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) | ||||
| 		#define USB_DEVICE_ONLY | ||||
| //		#define USB_HOST_ONLY
 | ||||
| //		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
 | ||||
| //		#define NO_LIMITED_CONTROLLER_CONNECT
 | ||||
| //		#define NO_SOF_EVENTS
 | ||||
| 
 | ||||
| 		/* USB Device Mode Driver Related Tokens: */ | ||||
| //		#define USE_RAM_DESCRIPTORS
 | ||||
| 		#define USE_FLASH_DESCRIPTORS | ||||
| //		#define USE_EEPROM_DESCRIPTORS
 | ||||
| //		#define NO_INTERNAL_SERIAL
 | ||||
| 		#define FIXED_CONTROL_ENDPOINT_SIZE      8 | ||||
| //		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}
 | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE
 | ||||
| //		#define INTERRUPT_CONTROL_ENDPOINT
 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP
 | ||||
| //		#define NO_DEVICE_SELF_POWER
 | ||||
| 
 | ||||
| 		/* USB Host Mode Driver Related Tokens: */ | ||||
| //		#define HOST_STATE_AS_GPIOR              {Insert Value Here}
 | ||||
| //		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}
 | ||||
| //		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}
 | ||||
| //		#define NO_AUTO_VBUS_MANAGEMENT
 | ||||
| //		#define INVERTED_VBUS_ENABLE_LINE
 | ||||
| 
 | ||||
| 	#else | ||||
| 
 | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
| 
 | ||||
| 	#endif | ||||
| #endif | ||||
| @ -1,312 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special | ||||
|  *  computer-readable structures which the host requests upon device enumeration, to determine | ||||
|  *  the device's capabilities and functions. | ||||
|  */ | ||||
| 
 | ||||
| #include "Descriptors.h" | ||||
| 
 | ||||
| /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 | ||||
|  *  device characteristics, including the supported USB version, control endpoint size and the | ||||
|  *  number of device configurations. The descriptor is read out by the USB host when the enumeration | ||||
|  *  process begins. | ||||
|  */ | ||||
| const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
| 
 | ||||
| 	.USBSpecification       = VERSION_BCD(2,0,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
| 
 | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
| 
 | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2046, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,2), | ||||
| 
 | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.SerialNumStrIndex      = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS | ||||
| }; | ||||
| 
 | ||||
| /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 | ||||
|  *  of the device in one of its supported configurations, including information about any device interfaces | ||||
|  *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting | ||||
|  *  a configuration so that the host may correctly communicate with the USB device. | ||||
|  */ | ||||
| const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | ||||
| { | ||||
| 	.Config = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | ||||
| 
 | ||||
| 			.TotalConfigurationSize   = sizeof(USB_Descriptor_Configuration_t), | ||||
| 			.TotalInterfaces          = 2, | ||||
| 
 | ||||
| 			.ConfigurationNumber      = 1, | ||||
| 			.ConfigurationStrIndex    = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 			.ConfigAttributes         = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
| 
 | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 0, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
| 
 | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = (sizeof(USB_Audio_Descriptor_Interface_AC_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_InputTerminal_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_OutputTerminal_t)), | ||||
| 
 | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_InputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_InputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
| 
 | ||||
| 			.TerminalID               = 0x01, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_STREAMING, | ||||
| 			.AssociatedOutputTerminal = 0x00, | ||||
| 
 | ||||
| 			.TotalChannels            = 2, | ||||
| 			.ChannelConfig            = (AUDIO_CHANNEL_LEFT_FRONT | AUDIO_CHANNEL_RIGHT_FRONT), | ||||
| 
 | ||||
| 			.ChannelStrIndex          = NO_DESCRIPTOR, | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_OutputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_OutputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
| 
 | ||||
| 			.TerminalID               = 0x02, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_OUT_SPEAKER, | ||||
| 			.AssociatedInputTerminal  = 0x00, | ||||
| 
 | ||||
| 			.SourceID                 = 0x01, | ||||
| 
 | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_Alt0 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 0, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_Alt1 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 1, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 1, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
| 
 | ||||
| 			.TerminalLink             = 0x01, | ||||
| 
 | ||||
| 			.FrameDelay               = 1, | ||||
| 			.AudioFormat              = 0x0001 | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_AudioFormat = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Format_t) + | ||||
| 			                                     sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates), | ||||
| 			                             .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_FormatType, | ||||
| 
 | ||||
| 			.FormatType               = 0x01, | ||||
| 			.Channels                 = 0x02, | ||||
| 
 | ||||
| 			.SubFrameSize             = 0x02, | ||||
| 			.BitResolution            = 16, | ||||
| 
 | ||||
| 			.TotalDiscreteSampleRates = (sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates) / sizeof(USB_Audio_SampleFreq_t)), | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_AudioFormatSampleRates = | ||||
| 		{ | ||||
| 			AUDIO_SAMPLE_FREQ(8000), | ||||
| 			AUDIO_SAMPLE_FREQ(11025), | ||||
| 			AUDIO_SAMPLE_FREQ(22050), | ||||
| 			AUDIO_SAMPLE_FREQ(44100), | ||||
| 			AUDIO_SAMPLE_FREQ(48000), | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamEndpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 					.EndpointAddress     = AUDIO_STREAM_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = AUDIO_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x01 | ||||
| 				}, | ||||
| 
 | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamEndpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
| 
 | ||||
| 			.Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL), | ||||
| 
 | ||||
| 			.LockDelayUnits           = 0x00, | ||||
| 			.LockDelay                = 0x0000 | ||||
| 		} | ||||
| }; | ||||
| 
 | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
 | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); | ||||
| 
 | ||||
| /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
 | ||||
|  *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||
|  *  Descriptor. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"Dean Camera"); | ||||
| 
 | ||||
| /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
 | ||||
|  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||
|  *  Descriptor. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Audio Out Demo"); | ||||
| 
 | ||||
| /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 | ||||
|  *  documentation) by the application code so that the address and size of a requested descriptor can be given | ||||
|  *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function | ||||
|  *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the | ||||
|  *  USB host. | ||||
|  */ | ||||
| uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
|                                     const uint8_t wIndex, | ||||
|                                     const void** const DescriptorAddress) | ||||
| { | ||||
| 	const uint8_t  DescriptorType   = (wValue >> 8); | ||||
| 	const uint8_t  DescriptorNumber = (wValue & 0xFF); | ||||
| 
 | ||||
| 	const void* Address = NULL; | ||||
| 	uint16_t    Size    = NO_DESCRIPTOR; | ||||
| 
 | ||||
| 	switch (DescriptorType) | ||||
| 	{ | ||||
| 		case DTYPE_Device: | ||||
| 			Address = &DeviceDescriptor; | ||||
| 			Size    = sizeof(USB_Descriptor_Device_t); | ||||
| 			break; | ||||
| 		case DTYPE_Configuration: | ||||
| 			Address = &ConfigurationDescriptor; | ||||
| 			Size    = sizeof(USB_Descriptor_Configuration_t); | ||||
| 			break; | ||||
| 		case DTYPE_String: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
| 
 | ||||
| @ -1,106 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Header file for Descriptors.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DESCRIPTORS_H_ | ||||
| #define _DESCRIPTORS_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 
 | ||||
| 		#include <avr/pgmspace.h> | ||||
| 
 | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Audio isochronous streaming data OUT endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPADDR           (ENDPOINT_DIR_OUT | 1) | ||||
| 
 | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPSIZE           256 | ||||
| 
 | ||||
| 	/* Type Defines: */ | ||||
| 		/** Type define for the device configuration descriptor structure. This must be defined in the
 | ||||
| 		 *  application code, as the configuration descriptor contains several sub-descriptors which | ||||
| 		 *  vary between devices, and which describe the device's usage to the host. | ||||
| 		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			USB_Descriptor_Configuration_Header_t     Config; | ||||
| 
 | ||||
| 			// Audio Control Interface
 | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
| 			USB_Audio_Descriptor_InputTerminal_t      Audio_InputTerminal; | ||||
| 			USB_Audio_Descriptor_OutputTerminal_t     Audio_OutputTerminal; | ||||
| 
 | ||||
| 			// Audio Streaming Interface
 | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt0; | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt1; | ||||
| 			USB_Audio_Descriptor_Interface_AS_t       Audio_StreamInterface_SPC; | ||||
| 			USB_Audio_Descriptor_Format_t             Audio_AudioFormat; | ||||
| 			USB_Audio_SampleFreq_t                    Audio_AudioFormatSampleRates[5]; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t Audio_StreamEndpoint; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Spc_t Audio_StreamEndpoint_SPC; | ||||
| 		} USB_Descriptor_Configuration_t; | ||||
| 
 | ||||
| 		/** Enum for the device interface descriptor IDs within the device. Each interface descriptor
 | ||||
| 		 *  should have a unique ID index associated with it, which can be used to refer to the | ||||
| 		 *  interface from other descriptors. | ||||
| 		 */ | ||||
| 		enum InterfaceDescriptors_t | ||||
| 		{ | ||||
| 			INTERFACE_ID_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio stream interface descriptor ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 		/** Enum for the device string descriptor IDs within the device. Each string descriptor should
 | ||||
| 		 *  have a unique ID index associated with it, which can be used to refer to the string from | ||||
| 		 *  other descriptors. | ||||
| 		 */ | ||||
| 		enum StringDescriptors_t | ||||
| 		{ | ||||
| 			STRING_ID_Language     = 0, /**< Supported Languages string descriptor ID (must be zero) */ | ||||
| 			STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */ | ||||
| 			STRING_ID_Product      = 2, /**< Product string ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
| 		                                    const uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| @ -1,50 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Audio Output Device Demo (Class Driver APIs)" id="lufa.demos.device.class.audio_output.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.audio_output"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<module type="application" id="lufa.demos.device.class.audio_output" caption="Audio Output Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Audio 1.0 Output device demo, implementing a basic USB speaker. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
| 
 | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
| 
 | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="Audio Class"/> | ||||
| 		</info> | ||||
| 
 | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
| 
 | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="AudioOutput.txt"/> | ||||
| 
 | ||||
| 		<build type="c-source" value="AudioOutput.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="AudioOutput.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
| 
 | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="module-config" subtype="required-header-file" value="AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
| 
 | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,38 +0,0 @@ | ||||
| #
 | ||||
| #             LUFA Library
 | ||||
| #     Copyright (C) Dean Camera, 2014.
 | ||||
| #
 | ||||
| #  dean [at] fourwalledcubicle [dot] com
 | ||||
| #           www.lufa-lib.org
 | ||||
| #
 | ||||
| # --------------------------------------
 | ||||
| #         LUFA Project Makefile.
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
| # Run "make help" for target help.
 | ||||
| 
 | ||||
| MCU          = at90usb1287 | ||||
| ARCH         = AVR8 | ||||
| BOARD        = USBKEY | ||||
| F_CPU        = 8000000 | ||||
| F_USB        = $(F_CPU) | ||||
| OPTIMIZATION = s | ||||
| TARGET       = AudioOutput | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
| 
 | ||||
| # Default target
 | ||||
| all: | ||||
| 
 | ||||
| # Include LUFA build script makefiles
 | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @ -1,126 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  *  \brief LUFA Library Configuration Header File | ||||
|  * | ||||
|  *  This header file is used to configure LUFA's compile time options, | ||||
|  *  as an alternative to the compile time constants supplied through | ||||
|  *  a makefile. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the LUFA | ||||
|  *  manual section "Summary of Compile Tokens". | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _LUFA_CONFIG_H_ | ||||
| #define _LUFA_CONFIG_H_ | ||||
| 
 | ||||
| 	#if (ARCH == ARCH_AVR8) | ||||
| 
 | ||||
| 		/* Non-USB Related Configuration Tokens: */ | ||||
| //		#define DISABLE_TERMINAL_CODES
 | ||||
| 
 | ||||
| 		/* USB Class Driver Related Tokens: */ | ||||
| //		#define HID_HOST_BOOT_PROTOCOL_ONLY
 | ||||
| //		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
 | ||||
| //		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
 | ||||
| //		#define HID_MAX_COLLECTIONS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORTITEMS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORT_IDS               {Insert Value Here}
 | ||||
| //		#define NO_CLASS_DRIVER_AUTOFLUSH
 | ||||
| 
 | ||||
| 		/* General USB Driver Related Tokens: */ | ||||
| //		#define ORDERED_EP_CONFIG
 | ||||
| 		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) | ||||
| 		#define USB_DEVICE_ONLY | ||||
| //		#define USB_HOST_ONLY
 | ||||
| //		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
 | ||||
| //		#define NO_LIMITED_CONTROLLER_CONNECT
 | ||||
| //		#define NO_SOF_EVENTS
 | ||||
| 
 | ||||
| 		/* USB Device Mode Driver Related Tokens: */ | ||||
| //		#define USE_RAM_DESCRIPTORS
 | ||||
| 		#define USE_FLASH_DESCRIPTORS | ||||
| //		#define USE_EEPROM_DESCRIPTORS
 | ||||
| //		#define NO_INTERNAL_SERIAL
 | ||||
| 		#define FIXED_CONTROL_ENDPOINT_SIZE      8 | ||||
| //		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}
 | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE
 | ||||
| //		#define INTERRUPT_CONTROL_ENDPOINT
 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP
 | ||||
| //		#define NO_DEVICE_SELF_POWER
 | ||||
| 
 | ||||
| 		/* USB Host Mode Driver Related Tokens: */ | ||||
| //		#define HOST_STATE_AS_GPIOR              {Insert Value Here}
 | ||||
| //		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}
 | ||||
| //		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}
 | ||||
| //		#define NO_AUTO_VBUS_MANAGEMENT
 | ||||
| //		#define INVERTED_VBUS_ENABLE_LINE
 | ||||
| 
 | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
| 
 | ||||
| 		/* Non-USB Related Configuration Tokens: */ | ||||
| //		#define DISABLE_TERMINAL_CODES
 | ||||
| 
 | ||||
| 		/* USB Class Driver Related Tokens: */ | ||||
| //		#define HID_HOST_BOOT_PROTOCOL_ONLY
 | ||||
| //		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
 | ||||
| //		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
 | ||||
| //		#define HID_MAX_COLLECTIONS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORTITEMS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORT_IDS               {Insert Value Here}
 | ||||
| //		#define NO_CLASS_DRIVER_AUTOFLUSH
 | ||||
| 
 | ||||
| 		/* General USB Driver Related Tokens: */ | ||||
| 		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
 | ||||
| //		#define NO_LIMITED_CONTROLLER_CONNECT
 | ||||
| //		#define NO_SOF_EVENTS
 | ||||
| 
 | ||||
| 		/* USB Device Mode Driver Related Tokens: */ | ||||
| //		#define USE_RAM_DESCRIPTORS
 | ||||
| 		#define USE_FLASH_DESCRIPTORS | ||||
| //		#define USE_EEPROM_DESCRIPTORS
 | ||||
| //		#define NO_INTERNAL_SERIAL
 | ||||
| 		#define FIXED_CONTROL_ENDPOINT_SIZE      8 | ||||
| //		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}
 | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE
 | ||||
| 		#define MAX_ENDPOINT_INDEX               2 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP
 | ||||
| //		#define NO_DEVICE_SELF_POWER
 | ||||
| 
 | ||||
| 	#else | ||||
| 
 | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
| 
 | ||||
| 	#endif | ||||
| #endif | ||||
| @ -1,366 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special | ||||
|  *  computer-readable structures which the host requests upon device enumeration, to determine | ||||
|  *  the device's capabilities and functions. | ||||
|  */ | ||||
| 
 | ||||
| #include "Descriptors.h" | ||||
| 
 | ||||
| /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 | ||||
|  *  device characteristics, including the supported USB version, control endpoint size and the | ||||
|  *  number of device configurations. The descriptor is read out by the USB host when the enumeration | ||||
|  *  process begins. | ||||
|  */ | ||||
| const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
| 
 | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
| 
 | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
| 
 | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x206D, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,2), | ||||
| 
 | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.SerialNumStrIndex      = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS | ||||
| }; | ||||
| 
 | ||||
| /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 | ||||
|  *  of the device in one of its supported configurations, including information about any device interfaces | ||||
|  *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting | ||||
|  *  a configuration so that the host may correctly communicate with the USB device. | ||||
|  */ | ||||
| const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | ||||
| { | ||||
| 	.Config = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | ||||
| 
 | ||||
| 			.TotalConfigurationSize   = sizeof(USB_Descriptor_Configuration_t), | ||||
| 			.TotalInterfaces          = 2, | ||||
| 
 | ||||
| 			.ConfigurationNumber      = 1, | ||||
| 			.ConfigurationStrIndex    = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 			.ConfigAttributes         = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
| 
 | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 0, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
| 
 | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = sizeof(USB_Audio_Descriptor_Interface_AC_t), | ||||
| 
 | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints           = 2, | ||||
| 
 | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_MIDIStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
| 
 | ||||
| 			.AudioSpecification       = VERSION_BCD(1,0,0), | ||||
| 
 | ||||
| 			.TotalLength              = (sizeof(USB_Descriptor_Configuration_t) - | ||||
| 			                             offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC)) | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_In_Jack_Emb = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x01, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_In_Jack_Emb2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x02, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_In_Jack_Ext = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x03, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_In_Jack_Ext2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x04, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_Out_Jack_Emb = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x05, | ||||
| 
 | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x03}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_Out_Jack_Emb2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x06, | ||||
| 
 | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x04}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_Out_Jack_Ext = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x07, | ||||
| 
 | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x01}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_Out_Jack_Ext2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
| 
 | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x08, | ||||
| 
 | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x02}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
| 
 | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_In_Jack_Endpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 					.EndpointAddress     = MIDI_STREAM_OUT_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = MIDI_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x05 | ||||
| 				}, | ||||
| 
 | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_In_Jack_Endpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_DualJack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
| 
 | ||||
| 			.TotalEmbeddedJacks       = 0x02, | ||||
| 			.AssociatedJackID         = {0x01, 0x02} | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_Out_Jack_Endpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 					.EndpointAddress     = MIDI_STREAM_IN_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = MIDI_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x05 | ||||
| 				}, | ||||
| 
 | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
| 
 | ||||
| 	.MIDI_Out_Jack_Endpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_DualJack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
| 
 | ||||
| 			.TotalEmbeddedJacks       = 0x02, | ||||
| 			.AssociatedJackID         = {0x05, 0x06} | ||||
| 		} | ||||
| }; | ||||
| 
 | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
 | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); | ||||
| 
 | ||||
| /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
 | ||||
|  *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||
|  *  Descriptor. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"Dean Camera"); | ||||
| 
 | ||||
| /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
 | ||||
|  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||
|  *  Descriptor. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Dual MIDI Demo"); | ||||
| 
 | ||||
| /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 | ||||
|  *  documentation) by the application code so that the address and size of a requested descriptor can be given | ||||
|  *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function | ||||
|  *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the | ||||
|  *  USB host. | ||||
|  */ | ||||
| uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
|                                     const uint8_t wIndex, | ||||
|                                     const void** const DescriptorAddress) | ||||
| { | ||||
| 	const uint8_t  DescriptorType   = (wValue >> 8); | ||||
| 	const uint8_t  DescriptorNumber = (wValue & 0xFF); | ||||
| 
 | ||||
| 	const void* Address = NULL; | ||||
| 	uint16_t    Size    = NO_DESCRIPTOR; | ||||
| 
 | ||||
| 	switch (DescriptorType) | ||||
| 	{ | ||||
| 		case DTYPE_Device: | ||||
| 			Address = &DeviceDescriptor; | ||||
| 			Size    = sizeof(USB_Descriptor_Device_t); | ||||
| 			break; | ||||
| 		case DTYPE_Configuration: | ||||
| 			Address = &ConfigurationDescriptor; | ||||
| 			Size    = sizeof(USB_Descriptor_Configuration_t); | ||||
| 			break; | ||||
| 		case DTYPE_String: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
| 
 | ||||
| @ -1,124 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Header file for Descriptors.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DESCRIPTORS_H_ | ||||
| #define _DESCRIPTORS_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 
 | ||||
| 		#include <avr/pgmspace.h> | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the MIDI streaming data IN endpoint, for device-to-host data transfers. */ | ||||
| 		#define MIDI_STREAM_IN_EPADDR       (ENDPOINT_DIR_IN  | 2) | ||||
| 
 | ||||
| 		/** Endpoint address of the MIDI streaming data OUT endpoint, for host-to-device data transfers. */ | ||||
| 		#define MIDI_STREAM_OUT_EPADDR      (ENDPOINT_DIR_OUT | 1) | ||||
| 
 | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data IN and OUT endpoints. */ | ||||
| 		#define MIDI_STREAM_EPSIZE          64 | ||||
| 
 | ||||
| 	/* Type Defines: */ | ||||
|  		/** Type define for a dual jack endpoint descriptor. This is identical to the LUFA MIDI class driver's
 | ||||
|  		 *  USB_MIDI_Descriptor_Jack_Endpoint_t, except that it contains two jack association entries. | ||||
|  		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			USB_Descriptor_Header_t   Header; /**< Regular descriptor header containing the descriptor's type and length. */ | ||||
| 			uint8_t                   Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ | ||||
| 
 | ||||
| 			uint8_t                   TotalEmbeddedJacks; /**< Total number of jacks inside this endpoint. */ | ||||
| 			uint8_t                   AssociatedJackID[2]; /**< IDs of each jack inside the endpoint. */ | ||||
| 		} ATTR_PACKED USB_MIDI_Descriptor_DualJack_Endpoint_t; | ||||
| 
 | ||||
| 		/** Type define for the device configuration descriptor structure. This must be defined in the
 | ||||
| 		 *  application code, as the configuration descriptor contains several sub-descriptors which | ||||
| 		 *  vary between devices, and which describe the device's usage to the host. | ||||
| 		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			USB_Descriptor_Configuration_Header_t     Config; | ||||
| 
 | ||||
| 			// MIDI Audio Control Interface
 | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
| 
 | ||||
| 			// MIDI Audio Streaming Interface
 | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface; | ||||
| 			USB_MIDI_Descriptor_AudioInterface_AS_t   Audio_StreamInterface_SPC; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Emb; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Emb2; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Ext; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Ext2; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Emb; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Emb2; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Ext; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Ext2; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_In_Jack_Endpoint; | ||||
| 			USB_MIDI_Descriptor_DualJack_Endpoint_t   MIDI_In_Jack_Endpoint_SPC; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint; | ||||
| 			USB_MIDI_Descriptor_DualJack_Endpoint_t   MIDI_Out_Jack_Endpoint_SPC; | ||||
| 		} USB_Descriptor_Configuration_t; | ||||
| 
 | ||||
| 		/** Enum for the device interface descriptor IDs within the device. Each interface descriptor
 | ||||
| 		 *  should have a unique ID index associated with it, which can be used to refer to the | ||||
| 		 *  interface from other descriptors. | ||||
| 		 */ | ||||
| 		enum InterfaceDescriptors_t | ||||
| 		{ | ||||
| 			INTERFACE_ID_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio streaming interface descriptor ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 		/** Enum for the device string descriptor IDs within the device. Each string descriptor should
 | ||||
| 		 *  have a unique ID index associated with it, which can be used to refer to the string from | ||||
| 		 *  other descriptors. | ||||
| 		 */ | ||||
| 		enum StringDescriptors_t | ||||
| 		{ | ||||
| 			STRING_ID_Language     = 0, /**< Supported Languages string descriptor ID (must be zero) */ | ||||
| 			STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */ | ||||
| 			STRING_ID_Product      = 2, /**< Product string ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
| 		                                    const uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| @ -1,211 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Main source file for the Dual MIDI demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
| 
 | ||||
| #include "DualMIDI.h" | ||||
| 
 | ||||
| /** LUFA MIDI Class driver interface configuration and state information. This structure is
 | ||||
|  *  passed to all MIDI Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_MIDI_Device_t Keyboard_MIDI_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = MIDI_STREAM_IN_EPADDR, | ||||
| 						.Size             = MIDI_STREAM_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.DataOUTEndpoint          = | ||||
| 					{ | ||||
| 						.Address          = MIDI_STREAM_OUT_EPADDR, | ||||
| 						.Size             = MIDI_STREAM_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
| 
 | ||||
| 
 | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial
 | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
| 
 | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		CheckJoystickMovement(); | ||||
| 
 | ||||
| 		MIDI_EventPacket_t ReceivedMIDIEvent; | ||||
| 		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) | ||||
| 		{ | ||||
| 			if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (ReceivedMIDIEvent.Data3 > 0)) | ||||
| 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | ||||
| 			else | ||||
| 			  LEDs_SetAllLEDs(LEDS_NO_LEDS); | ||||
| 		} | ||||
| 
 | ||||
| 		MIDI_Device_USBTask(&Keyboard_MIDI_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
| 
 | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
| 
 | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
| 
 | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
| 
 | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
| 
 | ||||
| /** Checks for changes in the position of the board joystick, sending MIDI events to the host upon each change. */ | ||||
| void CheckJoystickMovement(void) | ||||
| { | ||||
| 	static uint8_t PrevJoystickStatus; | ||||
| 
 | ||||
| 	uint8_t MIDICommand = 0; | ||||
| 	uint8_t MIDIPitch; | ||||
| 
 | ||||
| 	/* Get current joystick mask, XOR with previous to detect joystick changes */ | ||||
| 	uint8_t JoystickStatus  = Joystick_GetStatus(); | ||||
| 	uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus); | ||||
| 
 | ||||
| 	/* Get board button status - if pressed use second virtual cable, otherwise use the first */ | ||||
| 	uint8_t VirtualCable = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? 1 : 0; | ||||
| 
 | ||||
| 	if (JoystickChanges & JOY_LEFT) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3C; | ||||
| 	} | ||||
| 
 | ||||
| 	if (JoystickChanges & JOY_UP) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3D; | ||||
| 	} | ||||
| 
 | ||||
| 	if (JoystickChanges & JOY_RIGHT) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3E; | ||||
| 	} | ||||
| 
 | ||||
| 	if (JoystickChanges & JOY_DOWN) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3F; | ||||
| 	} | ||||
| 
 | ||||
| 	if (JoystickChanges & JOY_PRESS) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3B; | ||||
| 	} | ||||
| 
 | ||||
| 	if (MIDICommand) | ||||
| 	{ | ||||
| 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||
| 			{ | ||||
| 				.Event       = MIDI_EVENT(VirtualCable, MIDICommand), | ||||
| 
 | ||||
| 				.Data1       = MIDICommand | MIDI_CHANNEL(1), | ||||
| 				.Data2       = MIDIPitch, | ||||
| 				.Data3       = MIDI_STANDARD_VELOCITY, | ||||
| 			}; | ||||
| 
 | ||||
| 		MIDI_Device_SendEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent); | ||||
| 		MIDI_Device_Flush(&Keyboard_MIDI_Interface); | ||||
| 	} | ||||
| 
 | ||||
| 	PrevJoystickStatus = JoystickStatus; | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
| 
 | ||||
| 	ConfigSuccess &= MIDI_Device_ConfigureEndpoints(&Keyboard_MIDI_Interface); | ||||
| 
 | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
| 
 | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	MIDI_Device_ProcessControlRequest(&Keyboard_MIDI_Interface); | ||||
| } | ||||
| 
 | ||||
| @ -1,78 +0,0 @@ | ||||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||
| 
 | ||||
|   Permission to use, copy, modify, distribute, and sell this | ||||
|   software and its documentation for any purpose is hereby granted | ||||
|   without fee, provided that the above copyright notice appear in | ||||
|   all copies and that both that the copyright notice and this | ||||
|   permission notice and warranty disclaimer appear in supporting | ||||
|   documentation, and that the name of the author not be used in | ||||
|   advertising or publicity pertaining to distribution of the | ||||
|   software without specific, written prior permission. | ||||
| 
 | ||||
|   The author disclaims all warranties with regard to this | ||||
|   software, including all implied warranties of merchantability | ||||
|   and fitness.  In no event shall the author be liable for any | ||||
|   special, indirect or consequential damages or any damages | ||||
|   whatsoever resulting from loss of use, data or profits, whether | ||||
|   in an action of contract, negligence or other tortious action, | ||||
|   arising out of or in connection with the use or performance of | ||||
|   this software. | ||||
| */ | ||||
| 
 | ||||
| /** \file
 | ||||
|  * | ||||
|  *  Header file for DualMIDI.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DUAL_MIDI_H_ | ||||
| #define _DUAL_MIDI_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 		#include <string.h> | ||||
| 
 | ||||
| 		#include "Descriptors.h" | ||||
| 
 | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
| 
 | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
| 		void CheckJoystickMovement(void); | ||||
| 
 | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jack Humbert
						Jack Humbert