NetServices Stack source

Dependents:   HelloWorld ServoInterfaceBoardExample1 4180_Lab4

Committer:
donatien
Date:
Fri Jun 11 16:05:15 2010 +0000
Revision:
0:632c9925f013
Child:
2:a4f97773c90f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:632c9925f013 1
donatien 0:632c9925f013 2 /*
donatien 0:632c9925f013 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
donatien 0:632c9925f013 4
donatien 0:632c9925f013 5 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:632c9925f013 6 of this software and associated documentation files (the "Software"), to deal
donatien 0:632c9925f013 7 in the Software without restriction, including without limitation the rights
donatien 0:632c9925f013 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:632c9925f013 9 copies of the Software, and to permit persons to whom the Software is
donatien 0:632c9925f013 10 furnished to do so, subject to the following conditions:
donatien 0:632c9925f013 11
donatien 0:632c9925f013 12 The above copyright notice and this permission notice shall be included in
donatien 0:632c9925f013 13 all copies or substantial portions of the Software.
donatien 0:632c9925f013 14
donatien 0:632c9925f013 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:632c9925f013 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:632c9925f013 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:632c9925f013 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:632c9925f013 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:632c9925f013 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:632c9925f013 21 THE SOFTWARE.
donatien 0:632c9925f013 22 */
donatien 0:632c9925f013 23
donatien 0:632c9925f013 24 /*
donatien 0:632c9925f013 25 USB-Serial device driver
donatien 0:632c9925f013 26 Donatien Garnier 2010
donatien 0:632c9925f013 27 */
donatien 0:632c9925f013 28
donatien 0:632c9925f013 29 #include "usbserialif.h"
donatien 0:632c9925f013 30 #include "drv/usb/UsbEndpoint.h"
donatien 0:632c9925f013 31
donatien 0:632c9925f013 32 #include "netCfg.h"
donatien 0:632c9925f013 33 #if NET_USB_SERIAL
donatien 0:632c9925f013 34
donatien 0:632c9925f013 35 UsbEndpoint* pEpIn;
donatien 0:632c9925f013 36 UsbEndpoint* pEpOut;
donatien 0:632c9925f013 37
donatien 0:632c9925f013 38 USB_INT08U ser_int_found;
donatien 0:632c9925f013 39 USB_INT32S SerialInit()
donatien 0:632c9925f013 40 {
donatien 0:632c9925f013 41 Host_Init(); // Initialize the host controller
donatien 0:632c9925f013 42 USB_INT32S rc = Host_EnumDev(); // Enumerate the device connected
donatien 0:632c9925f013 43 if (rc != OK)
donatien 0:632c9925f013 44 {
donatien 0:632c9925f013 45 fprintf(stderr, "Could not enumerate device: %d\n", rc);
donatien 0:632c9925f013 46 return rc;
donatien 0:632c9925f013 47 }
donatien 0:632c9925f013 48 return OK;
donatien 0:632c9925f013 49 }
donatien 0:632c9925f013 50
donatien 0:632c9925f013 51 bool SerialHasToSwitch()
donatien 0:632c9925f013 52 {
donatien 0:632c9925f013 53 return (ser_int_found == 3);
donatien 0:632c9925f013 54 }
donatien 0:632c9925f013 55
donatien 0:632c9925f013 56 uint16_t m_vid;
donatien 0:632c9925f013 57 uint16_t m_pid;
donatien 0:632c9925f013 58
donatien 0:632c9925f013 59 USB_INT32S SerialSendMagic()
donatien 0:632c9925f013 60 {
donatien 0:632c9925f013 61 bool scsi = false;
donatien 0:632c9925f013 62 //Size 31
donatien 0:632c9925f013 63 const unsigned char magicHuawei[] = { 0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0, 0, 0, 0, 0, 0, 0, 0x11, 0x6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
donatien 0:632c9925f013 64 const unsigned char magicVoda[] = { 0x55, 0x53, 0x42, 0x43, 0x78, 0x56, 0x34, 0x12, 0x01, 0, 0, 0, 0x80, 0, 0x06, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
donatien 0:632c9925f013 65 char* magic;
donatien 0:632c9925f013 66 USB_INT32S rc;
donatien 0:632c9925f013 67 if((m_vid == 0x12d1) && (m_pid == 0x1446))
donatien 0:632c9925f013 68 {
donatien 0:632c9925f013 69 PRINT_Log("\r\nHuawei magic packet sent.\r\n");
donatien 0:632c9925f013 70 magic = (char*) magicHuawei;
donatien 0:632c9925f013 71 scsi = true;
donatien 0:632c9925f013 72 }
donatien 0:632c9925f013 73 else if((m_vid == 0x12d1) && (m_pid == 0x1003))
donatien 0:632c9925f013 74 {
donatien 0:632c9925f013 75 PRINT_Log("\r\nHuawei magic control packet sent.\r\n");
donatien 0:632c9925f013 76 rc = Host_CtrlSend( 0 /*USB_TYPE_STANDARD | USB_RECIP_DEVICE*/, 0x03 /*USB_REQ_SET_FEATURE*/, 00000001, 0, 0, NULL);
donatien 0:632c9925f013 77 }
donatien 0:632c9925f013 78 else if(m_vid == 0x0af0)
donatien 0:632c9925f013 79 {
donatien 0:632c9925f013 80 PRINT_Log("\r\nVoda magic packet sent.\r\n");
donatien 0:632c9925f013 81 magic = (char*) magicVoda;
donatien 0:632c9925f013 82 scsi = true;
donatien 0:632c9925f013 83 }
donatien 0:632c9925f013 84 else
donatien 0:632c9925f013 85 {
donatien 0:632c9925f013 86 return -1;
donatien 0:632c9925f013 87 }
donatien 0:632c9925f013 88
donatien 0:632c9925f013 89
donatien 0:632c9925f013 90 if(scsi)
donatien 0:632c9925f013 91 {
donatien 0:632c9925f013 92 //rc = Host_ProcessTD(EDBulkOut, TD_OUT, (volatile USB_INT08U*)magic, 31);
donatien 0:632c9925f013 93 rc = pEpOut->transfer((volatile USB_INT08U*)magic, 31);
donatien 0:632c9925f013 94 while(rc == PROCESSING)
donatien 0:632c9925f013 95 {
donatien 0:632c9925f013 96 // __WFI();
donatien 0:632c9925f013 97 rc = pEpOut->status();
donatien 0:632c9925f013 98 }
donatien 0:632c9925f013 99
donatien 0:632c9925f013 100 }
donatien 0:632c9925f013 101
donatien 0:632c9925f013 102
donatien 0:632c9925f013 103 delete pEpOut;
donatien 0:632c9925f013 104 pEpOut = NULL;
donatien 0:632c9925f013 105 return rc;
donatien 0:632c9925f013 106 }
donatien 0:632c9925f013 107
donatien 0:632c9925f013 108 USB_INT32S SerialCheckVidPid()
donatien 0:632c9925f013 109 {
donatien 0:632c9925f013 110 volatile USB_INT08U *desc_ptr;
donatien 0:632c9925f013 111 desc_ptr = TDBuffer;
donatien 0:632c9925f013 112
donatien 0:632c9925f013 113 ser_int_found = 0;
donatien 0:632c9925f013 114
donatien 0:632c9925f013 115 m_vid = *((USB_INT16U*)&desc_ptr[8]);
donatien 0:632c9925f013 116 m_pid = *((USB_INT16U*)&desc_ptr[10]);
donatien 0:632c9925f013 117
donatien 0:632c9925f013 118 if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_DEVICE) {
donatien 0:632c9925f013 119 PRINT_Log("\r\nLen = %02x\r\n",desc_ptr[0]);
donatien 0:632c9925f013 120 PRINT_Log("\r\nDesc code %02x\r\n",desc_ptr[1]);
donatien 0:632c9925f013 121 return (ERR_BAD_CONFIGURATION);
donatien 0:632c9925f013 122 }
donatien 0:632c9925f013 123
donatien 0:632c9925f013 124 if( m_vid == 0x12d1 &&//Huawei : Change
donatien 0:632c9925f013 125 m_pid == 0x1446 )
donatien 0:632c9925f013 126 {
donatien 0:632c9925f013 127 PRINT_Log("\r\nHuawei device found in CDFS mode\r\n");
donatien 0:632c9925f013 128 ser_int_found=3;
donatien 0:632c9925f013 129 }
donatien 0:632c9925f013 130 else if( m_vid == 0x12d1 &&//Huawei : Change
donatien 0:632c9925f013 131 m_pid == 0x1001 )
donatien 0:632c9925f013 132 {
donatien 0:632c9925f013 133 PRINT_Log("\r\nHuawei device found in Serial mode\r\n");
donatien 0:632c9925f013 134 ser_int_found=1;
donatien 0:632c9925f013 135 }
donatien 0:632c9925f013 136 else if( m_vid == 0x0af0 &&//Voda?Qualcomm? : Change
donatien 0:632c9925f013 137 m_pid == 0x7501 )
donatien 0:632c9925f013 138 {
donatien 0:632c9925f013 139 PRINT_Log("\r\nVodafone K3760 found, checking mode...\r\n");
donatien 0:632c9925f013 140 ser_int_found=3;
donatien 0:632c9925f013 141 }
donatien 0:632c9925f013 142 else if( m_vid == 0x12d1 &&//Voda?Qualcomm? : Change
donatien 0:632c9925f013 143 m_pid == 0x1003 )
donatien 0:632c9925f013 144 {
donatien 0:632c9925f013 145 PRINT_Log("\r\nHuawei device found, checking mode...\r\n");
donatien 0:632c9925f013 146 ser_int_found=3;
donatien 0:632c9925f013 147 }
donatien 0:632c9925f013 148 else
donatien 0:632c9925f013 149 {
donatien 0:632c9925f013 150 PRINT_Log("\r\nDevice %04x : %04x found.\r\n",m_vid,m_pid);
donatien 0:632c9925f013 151 }
donatien 0:632c9925f013 152 return OK;
donatien 0:632c9925f013 153 }
donatien 0:632c9925f013 154
donatien 0:632c9925f013 155 USB_INT32S SerialParseConfig()
donatien 0:632c9925f013 156 {
donatien 0:632c9925f013 157 volatile USB_INT08U *desc_ptr;
donatien 0:632c9925f013 158
donatien 0:632c9925f013 159 desc_ptr = TDBuffer;
donatien 0:632c9925f013 160
donatien 0:632c9925f013 161 if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION) {
donatien 0:632c9925f013 162 return (ERR_BAD_CONFIGURATION);
donatien 0:632c9925f013 163 }
donatien 0:632c9925f013 164 desc_ptr += desc_ptr[0];
donatien 0:632c9925f013 165
donatien 0:632c9925f013 166 int epOut = 0;
donatien 0:632c9925f013 167 int epIn = 0;
donatien 0:632c9925f013 168
donatien 0:632c9925f013 169 pEpOut = NULL;
donatien 0:632c9925f013 170 pEpIn = NULL;
donatien 0:632c9925f013 171 while (desc_ptr != TDBuffer + ReadLE16U(&TDBuffer[2])) {
donatien 0:632c9925f013 172
donatien 0:632c9925f013 173 switch (desc_ptr[1]) {
donatien 0:632c9925f013 174 case USB_DESCRIPTOR_TYPE_INTERFACE:
donatien 0:632c9925f013 175 PRINT_Log("\r\nIf %02x:%02x:%02x.\r\n",desc_ptr[5],desc_ptr[6],desc_ptr[7]);
donatien 0:632c9925f013 176 if (desc_ptr[5] == 0xFF &&
donatien 0:632c9925f013 177 desc_ptr[6] == 0xFF &&
donatien 0:632c9925f013 178 desc_ptr[7] == 0xFF ) {
donatien 0:632c9925f013 179 //if(ser_int_found==1)
donatien 0:632c9925f013 180 ser_int_found=2;
donatien 0:632c9925f013 181 }
donatien 0:632c9925f013 182 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
donatien 0:632c9925f013 183 break;
donatien 0:632c9925f013 184
donatien 0:632c9925f013 185 case USB_DESCRIPTOR_TYPE_ENDPOINT: /* If it is an endpoint descriptor */
donatien 0:632c9925f013 186 PRINT_Log("\r\nEp %02x of size %d.\r\n", desc_ptr[2], (ReadLE16U(&desc_ptr[4]) ));
donatien 0:632c9925f013 187 if ( SerialHasToSwitch() )
donatien 0:632c9925f013 188 {
donatien 0:632c9925f013 189 if( pEpOut == NULL /*desc_ptr[2] == 1*/) //EP 1
donatien 0:632c9925f013 190 {
donatien 0:632c9925f013 191 #if 0
donatien 0:632c9925f013 192 EDBulkOut->Control = 1 | /* USB address */
donatien 0:632c9925f013 193 ((desc_ptr[2] & 0x7F) << 7) | /* Endpoint address */
donatien 0:632c9925f013 194 (1 << 11) | /* direction */
donatien 0:632c9925f013 195 (ReadLE16U(&desc_ptr[4]) << 16); /* MaxPkt Size */
donatien 0:632c9925f013 196 #endif
donatien 0:632c9925f013 197 pEpOut = new UsbEndpoint((desc_ptr[2] & 0x7F), false, ReadLE16U(&desc_ptr[4]));
donatien 0:632c9925f013 198 }
donatien 0:632c9925f013 199 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
donatien 0:632c9925f013 200 }
donatien 0:632c9925f013 201 else if ((desc_ptr[3] & 0x03) == 0x02) { /* If it is Bulk endpoint */
donatien 0:632c9925f013 202 if (desc_ptr[2] & 0x80) { /* If it is In endpoint */
donatien 0:632c9925f013 203 if(epIn == 0)
donatien 0:632c9925f013 204 {
donatien 0:632c9925f013 205 PRINT_Log("\r\nEp %02x is in ep.\r\n", desc_ptr[2]);
donatien 0:632c9925f013 206 #if 0
donatien 0:632c9925f013 207 EDBulkIn->Control = 1 | /* USB address */
donatien 0:632c9925f013 208 ((desc_ptr[2] & 0x7F) << 7) | /* Endpoint address */
donatien 0:632c9925f013 209 (2 << 11) | /* direction */
donatien 0:632c9925f013 210 (ReadLE16U(&desc_ptr[4]) << 16); /* MaxPkt Size */
donatien 0:632c9925f013 211 #endif
donatien 0:632c9925f013 212 // pEpIn = new UsbEndpoint((desc_ptr[2] & 0x7F), true, ReadLE16U(&desc_ptr[4]));
donatien 0:632c9925f013 213 }
donatien 0:632c9925f013 214 epIn++;
donatien 0:632c9925f013 215 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
donatien 0:632c9925f013 216 } else { /* If it is Out endpoint */
donatien 0:632c9925f013 217 if(epOut == 0)
donatien 0:632c9925f013 218 {
donatien 0:632c9925f013 219 PRINT_Log("\r\nEp %02x is out ep.\r\n", desc_ptr[2]);
donatien 0:632c9925f013 220 #if 0
donatien 0:632c9925f013 221 EDBulkOut->Control = 1 | /* USB address */
donatien 0:632c9925f013 222 ((desc_ptr[2] & 0x7F) << 7) | /* Endpoint address */
donatien 0:632c9925f013 223 (1 << 11) | /* direction */
donatien 0:632c9925f013 224 (ReadLE16U(&desc_ptr[4]) << 16); /* MaxPkt Size */
donatien 0:632c9925f013 225 #endif
donatien 0:632c9925f013 226 // pEpOut = new UsbEndpoint((desc_ptr[2] & 0x7F), false, ReadLE16U(&desc_ptr[4]));
donatien 0:632c9925f013 227 }
donatien 0:632c9925f013 228 epOut++;
donatien 0:632c9925f013 229 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
donatien 0:632c9925f013 230 }
donatien 0:632c9925f013 231 } else { /* If it is not bulk end point */
donatien 0:632c9925f013 232 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
donatien 0:632c9925f013 233 }
donatien 0:632c9925f013 234 break;
donatien 0:632c9925f013 235
donatien 0:632c9925f013 236 default: /* If the descriptor is neither interface nor endpoint */
donatien 0:632c9925f013 237 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
donatien 0:632c9925f013 238 break;
donatien 0:632c9925f013 239 }
donatien 0:632c9925f013 240 }
donatien 0:632c9925f013 241 if (ser_int_found==2) {
donatien 0:632c9925f013 242 PRINT_Log("Virtual Serial Port device %04x:%04x connected, vid=%d, pid=%d, E220=%d\n", m_vid, m_pid, ( m_vid == 0x12d1 ), ( m_pid == 0x1003 ), (( m_vid == 0x12d1 ) && ( m_pid == 0x1003 )));
donatien 0:632c9925f013 243 if(m_vid==0x0af0) //Voda
donatien 0:632c9925f013 244 {
donatien 0:632c9925f013 245 pEpOut = new UsbEndpoint((0x0a & 0x7F), false, 64);
donatien 0:632c9925f013 246 pEpIn = new UsbEndpoint((0x8b & 0x7F), true, 64);
donatien 0:632c9925f013 247 PRINT_Log("Voda K3760\r\n");
donatien 0:632c9925f013 248 }
donatien 0:632c9925f013 249 else //if ( ( m_vid == 0x12d1 ) && ( m_pid == 0x1003 ) )
donatien 0:632c9925f013 250 /*{*/
donatien 0:632c9925f013 251 if ( ( m_vid == 0x12d1 ) && ( m_pid == 0x1003 ) )
donatien 0:632c9925f013 252 {
donatien 0:632c9925f013 253 pEpOut = new UsbEndpoint((0x02 & 0x7F), false, 64);
donatien 0:632c9925f013 254 pEpIn = new UsbEndpoint((0x82 & 0x7F), true, 64);
donatien 0:632c9925f013 255 PRINT_Log("Huawei E220\r\n");
donatien 0:632c9925f013 256 }
donatien 0:632c9925f013 257 /*else
donatien 0:632c9925f013 258 {
donatien 0:632c9925f013 259 if(( m_vid == 0x12d1 ))
donatien 0:632c9925f013 260 PRINT_Log("VID OK\r\n");
donatien 0:632c9925f013 261 else
donatien 0:632c9925f013 262 PRINT_Log("VID NOK\r\n");
donatien 0:632c9925f013 263 if(( m_pid == 0x1003 ))
donatien 0:632c9925f013 264 PRINT_Log("VID OK\r\n");
donatien 0:632c9925f013 265 else
donatien 0:632c9925f013 266 PRINT_Log("VID NOK\r\n");
donatien 0:632c9925f013 267 PRINT_Log("\r\n....\r\n\r\n");
donatien 0:632c9925f013 268 error("\r\n\r\n");
donatien 0:632c9925f013 269 }*/
donatien 0:632c9925f013 270 //}
donatien 0:632c9925f013 271 #if 1
donatien 0:632c9925f013 272 else /*if ( m_vid == 0x12d1 &&
donatien 0:632c9925f013 273 m_pid == 0x1001 )*/
donatien 0:632c9925f013 274 {
donatien 0:632c9925f013 275 pEpOut = new UsbEndpoint((0x01 & 0x7F), false, 64);
donatien 0:632c9925f013 276 pEpIn = new UsbEndpoint((0x82 & 0x7F), true, 64);
donatien 0:632c9925f013 277 PRINT_Log("Huawei E1550\r\n");
donatien 0:632c9925f013 278 }
donatien 0:632c9925f013 279 #endif
donatien 0:632c9925f013 280
donatien 0:632c9925f013 281 PRINT_Log("Virtual Serial Port device %04x:%04x connected\n", m_vid, m_pid);
donatien 0:632c9925f013 282 return (OK);
donatien 0:632c9925f013 283 }
donatien 0:632c9925f013 284 else if (ser_int_found==3) {
donatien 0:632c9925f013 285 PRINT_Log("CDFS dongle connected, reset\n");
donatien 0:632c9925f013 286 return (OK);
donatien 0:632c9925f013 287 } else {
donatien 0:632c9925f013 288 PRINT_Log("Not a Virtual Serial Port device\n");
donatien 0:632c9925f013 289 return (ERR_NO_MS_INTERFACE);
donatien 0:632c9925f013 290 }
donatien 0:632c9925f013 291 }
donatien 0:632c9925f013 292
donatien 0:632c9925f013 293
donatien 0:632c9925f013 294 USB_INT32S SerialRx( volatile USB_INT08U* buf, USB_INT32U len )
donatien 0:632c9925f013 295 {
donatien 0:632c9925f013 296 USB_INT32S rc;
donatien 0:632c9925f013 297 rc = pEpIn->transfer(buf, len);
donatien 0:632c9925f013 298 return rc;
donatien 0:632c9925f013 299 }
donatien 0:632c9925f013 300
donatien 0:632c9925f013 301 USB_INT32S SerialReceived()
donatien 0:632c9925f013 302 {
donatien 0:632c9925f013 303 return pEpIn->status();
donatien 0:632c9925f013 304 }
donatien 0:632c9925f013 305
donatien 0:632c9925f013 306 USB_INT32S SerialTx( volatile USB_INT08U* buf, USB_INT32U len )
donatien 0:632c9925f013 307 {
donatien 0:632c9925f013 308 USB_INT32S rc;
donatien 0:632c9925f013 309 rc = pEpOut->transfer(buf, len);
donatien 0:632c9925f013 310 // PRINT_Log("\r\nOut rc = %d\r\n",len);
donatien 0:632c9925f013 311 return rc;
donatien 0:632c9925f013 312 }
donatien 0:632c9925f013 313
donatien 0:632c9925f013 314 USB_INT32S SerialTransmitted()
donatien 0:632c9925f013 315 {
donatien 0:632c9925f013 316 USB_INT32S rc = pEpOut->status();
donatien 0:632c9925f013 317 /* if(rc>=0)
donatien 0:632c9925f013 318 {
donatien 0:632c9925f013 319 PRINT_Log("\r\nTransmitted %d\r\n",rc);
donatien 0:632c9925f013 320 }*/
donatien 0:632c9925f013 321 return rc;
donatien 0:632c9925f013 322 }
donatien 0:632c9925f013 323
donatien 0:632c9925f013 324 USB_INT32S SerialReg(USB_INT16U vid, USB_INT16U pid) {return 0;}
donatien 0:632c9925f013 325
donatien 0:632c9925f013 326 #endif