This is early stages of my project, the idea of this project is to be able to mix a guitar with windows sounds in reverse such as instrumental background music or trance music perhaps or maybe another fellow guitarist you may have downloaded from the internet. Microphone or guitar pin is p19 I would use a microphone for drums:) and that it for the moment, the code makes the mbed act as usb speaker that excepts a guitar or microphone input, but with a twist it all in reverse like a guitar reverse effects pedal but only you can mix anything you can get from the internet or any windows sound.

Dependencies:   mbed

Committer:
mbed2f
Date:
Sun Jan 08 17:28:24 2012 +0000
Revision:
0:7610d342c76e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed2f 0:7610d342c76e 1 // USBHID.c
mbed2f 0:7610d342c76e 2 // Human Interface Device (HID) class
mbed2f 0:7610d342c76e 3 // Copyright (c) 2011 ARM Limited. All rights reserved.
mbed2f 0:7610d342c76e 4
mbed2f 0:7610d342c76e 5 #include "stdint.h"
mbed2f 0:7610d342c76e 6 #include "USBBusInterface.h"
mbed2f 0:7610d342c76e 7 #include "USBHID.h"
mbed2f 0:7610d342c76e 8
mbed2f 0:7610d342c76e 9
mbed2f 0:7610d342c76e 10 USBHID::USBHID(uint8_t output_report_length, uint8_t input_report_length, uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect): USBDevice(vendor_id, product_id, product_release)
mbed2f 0:7610d342c76e 11 {
mbed2f 0:7610d342c76e 12 output_length = output_report_length;
mbed2f 0:7610d342c76e 13 input_length = input_report_length;
mbed2f 0:7610d342c76e 14 if(connect) {
mbed2f 0:7610d342c76e 15 USBDevice::connect();
mbed2f 0:7610d342c76e 16 }
mbed2f 0:7610d342c76e 17 }
mbed2f 0:7610d342c76e 18
mbed2f 0:7610d342c76e 19
mbed2f 0:7610d342c76e 20 bool USBHID::send(HID_REPORT *report)
mbed2f 0:7610d342c76e 21 {
mbed2f 0:7610d342c76e 22 return write(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
mbed2f 0:7610d342c76e 23 }
mbed2f 0:7610d342c76e 24
mbed2f 0:7610d342c76e 25 bool USBHID::sendNB(HID_REPORT *report)
mbed2f 0:7610d342c76e 26 {
mbed2f 0:7610d342c76e 27 return writeNB(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
mbed2f 0:7610d342c76e 28 }
mbed2f 0:7610d342c76e 29
mbed2f 0:7610d342c76e 30
mbed2f 0:7610d342c76e 31 bool USBHID::read(HID_REPORT *report)
mbed2f 0:7610d342c76e 32 {
mbed2f 0:7610d342c76e 33 uint16_t bytesRead = 0;
mbed2f 0:7610d342c76e 34 bool result;
mbed2f 0:7610d342c76e 35 result = USBDevice::readEP(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
mbed2f 0:7610d342c76e 36 if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
mbed2f 0:7610d342c76e 37 return false;
mbed2f 0:7610d342c76e 38 report->length = bytesRead;
mbed2f 0:7610d342c76e 39 return result;
mbed2f 0:7610d342c76e 40 }
mbed2f 0:7610d342c76e 41
mbed2f 0:7610d342c76e 42
mbed2f 0:7610d342c76e 43 bool USBHID::readNB(HID_REPORT *report)
mbed2f 0:7610d342c76e 44 {
mbed2f 0:7610d342c76e 45 uint16_t bytesRead = 0;
mbed2f 0:7610d342c76e 46 bool result;
mbed2f 0:7610d342c76e 47 result = USBDevice::readEP_NB(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
mbed2f 0:7610d342c76e 48 report->length = bytesRead;
mbed2f 0:7610d342c76e 49 if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
mbed2f 0:7610d342c76e 50 return false;
mbed2f 0:7610d342c76e 51 return result;
mbed2f 0:7610d342c76e 52 }
mbed2f 0:7610d342c76e 53
mbed2f 0:7610d342c76e 54
mbed2f 0:7610d342c76e 55 uint16_t USBHID::reportDescLength() {
mbed2f 0:7610d342c76e 56 reportDesc();
mbed2f 0:7610d342c76e 57 return reportLength;
mbed2f 0:7610d342c76e 58 }
mbed2f 0:7610d342c76e 59
mbed2f 0:7610d342c76e 60
mbed2f 0:7610d342c76e 61
mbed2f 0:7610d342c76e 62 //
mbed2f 0:7610d342c76e 63 // Route callbacks from lower layers to class(es)
mbed2f 0:7610d342c76e 64 //
mbed2f 0:7610d342c76e 65
mbed2f 0:7610d342c76e 66
mbed2f 0:7610d342c76e 67 // Called in ISR context
mbed2f 0:7610d342c76e 68 // Called by USBDevice on Endpoint0 request
mbed2f 0:7610d342c76e 69 // This is used to handle extensions to standard requests
mbed2f 0:7610d342c76e 70 // and class specific requests
mbed2f 0:7610d342c76e 71 // Return true if class handles this request
mbed2f 0:7610d342c76e 72 bool USBHID::USBCallback_request() {
mbed2f 0:7610d342c76e 73 bool success = false;
mbed2f 0:7610d342c76e 74 CONTROL_TRANSFER * transfer = getTransferPtr();
mbed2f 0:7610d342c76e 75 uint8_t *hidDescriptor;
mbed2f 0:7610d342c76e 76
mbed2f 0:7610d342c76e 77 // Process additional standard requests
mbed2f 0:7610d342c76e 78
mbed2f 0:7610d342c76e 79 if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
mbed2f 0:7610d342c76e 80 {
mbed2f 0:7610d342c76e 81 switch (transfer->setup.bRequest)
mbed2f 0:7610d342c76e 82 {
mbed2f 0:7610d342c76e 83 case GET_DESCRIPTOR:
mbed2f 0:7610d342c76e 84 switch (DESCRIPTOR_TYPE(transfer->setup.wValue))
mbed2f 0:7610d342c76e 85 {
mbed2f 0:7610d342c76e 86 case REPORT_DESCRIPTOR:
mbed2f 0:7610d342c76e 87 if ((reportDesc() != NULL) \
mbed2f 0:7610d342c76e 88 && (reportDescLength() != 0))
mbed2f 0:7610d342c76e 89 {
mbed2f 0:7610d342c76e 90 transfer->remaining = reportDescLength();
mbed2f 0:7610d342c76e 91 transfer->ptr = reportDesc();
mbed2f 0:7610d342c76e 92 transfer->direction = DEVICE_TO_HOST;
mbed2f 0:7610d342c76e 93 success = true;
mbed2f 0:7610d342c76e 94 }
mbed2f 0:7610d342c76e 95 break;
mbed2f 0:7610d342c76e 96 case HID_DESCRIPTOR:
mbed2f 0:7610d342c76e 97 // Find the HID descriptor, after the configuration descriptor
mbed2f 0:7610d342c76e 98 hidDescriptor = findDescriptor(HID_DESCRIPTOR);
mbed2f 0:7610d342c76e 99 if (hidDescriptor != NULL)
mbed2f 0:7610d342c76e 100 {
mbed2f 0:7610d342c76e 101 transfer->remaining = HID_DESCRIPTOR_LENGTH;
mbed2f 0:7610d342c76e 102 transfer->ptr = hidDescriptor;
mbed2f 0:7610d342c76e 103 transfer->direction = DEVICE_TO_HOST;
mbed2f 0:7610d342c76e 104 success = true;
mbed2f 0:7610d342c76e 105 }
mbed2f 0:7610d342c76e 106 break;
mbed2f 0:7610d342c76e 107
mbed2f 0:7610d342c76e 108 default:
mbed2f 0:7610d342c76e 109 break;
mbed2f 0:7610d342c76e 110 }
mbed2f 0:7610d342c76e 111 break;
mbed2f 0:7610d342c76e 112 default:
mbed2f 0:7610d342c76e 113 break;
mbed2f 0:7610d342c76e 114 }
mbed2f 0:7610d342c76e 115 }
mbed2f 0:7610d342c76e 116
mbed2f 0:7610d342c76e 117 // Process class-specific requests
mbed2f 0:7610d342c76e 118
mbed2f 0:7610d342c76e 119 if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
mbed2f 0:7610d342c76e 120 {
mbed2f 0:7610d342c76e 121 switch (transfer->setup.bRequest)
mbed2f 0:7610d342c76e 122 {
mbed2f 0:7610d342c76e 123 case SET_REPORT:
mbed2f 0:7610d342c76e 124 // First byte will be used for report ID
mbed2f 0:7610d342c76e 125 outputReport.data[0] = transfer->setup.wValue & 0xff;
mbed2f 0:7610d342c76e 126 outputReport.length = transfer->setup.wLength + 1;
mbed2f 0:7610d342c76e 127
mbed2f 0:7610d342c76e 128 transfer->remaining = sizeof(outputReport.data) - 1;
mbed2f 0:7610d342c76e 129 transfer->ptr = &outputReport.data[1];
mbed2f 0:7610d342c76e 130 transfer->direction = HOST_TO_DEVICE;
mbed2f 0:7610d342c76e 131 transfer->notify = true;
mbed2f 0:7610d342c76e 132 success = true;
mbed2f 0:7610d342c76e 133 default:
mbed2f 0:7610d342c76e 134 break;
mbed2f 0:7610d342c76e 135 }
mbed2f 0:7610d342c76e 136 }
mbed2f 0:7610d342c76e 137
mbed2f 0:7610d342c76e 138 return success;
mbed2f 0:7610d342c76e 139 }
mbed2f 0:7610d342c76e 140
mbed2f 0:7610d342c76e 141
mbed2f 0:7610d342c76e 142 #define DEFAULT_CONFIGURATION (1)
mbed2f 0:7610d342c76e 143
mbed2f 0:7610d342c76e 144
mbed2f 0:7610d342c76e 145 // Called in ISR context
mbed2f 0:7610d342c76e 146 // Set configuration. Return false if the
mbed2f 0:7610d342c76e 147 // configuration is not supported
mbed2f 0:7610d342c76e 148 bool USBHID::USBCallback_setConfiguration(uint8_t configuration) {
mbed2f 0:7610d342c76e 149 if (configuration != DEFAULT_CONFIGURATION) {
mbed2f 0:7610d342c76e 150 return false;
mbed2f 0:7610d342c76e 151 }
mbed2f 0:7610d342c76e 152
mbed2f 0:7610d342c76e 153 // Configure endpoints > 0
mbed2f 0:7610d342c76e 154 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
mbed2f 0:7610d342c76e 155 addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
mbed2f 0:7610d342c76e 156
mbed2f 0:7610d342c76e 157 // We activate the endpoint to be able to recceive data
mbed2f 0:7610d342c76e 158 readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
mbed2f 0:7610d342c76e 159 return true;
mbed2f 0:7610d342c76e 160 }
mbed2f 0:7610d342c76e 161
mbed2f 0:7610d342c76e 162
mbed2f 0:7610d342c76e 163 uint8_t * USBHID::stringIinterfaceDesc() {
mbed2f 0:7610d342c76e 164 static uint8_t stringIinterfaceDescriptor[] = {
mbed2f 0:7610d342c76e 165 0x08, //bLength
mbed2f 0:7610d342c76e 166 STRING_DESCRIPTOR, //bDescriptorType 0x03
mbed2f 0:7610d342c76e 167 'H',0,'I',0,'D',0, //bString iInterface - HID
mbed2f 0:7610d342c76e 168 };
mbed2f 0:7610d342c76e 169 return stringIinterfaceDescriptor;
mbed2f 0:7610d342c76e 170 }
mbed2f 0:7610d342c76e 171
mbed2f 0:7610d342c76e 172 uint8_t * USBHID::stringIproductDesc() {
mbed2f 0:7610d342c76e 173 static uint8_t stringIproductDescriptor[] = {
mbed2f 0:7610d342c76e 174 0x16, //bLength
mbed2f 0:7610d342c76e 175 STRING_DESCRIPTOR, //bDescriptorType 0x03
mbed2f 0:7610d342c76e 176 'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device
mbed2f 0:7610d342c76e 177 };
mbed2f 0:7610d342c76e 178 return stringIproductDescriptor;
mbed2f 0:7610d342c76e 179 }
mbed2f 0:7610d342c76e 180
mbed2f 0:7610d342c76e 181
mbed2f 0:7610d342c76e 182
mbed2f 0:7610d342c76e 183 uint8_t * USBHID::reportDesc() {
mbed2f 0:7610d342c76e 184 static uint8_t reportDescriptor[] = {
mbed2f 0:7610d342c76e 185 0x06, LSB(0xFFAB), MSB(0xFFAB),
mbed2f 0:7610d342c76e 186 0x0A, LSB(0x0200), MSB(0x0200),
mbed2f 0:7610d342c76e 187 0xA1, 0x01, // Collection 0x01
mbed2f 0:7610d342c76e 188 0x75, 0x08, // report size = 8 bits
mbed2f 0:7610d342c76e 189 0x15, 0x00, // logical minimum = 0
mbed2f 0:7610d342c76e 190 0x26, 0xFF, 0x00, // logical maximum = 255
mbed2f 0:7610d342c76e 191 0x95, input_length, // report count
mbed2f 0:7610d342c76e 192 0x09, 0x01, // usage
mbed2f 0:7610d342c76e 193 0x81, 0x02, // Input (array)
mbed2f 0:7610d342c76e 194 0x95, output_length, // report count
mbed2f 0:7610d342c76e 195 0x09, 0x02, // usage
mbed2f 0:7610d342c76e 196 0x91, 0x02, // Output (array)
mbed2f 0:7610d342c76e 197 0xC0 // end collection
mbed2f 0:7610d342c76e 198
mbed2f 0:7610d342c76e 199 };
mbed2f 0:7610d342c76e 200 reportLength = sizeof(reportDescriptor);
mbed2f 0:7610d342c76e 201 return reportDescriptor;
mbed2f 0:7610d342c76e 202 }
mbed2f 0:7610d342c76e 203
mbed2f 0:7610d342c76e 204 #define DEFAULT_CONFIGURATION (1)
mbed2f 0:7610d342c76e 205 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
mbed2f 0:7610d342c76e 206 + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
mbed2f 0:7610d342c76e 207 + (1 * HID_DESCRIPTOR_LENGTH) \
mbed2f 0:7610d342c76e 208 + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
mbed2f 0:7610d342c76e 209
mbed2f 0:7610d342c76e 210 uint8_t * USBHID::configurationDesc() {
mbed2f 0:7610d342c76e 211 static uint8_t configurationDescriptor[] = {
mbed2f 0:7610d342c76e 212 CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
mbed2f 0:7610d342c76e 213 CONFIGURATION_DESCRIPTOR, // bDescriptorType
mbed2f 0:7610d342c76e 214 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
mbed2f 0:7610d342c76e 215 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
mbed2f 0:7610d342c76e 216 0x01, // bNumInterfaces
mbed2f 0:7610d342c76e 217 DEFAULT_CONFIGURATION, // bConfigurationValue
mbed2f 0:7610d342c76e 218 0x00, // iConfiguration
mbed2f 0:7610d342c76e 219 C_RESERVED | C_SELF_POWERED, // bmAttributes
mbed2f 0:7610d342c76e 220 C_POWER(0), // bMaxPower
mbed2f 0:7610d342c76e 221
mbed2f 0:7610d342c76e 222 INTERFACE_DESCRIPTOR_LENGTH, // bLength
mbed2f 0:7610d342c76e 223 INTERFACE_DESCRIPTOR, // bDescriptorType
mbed2f 0:7610d342c76e 224 0x00, // bInterfaceNumber
mbed2f 0:7610d342c76e 225 0x00, // bAlternateSetting
mbed2f 0:7610d342c76e 226 0x02, // bNumEndpoints
mbed2f 0:7610d342c76e 227 HID_CLASS, // bInterfaceClass
mbed2f 0:7610d342c76e 228 HID_SUBCLASS_NONE, // bInterfaceSubClass
mbed2f 0:7610d342c76e 229 HID_PROTOCOL_NONE, // bInterfaceProtocol
mbed2f 0:7610d342c76e 230 0x00, // iInterface
mbed2f 0:7610d342c76e 231
mbed2f 0:7610d342c76e 232 HID_DESCRIPTOR_LENGTH, // bLength
mbed2f 0:7610d342c76e 233 HID_DESCRIPTOR, // bDescriptorType
mbed2f 0:7610d342c76e 234 LSB(HID_VERSION_1_11), // bcdHID (LSB)
mbed2f 0:7610d342c76e 235 MSB(HID_VERSION_1_11), // bcdHID (MSB)
mbed2f 0:7610d342c76e 236 0x00, // bCountryCode
mbed2f 0:7610d342c76e 237 0x01, // bNumDescriptors
mbed2f 0:7610d342c76e 238 REPORT_DESCRIPTOR, // bDescriptorType
mbed2f 0:7610d342c76e 239 LSB(this->reportDescLength()), // wDescriptorLength (LSB)
mbed2f 0:7610d342c76e 240 MSB(this->reportDescLength()), // wDescriptorLength (MSB)
mbed2f 0:7610d342c76e 241
mbed2f 0:7610d342c76e 242 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
mbed2f 0:7610d342c76e 243 ENDPOINT_DESCRIPTOR, // bDescriptorType
mbed2f 0:7610d342c76e 244 PHY_TO_DESC(EPINT_IN), // bEndpointAddress
mbed2f 0:7610d342c76e 245 E_INTERRUPT, // bmAttributes
mbed2f 0:7610d342c76e 246 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
mbed2f 0:7610d342c76e 247 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
mbed2f 0:7610d342c76e 248 1, // bInterval (milliseconds)
mbed2f 0:7610d342c76e 249
mbed2f 0:7610d342c76e 250 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
mbed2f 0:7610d342c76e 251 ENDPOINT_DESCRIPTOR, // bDescriptorType
mbed2f 0:7610d342c76e 252 PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
mbed2f 0:7610d342c76e 253 E_INTERRUPT, // bmAttributes
mbed2f 0:7610d342c76e 254 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
mbed2f 0:7610d342c76e 255 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
mbed2f 0:7610d342c76e 256 1, // bInterval (milliseconds)
mbed2f 0:7610d342c76e 257 };
mbed2f 0:7610d342c76e 258 return configurationDescriptor;
mbed2f 0:7610d342c76e 259 }