From 04885a3b447c82437d919d467328800eb00af629 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 21 Aug 2015 10:46:53 -0400 Subject: preonic --- protocol/lufa/descriptor.c | 11 ++-- protocol/lufa/descriptor.h | 18 +++++-- protocol/lufa/lufa.c | 61 +++++++++++++++++----- protocol/lufa/midi/Config/LUFAConfig.h | 93 ++++++++++++++++++++++++++++++++++ 4 files changed, 162 insertions(+), 21 deletions(-) create mode 100755 protocol/lufa/midi/Config/LUFAConfig.h (limited to 'protocol') 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 -- cgit v1.2.3