modded version Dirk-Willem van Gulik's Bonjour/Zerconf library http://mbed.org/users/dirkx/code/Bonjour/

Dependents:   OSCtoCVConverter

Fork of Bonjour by Dirk-Willem van Gulik (NXP/mbed)

Committer:
casiotone401
Date:
Thu Oct 16 14:13:21 2014 +0000
Revision:
8:275256b5d807
Parent:
0:355018f44c9f
minor change

Who changed what in which revision?

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