KAMUI USB HOST MIDI-CV Example based on Peter Barrett's BlueUSB

Dependencies:   TextLCD mbed

Committer:
radiojunkbox
Date:
Fri May 11 15:31:59 2012 +0000
Revision:
0:3b4e3e2ec6a5
Rev. 0.1 alfa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radiojunkbox 0:3b4e3e2ec6a5 1
radiojunkbox 0:3b4e3e2ec6a5 2 /*
radiojunkbox 0:3b4e3e2ec6a5 3 Copyright (c) 2012 RadioJunkBox
radiojunkbox 0:3b4e3e2ec6a5 4
radiojunkbox 0:3b4e3e2ec6a5 5 Permission is hereby granted, free of charge, to any person obtaining a copy
radiojunkbox 0:3b4e3e2ec6a5 6 of this software and associated documentation files (the "Software"), to deal
radiojunkbox 0:3b4e3e2ec6a5 7 in the Software without restriction, including without limitation the rights
radiojunkbox 0:3b4e3e2ec6a5 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
radiojunkbox 0:3b4e3e2ec6a5 9 copies of the Software, and to permit persons to whom the Software is
radiojunkbox 0:3b4e3e2ec6a5 10 furnished to do so, subject to the following conditions:
radiojunkbox 0:3b4e3e2ec6a5 11
radiojunkbox 0:3b4e3e2ec6a5 12 The above copyright notice and this permission notice shall be included in
radiojunkbox 0:3b4e3e2ec6a5 13 all copies or substantial portions of the Software.
radiojunkbox 0:3b4e3e2ec6a5 14
radiojunkbox 0:3b4e3e2ec6a5 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
radiojunkbox 0:3b4e3e2ec6a5 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
radiojunkbox 0:3b4e3e2ec6a5 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
radiojunkbox 0:3b4e3e2ec6a5 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
radiojunkbox 0:3b4e3e2ec6a5 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
radiojunkbox 0:3b4e3e2ec6a5 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
radiojunkbox 0:3b4e3e2ec6a5 21 THE SOFTWARE.
radiojunkbox 0:3b4e3e2ec6a5 22 */
radiojunkbox 0:3b4e3e2ec6a5 23
radiojunkbox 0:3b4e3e2ec6a5 24 #include "mbed.h"
radiojunkbox 0:3b4e3e2ec6a5 25 #include "USBHost.h"
radiojunkbox 0:3b4e3e2ec6a5 26 #include "Utils.h"
radiojunkbox 0:3b4e3e2ec6a5 27
radiojunkbox 0:3b4e3e2ec6a5 28 #define MIDIEVT(_class,_subclass,_protocol) (((_class) << 16) | ((_subclass) << 8) | _protocol)
radiojunkbox 0:3b4e3e2ec6a5 29 u8 ms_buf[255]; // MIDI Streaming Buffer
radiojunkbox 0:3b4e3e2ec6a5 30
radiojunkbox 0:3b4e3e2ec6a5 31 // Ring Buffer
radiojunkbox 0:3b4e3e2ec6a5 32 #define BUFSIZE 32 // size of ring buffer (ex 4,8,16,32...)
radiojunkbox 0:3b4e3e2ec6a5 33 extern int gPtr_buf_in, gPtr_buf_out;
radiojunkbox 0:3b4e3e2ec6a5 34 extern unsigned char gRxBuf[];
radiojunkbox 0:3b4e3e2ec6a5 35
radiojunkbox 0:3b4e3e2ec6a5 36 // Received MIDI Steram
radiojunkbox 0:3b4e3e2ec6a5 37 void MidiEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
radiojunkbox 0:3b4e3e2ec6a5 38 {
radiojunkbox 0:3b4e3e2ec6a5 39 int i;
radiojunkbox 0:3b4e3e2ec6a5 40 int ptr = 0;
radiojunkbox 0:3b4e3e2ec6a5 41
radiojunkbox 0:3b4e3e2ec6a5 42 while((data[ptr] != 0) && (ptr < len))
radiojunkbox 0:3b4e3e2ec6a5 43 {
radiojunkbox 0:3b4e3e2ec6a5 44 // printf("MIDI %02X %02X %02X",device,status,len);
radiojunkbox 0:3b4e3e2ec6a5 45 // printfBytes("",data,4);
radiojunkbox 0:3b4e3e2ec6a5 46 for( i = 1; i<4; i++)
radiojunkbox 0:3b4e3e2ec6a5 47 {
radiojunkbox 0:3b4e3e2ec6a5 48 gPtr_buf_in++;
radiojunkbox 0:3b4e3e2ec6a5 49 gPtr_buf_in &= (BUFSIZE - 1);
radiojunkbox 0:3b4e3e2ec6a5 50 gRxBuf[gPtr_buf_in] = data[ptr+i];
radiojunkbox 0:3b4e3e2ec6a5 51 }
radiojunkbox 0:3b4e3e2ec6a5 52 ptr+=4;
radiojunkbox 0:3b4e3e2ec6a5 53 }
radiojunkbox 0:3b4e3e2ec6a5 54 USBBulkTransfer(device,endpoint,data,len,MidiEventCallback,userData);
radiojunkbox 0:3b4e3e2ec6a5 55 }
radiojunkbox 0:3b4e3e2ec6a5 56
radiojunkbox 0:3b4e3e2ec6a5 57 // Add MIDI Interface
radiojunkbox 0:3b4e3e2ec6a5 58 void AddMidiInterface(int device, InterfaceDescriptor* id, EndpointDescriptor* ed,int len)
radiojunkbox 0:3b4e3e2ec6a5 59 {
radiojunkbox 0:3b4e3e2ec6a5 60 if ((ed->bmAttributes & 3) != ENDPOINT_BULK || !(ed->bEndpointAddress & 0x80))
radiojunkbox 0:3b4e3e2ec6a5 61 return;
radiojunkbox 0:3b4e3e2ec6a5 62
radiojunkbox 0:3b4e3e2ec6a5 63 // Make bulk enpoints for MIDI devices
radiojunkbox 0:3b4e3e2ec6a5 64 u32 evt = MIDIEVT(id->bInterfaceClass,id->bInterfaceSubClass,id->bInterfaceProtocol);
radiojunkbox 0:3b4e3e2ec6a5 65 u8* dst = ms_buf;
radiojunkbox 0:3b4e3e2ec6a5 66
radiojunkbox 0:3b4e3e2ec6a5 67 if(dst)
radiojunkbox 0:3b4e3e2ec6a5 68 {
radiojunkbox 0:3b4e3e2ec6a5 69 // printf("Add Midi Interface %02X %08X\r\n",ed->bEndpointAddress,evt);
radiojunkbox 0:3b4e3e2ec6a5 70 USBBulkTransfer(device,ed->bEndpointAddress,dst,len,MidiEventCallback,(void*)evt);
radiojunkbox 0:3b4e3e2ec6a5 71 }
radiojunkbox 0:3b4e3e2ec6a5 72 }
radiojunkbox 0:3b4e3e2ec6a5 73
radiojunkbox 0:3b4e3e2ec6a5 74 // Detected Midi Device
radiojunkbox 0:3b4e3e2ec6a5 75 int OnMidiInsert(int device)
radiojunkbox 0:3b4e3e2ec6a5 76 {
radiojunkbox 0:3b4e3e2ec6a5 77 u8 buffer[255];
radiojunkbox 0:3b4e3e2ec6a5 78 int err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255);
radiojunkbox 0:3b4e3e2ec6a5 79 if (err < 0)
radiojunkbox 0:3b4e3e2ec6a5 80 return err;
radiojunkbox 0:3b4e3e2ec6a5 81
radiojunkbox 0:3b4e3e2ec6a5 82 int len = buffer[2] | (buffer[3] << 8);
radiojunkbox 0:3b4e3e2ec6a5 83 u8* d = buffer;
radiojunkbox 0:3b4e3e2ec6a5 84 u8* end = d + len;
radiojunkbox 0:3b4e3e2ec6a5 85
radiojunkbox 0:3b4e3e2ec6a5 86 // printf("OnMidiInsert %02X %02X\r\n",device,len);
radiojunkbox 0:3b4e3e2ec6a5 87
radiojunkbox 0:3b4e3e2ec6a5 88 while (d < end)
radiojunkbox 0:3b4e3e2ec6a5 89 {
radiojunkbox 0:3b4e3e2ec6a5 90 if (d[1] == DESCRIPTOR_TYPE_INTERFACE)
radiojunkbox 0:3b4e3e2ec6a5 91 {
radiojunkbox 0:3b4e3e2ec6a5 92 InterfaceDescriptor* id = (InterfaceDescriptor*)d;
radiojunkbox 0:3b4e3e2ec6a5 93 d += d[0];
radiojunkbox 0:3b4e3e2ec6a5 94 while (d < end)
radiojunkbox 0:3b4e3e2ec6a5 95 {
radiojunkbox 0:3b4e3e2ec6a5 96 if (d[1] == DESCRIPTOR_TYPE_ENDPOINT)
radiojunkbox 0:3b4e3e2ec6a5 97 {
radiojunkbox 0:3b4e3e2ec6a5 98 // printfBytes("MIDI Endpoint",d,d[0]);
radiojunkbox 0:3b4e3e2ec6a5 99 AddMidiInterface(device,id,(EndpointDescriptor*)d,d[4]);
radiojunkbox 0:3b4e3e2ec6a5 100 }
radiojunkbox 0:3b4e3e2ec6a5 101 d += d[0];
radiojunkbox 0:3b4e3e2ec6a5 102 }
radiojunkbox 0:3b4e3e2ec6a5 103 }
radiojunkbox 0:3b4e3e2ec6a5 104 d += d[0];
radiojunkbox 0:3b4e3e2ec6a5 105 }
radiojunkbox 0:3b4e3e2ec6a5 106 return 0;
radiojunkbox 0:3b4e3e2ec6a5 107 }