USB composite device example program, drag-and-drop flash writer.

Dependencies:   SWD USBDevice mbed BaseDAP

Revision:
1:ea8e179320d7
Parent:
0:2385683c867a
--- a/Target2.cpp	Tue Sep 17 04:33:44 2013 +0000
+++ b/Target2.cpp	Sat Sep 28 03:21:14 2013 +0000
@@ -1,4 +1,4 @@
-// Target2.cpp 2013/9/17
+// Target2.cpp 2013/9/23
 #include "Target2.h"
 #include "mydebug.h"
 
@@ -18,7 +18,17 @@
 #define FP_COMP0 (0xE0002008)
 
 Target2::Target2(PinName swdio, PinName swclk, PinName reset)
-    : _swd(swdio, swclk, reset)
+{
+    _swd = new SWD(swdio, swclk, reset);
+    inst();
+}
+
+Target2::Target2(SWD* swd) : _swd(swd)
+{
+    inst();
+}
+
+void Target2::inst()
 {
     r0.setup(this, 0);
     r1.setup(this, 1);
@@ -41,47 +51,46 @@
 
 bool Target2::setup()
 {
-    _swd.Setup();
+    _swd->Setup();
     JTAG2SWD();
     
     uint32_t data;
-    uint8_t ack = _swd.Transfer(DP_IDCODE, &data);
+    uint8_t ack = _swd->Transfer(DP_IDCODE, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
     idcode = data;
-    //TEST_ASSERT(data == 0x0bb11477);
 
     Abort();
 
     data = 0x0;
-    ack = _swd.Transfer(DP_SELECT, &data);
+    ack = _swd->Transfer(DP_SELECT, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
-    ack = _swd.Transfer(DP_RDBUFF, &data);
+    ack = _swd->Transfer(DP_RDBUFF, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
     data = CSYSPWRUPREQ | CDBGPWRUPREQ;
-    ack = _swd.Transfer(DP_CTRL_STAT, &data);
+    ack = _swd->Transfer(DP_CTRL_STAT, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
-    ack = _swd.Transfer(DP_RDBUFF, &data);
+    ack = _swd->Transfer(DP_RDBUFF, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
-    ack = _swd.Transfer(DP_CTRL_STAT_R, &data);
+    ack = _swd->Transfer(DP_CTRL_STAT_R, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
@@ -89,26 +98,26 @@
     TEST_ASSERT(data == 0xf0000040);
 
     data = CSYSPWRUPREQ | CDBGPWRUPREQ | 0x04000000;
-    ack = _swd.Transfer(DP_CTRL_STAT, &data);
+    ack = _swd->Transfer(DP_CTRL_STAT, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
-    ack = _swd.Transfer(DP_RDBUFF, &data);
+    ack = _swd->Transfer(DP_RDBUFF, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
     data = CSYSPWRUPREQ | CDBGPWRUPREQ | MASKLANE;
-    ack = _swd.Transfer(DP_CTRL_STAT, &data);
+    ack = _swd->Transfer(DP_CTRL_STAT, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
     }
 
-    ack = _swd.Transfer(DP_RDBUFF, &data);
+    ack = _swd->Transfer(DP_RDBUFF, &data);
     TEST_ASSERT(ack == SWD_OK);
     if (ack != SWD_OK) {
         return false;
@@ -118,7 +127,7 @@
 
 void Target2::SWJClock(uint32_t clock_hz)
 {
-    _swd.SWJClock(clock_hz);
+    _swd->SWJClock(clock_hz);
 }
 
 void Target2::JTAG2SWD()
@@ -126,16 +135,16 @@
     const uint8_t data1[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff};
     const uint8_t data2[] = {0x9e,0xe7};
     const uint8_t data3[] = {0x00};
-    _swd.SWJSequence(sizeof(data1)*8, data1);
-    _swd.SWJSequence(sizeof(data2)*8, data2);
-    _swd.SWJSequence(sizeof(data1)*8, data1);
-    _swd.SWJSequence(sizeof(data3)*8, data3);
+    _swd->SWJSequence(sizeof(data1)*8, data1);
+    _swd->SWJSequence(sizeof(data2)*8, data2);
+    _swd->SWJSequence(sizeof(data1)*8, data1);
+    _swd->SWJSequence(sizeof(data3)*8, data3);
 }
 
 void Target2::HardwareReset()
 {
-    _swd.SWJPins(0x00, 0x80); // nReset off
-    _swd.SWJPins(0x80, 0x80); // nReset on
+    _swd->SWJPins(0x00, 0x80); // nReset off
+    _swd->SWJPins(0x80, 0x80); // nReset on
 }
 
 void Target2::SoftwareReset()
@@ -148,10 +157,10 @@
     _setaddr(addr);
 
     uint32_t data;
-    uint8_t ack = _swd.Transfer(AP_DRW_R, &data); // dummy read
+    uint8_t ack = _swd->Transfer(AP_DRW_R, &data); // dummy read
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(DP_RDBUFF, &data);
+    ack = _swd->Transfer(DP_RDBUFF, &data);
     TEST_ASSERT(ack == SWD_OK);
     return data;
 }
@@ -164,14 +173,14 @@
 
     _setaddr(addr);
     
-    uint8_t ack = _swd.Transfer(AP_DRW_R, NULL); // dummy read
+    uint8_t ack = _swd->Transfer(AP_DRW_R, NULL); // dummy read
     TEST_ASSERT(ack == SWD_OK);
 
     for(int i = 0; i < count-1; i++) {
-        ack = _swd.Transfer(AP_DRW_R, data++);
+        ack = _swd->Transfer(AP_DRW_R, data++);
         TEST_ASSERT(ack == SWD_OK);
     }
-    ack = _swd.Transfer(DP_RDBUFF, data);
+    ack = _swd->Transfer(DP_RDBUFF, data);
     TEST_ASSERT(ack == SWD_OK);
 }
 
@@ -185,7 +194,7 @@
     _setaddr(addr);
 
     while(count-- > 0) {
-        uint8_t ack = _swd.Transfer(AP_DRW_W, data);
+        uint8_t ack = _swd->Transfer(AP_DRW_W, data);
         TEST_ASSERT(ack == SWD_OK);
         data++;
     }
@@ -196,10 +205,10 @@
     _setaddr8(addr);
 
     uint32_t data32;
-    uint8_t ack = _swd.Transfer(AP_DRW_R, &data32); // dummy read
+    uint8_t ack = _swd->Transfer(AP_DRW_R, &data32); // dummy read
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(DP_RDBUFF, &data32);
+    ack = _swd->Transfer(DP_RDBUFF, &data32);
     TEST_ASSERT(ack == SWD_OK);
     return (data32 >> ((addr & 0x03) << 3)) & 0xff;
 }
@@ -210,46 +219,46 @@
 
     uint32_t data32 = data;
     data32 <<= ((addr & 0x03) << 3);
-    uint8_t ack = _swd.Transfer(AP_DRW_W, &data32);
+    uint8_t ack = _swd->Transfer(AP_DRW_W, &data32);
     TEST_ASSERT(ack == SWD_OK);
 }
 
 void Target2::_setaddr(uint32_t addr)
 {
     uint32_t ctl = CSW_VALUE|CSW_SIZE32;
-    uint8_t ack = _swd.Transfer(AP_CSW, &ctl);
+    uint8_t ack = _swd->Transfer(AP_CSW, &ctl);
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(DP_RDBUFF, NULL);
+    ack = _swd->Transfer(DP_RDBUFF, NULL);
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(AP_TAR, &addr);
+    ack = _swd->Transfer(AP_TAR, &addr);
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(DP_RDBUFF, NULL);
+    ack = _swd->Transfer(DP_RDBUFF, NULL);
     TEST_ASSERT(ack == SWD_OK);
 } 
 
 void Target2::_setaddr8(uint32_t addr)
 {
     uint32_t ctl = CSW_VALUE|CSW_SIZE8;
-    uint8_t ack = _swd.Transfer(AP_CSW, &ctl);
+    uint8_t ack = _swd->Transfer(AP_CSW, &ctl);
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(DP_RDBUFF, NULL);
+    ack = _swd->Transfer(DP_RDBUFF, NULL);
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(AP_TAR, &addr);
+    ack = _swd->Transfer(AP_TAR, &addr);
     TEST_ASSERT(ack == SWD_OK);
 
-    ack = _swd.Transfer(DP_RDBUFF, NULL);
+    ack = _swd->Transfer(DP_RDBUFF, NULL);
     TEST_ASSERT(ack == SWD_OK);
 } 
 
 void Target2::Abort()
 {
     uint32_t data = 0x1e;
-    uint8_t ack = _swd.Transfer(DP_ABORT, &data);
+    uint8_t ack = _swd->Transfer(DP_ABORT, &data);
     TEST_ASSERT(ack == SWD_OK);
 }