Go Down

Topic: Arduino Due and ADK 2012 (Read 19 times) previous topic - next topic

ardroid

I've successfully loaded Google's ADK 2012 demo onto DUE board. Changed code to disabling BT interface and also updated USB VSB pin control portion.

http://youtu.be/XJgN1gAwGQY   

nwscfox1

Did you make changes to the code on the Due that you can share?

ardroid


Did you make changes to the code on the Due that you can share?


Yes, I did. ADK 2012 will not run as is on DUE board.

First, you have to comment out BT and some init parts in ADK.cpp file as below.

Code: [Select]

void ADK::adkInit(void){

    //board init
    ::fwkInit();
    ::coopInit();
    ::ledsInit();
    ::i2cInit(1, 400000);
    ::rtcInit();
    ::rtcSet(2012, 3, 28, 19, 8, 50);
    ::audioInit();
    ::usbh_init();

    //bt init
    static const BtFuncs myBtFuncs = {this, btVerboseScanCbkF, btConnReqF, btConnStartF, btConnEndF, btPinRequestF, btLinkKeyRequest, btLinkKeyCreated, btAclDataRxF, btSspShowF};

// btInit(&myBtFuncs);              //BT UART & HCI driver
//    btSdpRegisterL2capService();     //SDP daemon
//    btRfcommRegisterL2capService();  //RFCOMM framework
    eliza();                         //easter egg
//    btA2dpRegister();                //A2DP profile
   

    uint8_t mac[BT_MAC_SIZE];

//    if(::btLocalMac(mac)) dbgPrintf("BT MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);

    //i2c devices init
//    if(!hygroInit()) dbgPrintf("ADK i2c init failure: hygrometer\n");
//    if(!baroInit()) dbgPrintf("ADK i2c init failure: barometer\n");
//    if(!capSenseInit()) dbgPrintf("ADK i2c init failure: capsense\n");
//    if(!alsInit()) dbgPrintf("ADK i2c init failure: ALS\n");
//    if(!accelInit()) dbgPrintf("ADK i2c init failure: accelerometer\n");
//    if(!magInit())  dbgPrintf("ADK i2c init failure: magnetometer\n");

dbgPrintf("BT iniit end\n");

}



And, also you have to change code in usbh.c code as below, (It's in usbhwork(void) function's switch command)
Code: [Select]

switch (usbh.state) {

case USBH_DISABLED:
break;

case USBH_INIT:

Usb_unfreeze_clock();

Usb_force_host_mode();
//Wr_bitfield(UOTGHS->UOTGHS_HSTCTRL, UOTGHS_HSTCTRL_SPDCONF_Msk, 1, UOTGHS_HSTCTRL_SPDCONF_Pos); // force full/low speed
Usb_disable_id_pin();

Disable_global_interrupt();

(void)Is_usb_enabled();
Enable_global_interrupt();

Usb_enable_otg_pad();
Usb_enable();

TRACE_OTG("USB_INIT\n");

Usb_set_vbof_active_low();
Usb_disable_vbus_hw_control();

Host_enable_device_disconnection_interrupt();


#if !USE_HIGH_SPEED
Wr_bitfield(UOTGHS->UOTGHS_HSTCTRL, UOTGHS_HSTCTRL_SPDCONF_Msk, 3, UOTGHS_HSTCTRL_SPDCONF_Pos); // force full speed mode
#endif
usbh.state = USBH_DEVICE_UNATTACHED;

// clear all ints
UOTGHS->UOTGHS_SCR = 0xf;
UOTGHS->UOTGHS_HSTICR = 0xf;
break;




Simple Arduino Terminal App Sample for ADK 2012,

Code: [Select]

#include "Arduino.h"
#include "variant.h"
#include <ADK.h>


ADK L;

// ADK1 usb accessory strings
#define ACCESSORY_STRING_VENDOR "Google, Inc."
#define ACCESSORY_STRING_NAME   "DemoKit"
#define ACCESSORY_STRING_LONGNAME "ADK2012 Arduino Due Board"
#define ACCESSORY_STRING_VERSION  "1.0"
#define ACCESSORY_STRING_URL    "http://www.android.com"
#define ACCESSORY_STRING_SERIAL "0000000012345678"

void adkPutchar(char c){Serial.write(c);}
extern "C" void dbgPrintf(const char *, ... );



void setup(void)
{


   
  Serial.begin(115200);

  L.adkSetPutchar(adkPutchar);
  L.adkInit();
 
  // set the old accessory strings
  L.usbSetAccessoryStringVendor(ACCESSORY_STRING_VENDOR);
  L.usbSetAccessoryStringName(ACCESSORY_STRING_NAME);
  L.usbSetAccessoryStringLongname(ACCESSORY_STRING_LONGNAME);
  L.usbSetAccessoryStringVersion(ACCESSORY_STRING_VERSION);
  L.usbSetAccessoryStringUrl(ACCESSORY_STRING_URL);
  L.usbSetAccessoryStringSerial(ACCESSORY_STRING_SERIAL);
 
  L.usbStart();
}


void loop()
{


  char helloWorld[] = "Hello World! \r\n";
   
  uint8_t buf[128];

 
 
  if (L.accessoryConnected()) {
     
    int res = L.accessoryReceive(buf, sizeof(buf));
   
   if (res > 0) {
     
     L.accessorySend((uint8_t *)helloWorld, strlen(helloWorld));
         
      for (uint32_t i = 0; i < res; ++i)
{
printf("%c", (char)buf[i]);
}
                                           
printf("\r\n");
     
    }
  }
  L.adkEventProcess(); //let the adk framework do its thing
}



Your android device will recognized as accessory device like this,
http://www.flickr.com/photos/picolink/8345855859/

-Kevin


aleu / Achim Leubner

Great. That works for me. Thanks!

refined-apps.com

jangofei

#4
Jan 06, 2013, 03:13 pm Last Edit: Jan 06, 2013, 05:28 pm by jangofei Reason: 1
Great! I have the following questions:

1. Which Arduino IDE do you use? arduino-1.5.1r2? or adk2012_ide-win32-20120629?
2. What app do you use on Nexus 7 to transfer data to Due?
3. Is DC to supply power a must? Arduino Due can't work when I use a DC--3.3V & 2.0A. What DC do you use?

Go Up