Dependencies:   ChaNFSSD mbed ChaNFS

Committer:
okini3939
Date:
Thu Nov 10 03:20:42 2011 +0000
Revision:
1:efbcfbae4747
Parent:
0:02c293160df3

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:02c293160df3 1 // USB_MIDI.cpp
okini3939 0:02c293160df3 2 // MIDI edvice example
okini3939 0:02c293160df3 3 // Copyright (c) 2011 ARM Limited. All rights reserved.
okini3939 0:02c293160df3 4
okini3939 0:02c293160df3 5 //#define DEBUG
okini3939 0:02c293160df3 6 #include "dbg.h"
okini3939 0:02c293160df3 7 #include "stdint.h"
okini3939 0:02c293160df3 8 #include "USBMSC.h"
okini3939 0:02c293160df3 9 #include "USBBusInterface.h"
okini3939 0:02c293160df3 10 #include "USBDevice.h"
okini3939 0:02c293160df3 11 #include "USBDevice_Types.h"
okini3939 0:02c293160df3 12
okini3939 0:02c293160df3 13 void USBMSC::setTransferData (uint8_t *buf, int len) {
okini3939 0:02c293160df3 14 CONTROL_TRANSFER *transfer = getTransferPtr();
okini3939 0:02c293160df3 15 transfer->remaining = len;
okini3939 0:02c293160df3 16 transfer->ptr = buf;
okini3939 0:02c293160df3 17 transfer->direction = DEVICE_TO_HOST;
okini3939 0:02c293160df3 18 }
okini3939 0:02c293160df3 19
okini3939 0:02c293160df3 20 void USBMSC::attach(void (*fptr)(uint8_t)) {
okini3939 0:02c293160df3 21 msc_evt = fptr;
okini3939 0:02c293160df3 22 }
okini3939 0:02c293160df3 23
okini3939 0:02c293160df3 24 USBMSC::USBMSC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
okini3939 0:02c293160df3 25 msc_evt = NULL;
okini3939 0:02c293160df3 26 }
okini3939 0:02c293160df3 27
okini3939 0:02c293160df3 28 bool USBMSC::EPBULK_OUT_callback() {
okini3939 0:02c293160df3 29
okini3939 0:02c293160df3 30 if (msc_evt && ! getEndpointStallState(EPBULK_OUT)) {
okini3939 0:02c293160df3 31 msc_evt(EPBULK_OUT);
okini3939 0:02c293160df3 32 }
okini3939 0:02c293160df3 33
okini3939 0:02c293160df3 34 // We reactivate the endpoint to receive next characters
okini3939 0:02c293160df3 35 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
okini3939 0:02c293160df3 36 DBG("EPBULK_OUT_callback\r\n");
okini3939 0:02c293160df3 37 return true;
okini3939 0:02c293160df3 38 }
okini3939 0:02c293160df3 39
okini3939 0:02c293160df3 40 bool USBMSC::EPBULK_IN_callback() {
okini3939 0:02c293160df3 41 DBG("EPBULK_IN_callback\r\n");
okini3939 0:02c293160df3 42
okini3939 0:02c293160df3 43 if (msc_evt && ! getEndpointStallState(EPBULK_IN)) {
okini3939 0:02c293160df3 44 msc_evt(EPBULK_IN);
okini3939 0:02c293160df3 45 }
okini3939 0:02c293160df3 46
okini3939 0:02c293160df3 47 return false;
okini3939 0:02c293160df3 48 }
okini3939 0:02c293160df3 49
okini3939 0:02c293160df3 50 bool USBMSC::USBCallback_request () {
okini3939 0:02c293160df3 51 bool success = false;
okini3939 0:02c293160df3 52 CONTROL_TRANSFER *transfer = getTransferPtr();
okini3939 0:02c293160df3 53
okini3939 0:02c293160df3 54 DBG("USBCallback_request: type %x, request %x\r\n", transfer->setup.bmRequestType.Type, transfer->setup.bRequest);
okini3939 0:02c293160df3 55 /* Process standard requests */
okini3939 0:02c293160df3 56 if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
okini3939 0:02c293160df3 57 {
okini3939 0:02c293160df3 58 switch (transfer->setup.bRequest)
okini3939 0:02c293160df3 59 {
okini3939 0:02c293160df3 60 default:
okini3939 0:02c293160df3 61 break;
okini3939 0:02c293160df3 62 }
okini3939 0:02c293160df3 63 }
okini3939 0:02c293160df3 64
okini3939 0:02c293160df3 65 if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
okini3939 0:02c293160df3 66 {
okini3939 0:02c293160df3 67 switch (transfer->setup.bRequest)
okini3939 0:02c293160df3 68 {
okini3939 0:02c293160df3 69 case 0xFE: // MSC get max LUN
okini3939 0:02c293160df3 70 static uint8_t dummy[] = {0};
okini3939 0:02c293160df3 71 transfer->remaining = 1;
okini3939 0:02c293160df3 72 transfer->ptr = dummy;
okini3939 0:02c293160df3 73 transfer->direction = DEVICE_TO_HOST;
okini3939 0:02c293160df3 74 success = true;
okini3939 0:02c293160df3 75 break;
okini3939 0:02c293160df3 76 case 0xFF: // MSC reset
okini3939 0:02c293160df3 77 if (transfer->setup.wLength == 0) {
okini3939 0:02c293160df3 78 if (msc_evt) {
okini3939 0:02c293160df3 79 msc_evt(0xFF);
okini3939 0:02c293160df3 80 }
okini3939 0:02c293160df3 81 success = true;
okini3939 0:02c293160df3 82 }
okini3939 0:02c293160df3 83 break;
okini3939 0:02c293160df3 84 default:
okini3939 0:02c293160df3 85 break;
okini3939 0:02c293160df3 86 }
okini3939 0:02c293160df3 87 }
okini3939 0:02c293160df3 88
okini3939 0:02c293160df3 89 return success;
okini3939 0:02c293160df3 90 }
okini3939 0:02c293160df3 91
okini3939 0:02c293160df3 92 bool USBMSC::USBCallback_setConfiguration(uint8_t configuration) {
okini3939 0:02c293160df3 93 DBG("USBCallback_setConfiguration: config %x\r\n", configuration);
okini3939 0:02c293160df3 94 // Called in ISR context
okini3939 0:02c293160df3 95 // Set configuration. Return false if the
okini3939 0:02c293160df3 96 // configuration is not supported.
okini3939 0:02c293160df3 97 if (configuration != DEFAULT_CONFIGURATION) {
okini3939 0:02c293160df3 98 return false;
okini3939 0:02c293160df3 99 }
okini3939 0:02c293160df3 100
okini3939 0:02c293160df3 101 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
okini3939 0:02c293160df3 102
okini3939 0:02c293160df3 103 // enable bulk-in interrupts on NAKs
okini3939 0:02c293160df3 104 // these are required to get the BOT protocol going again after a STALL
okini3939 0:02c293160df3 105 NakIntEnable(EPBULK_IN);
okini3939 0:02c293160df3 106
okini3939 0:02c293160df3 107 // Configure endpoints > 0
okini3939 0:02c293160df3 108 addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
okini3939 0:02c293160df3 109 addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
okini3939 0:02c293160df3 110
okini3939 0:02c293160df3 111 // We activate the endpoint to be able to receive data
okini3939 0:02c293160df3 112 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
okini3939 0:02c293160df3 113
okini3939 0:02c293160df3 114 return true;
okini3939 0:02c293160df3 115 }
okini3939 0:02c293160df3 116
okini3939 0:02c293160df3 117 uint8_t * USBMSC::configurationDesc() {
okini3939 0:02c293160df3 118 static uint8_t configDescriptor[] = {
okini3939 0:02c293160df3 119 // configuration descriptor
okini3939 0:02c293160df3 120 0x09, 0x02, 32, 0x00, 0x01, 0x01, 0x00, 0xC0, 0x32,
okini3939 0:02c293160df3 121
okini3939 0:02c293160df3 122 // MSC
okini3939 0:02c293160df3 123 // control class interface
okini3939 0:02c293160df3 124 0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50, 0x00,
okini3939 0:02c293160df3 125 // EP OUT
okini3939 0:02c293160df3 126 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00,
okini3939 0:02c293160df3 127 // EP IN
okini3939 0:02c293160df3 128 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00,
okini3939 0:02c293160df3 129 };
okini3939 0:02c293160df3 130 DBG("configurationDesc %d\r\n", sizeof(configDescriptor));
okini3939 0:02c293160df3 131 return configDescriptor;
okini3939 0:02c293160df3 132 }
okini3939 0:02c293160df3 133
okini3939 0:02c293160df3 134 uint8_t * USBMSC::deviceDesc() {
okini3939 0:02c293160df3 135 static uint8_t deviceDescriptor[] = {
okini3939 0:02c293160df3 136 DEVICE_DESCRIPTOR_LENGTH, /* bLength */
okini3939 0:02c293160df3 137 DEVICE_DESCRIPTOR, /* bDescriptorType */
okini3939 1:efbcfbae4747 138 LSB(USB_VERSION_2_0), /* bcdUSB (LSB) */
okini3939 1:efbcfbae4747 139 MSB(USB_VERSION_2_0), /* bcdUSB (MSB) */
okini3939 0:02c293160df3 140 0x00, /* bDeviceClass */
okini3939 0:02c293160df3 141 0x00, /* bDeviceSubClass */
okini3939 0:02c293160df3 142 0x00, /* bDeviceprotocol */
okini3939 0:02c293160df3 143 MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */
okini3939 0:02c293160df3 144 LSB(VENDOR_ID), /* idVendor (LSB) */
okini3939 0:02c293160df3 145 MSB(VENDOR_ID), /* idVendor (MSB) */
okini3939 0:02c293160df3 146 LSB(PRODUCT_ID), /* idProduct (LSB) */
okini3939 0:02c293160df3 147 MSB(PRODUCT_ID), /* idProduct (MSB) */
okini3939 0:02c293160df3 148 LSB(PRODUCT_RELEASE), /* bcdDevice (LSB) */
okini3939 0:02c293160df3 149 MSB(PRODUCT_RELEASE), /* bcdDevice (MSB) */
okini3939 0:02c293160df3 150 STRING_OFFSET_IMANUFACTURER, /* iManufacturer */
okini3939 0:02c293160df3 151 STRING_OFFSET_IPRODUCT, /* iProduct */
okini3939 0:02c293160df3 152 STRING_OFFSET_ISERIAL, /* iSerialNumber */
okini3939 0:02c293160df3 153 0x01 /* bNumConfigurations */
okini3939 0:02c293160df3 154 };
okini3939 0:02c293160df3 155 return deviceDescriptor;
okini3939 0:02c293160df3 156 }