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 stuffb6_b7_audio
parent
1923cffd41
commit
db32864ce7
File diff suppressed because it is too large
Load Diff
@ -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; |
||||
} |
||||
} |
@ -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; |
@ -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)]); |
||||
} |
@ -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 |
@ -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 |
@ -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…
Reference in new issue