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 stuffexample_keyboards
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