preonic
This commit is contained in:
parent
fb4fe52c0a
commit
04885a3b44
40 changed files with 3111 additions and 38 deletions
|
@ -487,6 +487,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
},
|
||||
#endif
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
.Audio_ControlInterface =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||
|
@ -508,7 +509,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.Header = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface},
|
||||
.Subtype = AUDIO_DSUBTYPE_CSInterface_Header,
|
||||
|
||||
.ACSpecification = VERSION_BCD(1,1,1),
|
||||
.ACSpecification = VERSION_BCD(1,0,0),
|
||||
.TotalLength = sizeof(USB_Audio_Descriptor_Interface_AC_t),
|
||||
|
||||
.InCollection = 1,
|
||||
|
@ -536,7 +537,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.Header = {.Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t), .Type = DTYPE_CSInterface},
|
||||
.Subtype = AUDIO_DSUBTYPE_CSInterface_General,
|
||||
|
||||
.AudioSpecification = VERSION_BCD(1,1,1),
|
||||
.AudioSpecification = VERSION_BCD(1,0,0),
|
||||
|
||||
.TotalLength = (sizeof(USB_Descriptor_Configuration_t) -
|
||||
offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC))
|
||||
|
@ -603,7 +604,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.EndpointAddress = (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM),
|
||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||
.EndpointSize = MIDI_STREAM_EPSIZE,
|
||||
.PollingIntervalMS = 0x01
|
||||
.PollingIntervalMS = 0x05
|
||||
},
|
||||
|
||||
.Refresh = 0,
|
||||
|
@ -628,7 +629,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.EndpointAddress = (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM),
|
||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||
.EndpointSize = MIDI_STREAM_EPSIZE,
|
||||
.PollingIntervalMS = 0x01
|
||||
.PollingIntervalMS = 0x05
|
||||
},
|
||||
|
||||
.Refresh = 0,
|
||||
|
@ -643,7 +644,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.TotalEmbeddedJacks = 0x01,
|
||||
.AssociatedJackID = {0x03}
|
||||
}
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -86,6 +86,7 @@ typedef struct
|
|||
USB_Descriptor_Endpoint_t NKRO_INEndpoint;
|
||||
#endif
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
// MIDI Audio Control Interface
|
||||
USB_Descriptor_Interface_t Audio_ControlInterface;
|
||||
USB_Audio_Descriptor_Interface_AC_t Audio_ControlInterface_SPC;
|
||||
|
@ -101,6 +102,7 @@ typedef struct
|
|||
USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_In_Jack_Endpoint_SPC;
|
||||
USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint;
|
||||
USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_Out_Jack_Endpoint_SPC;
|
||||
#endif
|
||||
|
||||
} USB_Descriptor_Configuration_t;
|
||||
|
||||
|
@ -132,9 +134,14 @@ typedef struct
|
|||
# define NKRO_INTERFACE CONSOLE_INTERFACE
|
||||
#endif
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
# define MIDI_INTERFACE (NKRO_INTERFACE + 1)
|
||||
#else
|
||||
# define MIDI_INTERFACE NKRO_INTERFACE
|
||||
#endif
|
||||
|
||||
/* nubmer of interfaces */
|
||||
#define TOTAL_INTERFACES (NKRO_INTERFACE + 3)
|
||||
#define TOTAL_INTERFACES (MIDI_INTERFACE + 1)
|
||||
|
||||
|
||||
// Endopoint number and size
|
||||
|
@ -167,8 +174,13 @@ typedef struct
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#define MIDI_STREAM_IN_EPNUM (NKRO_IN_EPNUM + 1)
|
||||
#define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 1)
|
||||
#ifdef MIDI_ENABLE
|
||||
# define MIDI_STREAM_IN_EPNUM (NKRO_IN_EPNUM + 1)
|
||||
# define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 1)
|
||||
#else
|
||||
# define MIDI_STREAM_IN_EPNUM NKRO_IN_EPNUM
|
||||
# define MIDI_STREAM_OUT_EPNUM NKRO_IN_EPNUM
|
||||
#endif
|
||||
|
||||
|
||||
#define KEYBOARD_EPSIZE 8
|
||||
|
|
|
@ -66,27 +66,35 @@ static void send_keyboard(report_keyboard_t *report);
|
|||
static void send_mouse(report_mouse_t *report);
|
||||
static void send_system(uint16_t data);
|
||||
static void send_consumer(uint16_t data);
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2);
|
||||
void usb_get_midi(MidiDevice * device);
|
||||
void midi_usb_init(MidiDevice * device);
|
||||
#endif
|
||||
|
||||
host_driver_t lufa_driver = {
|
||||
keyboard_leds,
|
||||
send_keyboard,
|
||||
send_mouse,
|
||||
send_system,
|
||||
send_consumer,
|
||||
#ifdef MIDI_ENABLE
|
||||
usb_send_func,
|
||||
usb_get_midi,
|
||||
midi_usb_init
|
||||
midi_usb_init,
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
void SetupHardware(void);
|
||||
|
||||
|
||||
USB_ClassInfo_MIDI_Device_t USB_MIDI_Interface =
|
||||
{
|
||||
.Config =
|
||||
{
|
||||
.StreamingInterfaceNumber = 1,
|
||||
.StreamingInterfaceNumber = (NKRO_INTERFACE + 2),
|
||||
.DataINEndpoint =
|
||||
{
|
||||
.Address = (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM),
|
||||
|
@ -112,6 +120,7 @@ USB_ClassInfo_MIDI_Device_t USB_MIDI_Interface =
|
|||
#define SYS_COMMON_3 0x30
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Console
|
||||
******************************************************************************/
|
||||
|
@ -279,8 +288,15 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
|||
NKRO_EPSIZE, ENDPOINT_BANK_SINGLE);
|
||||
#endif
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
// ConfigSuccess &= MIDI_Device_ConfigureEndpoints(&USB_MIDI_Interface);
|
||||
|
||||
ConfigSuccess &= ENDPOINT_CONFIG(MIDI_STREAM_IN_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
|
||||
MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
|
||||
ConfigSuccess &= ENDPOINT_CONFIG(MIDI_STREAM_OUT_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
|
||||
MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
|
||||
#endif
|
||||
|
||||
ConfigSuccess &= MIDI_Device_ConfigureEndpoints(&USB_MIDI_Interface);
|
||||
}
|
||||
|
||||
|
||||
|
@ -589,32 +605,37 @@ int8_t sendchar(uint8_t c)
|
|||
|
||||
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) {
|
||||
MIDI_EventPacket_t event;
|
||||
event.Data1 = byte0;
|
||||
event.Data2 = byte1;
|
||||
event.Data3 = byte2;
|
||||
|
||||
uint8_t cable = 0;
|
||||
|
||||
Endpoint_SelectEndpoint(MIDI_STREAM_IN_EPNUM);
|
||||
|
||||
//if the length is undefined we assume it is a SYSEX message
|
||||
if (midi_packet_length(byte0) == UNDEFINED) {
|
||||
switch(cnt) {
|
||||
case 3:
|
||||
if (byte2 == SYSEX_END)
|
||||
event.Event = MIDI_EVENT(0, SYSEX_ENDS_IN_3);
|
||||
event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_3);
|
||||
else
|
||||
event.Event = MIDI_EVENT(0, SYSEX_START_OR_CONT);
|
||||
event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT);
|
||||
break;
|
||||
case 2:
|
||||
if (byte1 == SYSEX_END)
|
||||
event.Event = MIDI_EVENT(0, SYSEX_ENDS_IN_2);
|
||||
event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_2);
|
||||
else
|
||||
event.Event = MIDI_EVENT(0, SYSEX_START_OR_CONT);
|
||||
event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT);
|
||||
break;
|
||||
case 1:
|
||||
if (byte0 == SYSEX_END)
|
||||
event.Event = MIDI_EVENT(0, SYSEX_ENDS_IN_1);
|
||||
event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_1);
|
||||
else
|
||||
event.Event = MIDI_EVENT(0, SYSEX_START_OR_CONT);
|
||||
event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT);
|
||||
break;
|
||||
default:
|
||||
return; //invalid cnt
|
||||
|
@ -624,18 +645,21 @@ void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byt
|
|||
//TODO are there any more?
|
||||
switch(byte0 & 0xF0){
|
||||
case MIDI_SONGPOSITION:
|
||||
event.Event = MIDI_EVENT(0, SYS_COMMON_3);
|
||||
event.Event = MIDI_EVENT(cable, SYS_COMMON_3);
|
||||
break;
|
||||
case MIDI_SONGSELECT:
|
||||
case MIDI_TC_QUARTERFRAME:
|
||||
event.Event = MIDI_EVENT(0, SYS_COMMON_2);
|
||||
event.Event = MIDI_EVENT(cable, SYS_COMMON_2);
|
||||
break;
|
||||
default:
|
||||
event.Event = MIDI_EVENT(0, byte0);
|
||||
event.Event = MIDI_EVENT(cable, byte0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Endpoint_Write_Stream_LE(&event, sizeof(event), NULL);
|
||||
Endpoint_ClearIN();
|
||||
|
||||
MIDI_Device_SendEventPacket(&USB_MIDI_Interface, &event);
|
||||
MIDI_Device_Flush(&USB_MIDI_Interface);
|
||||
MIDI_Device_USBTask(&USB_MIDI_Interface);
|
||||
|
@ -680,7 +704,7 @@ void midi_usb_init(MidiDevice * device){
|
|||
SetupHardware();
|
||||
sei();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
@ -707,25 +731,30 @@ void SetupHardware(void)
|
|||
print_set_sendchar(sendchar);
|
||||
}
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
void fallthrough_callback(MidiDevice * device,
|
||||
uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2);
|
||||
void cc_callback(MidiDevice * device,
|
||||
uint8_t chan, uint8_t num, uint8_t val);
|
||||
void sysex_callback(MidiDevice * device,
|
||||
uint16_t start, uint8_t length, uint8_t * data);
|
||||
#endif
|
||||
|
||||
int main(void) __attribute__ ((weak));
|
||||
int main(void)
|
||||
{
|
||||
//setup the device
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
midi_device_init(&midi_device);
|
||||
midi_device_set_send_func(&midi_device, usb_send_func);
|
||||
midi_device_set_pre_input_process_func(&midi_device, usb_get_midi);
|
||||
#endif
|
||||
|
||||
SetupHardware();
|
||||
sei();
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
midi_register_fallthrough_callback(&midi_device, fallthrough_callback);
|
||||
midi_register_cc_callback(&midi_device, cc_callback);
|
||||
midi_register_sysex_callback(&midi_device, sysex_callback);
|
||||
|
@ -734,6 +763,8 @@ int main(void)
|
|||
midi_send_cc(&midi_device, 15, 1, 0);
|
||||
midi_send_noteon(&midi_device, 0, 64, 127);
|
||||
midi_send_noteoff(&midi_device, 0, 64, 127);
|
||||
#endif
|
||||
|
||||
|
||||
/* wait for USB startup & debug output */
|
||||
while (USB_DeviceState != DEVICE_STATE_Configured) {
|
||||
|
@ -764,7 +795,9 @@ int main(void)
|
|||
|
||||
keyboard_task();
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
midi_device_process(&midi_device);
|
||||
#endif
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
USB_USBTask();
|
||||
|
@ -772,6 +805,7 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
//echo data back
|
||||
void fallthrough_callback(MidiDevice * device,
|
||||
uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2){
|
||||
|
@ -790,3 +824,4 @@ void sysex_callback(MidiDevice * device,
|
|||
for (int i = 0; i < length; i++)
|
||||
midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i));
|
||||
}
|
||||
#endif
|
||||
|
|
93
protocol/lufa/midi/Config/LUFAConfig.h
Executable file
93
protocol/lufa/midi/Config/LUFAConfig.h
Executable file
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2012.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.lufa-lib.org
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2012 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 disclaim 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
|
Loading…
Add table
Add a link
Reference in a new issue