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) \
 | SRC += $(KEYBOARD_FILE) \
 | ||||||
| 	$(KEYMAP_FILE) \
 | 	$(KEYMAP_FILE) \
 | ||||||
| 	$(QUANTUM_DIR)/quantum.c \
 | 	$(QUANTUM_DIR)/quantum.c \
 | ||||||
| 	$(QUANTUM_DIR)/keymap_common.c \
 | 	$(QUANTUM_DIR)/keymap.c \
 | ||||||
|  | 	$(QUANTUM_DIR)/keycode_config.c \
 | ||||||
| 	$(QUANTUM_DIR)/led.c | 	$(QUANTUM_DIR)/led.c | ||||||
| 
 | 
 | ||||||
| ifndef CUSTOM_MATRIX | ifndef CUSTOM_MATRIX | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define ARROW_PAD_H | #define ARROW_PAD_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #ifdef BACKLIGHT_ENABLE | #ifdef BACKLIGHT_ENABLE | ||||||
| 	#include "backlight.h" | 	#include "backlight.h" | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define ATREUS_H | #define ATREUS_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define BANTAM44_H | #define BANTAM44_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define CLUEBOARD1_H | #define CLUEBOARD1_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define CLUEBOARD2_H | #define CLUEBOARD2_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define CLUEPAD_H | #define CLUEPAD_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #include "ergodox_ez.h" | #include "ergodox_ez.h" | ||||||
| #include "action_layer.h" | #include "action_layer.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "keymap_extras/keymap_german.h" | #include "keymap_extras/keymap_german.h" | ||||||
| 
 | 
 | ||||||
| #define UC_ASYMPTOTICALLY_EQUAL_TO 0 | #define UC_ASYMPTOTICALLY_EQUAL_TO 0 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include "action_layer.h" | #include "action_layer.h" | ||||||
| #include "action_util.h" | #include "action_util.h" | ||||||
| #include "led.h" | #include "led.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "timer.h" | #include "timer.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define GH60_H | #define GH60_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define HHKB_H | #define HHKB_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| //#include "backlight.h"
 | //#include "backlight.h"
 | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define JD45_H | #define JD45_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define KC60_H | #define KC60_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #ifdef BACKLIGHT_ENABLE | #ifdef BACKLIGHT_ENABLE | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define PHANTOM_H | #define PHANTOM_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "planck.h" | #include "planck.h" | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [0] = { /* Qwerty */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [0] = { /* Qwerty */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|     [0] = { /* Native */ |     [0] = { /* Native */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [0] = { /* Qwerty */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [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] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [0] = { /* Qwerty */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "keymap_colemak.h" | #include "keymap_colemak.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 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] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [0] = { /* Qwerty */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* BASE */ | [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! | 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 "keymap_extras/keymap_german.h" | ||||||
| #include "backlight.h" | #include "backlight.h" | ||||||
| #include "debug.h" | #include "debug.h" | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = { /* Qwerty */ | [0] = { /* Qwerty */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP(  | [0] = KEYMAP(  | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP(  | [0] = KEYMAP(  | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( /* Jack */ | [0] = KEYMAP( /* Jack */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( /* Joe qwerty */ | [0] = KEYMAP( /* Joe qwerty */ | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
| `-----------------------------------------------------------------------------------------------' | `-----------------------------------------------------------------------------------------------' | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|   /* 0: dvorak */ |   /* 0: dvorak */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( | [0] = KEYMAP( | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| // Author: Nathan Ross Powell <nathanrospowell@gmail.com>
 | // Author: Nathan Ross Powell <nathanrospowell@gmail.com>
 | ||||||
| // https://github.com/nathanrosspowell/tmk_keyboard/blob/planck-jack/keyboard/planck/keymap_nathan.c
 | // 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] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|    /* 0: main layer
 |    /* 0: main layer
 | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( /* Paul */ | [0] = KEYMAP( /* Paul */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|     [0] = KEYMAP( /* Native */ |     [0] = KEYMAP( /* Native */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * BUILD: |  * BUILD: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|     [0] = KEYMAP( /* Matrix Dvorak */ |     [0] = KEYMAP( /* Matrix Dvorak */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "action_layer.h" | #include "action_layer.h" | ||||||
| #include "action.h" | #include "action.h" | ||||||
| #include "action_util.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] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( /* Jack */ | [0] = KEYMAP( /* Jack */ | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( | [0] = KEYMAP( | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
| [0] = KEYMAP( /* Wilba */ | [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 | You should have received a copy of the GNU General Public License | ||||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
| */ | */ | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* translates key to keycode */ | /* translates key to keycode */ | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define RETRO_REFIT_H | #define RETRO_REFIT_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "led.h" | #include "led.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define SATAN_H | #define SATAN_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| #include <avr/io.h> | #include <avr/io.h> | ||||||
| #include "print.h" | #include "print.h" | ||||||
| #include "audio.h" | #include "audio.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| #include "eeconfig.h" | #include "eeconfig.h" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| #include <avr/io.h> | #include <avr/io.h> | ||||||
| #include "print.h" | #include "print.h" | ||||||
| #include "audio.h" | #include "audio.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| #include "eeconfig.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 | #ifndef KEYMAP_BEPO_H | ||||||
| #define KEYMAP_BEPO_H | #define KEYMAP_BEPO_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #ifndef ALTGR | #ifndef ALTGR | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_COLEMAK_H | #ifndef KEYMAP_COLEMAK_H | ||||||
| #define KEYMAP_COLEMAK_H | #define KEYMAP_COLEMAK_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| // For software implementation of colemak
 | // For software implementation of colemak
 | ||||||
| #define CM_Q    KC_Q | #define CM_Q    KC_Q | ||||||
| #define CM_W    KC_W | #define CM_W    KC_W | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_DVORAK_H | #ifndef KEYMAP_DVORAK_H | ||||||
| #define KEYMAP_DVORAK_H | #define KEYMAP_DVORAK_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Normal characters
 | // Normal characters
 | ||||||
| #define DV_GRV	KC_GRV | #define DV_GRV	KC_GRV | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_FR_CH | #ifndef KEYMAP_FR_CH | ||||||
| #define KEYMAP_FR_CH | #define KEYMAP_FR_CH | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #define ALGR(kc) kc | 0x1400 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_FRENCH_H | #ifndef KEYMAP_FRENCH_H | ||||||
| #define KEYMAP_FRENCH_H | #define KEYMAP_FRENCH_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #define ALGR(kc) kc | 0x1400 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_FRENCH_OSX_H | #ifndef KEYMAP_FRENCH_OSX_H | ||||||
| #define KEYMAP_FRENCH_OSX_H | #define KEYMAP_FRENCH_OSX_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Normal characters
 | // Normal characters
 | ||||||
| #define FR_AT 	KC_GRV | #define FR_AT 	KC_GRV | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_GERMAN | #ifndef KEYMAP_GERMAN | ||||||
| #define KEYMAP_GERMAN | #define KEYMAP_GERMAN | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #define ALGR(kc) kc | 0x1400 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_SWISS_GERMAN | #ifndef KEYMAP_SWISS_GERMAN | ||||||
| #define KEYMAP_SWISS_GERMAN | #define KEYMAP_SWISS_GERMAN | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #define ALGR(kc) kc | 0x1400 | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ | |||||||
| #ifdef KEYMAP_GERMAN | #ifdef KEYMAP_GERMAN | ||||||
| 	#warning redefining german keys | 	#warning redefining german keys | ||||||
| #endif | #endif | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_NEO2 | #ifndef KEYMAP_NEO2 | ||||||
| #define KEYMAP_NEO2 | #define KEYMAP_NEO2 | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "keymap_extras/keymap_german.h" | #include "keymap_extras/keymap_german.h" | ||||||
| 
 | 
 | ||||||
| #define NEO_A KC_D | #define NEO_A KC_D | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_NORDIC_H | #ifndef KEYMAP_NORDIC_H | ||||||
| #define KEYMAP_NORDIC_H | #define KEYMAP_NORDIC_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #define ALGR(kc) kc | 0x1400 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_PLOVER_H | #ifndef KEYMAP_PLOVER_H | ||||||
| #define KEYMAP_PLOVER_H | #define KEYMAP_PLOVER_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| #define PV_NUM  KC_1 | #define PV_NUM  KC_1 | ||||||
| #define PV_LS   KC_Q | #define PV_LS   KC_Q | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_SPANISH_H | #ifndef KEYMAP_SPANISH_H | ||||||
| #define KEYMAP_SPANISH_H | #define KEYMAP_SPANISH_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #define ALGR(kc) kc | 0x1400 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #ifndef KEYMAP_UK_H | #ifndef KEYMAP_UK_H | ||||||
| #define KEYMAP_UK_H | #define KEYMAP_UK_H | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| 
 | 
 | ||||||
| // Alt gr
 | // Alt gr
 | ||||||
| #define ALGR(kc) kc | 0x1400 | #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/>.
 | along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #include "keymap_midi.h" | #include "keymap_midi.h" | ||||||
| 
 | 
 | ||||||
| uint8_t starting_note = 0x0C; | uint8_t starting_note = 0x0C; | ||||||
|  | |||||||
| @ -1,5 +1,4 @@ | |||||||
| #include "quantum.h" | #include "quantum.h" | ||||||
| #include "timer.h" |  | ||||||
| 
 | 
 | ||||||
| __attribute__ ((weak)) | __attribute__ ((weak)) | ||||||
| void matrix_init_kb(void) {} | void matrix_init_kb(void) {} | ||||||
| @ -35,15 +34,15 @@ int offset = 7; | |||||||
| #ifdef AUDIO_ENABLE | #ifdef AUDIO_ENABLE | ||||||
|   bool music_activated = false; |   bool music_activated = false; | ||||||
| 
 | 
 | ||||||
| // music sequencer
 |   // music sequencer
 | ||||||
| static bool music_sequence_recording = false; |   static bool music_sequence_recording = false; | ||||||
| static bool music_sequence_playing = false; |   static bool music_sequence_playing = false; | ||||||
| static float music_sequence[16] = {0}; |   static float music_sequence[16] = {0}; | ||||||
| static uint8_t music_sequence_count = 0; |   static uint8_t music_sequence_count = 0; | ||||||
| static uint8_t music_sequence_position = 0; |   static uint8_t music_sequence_position = 0; | ||||||
| 
 | 
 | ||||||
| static uint16_t music_sequence_timer = 0; |   static uint16_t music_sequence_timer = 0; | ||||||
| static uint16_t music_sequence_interval = 100; |   static uint16_t music_sequence_interval = 100; | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| @ -172,10 +171,6 @@ bool process_record_quantum(keyrecord_t *record) { | |||||||
|           if (record->event.pressed) { |           if (record->event.pressed) { | ||||||
|               starting_note++; // Change key
 |               starting_note++; // Change key
 | ||||||
|               midi_send_cc(&midi_device, 0, 0x7B, 0); |               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; |           return false; | ||||||
|       } |       } | ||||||
| @ -183,29 +178,17 @@ bool process_record_quantum(keyrecord_t *record) { | |||||||
|           if (record->event.pressed) { |           if (record->event.pressed) { | ||||||
|               starting_note--; // Change key
 |               starting_note--; // Change key
 | ||||||
|               midi_send_cc(&midi_device, 0, 0x7B, 0); |               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; |           return false; | ||||||
|       } |       } | ||||||
|       if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { |       if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { | ||||||
|           offset++; // Change scale
 |           offset++; // Change scale
 | ||||||
|           midi_send_cc(&midi_device, 0, 0x7B, 0); |           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; |           return false; | ||||||
|       } |       } | ||||||
|       if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { |       if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { | ||||||
|           offset--; // Change scale
 |           offset--; // Change scale
 | ||||||
|           midi_send_cc(&midi_device, 0, 0x7B, 0); |           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; |           return false; | ||||||
|       } |       } | ||||||
|       // basic
 |       // basic
 | ||||||
| @ -365,7 +348,7 @@ bool process_record_quantum(keyrecord_t *record) { | |||||||
| #define DISABLE_CHORDING | #define DISABLE_CHORDING | ||||||
| #ifndef DISABLE_CHORDING | #ifndef DISABLE_CHORDING | ||||||
| 
 | 
 | ||||||
|   if (keycode >= 0x5700 && keycode <= 0x57FF) { |   if (keycode >= QK_CHORDING && keycode <= QK_CHORDING_MAX) { | ||||||
|     if (record->event.pressed) { |     if (record->event.pressed) { | ||||||
|       if (!chording) { |       if (!chording) { | ||||||
|         chording = true; |         chording = true; | ||||||
| @ -403,7 +386,7 @@ bool process_record_quantum(keyrecord_t *record) { | |||||||
| 
 | 
 | ||||||
| #ifdef UNICODE_ENABLE | #ifdef UNICODE_ENABLE | ||||||
| 
 | 
 | ||||||
|   if (keycode > UNICODE(0) && record->event.pressed) { |   if (keycode > QK_UNICODE && record->event.pressed) { | ||||||
|     uint16_t unicode = keycode & 0x7FFF; |     uint16_t unicode = keycode & 0x7FFF; | ||||||
|     switch(input_mode) { |     switch(input_mode) { | ||||||
|       case UC_OSX: |       case UC_OSX: | ||||||
| @ -443,42 +426,117 @@ bool process_record_quantum(keyrecord_t *record) { | |||||||
|   // Shift / paren setup
 |   // Shift / paren setup
 | ||||||
| 
 | 
 | ||||||
|   switch(keycode) { |   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: { |     case KC_LSPO: { | ||||||
|                     if (record->event.pressed) { |       if (record->event.pressed) { | ||||||
|                       shift_interrupted[0] = false; |         shift_interrupted[0] = false; | ||||||
|                       register_mods(MOD_LSFT); |         register_mods(MOD_LSFT); | ||||||
|                     } |       } | ||||||
|                     else { |       else { | ||||||
|                       if (!shift_interrupted[0]) { |         if (!shift_interrupted[0]) { | ||||||
|                         register_code(LSPO_KEY); |           register_code(LSPO_KEY); | ||||||
|                         unregister_code(LSPO_KEY); |           unregister_code(LSPO_KEY); | ||||||
|                       } |         } | ||||||
|                       unregister_mods(MOD_LSFT); |         unregister_mods(MOD_LSFT); | ||||||
|                     } |       } | ||||||
|                     return false; |       return false; | ||||||
|                     break; |       break; | ||||||
|                   } |     } | ||||||
| 
 | 
 | ||||||
|     case KC_RSPC: { |     case KC_RSPC: { | ||||||
|                     if (record->event.pressed) { |       if (record->event.pressed) { | ||||||
|                       shift_interrupted[1] = false; |         shift_interrupted[1] = false; | ||||||
|                       register_mods(MOD_RSFT); |         register_mods(MOD_RSFT); | ||||||
|                     } |       } | ||||||
|                     else { |       else { | ||||||
|                       if (!shift_interrupted[1]) { |         if (!shift_interrupted[1]) { | ||||||
|                         register_code(RSPC_KEY); |           register_code(RSPC_KEY); | ||||||
|                         unregister_code(RSPC_KEY); |           unregister_code(RSPC_KEY); | ||||||
|                       } |         } | ||||||
|                       unregister_mods(MOD_RSFT); |         unregister_mods(MOD_RSFT); | ||||||
|                     } |       } | ||||||
|                     return false; |       return false; | ||||||
|                     break; |       break; | ||||||
|                   } |     } | ||||||
|     default: { |     default: { | ||||||
|                shift_interrupted[0] = true; |       shift_interrupted[0] = true; | ||||||
|                shift_interrupted[1] = true; |       shift_interrupted[1] = true; | ||||||
|                break; |       break; | ||||||
|              } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return process_action_kb(record); |   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() { | void matrix_init_quantum() { | ||||||
|   matrix_init_kb(); |   matrix_init_kb(); | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| 
 | 
 | ||||||
| #include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #ifdef BACKLIGHT_ENABLE | #ifdef BACKLIGHT_ENABLE | ||||||
|     #include "backlight.h" |     #include "backlight.h" | ||||||
| #endif | #endif | ||||||
| @ -25,8 +25,8 @@ | |||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| #include <avr/io.h> | #include <avr/io.h> | ||||||
| #include <util/delay.h> | #include <util/delay.h> | ||||||
| 
 | #include "bootloader.h" | ||||||
| #define SEND_STRING(str) send_string(PSTR(str)) | #include "timer.h" | ||||||
| 
 | 
 | ||||||
| extern uint32_t default_layer_state; | 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) | 	#define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #define SEND_STRING(str) send_string(PSTR(str)) | ||||||
| void send_string(const char *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_init_kb(void); | ||||||
| void matrix_scan_kb(void); | void matrix_scan_kb(void); | ||||||
| bool process_action_kb(keyrecord_t *record); | bool process_action_kb(keyrecord_t *record); | ||||||
| bool process_record_kb(uint16_t keycode, keyrecord_t *record); | bool process_record_kb(uint16_t keycode, keyrecord_t *record); | ||||||
| bool process_record_user(uint16_t keycode, keyrecord_t *record); | bool process_record_user(uint16_t keycode, keyrecord_t *record); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| bool is_music_on(void); | bool is_music_on(void); | ||||||
| void music_toggle(void); | void music_toggle(void); | ||||||
| void music_on(void); | void music_on(void); | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #define %KEYBOARD_UPPERCASE%_H | #define %KEYBOARD_UPPERCASE%_H | ||||||
| 
 | 
 | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| #include "keymap_common.h" | #include "keymap.h" | ||||||
| #ifdef BACKLIGHT_ENABLE | #ifdef BACKLIGHT_ENABLE | ||||||
| 	#include "backlight.h" | 	#include "backlight.h" | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -6,7 +6,6 @@ SRC +=	$(COMMON_DIR)/host.c \ | |||||||
| 	$(COMMON_DIR)/action_macro.c \
 | 	$(COMMON_DIR)/action_macro.c \
 | ||||||
| 	$(COMMON_DIR)/action_layer.c \
 | 	$(COMMON_DIR)/action_layer.c \
 | ||||||
| 	$(COMMON_DIR)/action_util.c \
 | 	$(COMMON_DIR)/action_util.c \
 | ||||||
| 	$(COMMON_DIR)/keymap.c \
 |  | ||||||
| 	$(COMMON_DIR)/print.c \
 | 	$(COMMON_DIR)/print.c \
 | ||||||
| 	$(COMMON_DIR)/debug.c \
 | 	$(COMMON_DIR)/debug.c \
 | ||||||
| 	$(COMMON_DIR)/util.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) | 	   $(LUFA_SRC_USB) | ||||||
| 
 | 
 | ||||||
| ifeq ($(strip $(MIDI_ENABLE)), yes) | ifeq ($(strip $(MIDI_ENABLE)), yes) | ||||||
| 	LUFA_SRC += midi/midi.c \
 | 	include $(TMK_PATH)/protocol/midi.mk | ||||||
| 	   midi/midi_device.c \
 |  | ||||||
| 	   midi/bytequeue/bytequeue.c \
 |  | ||||||
| 	   midi/bytequeue/interrupt_setting.c \
 |  | ||||||
| 	   $(LUFA_SRC_USBCLASS) |  | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | 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