diff options
Diffstat (limited to 'protocol/lufa')
| -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 6eedd5700..0536b7911 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 58a7df440..44f4c8f4a 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 d4c8eb169..0bb667a4e 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 000000000..fa9404498 --- /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
 | 
