Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ADK.cpp
00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include <stdio.h> 00004 #include <string.h> 00005 00006 #include "USBHost.h" 00007 #include "Utils.h" 00008 #include "ps3.h" 00009 #include "ADK.h" 00010 #include "mbed.h" 00011 00012 //#define ADKLOG 1 00013 #define ADKLOG 0 00014 #if ADKLOG 00015 #define LOG(...) printf(__VA_ARGS__) 00016 #define Log(...) printf(__VA_ARGS__) 00017 #define log(...) printf(__VA_ARGS__) 00018 00019 #else 00020 #define LOG(...) do {} while(0) 00021 #define Log(...) do {} while(0) 00022 #define log(...) do {} while(0) 00023 00024 #endif 00025 00026 00027 PwmOut red1(p26); 00028 PwmOut gren1(p24); 00029 PwmOut blue1(p25); 00030 00031 PwmOut red2(p22); 00032 PwmOut gren2(p23); 00033 PwmOut blue2(p21); 00034 00035 PwmOut led1(LED1); 00036 PwmOut led2(LED2); 00037 PwmOut led3(LED3); 00038 PwmOut led4(LED4); 00039 00040 /* 00041 InterruptIn sw1(p21); 00042 InterruptIn sw2(p22); 00043 InterruptIn sw3(p23); 00044 00045 DigitalIn sw1(p21); 00046 DigitalIn sw2(p22); 00047 DigitalIn sw3(p23); 00048 */ 00049 DigitalIn sw1(p17); 00050 DigitalIn sw2(p19); 00051 DigitalIn sw3(p20); 00052 00053 u8 readbuff[3]; 00054 u8 writebuf[3]; 00055 //switch data backup 00056 u8 sw1b,sw2b,sw3b; 00057 00058 00059 void AdkUSB::setup() { 00060 sw1.mode(PullUp); 00061 sw2.mode(PullUp); 00062 sw3.mode(PullUp); 00063 sw1b=sw2b=sw3b=sw1; 00064 } 00065 00066 void AdkUSB::loop() { 00067 log("enter loop\r\n"); 00068 u8 buf[3]; 00069 int ret=-1; 00070 //booting wait 00071 //wait(10); 00072 while (!this->_loopend) { 00073 bool w_flag=false; 00074 //wait_ms(4); 00075 00076 buf[0]=0x01; 00077 //switch1 00078 if (sw1!=sw1b) { 00079 log("sw1=%d\r\n",sw1.read()); 00080 buf[1]=0; 00081 buf[2]=!sw1; 00082 ret=this->write(buf,sizeof(buf)); 00083 //wait_ms(4); 00084 sw1b=sw1; 00085 w_flag=true; 00086 } 00087 //switch2 00088 if (sw2!=sw2b) { 00089 log("sw2=%d\r\n",sw2.read()); 00090 buf[1]=1; 00091 buf[2]=!sw2; 00092 ret=this->write(buf,sizeof(buf)); 00093 //wait_ms(4); 00094 sw2b=sw2; 00095 w_flag=true; 00096 } 00097 //switch3 00098 if (sw3!=sw3b) { 00099 log("sw3=%d\r\n",sw3.read()); 00100 buf[1]=2; 00101 buf[2]=!sw3; 00102 ret=this->write(buf,sizeof(buf)); 00103 //wait_ms(4); 00104 sw3b=sw3; 00105 w_flag=true; 00106 } 00107 00108 if (!w_flag) { 00109 buf[0]=buf[1]=buf[2]=0; 00110 ret=this->write(buf,sizeof(buf)); 00111 } 00112 } 00113 00114 //reset 00115 // led1=led2=led3=led4=0.0; 00116 red1=gren1=blue1=led4=0.0; 00117 red2=gren2=blue2=0.0; 00118 log("---------------------------------------------------------------loop end\r\n"); 00119 } 00120 void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData) { 00121 00122 log("AdkreadCallback(int device=%d, int endpoint=%x, int status=%d, u8* buf=%p, int len=%d, void* userData=%p)\r\n", 00123 device,endpoint,status,buf,len,userData); 00124 00125 AdkUSB* t = (AdkUSB*)userData; 00126 if (status!=0) { 00127 log("loop end.\r\n"); 00128 t->loopend(); 00129 return; 00130 } 00131 00132 00133 // gren=((float)buf[2])/255.0; 00134 if (buf[0] == 0x2) { 00135 if (buf[1] == 0x0) { 00136 log("led1=%d\r\n",buf[2]); 00137 // led1=((float)buf[2])/255.0; 00138 gren2=((float)buf[2])/255.0; 00139 // } else if (buf[1]==0x3) { 00140 } else if (buf[1]==0x1) { 00141 // led2=((float)buf[2])/255.0; 00142 red2=((float)buf[2])/255.0; 00143 // } else if (buf[1]==0x6) { 00144 } else if (buf[1]==0x2) { 00145 // led3=((float)buf[2])/255.0; 00146 blue2=((float)buf[2])/255.0; 00147 } else if (buf[1]==0x3) { 00148 red1=((float)buf[2])/255.0; 00149 } else if (buf[1]==0x4) { 00150 blue1=((float)buf[2])/255.0; 00151 } else if (buf[1]==0x5) { 00152 gren1=((float)buf[2])/255.0; 00153 } 00154 } else if (buf[0] ==0x3) { 00155 if (buf[1] == 0x0) { 00156 led4=buf[2]? 1.0:0.0; 00157 } 00158 } 00159 00160 USBBulkTransfer(device, endpoint , buf, len, AdkreadCallback, userData); 00161 wait_ms(4); 00162 00163 } 00164 00165 /* 00166 void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData) { 00167 00168 log("AdkwriteCallback(int device=%d, int endpoint=%x, int status=%d, u8* buf=%p, int len=%d, void* userData=%p)\r\n", 00169 device,endpoint,status,buf,len,userData); 00170 00171 AdkUSB* t = (AdkUSB*)userData; 00172 00173 } 00174 */ 00175 00176 00177 int getProtocol(int device); 00178 void sendString(int device, int index, const char *str); 00179 00180 bool switchDevice(int device) { 00181 00182 if (1==getProtocol(device)) { 00183 log("device supports protocol 1\r\n"); 00184 00185 } else { 00186 log("could not read device protocol version\r\n"); 00187 return false; 00188 } 00189 00190 00191 sendString(device,ACCESSORY_STRING_MANUFACTURER,"Google, Inc."); 00192 sendString(device,ACCESSORY_STRING_MODEL,"DemoKit"); 00193 sendString(device,ACCESSORY_STRING_DESCRIPTION,"DemoKit Arduino Board"); 00194 sendString(device,ACCESSORY_STRING_VERSION,"1.0"); 00195 sendString(device,ACCESSORY_STRING_URI,"http://www.android.com"); 00196 sendString(device,ACCESSORY_STRING_SERIAL,"0000000012345678"); 00197 USBControlTransfer(device, 00198 HOST_TO_DEVICE |REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, 00199 ACCESSORY_START, 00200 0,//value 00201 0, //index 00202 0, 00203 0, 00204 0, 00205 0 ); 00206 00207 wait_ms(400); 00208 00209 return true; 00210 00211 } 00212 00213 00214 int getProtocol(int device) { 00215 s16 data=-1; 00216 USBControlTransfer(device, 00217 DEVICE_TO_HOST|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, 00218 ACCESSORY_GET_PROTOCOL, 00219 0,//value 00220 0, //index 00221 (u8*)&data, 00222 2, 00223 0, 00224 0 ); 00225 //printf("return %d\r\n",data); 00226 return data; 00227 00228 } 00229 00230 void sendString(int device, int index, const char *str) { 00231 00232 LOG("send_string start(%d,%d,%s) %d \r\n",device,index,str,strlen(str)+1); 00233 u8 buffer[255]; 00234 strcpy((char*)buffer,str); 00235 //thankyou curryman san 00236 USBControlTransfer(device, 00237 HOST_TO_DEVICE|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, 00238 ACCESSORY_SEND_STRING, 00239 0,//value 00240 index, 00241 buffer, 00242 strlen(str)+1 00243 ); 00244 00245 LOG("send_string end(%d,%d,%s)\r\n",device,index,str); 00246 00247 } 00248 00249 //int USBBulkTransfer(int device, int ep, u8* data, int length, USBCallback callback, void* userData) 00250 int AdkUSB::read(u8 *buff, int len) { 00251 int ret=USBBulkTransfer(_device,input_ep|0x80,buff,len,0,0); 00252 log("adkUSB read ret=%d \r\n",ret); 00253 return ret; 00254 } 00255 00256 void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); 00257 00258 int AdkUSB::write(u8 *buff, int len) { 00259 log("adkUSB write ------- xxx \r\n"); 00260 int ret=USBBulkTransfer(_device,output_ep,buff,len/*,AdkwriteCallback,this*/); 00261 log("ret=%d \r\n",ret); 00262 return ret; 00263 } 00264 00265 void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); 00266 00267 AdkUSB::AdkUSB(int device, int configuration, int interfaceNumber) { 00268 00269 log("connecting Android \r\n"); 00270 _device = device; 00271 _configuration = configuration; 00272 _interfaceNumber = interfaceNumber; 00273 //for loop() 00274 _loopend=false; 00275 printf("device = %d configuration = %d interfaceNumber = %d\r\n", device, configuration, interfaceNumber); 00276 int err; 00277 00278 u8 buffer[255]; 00279 err = GetDescriptor(_device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,4); 00280 00281 if (err < 0) { 00282 log("Failed to get descriptor\r\n"); 00283 return; 00284 } 00285 00286 00287 int len = buffer[2] | (buffer[3] << 8); 00288 if (len > sizeof(buffer)) { 00289 log("config descriptor too large\n"); 00290 /* might want to truncate here */ 00291 return; 00292 } 00293 err = GetDescriptor(_device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,len); 00294 u8* p = buffer; 00295 input_ep=0; 00296 output_ep=0; 00297 EndpointDescriptor *epDesc; 00298 while (p<(buffer+len)) { 00299 u8 descLen = p[0]; 00300 u8 descType = p[1]; 00301 log("descLen=%d,descType=%d\r\n",descLen,descType); 00302 switch (descType) { 00303 case DESCRIPTOR_TYPE_CONFIGURATION: 00304 log("config desc\r\n"); 00305 break; 00306 case DESCRIPTOR_TYPE_INTERFACE: 00307 log("interface desc\r\n"); 00308 break; 00309 case DESCRIPTOR_TYPE_ENDPOINT: 00310 epDesc=(EndpointDescriptor*)p; 00311 if (!input_ep && (epDesc->bEndpointAddress& 0x80)) { 00312 input_ep=epDesc->bEndpointAddress& 0x7f; 00313 //PacketSize drop 00314 log("input Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); 00315 00316 } else if (!output_ep) { 00317 output_ep=epDesc->bEndpointAddress& 0x7f; 00318 //PacketSize drop 00319 log("output Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); 00320 } else { 00321 //other 00322 log("non input,output Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); 00323 } 00324 break; 00325 default: 00326 log("unkown desc type(%d) \r\n",descType); 00327 } 00328 p+=descLen; 00329 } 00330 00331 if (!(input_ep && output_ep)) { 00332 log("can't find accessory endpoints\r\n"); 00333 return; 00334 } 00335 00336 log("SetConfiguration\r\n"); 00337 err = SetConfiguration(device,configuration); 00338 if (err < 0) { 00339 log("SetConfiguration error\r\n"); 00340 return; 00341 } 00342 00343 log("interrupt setup\r\n"); 00344 //interrupt setup 00345 int ret=USBBulkTransfer(_device,input_ep|0x80,readbuff,sizeof(readbuff),AdkreadCallback,this); 00346 log("ret=%d \r\n",ret); 00347 log("ADK Standby\r\n"); 00348 00349 this->setup(); 00350 } 00351
Generated on Sat Jul 23 2022 04:28:40 by
1.7.2