Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1
Michael J. Spencer 1:f5ac63519541 2 /*
Michael J. Spencer 1:f5ac63519541 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
Michael J. Spencer 1:f5ac63519541 4
Michael J. Spencer 1:f5ac63519541 5 Permission is hereby granted, free of charge, to any person obtaining a copy
Michael J. Spencer 1:f5ac63519541 6 of this software and associated documentation files (the "Software"), to deal
Michael J. Spencer 1:f5ac63519541 7 in the Software without restriction, including without limitation the rights
Michael J. Spencer 1:f5ac63519541 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Michael J. Spencer 1:f5ac63519541 9 copies of the Software, and to permit persons to whom the Software is
Michael J. Spencer 1:f5ac63519541 10 furnished to do so, subject to the following conditions:
Michael J. Spencer 1:f5ac63519541 11
Michael J. Spencer 1:f5ac63519541 12 The above copyright notice and this permission notice shall be included in
Michael J. Spencer 1:f5ac63519541 13 all copies or substantial portions of the Software.
Michael J. Spencer 1:f5ac63519541 14
Michael J. Spencer 1:f5ac63519541 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Michael J. Spencer 1:f5ac63519541 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Michael J. Spencer 1:f5ac63519541 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Michael J. Spencer 1:f5ac63519541 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Michael J. Spencer 1:f5ac63519541 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Michael J. Spencer 1:f5ac63519541 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Michael J. Spencer 1:f5ac63519541 21 THE SOFTWARE.
Michael J. Spencer 1:f5ac63519541 22 */
Michael J. Spencer 1:f5ac63519541 23
Michael J. Spencer 1:f5ac63519541 24 #include "UsbDevice.h"
Michael J. Spencer 1:f5ac63519541 25
Michael J. Spencer 1:f5ac63519541 26 #include "netCfg.h"
Michael J. Spencer 1:f5ac63519541 27 #if NET_USB
Michael J. Spencer 1:f5ac63519541 28
Michael J. Spencer 1:f5ac63519541 29 //#define __DEBUG
Michael J. Spencer 1:f5ac63519541 30 #include "dbg/dbg.h"
Michael J. Spencer 1:f5ac63519541 31
Michael J. Spencer 1:f5ac63519541 32 UsbDevice::UsbDevice( UsbHostMgr* pMgr, int hub, int port, int addr ) : m_pControlEp(NULL), /*m_controlEp( this, 0x00, false, USB_CONTROL, 8 ),*/
Michael J. Spencer 1:f5ac63519541 33 m_pMgr(pMgr), m_connected(false), m_enumerated(false), m_hub(hub), m_port(port), m_addr(addr), m_refs(0),
Michael J. Spencer 1:f5ac63519541 34 m_vid(0), m_pid(0)
Michael J. Spencer 1:f5ac63519541 35 {
Michael J. Spencer 1:f5ac63519541 36
Michael J. Spencer 1:f5ac63519541 37 }
Michael J. Spencer 1:f5ac63519541 38
Michael J. Spencer 1:f5ac63519541 39 UsbDevice::~UsbDevice()
Michael J. Spencer 1:f5ac63519541 40 {
Michael J. Spencer 1:f5ac63519541 41 if(m_pControlEp)
Michael J. Spencer 1:f5ac63519541 42 delete m_pControlEp;
Michael J. Spencer 1:f5ac63519541 43 }
Michael J. Spencer 1:f5ac63519541 44
Michael J. Spencer 1:f5ac63519541 45 UsbErr UsbDevice::enumerate()
Michael J. Spencer 1:f5ac63519541 46 {
Michael J. Spencer 1:f5ac63519541 47 // USB_INT32S rc;
Michael J. Spencer 1:f5ac63519541 48
Michael J. Spencer 1:f5ac63519541 49 UsbErr rc;
Michael J. Spencer 1:f5ac63519541 50
Michael J. Spencer 1:f5ac63519541 51 DBG("Starting enumeration (m_pMgr = %p)\n", m_pMgr);
Michael J. Spencer 1:f5ac63519541 52
Michael J. Spencer 1:f5ac63519541 53 #if 1
Michael J. Spencer 1:f5ac63519541 54 m_pMgr->resetPort(m_hub, m_port);
Michael J. Spencer 1:f5ac63519541 55 #else
Michael J. Spencer 1:f5ac63519541 56 wait_ms(100); /* USB 2.0 spec says atleast 50ms delay beore port reset */
Michael J. Spencer 1:f5ac63519541 57 LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS; // Initiate port reset
Michael J. Spencer 1:f5ac63519541 58 while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS)
Michael J. Spencer 1:f5ac63519541 59 __WFI(); // Wait for port reset to complete...
Michael J. Spencer 1:f5ac63519541 60 LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; // ...and clear port reset signal
Michael J. Spencer 1:f5ac63519541 61 wait_ms(200); /* Wait for 100 MS after port reset */
Michael J. Spencer 1:f5ac63519541 62 #endif
Michael J. Spencer 1:f5ac63519541 63
Michael J. Spencer 1:f5ac63519541 64 DBG("Port reset\n");
Michael J. Spencer 1:f5ac63519541 65
Michael J. Spencer 1:f5ac63519541 66 wait_ms(200);
Michael J. Spencer 1:f5ac63519541 67
Michael J. Spencer 1:f5ac63519541 68 m_pControlEp = new UsbEndpoint( this, 0x00, false, USB_CONTROL, 8, 0 );
Michael J. Spencer 1:f5ac63519541 69
Michael J. Spencer 1:f5ac63519541 70 //EDCtrl->Control = 8 << 16;/* Put max pkt size = 8 */
Michael J. Spencer 1:f5ac63519541 71 /* Read first 8 bytes of device desc */
Michael J. Spencer 1:f5ac63519541 72 rc = controlReceive(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, (USB_DESCRIPTOR_TYPE_DEVICE << 8)|(0), 0, m_controlDataBuf, 8);
Michael J. Spencer 1:f5ac63519541 73 if (rc)
Michael J. Spencer 1:f5ac63519541 74 {
Michael J. Spencer 1:f5ac63519541 75 DBG("RC=%d",rc);
Michael J. Spencer 1:f5ac63519541 76 return (rc);
Michael J. Spencer 1:f5ac63519541 77 }
Michael J. Spencer 1:f5ac63519541 78
Michael J. Spencer 1:f5ac63519541 79 DBG("Got descriptor, max ep size is %d\n", m_controlDataBuf[7]);
Michael J. Spencer 1:f5ac63519541 80
Michael J. Spencer 1:f5ac63519541 81 m_pControlEp->updateSize(m_controlDataBuf[7]); /* Get max pkt size of endpoint 0 */
Michael J. Spencer 1:f5ac63519541 82 rc = controlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS, m_addr, 0, NULL, 0); /* Set the device address to m_addr */
Michael J. Spencer 1:f5ac63519541 83 if (rc)
Michael J. Spencer 1:f5ac63519541 84 {
Michael J. Spencer 1:f5ac63519541 85 // PRINT_Err(rc);
Michael J. Spencer 1:f5ac63519541 86 return (rc);
Michael J. Spencer 1:f5ac63519541 87 }
Michael J. Spencer 1:f5ac63519541 88 wait_ms(2);
Michael J. Spencer 1:f5ac63519541 89 //EDCtrl->Control = (EDCtrl->Control) | 1; /* Modify control pipe with address 1 */
Michael J. Spencer 1:f5ac63519541 90
Michael J. Spencer 1:f5ac63519541 91 //Update address
Michael J. Spencer 1:f5ac63519541 92 m_pControlEp->updateAddr(m_addr);
Michael J. Spencer 1:f5ac63519541 93 DBG("Ep addr is now %d", m_addr);
Michael J. Spencer 1:f5ac63519541 94 /**/
Michael J. Spencer 1:f5ac63519541 95
Michael J. Spencer 1:f5ac63519541 96 //rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_DEVICE, 0, TDBuffer, 17); //Read full device descriptor
Michael J. Spencer 1:f5ac63519541 97 rc = controlReceive(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, (USB_DESCRIPTOR_TYPE_DEVICE << 8)|(0), 0, m_controlDataBuf, 17);
Michael J. Spencer 1:f5ac63519541 98 if (rc)
Michael J. Spencer 1:f5ac63519541 99 {
Michael J. Spencer 1:f5ac63519541 100 //PRINT_Err(rc);
Michael J. Spencer 1:f5ac63519541 101 return (rc);
Michael J. Spencer 1:f5ac63519541 102 }
Michael J. Spencer 1:f5ac63519541 103 /*
Michael J. Spencer 1:f5ac63519541 104 rc = SerialCheckVidPid();
Michael J. Spencer 1:f5ac63519541 105 if (rc != OK) {
Michael J. Spencer 1:f5ac63519541 106 PRINT_Err(rc);
Michael J. Spencer 1:f5ac63519541 107 return (rc);
Michael J. Spencer 1:f5ac63519541 108 }
Michael J. Spencer 1:f5ac63519541 109 */
Michael J. Spencer 1:f5ac63519541 110 /**/
Michael J. Spencer 1:f5ac63519541 111
Michael J. Spencer 1:f5ac63519541 112 m_vid = *((uint16_t*)&m_controlDataBuf[8]);
Michael J. Spencer 1:f5ac63519541 113 m_pid = *((uint16_t*)&m_controlDataBuf[10]);
Michael J. Spencer 1:f5ac63519541 114
Michael J. Spencer 1:f5ac63519541 115 DBG("VID: %02x, PID: %02x\n", m_vid, m_pid);
Michael J. Spencer 1:f5ac63519541 116 /* Get the configuration descriptor */
Michael J. Spencer 1:f5ac63519541 117 //rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, 9);
Michael J. Spencer 1:f5ac63519541 118 rc = controlReceive(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, (USB_DESCRIPTOR_TYPE_CONFIGURATION << 8)|(0), 0, m_controlDataBuf, 9);
Michael J. Spencer 1:f5ac63519541 119 if (rc)
Michael J. Spencer 1:f5ac63519541 120 {
Michael J. Spencer 1:f5ac63519541 121 //PRINT_Err(rc);
Michael J. Spencer 1:f5ac63519541 122 return (rc);
Michael J. Spencer 1:f5ac63519541 123 }
Michael J. Spencer 1:f5ac63519541 124 /* Get the first configuration data */
Michael J. Spencer 1:f5ac63519541 125 //rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, *((uint16_t*)&TDBuffer[2]));
Michael J. Spencer 1:f5ac63519541 126 rc = controlReceive(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, (USB_DESCRIPTOR_TYPE_CONFIGURATION << 8)|(0), 0, m_controlDataBuf, *((uint16_t*)&m_controlDataBuf[2]));
Michael J. Spencer 1:f5ac63519541 127 if (rc)
Michael J. Spencer 1:f5ac63519541 128 {
Michael J. Spencer 1:f5ac63519541 129 //PRINT_Err(rc);
Michael J. Spencer 1:f5ac63519541 130 return (rc);
Michael J. Spencer 1:f5ac63519541 131 }
Michael J. Spencer 1:f5ac63519541 132
Michael J. Spencer 1:f5ac63519541 133 DBG("Desc len is %d\n", *((uint16_t*)&m_controlDataBuf[2]));
Michael J. Spencer 1:f5ac63519541 134
Michael J. Spencer 1:f5ac63519541 135 DBG("Set configuration\n");
Michael J. Spencer 1:f5ac63519541 136
Michael J. Spencer 1:f5ac63519541 137 //rc = USBH_SET_CONFIGURATION(1);/* Select device configuration 1 */
Michael J. Spencer 1:f5ac63519541 138 rc = controlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_CONFIGURATION, 1, 0, NULL, 0);
Michael J. Spencer 1:f5ac63519541 139 if (rc)
Michael J. Spencer 1:f5ac63519541 140 {
Michael J. Spencer 1:f5ac63519541 141 // PRINT_Err(rc);
Michael J. Spencer 1:f5ac63519541 142 return rc;
Michael J. Spencer 1:f5ac63519541 143 }
Michael J. Spencer 1:f5ac63519541 144 wait_ms(100);/* Some devices may require this delay */
Michael J. Spencer 1:f5ac63519541 145
Michael J. Spencer 1:f5ac63519541 146 m_enumerated = true;
Michael J. Spencer 1:f5ac63519541 147 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 148 }
Michael J. Spencer 1:f5ac63519541 149
Michael J. Spencer 1:f5ac63519541 150 bool UsbDevice::connected()
Michael J. Spencer 1:f5ac63519541 151 {
Michael J. Spencer 1:f5ac63519541 152 return m_connected;
Michael J. Spencer 1:f5ac63519541 153 }
Michael J. Spencer 1:f5ac63519541 154
Michael J. Spencer 1:f5ac63519541 155 bool UsbDevice::enumerated()
Michael J. Spencer 1:f5ac63519541 156 {
Michael J. Spencer 1:f5ac63519541 157 return m_enumerated;
Michael J. Spencer 1:f5ac63519541 158 }
Michael J. Spencer 1:f5ac63519541 159
Michael J. Spencer 1:f5ac63519541 160 int UsbDevice::getPid()
Michael J. Spencer 1:f5ac63519541 161 {
Michael J. Spencer 1:f5ac63519541 162 return m_pid;
Michael J. Spencer 1:f5ac63519541 163 }
Michael J. Spencer 1:f5ac63519541 164
Michael J. Spencer 1:f5ac63519541 165 int UsbDevice::getVid()
Michael J. Spencer 1:f5ac63519541 166 {
Michael J. Spencer 1:f5ac63519541 167 return m_vid;
Michael J. Spencer 1:f5ac63519541 168 }
Michael J. Spencer 1:f5ac63519541 169
Michael J. Spencer 1:f5ac63519541 170 UsbErr UsbDevice::getConfigurationDescriptor(int config, uint8_t** pBuf)
Michael J. Spencer 1:f5ac63519541 171 {
Michael J. Spencer 1:f5ac63519541 172 //For now olny one config
Michael J. Spencer 1:f5ac63519541 173 *pBuf = m_controlDataBuf;
Michael J. Spencer 1:f5ac63519541 174 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 175 }
Michael J. Spencer 1:f5ac63519541 176
Michael J. Spencer 1:f5ac63519541 177 UsbErr UsbDevice::getInterfaceDescriptor(int config, int item, uint8_t** pBuf)
Michael J. Spencer 1:f5ac63519541 178 {
Michael J. Spencer 1:f5ac63519541 179 byte* desc_ptr = m_controlDataBuf;
Michael J. Spencer 1:f5ac63519541 180
Michael J. Spencer 1:f5ac63519541 181 /* if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION)
Michael J. Spencer 1:f5ac63519541 182 {
Michael J. Spencer 1:f5ac63519541 183 return USBERR_BADCONFIG;
Michael J. Spencer 1:f5ac63519541 184 }*/
Michael J. Spencer 1:f5ac63519541 185
Michael J. Spencer 1:f5ac63519541 186 if(item>=m_controlDataBuf[4])//Interfaces count
Michael J. Spencer 1:f5ac63519541 187 return USBERR_NOTFOUND;
Michael J. Spencer 1:f5ac63519541 188
Michael J. Spencer 1:f5ac63519541 189 desc_ptr += desc_ptr[0];
Michael J. Spencer 1:f5ac63519541 190
Michael J. Spencer 1:f5ac63519541 191 *pBuf = NULL;
Michael J. Spencer 1:f5ac63519541 192
Michael J. Spencer 1:f5ac63519541 193 while (desc_ptr < m_controlDataBuf + *((uint16_t*)&m_controlDataBuf[2]))
Michael J. Spencer 1:f5ac63519541 194 {
Michael J. Spencer 1:f5ac63519541 195
Michael J. Spencer 1:f5ac63519541 196 switch (desc_ptr[1]) {
Michael J. Spencer 1:f5ac63519541 197 case USB_DESCRIPTOR_TYPE_INTERFACE:
Michael J. Spencer 1:f5ac63519541 198 if(desc_ptr[2] == item)
Michael J. Spencer 1:f5ac63519541 199 {
Michael J. Spencer 1:f5ac63519541 200 *pBuf = desc_ptr;
Michael J. Spencer 1:f5ac63519541 201 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 202 }
Michael J. Spencer 1:f5ac63519541 203 desc_ptr += desc_ptr[0]; // Move to next descriptor start
Michael J. Spencer 1:f5ac63519541 204 break;
Michael J. Spencer 1:f5ac63519541 205 }
Michael J. Spencer 1:f5ac63519541 206
Michael J. Spencer 1:f5ac63519541 207 }
Michael J. Spencer 1:f5ac63519541 208
Michael J. Spencer 1:f5ac63519541 209 if(*pBuf == NULL)
Michael J. Spencer 1:f5ac63519541 210 return USBERR_NOTFOUND;
Michael J. Spencer 1:f5ac63519541 211
Michael J. Spencer 1:f5ac63519541 212 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 213 }
Michael J. Spencer 1:f5ac63519541 214
Michael J. Spencer 1:f5ac63519541 215
Michael J. Spencer 1:f5ac63519541 216 UsbErr UsbDevice::setConfiguration(int config)
Michael J. Spencer 1:f5ac63519541 217 {
Michael J. Spencer 1:f5ac63519541 218 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 219 }
Michael J. Spencer 1:f5ac63519541 220
Michael J. Spencer 1:f5ac63519541 221 UsbErr UsbDevice::controlSend(byte requestType, byte request, word value, word index, const byte* buf, int len)
Michael J. Spencer 1:f5ac63519541 222 {
Michael J. Spencer 1:f5ac63519541 223 UsbErr rc;
Michael J. Spencer 1:f5ac63519541 224 fillControlBuf(requestType, request, value, index, len);
Michael J. Spencer 1:f5ac63519541 225 m_pControlEp->setNextToken(TD_SETUP);
Michael J. Spencer 1:f5ac63519541 226 rc = m_pControlEp->transfer(m_controlBuf, 8);
Michael J. Spencer 1:f5ac63519541 227 while(m_pControlEp->status() == USBERR_PROCESSING);
Michael J. Spencer 1:f5ac63519541 228 rc = (UsbErr) MIN(0, m_pControlEp->status());
Michael J. Spencer 1:f5ac63519541 229 if(rc)
Michael J. Spencer 1:f5ac63519541 230 return rc;
Michael J. Spencer 1:f5ac63519541 231 if(len)
Michael J. Spencer 1:f5ac63519541 232 {
Michael J. Spencer 1:f5ac63519541 233 m_pControlEp->setNextToken(TD_OUT);
Michael J. Spencer 1:f5ac63519541 234 rc = m_pControlEp->transfer((byte*)buf, len);
Michael J. Spencer 1:f5ac63519541 235 while(m_pControlEp->status() == USBERR_PROCESSING);
Michael J. Spencer 1:f5ac63519541 236 rc = (UsbErr) MIN(0, m_pControlEp->status());
Michael J. Spencer 1:f5ac63519541 237 if(rc)
Michael J. Spencer 1:f5ac63519541 238 return rc;
Michael J. Spencer 1:f5ac63519541 239 }
Michael J. Spencer 1:f5ac63519541 240 m_pControlEp->setNextToken(TD_IN);
Michael J. Spencer 1:f5ac63519541 241 rc = m_pControlEp->transfer(NULL, 0);
Michael J. Spencer 1:f5ac63519541 242 while(m_pControlEp->status() == USBERR_PROCESSING);
Michael J. Spencer 1:f5ac63519541 243 rc = (UsbErr) MIN(0, m_pControlEp->status());
Michael J. Spencer 1:f5ac63519541 244 if(rc)
Michael J. Spencer 1:f5ac63519541 245 return rc;
Michael J. Spencer 1:f5ac63519541 246 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 247 }
Michael J. Spencer 1:f5ac63519541 248
Michael J. Spencer 1:f5ac63519541 249 UsbErr UsbDevice::controlReceive(byte requestType, byte request, word value, word index, const byte* buf, int len)
Michael J. Spencer 1:f5ac63519541 250 {
Michael J. Spencer 1:f5ac63519541 251 UsbErr rc;
Michael J. Spencer 1:f5ac63519541 252 fillControlBuf(requestType, request, value, index, len);
Michael J. Spencer 1:f5ac63519541 253 m_pControlEp->setNextToken(TD_SETUP);
Michael J. Spencer 1:f5ac63519541 254 rc = m_pControlEp->transfer(m_controlBuf, 8);
Michael J. Spencer 1:f5ac63519541 255 while(m_pControlEp->status() == USBERR_PROCESSING);
Michael J. Spencer 1:f5ac63519541 256 rc = (UsbErr) MIN(0, m_pControlEp->status());
Michael J. Spencer 1:f5ac63519541 257 if(rc)
Michael J. Spencer 1:f5ac63519541 258 return rc;
Michael J. Spencer 1:f5ac63519541 259 if(len)
Michael J. Spencer 1:f5ac63519541 260 {
Michael J. Spencer 1:f5ac63519541 261 m_pControlEp->setNextToken(TD_IN);
Michael J. Spencer 1:f5ac63519541 262 rc = m_pControlEp->transfer( (byte*) buf, len);
Michael J. Spencer 1:f5ac63519541 263 while(m_pControlEp->status() == USBERR_PROCESSING);
Michael J. Spencer 1:f5ac63519541 264 rc = (UsbErr) MIN(0, m_pControlEp->status());
Michael J. Spencer 1:f5ac63519541 265 if(rc)
Michael J. Spencer 1:f5ac63519541 266 return rc;
Michael J. Spencer 1:f5ac63519541 267 }
Michael J. Spencer 1:f5ac63519541 268 m_pControlEp->setNextToken(TD_OUT);
Michael J. Spencer 1:f5ac63519541 269 rc = m_pControlEp->transfer(NULL, 0);
Michael J. Spencer 1:f5ac63519541 270 while(m_pControlEp->status() == USBERR_PROCESSING);
Michael J. Spencer 1:f5ac63519541 271 rc = (UsbErr) MIN(0, m_pControlEp->status());
Michael J. Spencer 1:f5ac63519541 272 if(rc)
Michael J. Spencer 1:f5ac63519541 273 return rc;
Michael J. Spencer 1:f5ac63519541 274 return USBERR_OK;
Michael J. Spencer 1:f5ac63519541 275 }
Michael J. Spencer 1:f5ac63519541 276
Michael J. Spencer 1:f5ac63519541 277 void UsbDevice::fillControlBuf(byte requestType, byte request, word value, word index, int len)
Michael J. Spencer 1:f5ac63519541 278 {
Michael J. Spencer 1:f5ac63519541 279 #ifdef __BIG_ENDIAN
Michael J. Spencer 1:f5ac63519541 280 #error "Must implement BE to LE conv here"
Michael J. Spencer 1:f5ac63519541 281 #endif
Michael J. Spencer 1:f5ac63519541 282 m_controlBuf[0] = requestType;
Michael J. Spencer 1:f5ac63519541 283 m_controlBuf[1] = request;
Michael J. Spencer 1:f5ac63519541 284 //We are in LE so it's fine
Michael J. Spencer 1:f5ac63519541 285 *((word*)&m_controlBuf[2]) = value;
Michael J. Spencer 1:f5ac63519541 286 *((word*)&m_controlBuf[4]) = index;
Michael J. Spencer 1:f5ac63519541 287 *((word*)&m_controlBuf[6]) = (word) len;
Michael J. Spencer 1:f5ac63519541 288 }
Michael J. Spencer 1:f5ac63519541 289
Michael J. Spencer 1:f5ac63519541 290
Michael J. Spencer 1:f5ac63519541 291 #endif