This program is for an autonomous robot for the competition at the Hochschule Luzern. http://cruisingcrepe.wordpress.com/ We are one of the 32 teams. http://cruisingcrepe.wordpress.com/ The postition control is based on this Documentation: Control of Wheeled Mobile Robots: An Experimental Overview from Alessandro De Luca, Giuseppe Oriolo, Marilena Vendittelli. For more information see here: http://www.dis.uniroma1.it/~labrob/pub/papers/Ramsete01.pdf
Fork of autonomous Robot Android by
Android/AndroidAccessory/AndroidAccessory.cpp@6:48eeb41188dd, 2013-03-23 (annotated)
- Committer:
- chrigelburri
- Date:
- Sat Mar 23 13:52:48 2013 +0000
- Revision:
- 6:48eeb41188dd
mit link und rechten Radradius
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chrigelburri | 6:48eeb41188dd | 1 | #include <stdio.h> |
chrigelburri | 6:48eeb41188dd | 2 | #include <stdlib.h> |
chrigelburri | 6:48eeb41188dd | 3 | #include <string.h> |
chrigelburri | 6:48eeb41188dd | 4 | |
chrigelburri | 6:48eeb41188dd | 5 | #include "USBHost.h" |
chrigelburri | 6:48eeb41188dd | 6 | #include "AndroidAccessory.h" |
chrigelburri | 6:48eeb41188dd | 7 | #include "mbed.h" |
chrigelburri | 6:48eeb41188dd | 8 | |
chrigelburri | 6:48eeb41188dd | 9 | AndroidAccessory* _adk; |
chrigelburri | 6:48eeb41188dd | 10 | |
chrigelburri | 6:48eeb41188dd | 11 | void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); |
chrigelburri | 6:48eeb41188dd | 12 | void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); |
chrigelburri | 6:48eeb41188dd | 13 | |
chrigelburri | 6:48eeb41188dd | 14 | |
chrigelburri | 6:48eeb41188dd | 15 | |
chrigelburri | 6:48eeb41188dd | 16 | AndroidAccessory::AndroidAccessory(int rbuffsize,int wbuffsize, |
chrigelburri | 6:48eeb41188dd | 17 | const char* manufacturer, |
chrigelburri | 6:48eeb41188dd | 18 | const char *model, |
chrigelburri | 6:48eeb41188dd | 19 | const char *description, |
chrigelburri | 6:48eeb41188dd | 20 | const char *version, |
chrigelburri | 6:48eeb41188dd | 21 | const char *uri, |
chrigelburri | 6:48eeb41188dd | 22 | const char *serial |
chrigelburri | 6:48eeb41188dd | 23 | ) { |
chrigelburri | 6:48eeb41188dd | 24 | |
chrigelburri | 6:48eeb41188dd | 25 | _adk=this; |
chrigelburri | 6:48eeb41188dd | 26 | |
chrigelburri | 6:48eeb41188dd | 27 | this->manufacturer=manufacturer; |
chrigelburri | 6:48eeb41188dd | 28 | this->model=model; |
chrigelburri | 6:48eeb41188dd | 29 | this->description=description; |
chrigelburri | 6:48eeb41188dd | 30 | this->version=version; |
chrigelburri | 6:48eeb41188dd | 31 | this->uri=uri; |
chrigelburri | 6:48eeb41188dd | 32 | this->serial=serial; |
chrigelburri | 6:48eeb41188dd | 33 | |
chrigelburri | 6:48eeb41188dd | 34 | u32 len; |
chrigelburri | 6:48eeb41188dd | 35 | u8* p=USBGetBuffer(&len); |
chrigelburri | 6:48eeb41188dd | 36 | if (len<(rbuffsize+wbuffsize+255)) { |
chrigelburri | 6:48eeb41188dd | 37 | error("buff size too big.please resize max=%d. currentSize=%d\r\n",len,(rbuffsize+wbuffsize+255)); |
chrigelburri | 6:48eeb41188dd | 38 | } |
chrigelburri | 6:48eeb41188dd | 39 | |
chrigelburri | 6:48eeb41188dd | 40 | _readbuff=p; |
chrigelburri | 6:48eeb41188dd | 41 | _readbuffsize=rbuffsize; |
chrigelburri | 6:48eeb41188dd | 42 | p+=rbuffsize; |
chrigelburri | 6:48eeb41188dd | 43 | _writebuff=p; |
chrigelburri | 6:48eeb41188dd | 44 | _writebuffsize=wbuffsize; |
chrigelburri | 6:48eeb41188dd | 45 | p+=wbuffsize; |
chrigelburri | 6:48eeb41188dd | 46 | _strbuff=p; |
chrigelburri | 6:48eeb41188dd | 47 | p+=255; |
chrigelburri | 6:48eeb41188dd | 48 | |
chrigelburri | 6:48eeb41188dd | 49 | } |
chrigelburri | 6:48eeb41188dd | 50 | |
chrigelburri | 6:48eeb41188dd | 51 | |
chrigelburri | 6:48eeb41188dd | 52 | |
chrigelburri | 6:48eeb41188dd | 53 | int AndroidAccessory::write(u8 *buff, int len) { |
chrigelburri | 6:48eeb41188dd | 54 | log("AndroidAccessory::write "); |
chrigelburri | 6:48eeb41188dd | 55 | // __disable_irq(); |
chrigelburri | 6:48eeb41188dd | 56 | int ret=USBBulkTransfer(_device,output_ep,buff,len,AdkwriteCallback,this); |
chrigelburri | 6:48eeb41188dd | 57 | // __enable_irq(); |
chrigelburri | 6:48eeb41188dd | 58 | log("--ret=%d \r\n",ret); |
chrigelburri | 6:48eeb41188dd | 59 | return ret; |
chrigelburri | 6:48eeb41188dd | 60 | } |
chrigelburri | 6:48eeb41188dd | 61 | int AndroidAccessory::writeNC(u8 *buff, int len) { |
chrigelburri | 6:48eeb41188dd | 62 | log("AndroidAccessory::write "); |
chrigelburri | 6:48eeb41188dd | 63 | // __disable_irq(); |
chrigelburri | 6:48eeb41188dd | 64 | int ret=USBBulkTransfer(_device,output_ep,buff,len); |
chrigelburri | 6:48eeb41188dd | 65 | // __enable_irq(); |
chrigelburri | 6:48eeb41188dd | 66 | log("--ret=%d \r\n",ret); |
chrigelburri | 6:48eeb41188dd | 67 | return ret; |
chrigelburri | 6:48eeb41188dd | 68 | } |
chrigelburri | 6:48eeb41188dd | 69 | |
chrigelburri | 6:48eeb41188dd | 70 | |
chrigelburri | 6:48eeb41188dd | 71 | |
chrigelburri | 6:48eeb41188dd | 72 | int AndroidAccessory::read(u8 *buff, int len) { |
chrigelburri | 6:48eeb41188dd | 73 | // if(_initok==false)return 0; |
chrigelburri | 6:48eeb41188dd | 74 | |
chrigelburri | 6:48eeb41188dd | 75 | log("AndroidAccessory::read "); |
chrigelburri | 6:48eeb41188dd | 76 | // __disable_irq(); |
chrigelburri | 6:48eeb41188dd | 77 | int ret=USBBulkTransfer(_device,input_ep|0x80,buff,len); |
chrigelburri | 6:48eeb41188dd | 78 | // __enable_irq(); |
chrigelburri | 6:48eeb41188dd | 79 | log("--ret=%d \r\n",ret); |
chrigelburri | 6:48eeb41188dd | 80 | return ret; |
chrigelburri | 6:48eeb41188dd | 81 | } |
chrigelburri | 6:48eeb41188dd | 82 | |
chrigelburri | 6:48eeb41188dd | 83 | |
chrigelburri | 6:48eeb41188dd | 84 | void AndroidAccessory::init(int device, int configuration, int interfaceNumber) { |
chrigelburri | 6:48eeb41188dd | 85 | |
chrigelburri | 6:48eeb41188dd | 86 | log("AndroidAccessory::init \r\n"); |
chrigelburri | 6:48eeb41188dd | 87 | |
chrigelburri | 6:48eeb41188dd | 88 | // _initok=false; |
chrigelburri | 6:48eeb41188dd | 89 | _device = device; |
chrigelburri | 6:48eeb41188dd | 90 | _configuration = configuration; |
chrigelburri | 6:48eeb41188dd | 91 | _interfaceNumber = interfaceNumber; |
chrigelburri | 6:48eeb41188dd | 92 | printf("device = %d configuration = %d interfaceNumber = %d\r\n", device, configuration, interfaceNumber); |
chrigelburri | 6:48eeb41188dd | 93 | int err; |
chrigelburri | 6:48eeb41188dd | 94 | |
chrigelburri | 6:48eeb41188dd | 95 | u8* buffer=_strbuff; |
chrigelburri | 6:48eeb41188dd | 96 | err = GetDescriptor(_device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,4); |
chrigelburri | 6:48eeb41188dd | 97 | |
chrigelburri | 6:48eeb41188dd | 98 | if (err < 0) { |
chrigelburri | 6:48eeb41188dd | 99 | log("Failed to get descriptor\r\n"); |
chrigelburri | 6:48eeb41188dd | 100 | return; |
chrigelburri | 6:48eeb41188dd | 101 | } |
chrigelburri | 6:48eeb41188dd | 102 | |
chrigelburri | 6:48eeb41188dd | 103 | |
chrigelburri | 6:48eeb41188dd | 104 | int len = buffer[2] | (buffer[3] << 8); |
chrigelburri | 6:48eeb41188dd | 105 | if (len > 255) { |
chrigelburri | 6:48eeb41188dd | 106 | log("config descriptor too large\n"); |
chrigelburri | 6:48eeb41188dd | 107 | /* might want to truncate here */ |
chrigelburri | 6:48eeb41188dd | 108 | return; |
chrigelburri | 6:48eeb41188dd | 109 | } |
chrigelburri | 6:48eeb41188dd | 110 | err = GetDescriptor(_device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,len); |
chrigelburri | 6:48eeb41188dd | 111 | u8* p = buffer; |
chrigelburri | 6:48eeb41188dd | 112 | input_ep=0; |
chrigelburri | 6:48eeb41188dd | 113 | output_ep=0; |
chrigelburri | 6:48eeb41188dd | 114 | EndpointDescriptor *epDesc; |
chrigelburri | 6:48eeb41188dd | 115 | while (p<(buffer+len)) { |
chrigelburri | 6:48eeb41188dd | 116 | u8 descLen = p[0]; |
chrigelburri | 6:48eeb41188dd | 117 | u8 descType = p[1]; |
chrigelburri | 6:48eeb41188dd | 118 | log("descLen=%d,descType=%d\r\n",descLen,descType); |
chrigelburri | 6:48eeb41188dd | 119 | switch (descType) { |
chrigelburri | 6:48eeb41188dd | 120 | case DESCRIPTOR_TYPE_CONFIGURATION: |
chrigelburri | 6:48eeb41188dd | 121 | log("config desc\r\n"); |
chrigelburri | 6:48eeb41188dd | 122 | break; |
chrigelburri | 6:48eeb41188dd | 123 | case DESCRIPTOR_TYPE_INTERFACE: |
chrigelburri | 6:48eeb41188dd | 124 | log("interface desc\r\n"); |
chrigelburri | 6:48eeb41188dd | 125 | break; |
chrigelburri | 6:48eeb41188dd | 126 | case DESCRIPTOR_TYPE_ENDPOINT: |
chrigelburri | 6:48eeb41188dd | 127 | epDesc=(EndpointDescriptor*)p; |
chrigelburri | 6:48eeb41188dd | 128 | if (!input_ep && (epDesc->bEndpointAddress& 0x80)) { |
chrigelburri | 6:48eeb41188dd | 129 | input_ep=epDesc->bEndpointAddress& 0x7f; |
chrigelburri | 6:48eeb41188dd | 130 | //PacketSize drop |
chrigelburri | 6:48eeb41188dd | 131 | log("input Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); |
chrigelburri | 6:48eeb41188dd | 132 | |
chrigelburri | 6:48eeb41188dd | 133 | } else if (!output_ep) { |
chrigelburri | 6:48eeb41188dd | 134 | output_ep=epDesc->bEndpointAddress& 0x7f; |
chrigelburri | 6:48eeb41188dd | 135 | //PacketSize drop |
chrigelburri | 6:48eeb41188dd | 136 | log("output Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); |
chrigelburri | 6:48eeb41188dd | 137 | } else { |
chrigelburri | 6:48eeb41188dd | 138 | //other |
chrigelburri | 6:48eeb41188dd | 139 | log("non input,output Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); |
chrigelburri | 6:48eeb41188dd | 140 | } |
chrigelburri | 6:48eeb41188dd | 141 | break; |
chrigelburri | 6:48eeb41188dd | 142 | default: |
chrigelburri | 6:48eeb41188dd | 143 | log("unkown desc type(%d) \r\n",descType); |
chrigelburri | 6:48eeb41188dd | 144 | } |
chrigelburri | 6:48eeb41188dd | 145 | p+=descLen; |
chrigelburri | 6:48eeb41188dd | 146 | } |
chrigelburri | 6:48eeb41188dd | 147 | |
chrigelburri | 6:48eeb41188dd | 148 | if (!(input_ep && output_ep)) { |
chrigelburri | 6:48eeb41188dd | 149 | log("can't find accessory endpoints\r\n"); |
chrigelburri | 6:48eeb41188dd | 150 | return; |
chrigelburri | 6:48eeb41188dd | 151 | } |
chrigelburri | 6:48eeb41188dd | 152 | |
chrigelburri | 6:48eeb41188dd | 153 | log("SetConfiguration\r\n"); |
chrigelburri | 6:48eeb41188dd | 154 | err = SetConfiguration(device,configuration); |
chrigelburri | 6:48eeb41188dd | 155 | if (err < 0) { |
chrigelburri | 6:48eeb41188dd | 156 | log("SetConfiguration error\r\n"); |
chrigelburri | 6:48eeb41188dd | 157 | return; |
chrigelburri | 6:48eeb41188dd | 158 | } |
chrigelburri | 6:48eeb41188dd | 159 | |
chrigelburri | 6:48eeb41188dd | 160 | |
chrigelburri | 6:48eeb41188dd | 161 | log("interrupt setup\r\n"); |
chrigelburri | 6:48eeb41188dd | 162 | //interrupt setup |
chrigelburri | 6:48eeb41188dd | 163 | if (_readbuff==NULL || _readbuffsize<=0) { |
chrigelburri | 6:48eeb41188dd | 164 | error("_readbuffer error please setup buffer call setReadBuffer function\r\n"); |
chrigelburri | 6:48eeb41188dd | 165 | } |
chrigelburri | 6:48eeb41188dd | 166 | |
chrigelburri | 6:48eeb41188dd | 167 | if (IO_PENDING!=USBBulkTransfer(_device,input_ep|0x80,_readbuff,_readbuffsize,AdkreadCallback,this)) |
chrigelburri | 6:48eeb41188dd | 168 | return; |
chrigelburri | 6:48eeb41188dd | 169 | |
chrigelburri | 6:48eeb41188dd | 170 | |
chrigelburri | 6:48eeb41188dd | 171 | log("setupDevice\r\n"); |
chrigelburri | 6:48eeb41188dd | 172 | this->setupDevice(); |
chrigelburri | 6:48eeb41188dd | 173 | // _initok=true; |
chrigelburri | 6:48eeb41188dd | 174 | } |
chrigelburri | 6:48eeb41188dd | 175 | |
chrigelburri | 6:48eeb41188dd | 176 | |
chrigelburri | 6:48eeb41188dd | 177 | |
chrigelburri | 6:48eeb41188dd | 178 | bool AndroidAccessory::switchDevice(int device) { |
chrigelburri | 6:48eeb41188dd | 179 | |
chrigelburri | 6:48eeb41188dd | 180 | if (1==getProtocol(device)) { |
chrigelburri | 6:48eeb41188dd | 181 | log("device supports protocol 1\r\n"); |
chrigelburri | 6:48eeb41188dd | 182 | |
chrigelburri | 6:48eeb41188dd | 183 | } else { |
chrigelburri | 6:48eeb41188dd | 184 | log("could not read device protocol version\r\n"); |
chrigelburri | 6:48eeb41188dd | 185 | return false; |
chrigelburri | 6:48eeb41188dd | 186 | } |
chrigelburri | 6:48eeb41188dd | 187 | |
chrigelburri | 6:48eeb41188dd | 188 | |
chrigelburri | 6:48eeb41188dd | 189 | sendString(device,ACCESSORY_STRING_MANUFACTURER,manufacturer); |
chrigelburri | 6:48eeb41188dd | 190 | sendString(device,ACCESSORY_STRING_MODEL,model); |
chrigelburri | 6:48eeb41188dd | 191 | sendString(device,ACCESSORY_STRING_DESCRIPTION,description); |
chrigelburri | 6:48eeb41188dd | 192 | sendString(device,ACCESSORY_STRING_VERSION,version); |
chrigelburri | 6:48eeb41188dd | 193 | sendString(device,ACCESSORY_STRING_URI,uri); |
chrigelburri | 6:48eeb41188dd | 194 | sendString(device,ACCESSORY_STRING_SERIAL,serial); |
chrigelburri | 6:48eeb41188dd | 195 | USBControlTransfer(device, |
chrigelburri | 6:48eeb41188dd | 196 | HOST_TO_DEVICE |REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, |
chrigelburri | 6:48eeb41188dd | 197 | ACCESSORY_START, |
chrigelburri | 6:48eeb41188dd | 198 | 0,//value |
chrigelburri | 6:48eeb41188dd | 199 | 0, //index |
chrigelburri | 6:48eeb41188dd | 200 | 0, |
chrigelburri | 6:48eeb41188dd | 201 | 0, |
chrigelburri | 6:48eeb41188dd | 202 | 0, |
chrigelburri | 6:48eeb41188dd | 203 | 0 ); |
chrigelburri | 6:48eeb41188dd | 204 | |
chrigelburri | 6:48eeb41188dd | 205 | wait_ms(4); |
chrigelburri | 6:48eeb41188dd | 206 | //reset usb host |
chrigelburri | 6:48eeb41188dd | 207 | USBInit(); |
chrigelburri | 6:48eeb41188dd | 208 | |
chrigelburri | 6:48eeb41188dd | 209 | return true; |
chrigelburri | 6:48eeb41188dd | 210 | |
chrigelburri | 6:48eeb41188dd | 211 | } |
chrigelburri | 6:48eeb41188dd | 212 | |
chrigelburri | 6:48eeb41188dd | 213 | |
chrigelburri | 6:48eeb41188dd | 214 | int AndroidAccessory::getProtocol(int device) { |
chrigelburri | 6:48eeb41188dd | 215 | s16 data=-1; |
chrigelburri | 6:48eeb41188dd | 216 | USBControlTransfer(device, |
chrigelburri | 6:48eeb41188dd | 217 | DEVICE_TO_HOST|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, |
chrigelburri | 6:48eeb41188dd | 218 | ACCESSORY_GET_PROTOCOL, |
chrigelburri | 6:48eeb41188dd | 219 | 0,//value |
chrigelburri | 6:48eeb41188dd | 220 | 0, //index |
chrigelburri | 6:48eeb41188dd | 221 | (u8*)&data, |
chrigelburri | 6:48eeb41188dd | 222 | 2, |
chrigelburri | 6:48eeb41188dd | 223 | 0, |
chrigelburri | 6:48eeb41188dd | 224 | 0 ); |
chrigelburri | 6:48eeb41188dd | 225 | return data; |
chrigelburri | 6:48eeb41188dd | 226 | |
chrigelburri | 6:48eeb41188dd | 227 | } |
chrigelburri | 6:48eeb41188dd | 228 | |
chrigelburri | 6:48eeb41188dd | 229 | void AndroidAccessory::sendString(const char *str) { |
chrigelburri | 6:48eeb41188dd | 230 | sendString(_device,1,str); |
chrigelburri | 6:48eeb41188dd | 231 | |
chrigelburri | 6:48eeb41188dd | 232 | } |
chrigelburri | 6:48eeb41188dd | 233 | |
chrigelburri | 6:48eeb41188dd | 234 | void AndroidAccessory::sendString(int device, int index, const char *str) { |
chrigelburri | 6:48eeb41188dd | 235 | |
chrigelburri | 6:48eeb41188dd | 236 | LOG("send_string start(%d,%d,%s) %d \r\n",device,index,str,strlen(str)+1); |
chrigelburri | 6:48eeb41188dd | 237 | strcpy((char*)_strbuff,str); |
chrigelburri | 6:48eeb41188dd | 238 | //thankyou curryman san |
chrigelburri | 6:48eeb41188dd | 239 | USBControlTransfer(device, |
chrigelburri | 6:48eeb41188dd | 240 | HOST_TO_DEVICE|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, |
chrigelburri | 6:48eeb41188dd | 241 | ACCESSORY_SEND_STRING, |
chrigelburri | 6:48eeb41188dd | 242 | 0,//value |
chrigelburri | 6:48eeb41188dd | 243 | index, |
chrigelburri | 6:48eeb41188dd | 244 | _strbuff, |
chrigelburri | 6:48eeb41188dd | 245 | strlen(str)+1 |
chrigelburri | 6:48eeb41188dd | 246 | ); |
chrigelburri | 6:48eeb41188dd | 247 | |
chrigelburri | 6:48eeb41188dd | 248 | LOG("send_string end(%d,%d,%s)\r\n",device,index,str); |
chrigelburri | 6:48eeb41188dd | 249 | |
chrigelburri | 6:48eeb41188dd | 250 | } |
chrigelburri | 6:48eeb41188dd | 251 | |
chrigelburri | 6:48eeb41188dd | 252 | |
chrigelburri | 6:48eeb41188dd | 253 | /** from USBHost load function. initialize Android device**/ |
chrigelburri | 6:48eeb41188dd | 254 | void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc) { |
chrigelburri | 6:48eeb41188dd | 255 | printf("LoadDevice %d %02X:%02X:%02X\r\n",device,interfaceDesc->bInterfaceClass,interfaceDesc->bInterfaceSubClass,interfaceDesc->bInterfaceProtocol); |
chrigelburri | 6:48eeb41188dd | 256 | char s[128]; |
chrigelburri | 6:48eeb41188dd | 257 | |
chrigelburri | 6:48eeb41188dd | 258 | for (int i = 1; i < 3; i++) { |
chrigelburri | 6:48eeb41188dd | 259 | if (GetString(device,i,s,sizeof(s)) < 0) |
chrigelburri | 6:48eeb41188dd | 260 | break; |
chrigelburri | 6:48eeb41188dd | 261 | printf("%d: %s\r\n",i,s); |
chrigelburri | 6:48eeb41188dd | 262 | } |
chrigelburri | 6:48eeb41188dd | 263 | |
chrigelburri | 6:48eeb41188dd | 264 | //for android ADK |
chrigelburri | 6:48eeb41188dd | 265 | if ( ( deviceDesc->idVendor != 0x18D1 || |
chrigelburri | 6:48eeb41188dd | 266 | ( deviceDesc->idProduct != 0x2D00 && deviceDesc->idProduct != 0x2D01)) |
chrigelburri | 6:48eeb41188dd | 267 | &&_adk->switchDevice(device)) { |
chrigelburri | 6:48eeb41188dd | 268 | |
chrigelburri | 6:48eeb41188dd | 269 | printf(" try to change accmode.interfaceDesc->bInterfaceClass=%d\r\n",interfaceDesc->bInterfaceClass); |
chrigelburri | 6:48eeb41188dd | 270 | //1th root |
chrigelburri | 6:48eeb41188dd | 271 | //accmode_support=true; |
chrigelburri | 6:48eeb41188dd | 272 | printf("accessory mode ok.\r\n"); |
chrigelburri | 6:48eeb41188dd | 273 | return; |
chrigelburri | 6:48eeb41188dd | 274 | } |
chrigelburri | 6:48eeb41188dd | 275 | |
chrigelburri | 6:48eeb41188dd | 276 | if (deviceDesc->idVendor == 0x18D1 && |
chrigelburri | 6:48eeb41188dd | 277 | (deviceDesc->idProduct == 0x2D00 || deviceDesc->idProduct == 0x2D01)) { |
chrigelburri | 6:48eeb41188dd | 278 | //2th root |
chrigelburri | 6:48eeb41188dd | 279 | printf("connecting Android.\r\n"); |
chrigelburri | 6:48eeb41188dd | 280 | printf("idVender=%x idProduct=%x interfaceDesc->bInterfaceClass=%d\r\n",deviceDesc->idVendor,deviceDesc->idProduct,interfaceDesc->bInterfaceClass); |
chrigelburri | 6:48eeb41188dd | 281 | _adk->init(device,1,0); |
chrigelburri | 6:48eeb41188dd | 282 | //_AdkUSB.loop(); |
chrigelburri | 6:48eeb41188dd | 283 | return; |
chrigelburri | 6:48eeb41188dd | 284 | } |
chrigelburri | 6:48eeb41188dd | 285 | } |
chrigelburri | 6:48eeb41188dd | 286 | |
chrigelburri | 6:48eeb41188dd | 287 | void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData) { |
chrigelburri | 6:48eeb41188dd | 288 | log("AdkreadCallback(int device=%d, int endpoint=%x, int status=%d, u8* buf=%p, int len=%d, void* userData=%p)\r\n", |
chrigelburri | 6:48eeb41188dd | 289 | device,endpoint,status,buf,len,userData); |
chrigelburri | 6:48eeb41188dd | 290 | // __disable_irq(); |
chrigelburri | 6:48eeb41188dd | 291 | AndroidAccessory* t = (AndroidAccessory*)userData; |
chrigelburri | 6:48eeb41188dd | 292 | if (status!=0 && status!=8) { |
chrigelburri | 6:48eeb41188dd | 293 | log("adk end.\r\n"); |
chrigelburri | 6:48eeb41188dd | 294 | t->adkEnd(); |
chrigelburri | 6:48eeb41188dd | 295 | // __enable_irq(); |
chrigelburri | 6:48eeb41188dd | 296 | USBInit(); |
chrigelburri | 6:48eeb41188dd | 297 | return; |
chrigelburri | 6:48eeb41188dd | 298 | } |
chrigelburri | 6:48eeb41188dd | 299 | |
chrigelburri | 6:48eeb41188dd | 300 | |
chrigelburri | 6:48eeb41188dd | 301 | //virtual method run |
chrigelburri | 6:48eeb41188dd | 302 | t->callbackRead(buf,len); |
chrigelburri | 6:48eeb41188dd | 303 | |
chrigelburri | 6:48eeb41188dd | 304 | USBBulkTransfer(device, endpoint , buf, len, AdkreadCallback, userData); |
chrigelburri | 6:48eeb41188dd | 305 | |
chrigelburri | 6:48eeb41188dd | 306 | // wait_ms(4); |
chrigelburri | 6:48eeb41188dd | 307 | // __enable_irq(); |
chrigelburri | 6:48eeb41188dd | 308 | } |
chrigelburri | 6:48eeb41188dd | 309 | |
chrigelburri | 6:48eeb41188dd | 310 | |
chrigelburri | 6:48eeb41188dd | 311 | |
chrigelburri | 6:48eeb41188dd | 312 | |
chrigelburri | 6:48eeb41188dd | 313 | void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData) { |
chrigelburri | 6:48eeb41188dd | 314 | |
chrigelburri | 6:48eeb41188dd | 315 | log("AdkwriteCallback(int device=%d, int endpoint=%x, int status=%d, u8* buf=%p, int len=%d, void* userData=%p)\r\n", |
chrigelburri | 6:48eeb41188dd | 316 | device,endpoint,status,buf,len,userData); |
chrigelburri | 6:48eeb41188dd | 317 | |
chrigelburri | 6:48eeb41188dd | 318 | AndroidAccessory* t = (AndroidAccessory*)userData; |
chrigelburri | 6:48eeb41188dd | 319 | t->callbackWrite(); |
chrigelburri | 6:48eeb41188dd | 320 | //wait_ms(4); |
chrigelburri | 6:48eeb41188dd | 321 | //USBBulkTransfer(device, endpoint , buf, len, AdkwriteCallback, userData); |
chrigelburri | 6:48eeb41188dd | 322 | } |
chrigelburri | 6:48eeb41188dd | 323 |