Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234

Dependencies:   mbed myUSBHost AvailableMemory

Dependents:   mbed_TANK_Kinect myBlueUSB_ros ftusbClass

Committer:
networker
Date:
Sat Jun 11 19:45:42 2011 +0000
Revision:
6:567607a9a79f
new release because of some changes to the libraries.
Also added functions to spoof the mac address on csr dongles

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 6:567607a9a79f 1
networker 6:567607a9a79f 2 /*
networker 6:567607a9a79f 3 Copyright (c) 2010 Peter Barrett
networker 6:567607a9a79f 4
networker 6:567607a9a79f 5 Permission is hereby granted, free of charge, to any person obtaining a copy
networker 6:567607a9a79f 6 of this software and associated documentation files (the "Software"), to deal
networker 6:567607a9a79f 7 in the Software without restriction, including without limitation the rights
networker 6:567607a9a79f 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
networker 6:567607a9a79f 9 copies of the Software, and to permit persons to whom the Software is
networker 6:567607a9a79f 10 furnished to do so, subject to the following conditions:
networker 6:567607a9a79f 11
networker 6:567607a9a79f 12 The above copyright notice and this permission notice shall be included in
networker 6:567607a9a79f 13 all copies or substantial portions of the Software.
networker 6:567607a9a79f 14
networker 6:567607a9a79f 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
networker 6:567607a9a79f 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
networker 6:567607a9a79f 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
networker 6:567607a9a79f 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
networker 6:567607a9a79f 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
networker 6:567607a9a79f 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
networker 6:567607a9a79f 21 THE SOFTWARE.
networker 6:567607a9a79f 22 */
networker 6:567607a9a79f 23
networker 6:567607a9a79f 24 #include "mbed.h"
networker 6:567607a9a79f 25 #include "USBHost.h"
networker 6:567607a9a79f 26 #include "Utils.h"
networker 6:567607a9a79f 27
networker 6:567607a9a79f 28 #define AUTOEVT(_class,_subclass,_protocol) (((_class) << 16) | ((_subclass) << 8) | _protocol)
networker 6:567607a9a79f 29 #define AUTO_KEYBOARD AUTOEVT(CLASS_HID,1,1)
networker 6:567607a9a79f 30 #define AUTO_MOUSE AUTOEVT(CLASS_HID,1,2)
networker 6:567607a9a79f 31
networker 6:567607a9a79f 32 u8 auto_mouse[4]; // buttons,dx,dy,scroll
networker 6:567607a9a79f 33 u8 auto_keyboard[8]; // modifiers,reserved,keycode1..keycode6
networker 6:567607a9a79f 34 u8 auto_joystick[4]; // x,y,buttons,throttle
networker 6:567607a9a79f 35
networker 6:567607a9a79f 36 void AutoEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
networker 6:567607a9a79f 37 {
networker 6:567607a9a79f 38 int evt = (int)userData;
networker 6:567607a9a79f 39 switch (evt)
networker 6:567607a9a79f 40 {
networker 6:567607a9a79f 41 case AUTO_KEYBOARD:
networker 6:567607a9a79f 42 printf("AUTO_KEYBOARD ");
networker 6:567607a9a79f 43 break;
networker 6:567607a9a79f 44 case AUTO_MOUSE:
networker 6:567607a9a79f 45 printf("AUTO_MOUSE ");
networker 6:567607a9a79f 46 break;
networker 6:567607a9a79f 47 default:
networker 6:567607a9a79f 48 printf("HUH ");
networker 6:567607a9a79f 49 }
networker 6:567607a9a79f 50 printfBytes("data",data,len);
networker 6:567607a9a79f 51 USBInterruptTransfer(device,endpoint,data,len,AutoEventCallback,userData);
networker 6:567607a9a79f 52 }
networker 6:567607a9a79f 53
networker 6:567607a9a79f 54 // Establish transfers for interrupt events
networker 6:567607a9a79f 55 void AddAutoEvent(int device, InterfaceDescriptor* id, EndpointDescriptor* ed)
networker 6:567607a9a79f 56 {
networker 6:567607a9a79f 57 if ((ed->bmAttributes & 3) != ENDPOINT_INTERRUPT || !(ed->bEndpointAddress & 0x80))
networker 6:567607a9a79f 58 return;
networker 6:567607a9a79f 59
networker 6:567607a9a79f 60 // Make automatic interrupt enpoints for known devices
networker 6:567607a9a79f 61 u32 evt = AUTOEVT(id->bInterfaceClass,id->bInterfaceSubClass,id->bInterfaceProtocol);
networker 6:567607a9a79f 62 u8* dst = 0;
networker 6:567607a9a79f 63 int len;
networker 6:567607a9a79f 64 switch (evt)
networker 6:567607a9a79f 65 {
networker 6:567607a9a79f 66 case AUTO_MOUSE:
networker 6:567607a9a79f 67 dst = auto_mouse;
networker 6:567607a9a79f 68 len = sizeof(auto_mouse);
networker 6:567607a9a79f 69 break;
networker 6:567607a9a79f 70 case AUTO_KEYBOARD:
networker 6:567607a9a79f 71 dst = auto_keyboard;
networker 6:567607a9a79f 72 len = sizeof(auto_keyboard);
networker 6:567607a9a79f 73 break;
networker 6:567607a9a79f 74 default:
networker 6:567607a9a79f 75 printf("Interrupt endpoint %02X %08X\n",ed->bEndpointAddress,evt);
networker 6:567607a9a79f 76 break;
networker 6:567607a9a79f 77 }
networker 6:567607a9a79f 78 if (dst)
networker 6:567607a9a79f 79 {
networker 6:567607a9a79f 80 printf("Auto Event for %02X %08X\n",ed->bEndpointAddress,evt);
networker 6:567607a9a79f 81 USBInterruptTransfer(device,ed->bEndpointAddress,dst,len,AutoEventCallback,(void*)evt);
networker 6:567607a9a79f 82 }
networker 6:567607a9a79f 83 }
networker 6:567607a9a79f 84
networker 6:567607a9a79f 85 void PrintString(int device, int i)
networker 6:567607a9a79f 86 {
networker 6:567607a9a79f 87 u8 buffer[256];
networker 6:567607a9a79f 88 int le = GetDescriptor(device,DESCRIPTOR_TYPE_STRING,i,buffer,255);
networker 6:567607a9a79f 89 if (le < 0)
networker 6:567607a9a79f 90 return;
networker 6:567607a9a79f 91 char* dst = (char*)buffer;
networker 6:567607a9a79f 92 for (int j = 2; j < le; j += 2)
networker 6:567607a9a79f 93 *dst++ = buffer[j];
networker 6:567607a9a79f 94 *dst = 0;
networker 6:567607a9a79f 95 printf("%d:%s\n",i,(const char*)buffer);
networker 6:567607a9a79f 96 }
networker 6:567607a9a79f 97
networker 6:567607a9a79f 98 // Walk descriptors and create endpoints for a given device
networker 6:567607a9a79f 99 int StartAutoEvent(int device, int configuration, int interfaceNumber)
networker 6:567607a9a79f 100 {
networker 6:567607a9a79f 101 u8 buffer[255];
networker 6:567607a9a79f 102 int err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255);
networker 6:567607a9a79f 103 if (err < 0)
networker 6:567607a9a79f 104 return err;
networker 6:567607a9a79f 105
networker 6:567607a9a79f 106 int len = buffer[2] | (buffer[3] << 8);
networker 6:567607a9a79f 107 u8* d = buffer;
networker 6:567607a9a79f 108 u8* end = d + len;
networker 6:567607a9a79f 109 while (d < end)
networker 6:567607a9a79f 110 {
networker 6:567607a9a79f 111 if (d[1] == DESCRIPTOR_TYPE_INTERFACE)
networker 6:567607a9a79f 112 {
networker 6:567607a9a79f 113 InterfaceDescriptor* id = (InterfaceDescriptor*)d;
networker 6:567607a9a79f 114 if (id->bInterfaceNumber == interfaceNumber)
networker 6:567607a9a79f 115 {
networker 6:567607a9a79f 116 d += d[0];
networker 6:567607a9a79f 117 while (d < end && d[1] != DESCRIPTOR_TYPE_INTERFACE)
networker 6:567607a9a79f 118 {
networker 6:567607a9a79f 119 if (d[1] == DESCRIPTOR_TYPE_ENDPOINT)
networker 6:567607a9a79f 120 AddAutoEvent(device,id,(EndpointDescriptor*)d);
networker 6:567607a9a79f 121 d += d[0];
networker 6:567607a9a79f 122 }
networker 6:567607a9a79f 123 }
networker 6:567607a9a79f 124 }
networker 6:567607a9a79f 125 d += d[0];
networker 6:567607a9a79f 126 }
networker 6:567607a9a79f 127 return 0;
networker 6:567607a9a79f 128 }
networker 6:567607a9a79f 129
networker 6:567607a9a79f 130 // Implemented in main.cpp
networker 6:567607a9a79f 131 int OnDiskInsert(int device);
networker 6:567607a9a79f 132
networker 6:567607a9a79f 133 // Implemented in TestShell.cpp
networker 6:567607a9a79f 134 int OnBluetoothInsert(int device);
networker 6:567607a9a79f 135
networker 6:567607a9a79f 136 void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc)
networker 6:567607a9a79f 137 {
networker 6:567607a9a79f 138 printf("LoadDevice %d %02X:%02X:%02X\n",device,interfaceDesc->bInterfaceClass,interfaceDesc->bInterfaceSubClass,interfaceDesc->bInterfaceProtocol);
networker 6:567607a9a79f 139 char s[128];
networker 6:567607a9a79f 140 for (int i = 1; i < 3; i++)
networker 6:567607a9a79f 141 {
networker 6:567607a9a79f 142 if (GetString(device,i,s,sizeof(s)) < 0)
networker 6:567607a9a79f 143 break;
networker 6:567607a9a79f 144 printf("%d: %s\n",i,s);
networker 6:567607a9a79f 145 }
networker 6:567607a9a79f 146
networker 6:567607a9a79f 147 switch (interfaceDesc->bInterfaceClass)
networker 6:567607a9a79f 148 {
networker 6:567607a9a79f 149 case CLASS_MASS_STORAGE:
networker 6:567607a9a79f 150 if (interfaceDesc->bInterfaceSubClass == 0x06 && interfaceDesc->bInterfaceProtocol == 0x50)
networker 6:567607a9a79f 151 OnDiskInsert(device); // it's SCSI!
networker 6:567607a9a79f 152 break;
networker 6:567607a9a79f 153 case CLASS_WIRELESS_CONTROLLER:
networker 6:567607a9a79f 154 if (interfaceDesc->bInterfaceSubClass == 0x01 && interfaceDesc->bInterfaceProtocol == 0x01)
networker 6:567607a9a79f 155 OnBluetoothInsert(device); // it's bluetooth!
networker 6:567607a9a79f 156 break;
networker 6:567607a9a79f 157 default:
networker 6:567607a9a79f 158 StartAutoEvent(device,1,0);
networker 6:567607a9a79f 159 break;
networker 6:567607a9a79f 160 }
networker 6:567607a9a79f 161 }