diff options
Diffstat (limited to 'protocol')
-rw-r--r-- | protocol/lufa/descriptor.c | 11 | ||||
-rw-r--r-- | protocol/lufa/descriptor.h | 18 | ||||
-rw-r--r-- | protocol/lufa/lufa.c | 61 | ||||
-rwxr-xr-x | protocol/lufa/midi/Config/LUFAConfig.h | 93 |
4 files changed, 162 insertions, 21 deletions
diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c index 6eedd57000..0536b79110 100644 --- a/protocol/lufa/descriptor.c +++ b/protocol/lufa/descriptor.c @@ -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 }; diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h index 58a7df4407..44f4c8f4a6 100644 --- a/protocol/lufa/descriptor.h +++ b/protocol/lufa/descriptor.h @@ -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 diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index d4c8eb1692..0bb667a4e6 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -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 diff --git a/protocol/lufa/midi/Config/LUFAConfig.h b/protocol/lufa/midi/Config/LUFAConfig.h new file mode 100755 index 0000000000..fa9404498f --- /dev/null +++ b/protocol/lufa/midi/Config/LUFAConfig.h @@ -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
|