Programming internal SRAM over SWD

https://github.com/MarkDing/swd_programing_sram

//
// Copyright (c) 2013 SILICON LABORATORIES, INC.
//
// FILE NAME    : 32bit_prog_defs.h
// DESCRIPTION  : ARM Serial Wire debug interface header file
//

#ifndef _32BIT_PROG_DEFS_
#define _32BIT_PROG_DEFS_

#include <compiler_defs.h>
#include <C8051F380_defs.h>

//-----------------------------------------------------------------------------
// Project Constants
//-----------------------------------------------------------------------------

// System clock frequency in Hz
#define  SYSCLK                 48000000

#define BOOL bit
#define TRUE (1 == 1)
#define FALSE (!TRUE)

// Delay Times
#define  DELAY100mS             -( SYSCLK / 48 * 0.1 )
#define  DELAY20mS              -( SYSCLK / 48 * 0.02 )
#define  DELAY5mS               -( SYSCLK / 48 * 0.005 )
#define  DELAY1mS               -( SYSCLK / 48 * 0.001 )
#define  DELAY100uS             -( SYSCLK / 48 * 0.000100 )
#define  DELAY75uS              -( SYSCLK / 48 * 0.000075 )
#define  DELAY25uS              -( SYSCLK / 48 * 0.000025 )
#define  DELAY10uS              -( SYSCLK / 48 * 0.00001 )
#define  DELAY4_3uS             -( SYSCLK / 48 * 0.0000043 )
#define  DELAY3uS               -( SYSCLK / 48 * 0.000003 )
#define  DELAY2uS               -( SYSCLK / 48 * 0.000002 )

// Timeout Times
#define  TIMEOUT_2Sec           -( SYSCLK / 48 * 2 )

// Command Status Response Codes
#define HOST_COMMAND_OK         0x55
#define HOST_INVALID_COMMAND    0x80
#define HOST_COMMAND_FAILED     0x81
#define HOST_AP_TIMEOUT         0x82
#define HOST_WIRE_ERROR         0x83
#define HOST_ACK_FAULT          0x84
#define HOST_DP_NOT_CONNECTED   0x85

// Property SRST values
#define SRST_ASSERTED           0x1
#define SRST_DEASSERTED         0x0

#define DAP_RETRY_COUNT         255

//-----------------------------------------------------------------------------
// ARM Debug Interface Constants
//-----------------------------------------------------------------------------

// ARM CoreSight SWD-DP packet request values
#define SW_IDCODE_RD            0xA5
#define SW_ABORT_WR             0x81
#define SW_CTRLSTAT_RD          0x8D
#define SW_CTRLSTAT_WR          0xA9
#define SW_RESEND_RD            0x95
#define SW_SELECT_WR            0xB1
#define SW_RDBUFF_RD            0xBD

// ARM CoreSight SW-DP packet request masks
#define SW_REQ_PARK_START       0x81
#define SW_REQ_PARITY           0x20
#define SW_REQ_A32              0x18
#define SW_REQ_RnW              0x04
#define SW_REQ_APnDP            0x02

// ARM CoreSight SW-DP packet acknowledge values
#define SW_ACK_OK               0x1
#define SW_ACK_WAIT             0x2
#define SW_ACK_FAULT            0x4
#define SW_ACK_PARITY_ERR       0x8

// ARM CoreSight DAP command values
#define DAP_IDCODE_RD           0x02
#define DAP_ABORT_WR            0x00
#define DAP_CTRLSTAT_RD         0x06
#define DAP_CTRLSTAT_WR         0x04
#define DAP_SELECT_WR           0x08
#define DAP_RDBUFF_RD           0x0E

// ARM CoreSight DAP command masks
#define DAP_CMD_PACKED          0x80
#define DAP_CMD_A32             0x0C
#define DAP_CMD_RnW             0x02
#define DAP_CMD_APnDP           0x01
#define DAP_CMD_MASK            0x0F

//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------

// These pin assignments match the debug adapter cable
//
// Pin 1: VREF         P1.0
// Pin 2: SWDIO/TMS    P1.1
// Pin 3: ground       P1.2
// Pin 4: SWCLK/TCK    P1.3
// Pin 5: ground       P1.4
// Pin 6: SWO/TDO      P1.5
// Pin 7: NC           P1.6
// Pin 8: TDI          P1.7
// Pin 9: ground       GND
// Pin 10: RESETB      P2.1


// LED Pin Definitions
SBIT(LED0, SFR_P2, 2);                 // Green LED
SBIT(LED1, SFR_P2, 3);                 // Green LED

// JTAG Pin Definitions
SBIT(TDO_In, SFR_P1, 5);               // TDO Input
SBIT(TDI_Out, SFR_P1, 7);              // TDI Output
SBIT(TMS_Out, SFR_P1, 1);              // TMS Output
SBIT(TCK_Out, SFR_P1, 3);              // TCK Output

// Serial Wire Pin Definitions
SBIT(SWDIO_Out, SFR_P1, 1);            // SWDIO Output
SBIT(SWDIO_In, SFR_P1, 1);             // SWDIO Input
SBIT(SWCLK_Out, SFR_P1, 3);            // SWCLK Output
// SWO on P0.5 with TDO

// Reset Pin Definitions
SBIT(nSRST_Out, SFR_P0, 1);            // nSRST Output
SBIT(nSRST_In, SFR_P0, 1);             // nSRST Input

// These pins are ground on the CoreSight debug connector
SBIT(P1_2, SFR_P1, 2);
SBIT(P1_4, SFR_P1, 4);

//-----------------------------------------------------------------------------
// Macros
//-----------------------------------------------------------------------------

// Serial Wire Interface Macros
#define  _SetSWPinsIdle             { P1MDOUT |= 0x08; P1MDOUT &= ~0x22; P1 |= 0x2A; }
#define  _SetSWDIOasInput           { P1MDOUT &= ~0x02; P1 |= 0x02; }
#define  _SetSWDIOasOutput          P1MDOUT |= 0x02

// Set all debug pins xPIN_OUT to 1 (open drain outputs off)
#define  _ResetDebugPins            { P1MDOUT &= ~0x8A; P1 |= 0x8A; P0MDOUT &= ~0x02; P0 |= 0x02; }

// Target Reset Control Macros
#define  _AssertTargetReset         nSRST_Out = 0
#define  _ReleaseTargetReset        nSRST_Out = 1
#define  _IsTargetReset             (nSRST_In == 1)

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

typedef unsigned char STATUS;

//-----------------------------------------------------------------------------
// SWD-DP Interface Functions
//-----------------------------------------------------------------------------
void    SWD_Initialize (void);
STATUS  SWD_Configure (U8 dp_type);
STATUS  SWD_Connect (void);
STATUS  SWD_Disconnect (void);
STATUS  SWD_LineReset (void);
STATUS  SWD_ClearErrors (void);
STATUS  SWD_DAP_Move(U8, U8, U32 *);

STATUS  SW_Response (U8);
void    SW_DAP_Read(U8, U8, U32 *);
void    SW_DAP_Write(U8, U8, U32 *, BOOL);
U8      SW_Request(U8);
BOOL    SW_CalcDataParity(void);
U8      SW_ShiftPacket(U8, U8);
void    SW_ShiftByteOut(U8);
U8      SW_ShiftByteIn(void);
void    SW_ShiftReset(void);

#endif // _32BIT_PROG_DEFS
U32 code binraw0[ ] =
{ 0x20008000, 0x2000016f, 0x20000185, 0x20000187, 0x20000189, 0x20000189,
  0x20000189, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000189,
  0x20000189, 0x00000000, 0x20000189, 0x20000041, 0x13f8f240, 0x300f2c2,
  0x1c426818, 0x4770601a, 0x7f0e92d, 0xf2c42500, 0xf04f0503, 0xf8c50aa5,
  0xf44fa030, 0xf24a4950, 0xf44f1240, 0xf24a4420, 0xf04f13e0, 0xf8c50add,
  0xf2c4a030, 0xf2c40302, 0xf44f0202, 0xf04f7040, 0xf04f4c00, 0xf2c40808,
  0xf44f0402, 0x26036740, 0x902f2c4, 0x11f4f240, 0xf8c92502, 0xf2c25024,
  0xf8c20100, 0xf8c28044, 0xf8c48024, 0xf8c4c044, 0x6498c034, 0x62586058,
  0x625f645f, 0x62566456, 0xf644680a, 0xf2c15cd3, 0xfbac0c62, 0xf24e2102,
  0x9880310, 0x300f2ce, 0xf44f3801, 0x6058426d, 0x200f2ce, 0x200021f0,
  0x1023f882, 0x20076098, 0xf8826018, 0xe8bd1023, 0x477007f0, 0xf24ab410,
  0xf24a1040, 0x4a0c14e0, 0x402f2c4, 0x2f2c4, 0xf5016811, 0x6813717a,
  0xd8fc4299, 0x43cb6821, 0xf041b299, 0x60e36340, 0x43cb6801, 0xfc83fa1f,
  0x3140f44c, 0xe7eb60c1, 0x200001f8, 0x49112000, 0xf8504a11, 0xf8413b04,
  0x42913b04, 0x2000dbf9, 0xf8414a0e, 0x42910b04, 0x480ddbfb, 0x60014909,
  0x5e00f04e, 0xf0004770, 0xf7fff817, 0x4809ffc7, 0x60084907, 0x468d6801,
  0x47006840, 0xe7fee7fe, 0xe7fe, 0x20000000, 0x200001f8, 0x200001fc,
  0xe000ed08, 0x1000, 0x360f24d, 0x302f2c4, 0x7d0691a, 0x6918d51f, 0xd41c0781,
  0xf013691b, 0xd1180204, 0xc10f24e, 0xc00f2ce, 0x120f44f, 0x1004f8cc,
  0x2008f8cc, 0x46612205, 0x2000f8cc, 0xf24e6808, 0x3c20310, 0x300f2ce,
  0x2200d5f8, 0x605a601a, 0xf7ff609a, 0xbf00bf2f, 0x1312d00,

};

U32 code binraw[ ] =
{ 0x20008000, 0x20000151, 0x20000d8d, 0x20000d91, 0x20000d95, 0x20000d99,
  0x20000d9d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000141,
  0x20000145, 0x00000000, 0x20000149, 0x20000d7d, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000e91, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000cbd, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x20000219,
  0x20000219, 0x20000219, 0x20000219, 0x20000219, 0x200018d0, 0x200018d0, 0x18,
  0x200018e8, 0x1c8, 0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe,
  0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe, 0x4a164b15, 0x4293b570,
  0x330cd202, 0xd3fc4293, 0x42ab4d13, 0x2100d21b, 0x42abe001, 0x6858d217,
  0x3308681c, 0xd0f82800, 0x1e462204, 0x51094290, 0x680f3c6, 0xb11ed9f1,
  0x42902208, 0xd9ec6061, 0x51111d16, 0x42903208, 0xd9e65131, 0xf000e7f8,
  0xf000fd63, 0xe7fefedd, 0x20000118, 0x20000124, 0x2000012c, 0xb1aab430,
  0x1e536804, 0xf3c3600c, 0x23040480, 0xd90d429a, 0x6844b124, 0x429a2308,
  0xd907604c, 0x1d1c581d, 0x5825505d, 0x429a3308, 0xd8f75065, 0x4770bc30,
  0xb191b410, 0xf3c31e4b, 0x23040280, 0x42992400, 0xd90a5024, 0x2308b11a,
  0x60444299, 0x1d1ad905, 0x3308501c, 0x50144299, 0xbc10d8f9, 0xbf004770,
  0xbf00e7fe, 0x4ff0e92d, 0xb0834d2d, 0x3bfff04f, 0x591ff248, 0x16e0f24a,
  0x80acf8df, 0xf8cd4f29, 0x2400b004, 0xfde2f000, 0xf00046aa, 0xf2c5fa15,
  0xf00019eb, 0xf2c4fa8d, 0x46580602, 0x4283682b, 0xf8dad011, 0xfba93000,
  0x21641003, 0xfb010942, 0xb1c03012, 0x3000f898, 0x201f083, 0xf04302d3,
  0x60f06000, 0x5a16828, 0xb9130d8b, 0x6280f44f, 0x783a60b2, 0x40912101,
  0xbf04428b, 0x6380f44f, 0x34016073, 0xf000e7da, 0xf898f823, 0xb1533000,
  0x783a9901, 0xd006428a, 0x98019201, 0xfc20f000, 0x781b4b09, 0x9a01e7d8,
  0xd0d53201, 0xd1d32b00, 0x31fff04f, 0x91012010, 0xfc12f000, 0xbf00e7ca,
  0x20001960, 0x2000194d, 0x2000194c, 0xbf004770, 0xcfcf641, 0x5340f44f,
  0x302f2c4, 0xf2c22200, 0xf8cc0c00, 0x651a2004, 0x20026d19, 0x11c7f362,
  0x65192201, 0x605a6058, 0xbf004770, 0x00000000, 0x4ff0e92d, 0x280eb10,
  0x4680b087, 0xf0009205, 0x4da780ce, 0x31fff102, 0x6bae6a28, 0x6bef6a6c,
  0xebc71b82, 0xfb080904, 0x23ff9902, 0xf0019302, 0xf04f0a01, 0xf1b90b00,
  0xf0400f00, 0x990580dd, 0x428c2401, 0x80b0f000, 0xf00f1ba, 0xfbb4d024,
  0xfb08f6f8, 0xf1064916, 0xf106000f, 0xf8550709, 0xf855a020, 0xf1067027,
  0xebca0208, 0x360e0307, 0x3c03fb09, 0x22f855, 0x6026f855, 0x108ebc9,
  0x900ebc6, 0xc909fb01, 0xf0c045cb, 0x990580cd, 0x428c3401, 0x8088f000,
  0xf2f8fbb4, 0x4a12fb08, 0x609f102, 0x70ff102, 0x6026f855, 0x7027f855, 0x8f102,
  0x320e1bf3, 0x3c03fb0a, 0x20f855, 0x9022f855, 0x108ebca, 0xa00ebc9,
  0xca0afb01, 0xd22f45d3, 0xf992f001, 0x100e9cd, 0x7080f509, 0xf98cf001,
  0xe9d3a370, 0xf0012300, 0x4602f8cb, 0xe9dd460b, 0xf0010100, 0x2800f985,
  0x4630d179, 0xf97cf001, 0x100e9cd, 0x7080f507, 0xf976f001, 0xe9d3a365,
  0xf0012300, 0x4602f8b5, 0xe9dd460b, 0xf0010100, 0x9a02f96f, 0xbf182800,
  0x92024622, 0x46d3bf18, 0xfbb43401, 0xfb08f2f8, 0xf1024a12, 0xf1020609,
  0xf855070f, 0xf8556026, 0xf1027027, 0x1bf10008, 0xfb0a320e, 0xf8551301,
  0xf8550020, 0xebca9022, 0xebc90108, 0xfb010c00, 0x45d33a0c, 0xf001d28d,
  0xe9cdf943, 0xf5090100, 0xf0017080, 0xa349f93d, 0x2300e9d3, 0xf87cf001,
  0x460b4602, 0x100e9dd, 0xf936f001, 0x9905b178, 0x34019402, 0x46d3428c,
  0xaf78f47f, 0x2b7f9b02, 0x4841d954, 0x70022200, 0xe8bdb007, 0x46308ff0,
  0xf91ef001, 0x100e9cd, 0x7080f507, 0xf918f001, 0xe9d3a336, 0xf0012300,
  0x460bf857, 0xe9dd4602, 0xf0010100, 0x9b02f911, 0xbf182800, 0x93024623,
  0x46d3bf18, 0x9402e74d, 0xe79d46d3, 0xf900f001, 0x102e9cd, 0x7080f506,
  0xf8faf001, 0xe9d3a327, 0xf0012300, 0x4602f839, 0xe9dd460b, 0xf0010102,
  0xb310f8f3, 0xb008f8cd, 0xe70a46cb, 0xf8e8f001, 0x100e9cd, 0x7080f506,
  0xf8e2f001, 0xe9d3a31b, 0xf0012300, 0x4602f821, 0xe9dd460b, 0xf0010100,
  0x2800f8db, 0x9402d034, 0xe71a46cb, 0x48174b16, 0x21019a02, 0x70027019,
  0x4620e7a6, 0xf8c8f001, 0x102e9cd, 0x7080f507, 0xf8c2f001, 0xe9d3a30b,
  0xf0012300, 0x460bf801, 0xe9dd4602, 0xf0010102, 0x2800f8bb, 0x23ffbf0c,
  0x93022300, 0xf04fbf0c, 0x46cb0b00, 0xbf00e6cd, 0x8000f3af, 0x33333333,
  0x3ff33333, 0x200018fc, 0x2000194c, 0x2000194d, 0xf0014638, 0x4606f89d,
  0x7080f50a, 0xf001460f, 0xa30af897, 0x2300e9d3, 0xffd6f000, 0x4602460b,
  0x46304639, 0xf890f001, 0x28009b02, 0x4623bf18, 0xbf189302, 0xe6cc46cb,
  0x8000f3af, 0x33333333, 0x3ff33333, 0x4a14b430, 0x5340f44f, 0x302f2c4,
  0x68518c1d, 0xf101b2ad, 0xf8420408, 0x20025024, 0x7400f04f, 0x609c2904,
  0xd80e6098, 0xf8521ccc, 0x31014024, 0x651c6051, 0x22016d19, 0x11c7f36f,
  0x60586519, 0xbc30605a, 0x6d1a4770, 0x12c7f36f, 0xbc30651a, 0xbe56f7ff,
  0x200018fc, 0x4161f44f, 0x481db470, 0x100f2ce, 0xf8c12480, 0x24034084,
  0xf44f6144, 0x24085240, 0x61842300, 0x24092601, 0xf2c42502, 0x61c40202,
  0x60434601, 0x60c66083, 0x46146105, 0x65132006, 0xf36f6d13, 0x651313c7,
  0x60566055, 0x7db6813, 0x60a5d4fc, 0xfa1f8c23, 0xf5acfc83, 0x638b7380,
  0x38013104, 0x688bd001, 0xf44fe7e9, 0xf2ce4061, 0x22800000, 0x2184f8c0,
  0xbc706042, 0xbf004770, 0x200018fc, 0xb4102200, 0x203f2c4, 0x631424a5,
  0x4050f44f, 0x1340f24a, 0x631424dd, 0x302f2c4, 0xf2c42108, 0x22020002,
  0x64596242, 0xbc106259, 0xbf004770, 0x3f4f641, 0x300f2c2, 0x601a2201,
  0xbf004770, 0xbf004770, 0xbf004770, 0xf0f641, 0xcecf641, 0xf2c2, 0xf2c22203,
  0xf44f0c00, 0x21014300, 0xf2c46002, 0xf8cc0301, 0x6d181000, 0x3280f440,
  0x4770651a, 0xbf004770, 0x1f0f641, 0xcecf641, 0xf2c22001, 0xf2c20100,
  0xf44f0c00, 0x60084300, 0x301f2c4, 0xf8cc, 0x200f8d3, 0x280f040, 0x2200f8c3,
  0xbf004770, 0xbf282940, 0x7832140, 0xd073b4f0, 0xd06e2900, 0xf8134603,
  0xf44f0b01, 0x1e4a4400, 0x401f2c4, 0xf03f013, 0x830f884, 0x1f002, 0x2a00d013,
  0xb110d05d, 0x2a00e008, 0xf813d059, 0x3a01cb01, 0xf8840798, 0xd006c830,
  0xcb01f813, 0x7983a01, 0xc830f884, 0x2a03d1ef, 0x1f16d929, 0x4635461c,
  0x4700f44f, 0xb04f854, 0x701f2c4, 0xf8c72d03, 0xf3c60830, 0xd9130680,
  0xf854b136, 0x3d040b04, 0xf8c72d03, 0xd90b0830, 0xf8564626, 0x3d080b04,
  0x830f8c7, 0x1d346860, 0xf8c72d03, 0xd8f30830, 0xf0201f10, 0x30040003,
  0x203f002, 0xb1f2181b, 0xf44f3a01, 0xf8134500, 0xf2c4cb01, 0x46140501,
  0xc830f885, 0x201f002, 0xb12ab18c, 0xb01f813, 0xf8853c01, 0xd00a0830,
  0xf812461a, 0xf885cb01, 0x7858c830, 0x3c021c53, 0x830f885, 0x4608d1f4,
  0x4770bcf0, 0x460a4603, 0xbf00e7ad, 0x4c37b538, 0x1ec36820, 0xd8152b07,
  0xf003e8df, 0x14141440, 0x4142115, 0x4c00f44f, 0xc01f2c4, 0x1810f8dc,
  0x40f041, 0x810f8cc, 0x3810f8dc, 0x220f043, 0x2810f8cc, 0xf44fbd38,
  0xf2c44e00, 0xf8de0e01, 0x25081810, 0x40f041, 0x810f8ce, 0x4d246025,
  0x682a4b24, 0x429188d9, 0x4611bf28, 0xd9222940, 0x21404c21, 0xf7ff6820,
  0x6823ff4b, 0x1819682a, 0x4e00f44f, 0x60281a10, 0xf2c46021, 0xf8de0e01,
  0xf0411810, 0xf8ce0002, 0xbd380810, 0x4c00f44f, 0xc01f2c4, 0x3810f8dc,
  0xf0432101, 0xf8cc0240, 0x60212810, 0x4b10bd38, 0xf7ff6818, 0xf44fff29,
  0xf2c44c00, 0xf8dc0c01, 0x20012810, 0x108f042, 0x4e00f44f, 0x1810f8cc,
  0xe01f2c4, 0xf8de6020, 0xf0411810, 0xf8ce0002, 0xbd380810, 0x200018ec,
  0x200018e8, 0x20001958, 0x20001954, 0xf44fb508, 0xf2c44300, 0xf8d30301,
  0x7502810, 0xf8d3d508, 0x210b0810, 0x82f36f, 0x810f8c3, 0x60194b19,
  0xd50c06d1, 0x4c00f44f, 0xc01f2c4, 0x1810f8dc, 0xf0414b14, 0x21010080,
  0x810f8cc, 0x7d26019, 0x4b10d51c, 0x2a0b681a, 0x681bd003, 0xd0052b01,
  0x2001e7fe, 0x681b6018, 0xd1f92b01, 0x4e00f44f, 0xe01f2c4, 0x3830f8de,
  0x49064a07, 0xf8de6013, 0x20023830, 0x60536008, 0xf898f000, 0x4008e8bd,
  0xbf44f7ff, 0x200018ec, 0x20001958, 0x7804b4f0, 0xebb24603, 0xbf240fc4,
  0xd27802, 0xd0640788, 0xd05f2a00, 0x4b01f811, 0xf0111e50, 0xf8830f03,
  0xf0004030, 0xd0150401, 0xd0532800, 0xe009b114, 0xd04f2800, 0x4b01f811,
  0xf0113801, 0xf8830f03, 0xd0074030, 0x4b01f811, 0xf0113801, 0xf8830f03,
  0xd1ed4030, 0xd9212803, 0x460c1f06, 0xf8544635, 0x2d037b04, 0xf3c6631f,
  0xd9100680, 0xf854b12e, 0x3d046b04, 0x631e2d03, 0x4626d909, 0x7b04f856,
  0x631f3d08, 0x1d346867, 0x631f2d03, 0x1f04d8f5, 0x403f024, 0xf0003404,
  0x19090003, 0x3801b1d0, 0x5b01f811, 0xf8834604, 0xf0005030, 0xb18c0001,
  0xf811b128, 0x3c01cb01, 0xc030f883, 0x4608d00a, 0x5b01f810, 0x5030f883,
  0x1c41784d, 0xf8833c02, 0xd1f45030, 0xbcf04610, 0x46104770, 0xbf00e7ba,
  0x4b0cb538, 0xb1a2681a, 0x2a01681a, 0x4d0ad1fc, 0xf6484b08, 0x18290480,
  0x401f2c4, 0x601d2502, 0xf7ff4620, 0x6921ff7b, 0x8af441, 0x325f040,
  0xbd386123, 0x200018f4, 0x200018d0, 0xf2404a44, 0x88136181, 0xd074428b,
  0xf5b3d90a, 0xd01e6f10, 0x3201f640, 0xd01a4293, 0x220a493e, 0x4770600a,
  0x6fa0f5b3, 0xf5b3d058, 0xd1f56fd0, 0xf5b38853, 0xd0677f80, 0x7f00f5b3,
  0x4a37d1ee, 0x60114937, 0x4b372222, 0x21074833, 0x6001601a, 0xf6484770,
  0xf2c40080, 0x69010001, 0x324f242, 0x345f2c0, 0x203ea41, 0x69036102,
  0x72dbf64b, 0x18af423, 0xc24f021, 0x38af44c, 0x120f043, 0x69036101,
  0x72baf6cf, 0xc02ea03, 0x18af44c, 0x324f041, 0x69026103, 0xc8af422, 0x134f02c,
  0x38af441, 0x224f043, 0x69016102, 0x4c00f44f, 0x38af441, 0x264f043,
  0x61022108, 0xc01f2c4, 0xf8dc7001, 0x4a183050, 0x3000f443, 0xf8cc4b12,
  0x21010050, 0x60112003, 0x47706018, 0xf44f8852, 0x4b0d4c00, 0x17ff002,
  0xc01f2c4, 0xf8cc2003, 0x60181000, 0x88504770, 0x5f08f5b0, 0x4a0bd18e,
  0x601a4b06, 0xe79e2217, 0x4b044809, 0x60182212, 0xbf00e799, 0x20001958,
  0x200018ec, 0x20001954, 0x20001864, 0x200018e8, 0x200018f4, 0x2000189c,
  0x20001888, 0x360f24d, 0x302f2c4, 0x7d0691a, 0x6918d51f, 0xd41c0781,
  0xf013691b, 0xd1180204, 0xc10f24e, 0xc00f2ce, 0x120f44f, 0x1004f8cc,
  0x2008f8cc, 0x46612205, 0x2000f8cc, 0xf24e6808, 0x3c20310, 0x300f2ce,
  0x2200d5f8, 0x605a601a, 0xf7ff609a, 0xbf00bd1b, 0xf44fb508, 0xf2c45040,
  0x68030002, 0xd40b019a, 0x5240f44f, 0x202f2c4, 0x14b6811, 0xbd08d400,
  0x4008e8bd, 0xbb00f7ff, 0xfc98f7ff, 0xbf00e7f0, 0x4c50f44f, 0x5340f44f,
  0xf2c4b470, 0xf44f0302, 0x26041100, 0xc02f2c4, 0x1024f8cc, 0x2630605e,
  0xf44f609e, 0x609e4670, 0x605e2600, 0x250124c0, 0x631d2607, 0x4261f44f,
  0x615d619e, 0x605c609c, 0x64e0f44f, 0xf2ce609c, 0x20800200, 0x6480f44f,
  0xf8c2605c, 0x60500184, 0xbc706059, 0xbf004770, 0xf000b508, 0xf641f8c9,
  0xf44f03e4, 0xf2c25234, 0xf2c00300, 0x601a1231, 0xbf00bd08, 0x4350f44f,
  0xf2c42202, 0xf2c50302, 0x625a0220, 0xbf004770, 0x1360f641, 0x300f2c2,
  0x1c426818, 0x4770601a, 0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe, 0xbf00e7fe,
  0xbf00e7fe, 0xf641b430, 0xf2c205e4, 0x68290500, 0xfb002032, 0xf644fc01,
  0xf2c152d3, 0xf64c0262, 0xfba2236b, 0xf6c65401, 0xfba3335f, 0x9a1250c,
  0x310f24e, 0x300f2ce, 0xde81e4c, 0x4c6df44f, 0x605c2210, 0xc00f2ce, 0x204f2ce,
  0x24f03801, 0x21072500, 0x4023f88c, 0x6019609d, 0xbc306010, 0xbf004770,
  0xbf004770, 0xf7ffb508, 0xf000ffaf, 0xf641f815, 0xf44f03e4, 0xf2c25234,
  0xf2c00300, 0x601a1231, 0xffbef7ff, 0xff92f7ff, 0xffbaf7ff, 0xff5ef7ff,
  0x4008e8bd, 0xbfe4f7ff, 0x2a0f24a, 0xf2c4b4f0, 0x241e0202, 0x1340f24a,
  0x4120f44f, 0x10e0f24a, 0xf2c46294, 0x60540302, 0x7cc0f44f, 0x27086314,
  0x102f2c4, 0x4500f04f, 0x2f2c4, 0x6640f44f, 0x72c4f44f, 0xc028f8c3,
  0xc004f8c3, 0x625f645f, 0x634d631a, 0x62466446, 0xbcf0644d, 0xbf004770,
  0xf44fb538, 0xf2c44300, 0x6b1c0301, 0x631c6a1d, 0x621d07ea, 0x7abd41a,
  0x720d415, 0x7a1d410, 0x762d40b, 0x7e3d406, 0xbd38d400, 0x4038e8bd,
  0xbc50f7ff, 0xfc38f7ff, 0xf7ffe7f5, 0xe7f0fc33, 0xfc2ef7ff, 0xf7ffe7eb,
  0xe7e6fc23, 0xfd52f7ff, 0xbf00e7e1, 0x4300f44f, 0x301f2c4, 0xf8c32280,
  0xf8d32314, 0x22000300, 0x140f040, 0x1300f8c3, 0x621a631a, 0xf44f6c18,
  0xf0404c61, 0x64190101, 0xf2ce6d18, 0xf0400c00, 0x65190104, 0x2200f8c3,
  0x200f8d3, 0x120f040, 0x1200f8c3, 0x200f8d3, 0x140f040, 0x1200f8c3,
  0xf0406e18, 0x66190180, 0xf3626e18, 0x66181045, 0x20046e19, 0x1186f362,
  0xf8cc6619, 0x69190004, 0x1104f362, 0x47706119, 0xb5102000, 0x46024601,
  0xf804f000, 0x4010e8bd, 0xb954f7ff, 0x2100b510, 0x72a0f44f, 0xf000481e,
  0x20c0f86b, 0xf9a2f000, 0x21004c1c, 0x602022c0, 0xf862f000, 0x68224b18,
  0x71a0f503, 0x3328625a, 0x428b3218, 0x2000d1fa, 0x4a134915, 0xf878f000,
  0xf44f2100, 0xf44f5380, 0x480f6280, 0xf828f000, 0x49102001, 0xf0004a10,
  0x2100f86b, 0x5380f44f, 0x6280f44f, 0xf000480c, 0x2002f81b, 0x4a0b4909,
  0xf85ef000, 0x21004809, 0x6280f44f, 0x5380f44f, 0x4010e8bd, 0xb80cf000,
  0x20001968, 0x20001964, 0x200018b4, 0x200018b6, 0x20001990, 0x200019b8,
  0x68c4b570, 0xf03f014, 0xf5b2d017, 0xd0097f00, 0x6f80f5b2, 0xf5b2d003,
  0xd10e7f80, 0x6a41e002, 0xe0032301, 0x1e5e4d07, 0xd80842ae, 0x61014322,
  0x61c36001, 0x200060c2, 0x2001bd70, 0x2001bd70, 0xbf00bd70, 0xfffffe,
  0xbb8cf000, 0xb51068c3, 0x320f023, 0x6a4360c3, 0x685b6982, 0x429a4604,
  0xf000d00f, 0x68e3f84c, 0xf4236a62, 0xf0235340, 0xf0430310, 0x60e30310,
  0x61a36853, 0x60936923, 0x68e36023, 0x4380f423, 0x340f023, 0xbd1060e3,
  0x460eb570, 0x46104605, 0xf0004614, 0x7833f91f, 0xd0042b72, 0xd0092b77,
  0xd1252b61, 0x2300e002, 0xe0052201, 0xf2482308, 0xe0010202, 0x22022304,
  0x1f01f816, 0xd002292b, 0xd10a2962, 0xf042e004, 0xf0430203, 0xe7f30302,
  0x204f042, 0x301f043, 0xf013e7ee, 0x60e20f08, 0xd0066165, 0x21004620,
  0xf0002202, 0xe000f947, 0x46202400, 0xb538bd70, 0x46046801, 0x69056a43,
  0x689b68c0, 0x2200f420, 0xf00060e2, 0x2a020282, 0xf410d117, 0xd0193080,
  0xbf384299, 0x42a94619, 0x4628d005, 0x46221b49, 0xf812f000, 0x6a63b960,
  0x609d2000, 0x602568e3, 0x3380f423, 0x60e360a0, 0xf04fbd38, 0xbd3830ff,
  0x30fff04f, 0xbd38, 0x41f0e92d, 0x460668d7, 0x1f80f417, 0x4614460d,
  0x8014f8d2, 0x4640d005, 0xfb16f000, 0x710f047, 0x4b1861a0, 0x303ea07,
  0x4640b193, 0xf00069a1, 0x2800fb1d, 0x68e3da07, 0x30fff04f, 0x380f043,
  0xe8bd60e3, 0xf42781f0, 0xf0273700, 0x60e70710, 0x4640462a, 0xf0004631,
  0x69a3fb15, 0xbf1442a8, 0x30fff04f, 0x18ed2000, 0x4300f020, 0x61a51aed,
  0x68e3b128, 0x30fff04f, 0x380f043, 0xe8bd60e3, 0xbf0081f0, 0x20010,
  0xe92d4b32, 0x1cc541f0, 0x8ad681c, 0x28004698, 0x2700d05a, 0x6821e03f,
  0x5f80f1b1, 0x68a6d139, 0xf1b36833, 0x68635f80, 0x6872d106, 0x3303189b,
  0x68b36063, 0xe02e60a3, 0xd10642ab, 0xf04f4620, 0xf8405300, 0xe8bd3b0c,
  0x1cea81f0, 0xd9104293, 0xf04f4620, 0xf8405200, 0x1b5b2b0c, 0x285eb00,
  0x60653b03, 0xf84060a2, 0x60531025, 0xe8bd6096, 0xb97681f0, 0x1ac0009b,
  0xfac6f000, 0x3ffff1b0, 0xf04fd01e, 0x60235300, 0xf1046065, 0xe8bd000c,
  0x462781f0, 0x2c0068a4, 0x300cd1bd, 0xfab4f000, 0x3ffff1b0, 0xf04fd00f,
  0x60035300, 0x60846045, 0xf8c8b917, 0xe0000000, 0x300c60b8, 0x81f0e8bd,
  0xe8bd4630, 0x462081f0, 0x81f0e8bd, 0x20001aa8, 0x5380f04f, 0x3c0cf840,
  0x4770, 0xf7ffb510, 0x4604ff8f, 0x4904b928, 0xf0002217, 0xf000fa87,
  0x4620fa5b, 0xbf00bd10, 0x200018b8, 0x41f0e92d, 0xb08668c6, 0xf03f016,
  0xf8d04604, 0x69078014, 0xd0276a45, 0xf08f016, 0xf000d117, 0x4640f829,
  0xfa48f000, 0x6f00f416, 0x4638d002, 0xffd0f7ff, 0x5b60db6, 0x4fa5f116,
  0xa801d107, 0x22146a21, 0xfa56f000, 0xf000a801, 0x2100f8dd, 0x6a602218,
  0xfe8af7ff, 0x21004620, 0xf7ff2228, 0x6265fe85, 0xe0012000, 0x30fff04f,
  0xe8bdb006, 0x81f0, 0x4604b570, 0xe8bdb118, 0xf0004070, 0x4605b8f4,
  0x20284b07, 0x3004fb00, 0xf8edf000, 0x28003401, 0xf04fbf18, 0x2c0835ff,
  0x4628d1f2, 0xbf00bd70, 0x20001968, 0x41f0e92d, 0x68c64b41, 0xea064604,
  0x460d0303, 0xf8d04617, 0x2b008014, 0x4640d071, 0xfa04f000, 0xd16c2800,
  0xd0042f01, 0xd0072f02, 0xd0272f00, 0x4620e065, 0xf86cf000, 0xe021182d,
  0xf0004640, 0x2800f9ed, 0x68e3da06, 0xf0432001, 0x60e30380, 0x81f0e8bd,
  0x69a16a62, 0x68936827, 0xbf2c429f, 0x18cb19cb, 0x1a5b6921, 0xf01168e1,
  0xd0030f20, 0x42936852, 0x4613bfb8, 0xbfac4283, 0x182d18ed, 0xdb3f2d00,
  0x5f00f416, 0x6a63d005, 0x68996822, 0xbf384291, 0x69a3609a, 0xdb0e429d,
  0x68216a60, 0x42916882, 0x4611bf38, 0x18cf6922, 0x42bd1abf, 0x68c0dc03,
  0x42bd18c7, 0x2300db07, 0x606360a3, 0xf0466a63, 0x605d0620, 0xf016e011,
  0xebc30f02, 0xbf1c0505, 0x5ebc0, 0xf01660a0, 0xd0020f01, 0x19491a51,
  0x19556061, 0xf0266025, 0xf4260620, 0xf4262602, 0x60e65682, 0xe8bd2000,
  0x200281f0, 0x81f0e8bd, 0xe8bd2002, 0xbf0081f0, 0x100003, 0xf01368c3,
  0xd1050f03, 0x22214b10, 0xf04f601a, 0x477030ff, 0x2f00f413, 0x320f003,
  0xb11bd00b, 0x68586a43, 0x47703801, 0x68016903, 0x43db6982, 0x18181888,
  0xb1134770, 0x68586a43, 0x69834770, 0x18d26802, 0x1ad06903, 0xbf004770,
  0x200018f8, 0x4604b510, 0xf806f000, 0x46204601, 0x4010e8bd, 0xb960f000,
  0x1c41b510, 0xf810e004, 0xb90b3b01, 0xbd101a40, 0xf03f010, 0x4602d1f7,
  0x3b04f850, 0x3401f1a3, 0x403ea24, 0x3f80f014, 0xf013d0f5, 0xd00b0fff,
  0x4f7ff413, 0xf413d006, 0xd0010f7f, 0xe0041d13, 0xe0021cd3, 0xe0001c93,
  0x1a581c53, 0x68c3bd10, 0xf013b570, 0x46050403, 0xf013d019, 0xd0040f20,
  0x685e6a43, 0xfd76f7ff, 0x6983e004, 0x18f66806, 0x1af66903, 0x462868eb,
  0x5340f423, 0xf7ff60eb, 0x4631fdc2, 0x22004604, 0xf7ff4628, 0x4620feff,
  0xbd70, 0x4ff0e92d, 0x5760d0e, 0x460f0d76, 0x461d4614, 0x2e00469c, 0xf240d05c,
  0x428e71ff, 0xd1bd058, 0xd5b055b, 0xd0532b00, 0xd051428b, 0x107ea85,
  0x477ff027, 0x770f427, 0x2ac2ea4f, 0x1780f447, 0x890afba7, 0xab00fbaa,
  0xd5318f6, 0x2cc5ea43, 0xeb1b2500, 0xf1450408, 0xf04c0500, 0xfbe04c00,
  0x2300450c, 0x209eb15, 0x300f143, 0x230cfbe7, 0x1f80f5b3, 0x6680f5a6,
  0x4100f001, 0x49aea44, 0x1892d206, 0x303eb43, 0x43020fe0, 0xe0000064,
  0xfe03601, 0xf1431812, 0x46180300, 0x4f00f1b4, 0x73fdf240, 0xf022bf08,
  0x429e0201, 0xea41d806, 0x5360300, 0x461018f1, 0x8ff0e8bd, 0xbfa42e00,
  0x41fef041, 0x170f441, 0x46102200, 0x8ff0e8bd, 0x207ea8c, 0x1300f46f,
  0x429f007f, 0x4200f002, 0xebb3d806, 0xd3060f4c, 0x20004611, 0x8ff0e8bd,
  0x1f00f517, 0xea4fd10b, 0xf51c0c4c, 0xd8061f00, 0x57f0d7f, 0xea4fb11f,
  0x55b535c, 0x2000b91b, 0xe8bd4904, 0xf0428ff0, 0xf44141fe, 0x20000170,
  0x8ff0e8bd, 0x7ff80000, 0x4603b910, 0xe0204602, 0xd1010c03, 0xe0010400,
  0x7180f101, 0xd1010e03, 0xe0010200, 0x100f501, 0xd1010f03, 0xe0010100,
  0x180f501, 0xd1010f83, 0xe0010080, 0x1100f501, 0xdb012800, 0xe0010040,
  0x1180f501, 0x23e0eb01, 0x46100542, 0x47704619, 0x4180f04f, 0xbfd4f7ff,
  0x460eb570, 0x4619461d, 0x306ea55, 0x446ea4f, 0xf514d407, 0xd8171f00,
  0xd81942ae, 0x4290d114, 0xf514e00e, 0xd80f1f00, 0xf513006b, 0xd80b1f00,
  0xd1014304, 0xd0094313, 0xd80942b1, 0x4282d10a, 0x2000bf94, 0xbd702001,
  0xbd702000, 0xbd704618, 0xbd702001, 0xbd702000, 0x3a044603, 0xb2c9d308,
  0x2101ea41, 0x4101ea41, 0xf8433a04, 0xd2fb1b04, 0xd0023204, 0x54993a01,
  0x4770d1fc, 0x49012018, 0x4770beab, 0x20026, 0x4669b403, 0xbeab2002,
  0x4770b002, 0x4669b403, 0xbeab200c, 0x4770b002, 0x4669b403, 0xbeab2009,
  0x4770b002, 0x4669b403, 0xbeab200e, 0x4770b002, 0x4669b403, 0xbeab200a,
  0x4770b002, 0x4669b40f, 0xbeab200d, 0x4770b004, 0x4669b40f, 0xbeab2005,
  0x4770b004, 0x4b0cb538, 0xb90a681a, 0x601a4a0b, 0x681c1cc5, 0x503f025,
  0x46281965, 0xf812f000, 0x4b05b910, 0xe004601d, 0x220c4b05, 0xf04f601a,
  0x462034ff, 0xbf00bd38, 0x20001aac, 0x20001ab0, 0x200018f8, 0x466b4a08,
  0xd9014293, 0xd2064298, 0xb1334b06, 0xbf344298, 0x20012000, 0x20014770,
  0x46184770, 0xbf004770, 0x20001ab0, 0x00000000, 0x220209, 0xc0000101, 0x40932,
  0x30100, 0x21090000, 0x1000100, 0x7001722, 0x40038105, 0x100, 0x2000112,
  0x40000000, 0xfffeffff, 0x100, 0x100, 0x7090105, 0x70501a1, 0x65290019,
  0x65250015, 0x1950875, 0xc00081, 0x770072, 0x202a2a2a, 0x7973435f, 0x6c615f73,
  0x20636f6c, 0x6c696166, 0xa6465, 0x5b5a5962, 0x5f5e5d5c, 0x636160, 0x00000000,
  0x00000000, 0x1312d00, };
//
// Copyright (c) 2013 SILICON LABORATORIES, INC.
//
// FILE NAME    : dp_swd.c
// TARGET MCU   : C8051F380
// DESCRIPTION  : ARM CoreSight SW-DP Interface
//
// This file implements an interface to the ARM CoreSight Serial Wire Debug
// (SWD) - Debug Port (DP).
//
#include <compiler_defs.h>
#include "32bit_prog_defs.h"

//-----------------------------------------------------------------------------
// Project Variables
//-----------------------------------------------------------------------------

// Holds the last acknowledge error from the start of a move command.
// Also used by the Serial Wire module.
U8 idata ack_error;

#if 1
// Note how the bit addresses are arranged to provide an endian swap.
// io_word is stored BE (matches the Keil C compliler), while the bit addresses
// are LE (matches the wire interface).
SEGMENT_VARIABLE( io_word, UU32, SEG_BDATA );

// Used to provide bit addressable data for 8-bit and smaller shift routines.
// Also used by the Serial Wire module.
SEGMENT_VARIABLE( io_byte, U8, SEG_BDATA );

SBIT (iow_0, io_word.U32, 24);
SBIT (iow_1, io_word.U32, 25);
SBIT (iow_2, io_word.U32, 26);
SBIT (iow_3, io_word.U32, 27);
SBIT (iow_4, io_word.U32, 28);
SBIT (iow_5, io_word.U32, 29);
SBIT (iow_6, io_word.U32, 30);
SBIT (iow_7, io_word.U32, 31);

SBIT (iow_8, io_word.U32, 16);
SBIT (iow_9, io_word.U32, 17);
SBIT (iow_10, io_word.U32, 18);
SBIT (iow_11, io_word.U32, 19);
SBIT (iow_12, io_word.U32, 20);
SBIT (iow_13, io_word.U32, 21);
SBIT (iow_14, io_word.U32, 22);
SBIT (iow_15, io_word.U32, 23);

SBIT (iow_16, io_word.U32, 8);
SBIT (iow_17, io_word.U32, 9);
SBIT (iow_18, io_word.U32, 10);
SBIT (iow_19, io_word.U32, 11);
SBIT (iow_20, io_word.U32, 12);
SBIT (iow_21, io_word.U32, 13);
SBIT (iow_22, io_word.U32, 14);
SBIT (iow_23, io_word.U32, 15);

SBIT (iow_24, io_word.U32, 0);
SBIT (iow_25, io_word.U32, 1);
SBIT (iow_26, io_word.U32, 2);
SBIT (iow_27, io_word.U32, 3);
SBIT (iow_28, io_word.U32, 4);
SBIT (iow_29, io_word.U32, 5);
SBIT (iow_30, io_word.U32, 6);
SBIT (iow_31, io_word.U32, 7);

SBIT (iob_0, io_byte, 0);
SBIT (iob_1, io_byte, 1);
SBIT (iob_2, io_byte, 2);
SBIT (iob_3, io_byte, 3);
SBIT (iob_4, io_byte, 4);
SBIT (iob_5, io_byte, 5);
SBIT (iob_6, io_byte, 6);
SBIT (iob_7, io_byte, 7);
#else
UU32 io_word;
volatile U8 bdata io_byte;
#endif

//-----------------------------------------------------------------------------
// Variables Declarations
//-----------------------------------------------------------------------------

// Controls SW connection sequence. 0=SW-DP, 1=SWJ-DP (use switch sequence)
U8 idata swj_dp_type;

// Even parity lookup table, holds even parity result for a 4-bit value.
const U8 code even_parity[] =
{ 
  0x00, 0x10, 0x10, 0x00,
  0x10, 0x00, 0x00, 0x10,
  0x10, 0x00, 0x00, 0x10,
  0x00, 0x10, 0x10, 0x00
};

//-----------------------------------------------------------------------------
// SWD Host Command Handlers
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// StrobeSWCLK
//-----------------------------------------------------------------------------
//
// Pulls SWCLK high then low.
//
#define _StrobeSWCLK  { SWCLK_Out = 1; SWCLK_Out = 0; };

//-----------------------------------------------------------------------------
// SWD_Initialize
//-----------------------------------------------------------------------------
//
// Initializes SWD configuration data at startup.
//
void SWD_Initialize( void )
{
  swj_dp_type = FALSE;    // Default DP type is DP-SW
}

//-----------------------------------------------------------------------------
// (0x20) SWD_Configure
//-----------------------------------------------------------------------------
//
// Sets the debug port (DP) type to either Serial Wire only or Serial Wire JTAG.
// The firmware needs to know this because the connection sequence is different
// depending on the DP type.
//
// Parameters:
//    1. DP_Type - Debug Port type. 0=SW, 1=SWJ
//
// Returns:
//    1. HOST_COMMAND_OK
//
STATUS SWD_Configure( U8 dp_type )
{
  swj_dp_type = dp_type;
  
  return HOST_COMMAND_OK;
}

//-----------------------------------------------------------------------------
// (0x21) SWD_Connect
//-----------------------------------------------------------------------------
//
// Sets the target device for Serial Wire communication and returns the
// 32-bit ID code. Must be called before performing any SWD commands.
//
// Returns:
//  1-4. IDCODE - Value read from the IDCODE register (32-bit).
//    5. Response code.
//
STATUS SWD_Connect( void )
{
  U8 rtn;
  
  // Initialize IO pins for SWD interface
  _SetSWPinsIdle;
  
  // Select the Serial Wire Debug Port
  // Skip this switch sequence if the device does not have the swj_dp port
  // Serial Wire + JTAG
  SW_ShiftReset( );
  SW_ShiftByteOut( 0x9E );
  SW_ShiftByteOut( 0xE7 );
  
  // Reset the line and return the 32-bit ID code
  rtn = SWD_LineReset( );
  //SendLongToHost(io_word.U32);
  
  return rtn;
}

//-----------------------------------------------------------------------------
// (0x30) SWD_Disconnect
//-----------------------------------------------------------------------------
//
// Switches the debug interface to JTAG communication and disconnects pins.
//
// Returns:
//    1. HOST_COMMAND_OK
//
STATUS SWD_Disconnect( void )
{
  // Initialize IO pins for SWD interface
  _SetSWPinsIdle;
  
  // Select the JTAG Debug Port
  // Skip this switch sequence if the device does not have the swj_dp port
  // Serial Wire + JTAG
  SW_ShiftReset( );
  SW_ShiftByteOut( 0x3C );
  SW_ShiftByteOut( 0xE7 );
  
  // Release debug interface pins except nSRST
  _ResetDebugPins;
  
  return HOST_COMMAND_OK;
}

//-----------------------------------------------------------------------------
// (0x31) SWD_LineReset
//-----------------------------------------------------------------------------
//
// Performs a line reset on the Serial Wire interface.
//
// Returns:
//    1. Response code.
//
STATUS SWD_LineReset( void )
{
  U8 ack;
  
  // Complete SWD reset sequence (50 cycles high followed by 2 or more idle cycles)
  SW_ShiftReset( );
  SW_ShiftByteOut( 0 );
  
  // Now read the DPIDR register to move the SWD out of reset
  ack = SW_ShiftPacket( SW_IDCODE_RD, 1 );
  SW_ShiftByteOut( 0 );
  
  return SW_Response( ack );
}

//-----------------------------------------------------------------------------
// (0x32) SWD_ClearErrors
//-----------------------------------------------------------------------------
//
// Clears all the error/sticky bits in the DP Control/Status register.
//
// Returns:
//  1-4. DP_CSR - DP_CTRLSTAT register value before the clear (32-bit, LE).
//  5-8. DP_CSR - DP_CTRLSTAT register value after the clear (32-bit, LE).
//    9. Response code.
//
STATUS SWD_ClearErrors( void )
{
  U8 ack;
  
  // First read the DP-CSR register and send the value to the host.
  SW_ShiftPacket( SW_CTRLSTAT_RD, 1 );
  //SendLongToHost(io_word.U32);
  
  // Clear all error/sticky bits by writing to the abort register.
  io_word.U32 = 0x1E;
  SW_ShiftPacket( SW_ABORT_WR, 1 );
  
  // Read the DP-CSR register again and send the results to the host.
  ack = SW_ShiftPacket( SW_CTRLSTAT_RD, 1 );
  SW_ShiftByteOut( 0 );
  //SendLongToHost(io_word.U32);
  
  return SW_Response( ack );
}

//-----------------------------------------------------------------------------
// (0x34) SWD_DAP_Move
//-----------------------------------------------------------------------------
//
// Reads or writes one Debug/Access Port address one or more times.
//
// Parameters:
//    1. Count - Number of words to transfer minus one (i.e. 0=move 1 word).
//    2. DAP_Addr - The DAP register address to transfer one or more times.
//  3-n. Words[] - Array of 32-bit LE words (write transfers only).
//
// Returns:
//  1-n. Words[] - Array of 32-bit LE words (read transfers only).
//  n+1. Response code.
//
// Uses:
//    ack_error - Resets error accumulator.
//
STATUS SWD_DAP_Move( U8 cnt, U8 dap, U32 * transfer_data )
{
  // Reset global error accumulator
  ack_error = SW_ACK_OK;
  
  // Determine if this is a read or write transfer
  if ( dap & DAP_CMD_RnW )
  {
    // Perform the requested number of reads
    SW_DAP_Read( cnt, dap, transfer_data );
  }
  else
  {
    SW_DAP_Write( cnt, dap, transfer_data, TRUE );
  }
  
  // Finish with idle cycles
  SW_ShiftByteOut( 0 );
  
  // Return the accumulated error result
  return SW_Response( ack_error );
}

//-----------------------------------------------------------------------------
// SWD Helper Functions
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// SW_Response
//-----------------------------------------------------------------------------
//
// Converts SWD acknowledge value into a host response code.
//
// Parameters:
//    SW_Ack - 3-bit SWD acknowledge code.
//
// Returns:
//    8-bit host response code.
//
STATUS SW_Response( U8 SW_Ack )
{
  switch ( SW_Ack )
  {
    case SW_ACK_OK:
      return HOST_COMMAND_OK;
    case SW_ACK_WAIT:
      return HOST_AP_TIMEOUT;
    case SW_ACK_FAULT:
      return HOST_ACK_FAULT;
    default:
      return HOST_WIRE_ERROR;
  }
}

//-----------------------------------------------------------------------------
// SW_DAP_Read
//-----------------------------------------------------------------------------
//
// Does one or more reads of one Debug/Access Port register and returns each
// 32-bit word to the host.
//
// Parameters:
//    cnt - Number of words to read minus one (i.e. 0=read 1 word).
//    DAP_Addr - The DAP register address to read one or more times.
//
void SW_DAP_Read( U8 cnt, U8 DAP_Addr, U32 * read_data )
{
  U8 req;
  
  // Format the packet request header
  req = SW_Request( DAP_Addr );
  
  // Shift the first packet and if DP access, send the results
  SW_ShiftPacket( req, 0 );
  if ( !( req & SW_REQ_APnDP ) )
  {
    *read_data = io_word.U32;
    read_data++;
  }
  
  // Perform the requested number of reads
  for ( ; cnt != 0; cnt-- )
  {
    SW_ShiftPacket( req, 0 );
    *read_data = io_word.U32;
    read_data++;
  }
  
  // For AP access, get and send results of the last read
  if ( req & SW_REQ_APnDP )
  {
    SW_ShiftPacket( SW_RDBUFF_RD, 0 );
    *read_data = io_word.U32;
    read_data++;
  }
}

//-----------------------------------------------------------------------------
// SW_DAP_Write
//-----------------------------------------------------------------------------
//
// Does one or more writes to one Debug/Access Port register getting each
// 32-bit word from the host.
//
// Parameters:
//    cnt - Number of words to write minus one (ie 0=write 1 word).
//    DAP_Addr - The DAP register address to write one or more times.
//    final - True if this is the final transfer of a move sequence.
//
void SW_DAP_Write( U8 cnt, U8 DAP_Addr, U32 * write_data, BOOL final )
{
  U8 req;
  
  // Format the packet request header
  req = SW_Request( DAP_Addr );
  
  // Perform the requested number of writes
  do
  {
    io_word.U32 = *write_data;
    write_data++;
#if 0
    // Clear the upper half word for 16-bit packed writes
    io_word.U16[MSB] = 0;

    // For packed transfers, write 16-bits at a time
    if (DAP_Addr & DAP_CMD_PACKED)
    { 
      SW_ShiftPacket(req, 0);
      io_word.U32 = *write_data;
      write_data++;

      // Clear the upper half word for 16-bit packed writes
      io_word.U16[MSB] = 0;
    }
    else
    { 
      io_word.U16[MSB] = (U16) *write_data;
      write_data++;
    }
#endif
    SW_ShiftPacket( req, 0 );
  }while ( cnt-- != 0 );
  
  // For AP access, check results of last write (use default retry count
  // because previous write may need time to complete)
  if ( final && ( req & SW_REQ_APnDP ) )
  {
    SW_ShiftPacket( SW_RDBUFF_RD, 0 );
  }
}

//-----------------------------------------------------------------------------
// SW_Request
//-----------------------------------------------------------------------------
//
// Converts DAP address into SWD packet request value.
//
// Parameters:
//    DAP_Addr - 4-bit DAP address (A3:A2:RnW:APnDP).
//
// Returns:
//    Complete 8-bit packet request value. Includes parity, start, etc.
//
U8 SW_Request( U8 DAP_Addr )
{
  U8 req;
  
  // Convert the DAP address into a SWD packet request value
  req = DAP_Addr & DAP_CMD_MASK;      // mask off the bank select bits
  req = req | even_parity[ req ];       // compute and add parity bit
  req = req << 1;                     // move address/parity bits
  req = req | SW_REQ_PARK_START;      // add start and park bits
  return req;
}

//-----------------------------------------------------------------------------
// SW_CalcDataParity
//-----------------------------------------------------------------------------
//
// Calculates even parity over the 32-bit value in io_word.U32. Contents of
// io_word are not changed.
//
// Returns:
//    1-bit even parity.
//
// Uses:
//    io_word - Holds 32-bit value to compute parity on.
//
bit SW_CalcDataParity( void )
{
  U8 parity;
  
  // Calculate column parity, reducing down to 4 columns
  parity = io_word.U8[ b0 ];
  parity ^= io_word.U8[ b1 ];
  parity ^= io_word.U8[ b2 ];
  parity ^= io_word.U8[ b3 ];
  parity ^= parity >> 4;
  
  // Use lookup table to get parity on 4 remaining bits. The cast (bit)
  // converts any non-zero value to 1.
  return (bit) even_parity[ parity & 0xF ];
}

//-----------------------------------------------------------------------------
// SW_ShiftReset
//-----------------------------------------------------------------------------
//
// Puts the SWD into the reset state by clocking 64 times with SWDIO high.
// Leaves SWDIO an output and high.
//
void SW_ShiftReset( void )
{
  U8 i;
  
  // Drive SWDIO high
  SWDIO_Out = 1;
  _SetSWDIOasOutput;
  
  // Complete 64 SWCLK cycles
  for ( i = 64; i != 0; i-- )
  {
    _StrobeSWCLK
  }
}

//-----------------------------------------------------------------------------
// SW_ShiftPacket
//-----------------------------------------------------------------------------
//
// Completes one serial wire packet transfer (read or write). Expects SWDIO to
// be an output on entry.
//
// Parameters:
//    request - Complete 8-bit packet request value. Includes parity, start, etc.
//    retry - Number of times to try the request while the target ack is WAIT.
//       0 = use the system default retry count
//       n = try the request upto n times
//
// Returns:
//    3-bit SWD acknowledge code.
//    Leaves SWDIO an output and low.
//
// Uses:
//    ack_error - Updated if there was a transfer error.
//    io_byte - Used for all transfers.
//    io_word - On entry, holds the 32-bit word data to transfer on writes.
//              On exit, holds the 32-bit word data transfered on reads.
//
U8 SW_ShiftPacket( U8 request, U8 retry )
{
  U8 ack, limit, i;
  
  // If retry parameter is zero, use the default value instead
  if ( retry == 0 )
  {
    retry = DAP_RETRY_COUNT;
  }
  limit = retry;
  
  // While waiting, do request phase (8-bit request, turnaround, 3-bit ack)
  do
  {
    // Turnaround or idle cycle, makes or keeps SWDIO an output
    SWDIO_Out = 0;
    _SetSWDIOasOutput;
    _StrobeSWCLK
      
      // Shift out the 8-bit packet request
    SW_ShiftByteOut( request );
    
    // Turnaround cycle makes SWDIO an input
    _SetSWDIOasInput;
    _StrobeSWCLK
      
      // Shift in the 3-bit acknowledge response
    io_byte = 0;
    iob_0 = SWDIO_In;
    _StrobeSWCLK
    iob_1 = SWDIO_In;
    _StrobeSWCLK
    iob_2 = SWDIO_In;
    _StrobeSWCLK
    ack = io_byte;
    
    // Check if we need to retry the request
    if ( ( ack == SW_ACK_WAIT ) && --retry )
    {
      // Delay an increasing amount with each retry
      for ( i = retry; i < limit; i++ )
        ;
    }
    else
    {
      break;  // Request phase complete (or timeout)
    }
  }while ( TRUE );
  
  // If the request was accepted, do the data transfer phase (turnaround if
  // writing, 32-bit data, and parity)
  if ( ack == SW_ACK_OK )
  {
    if ( request & SW_REQ_RnW )
    {
      // Swap endian order while shifting in 32-bits of data
      io_word.U8[ b0 ] = SW_ShiftByteIn( );
      io_word.U8[ b1 ] = SW_ShiftByteIn( );
      io_word.U8[ b2 ] = SW_ShiftByteIn( );
      io_word.U8[ b3 ] = SW_ShiftByteIn( );
      
      // Shift in the parity bit
      iob_0 = SWDIO_In;
      _StrobeSWCLK
        
        // Check for parity error
      if ( iob_0 ^ SW_CalcDataParity( ) )
      {
        ack = SW_ACK_PARITY_ERR;
      }
    }
    else
    {
      // Turnaround cycle makes SWDIO an output
      _SetSWDIOasOutput;
      _StrobeSWCLK
        
        // Swap endian order while shifting out 32-bits of data
      SW_ShiftByteOut( io_word.U8[ b0 ] );
      SW_ShiftByteOut( io_word.U8[ b1 ] );
      SW_ShiftByteOut( io_word.U8[ b2 ] );
      SW_ShiftByteOut( io_word.U8[ b3 ] );
      
      // Shift out the parity bit
      SWDIO_Out = SW_CalcDataParity( );
      _StrobeSWCLK
    }
  }
  // TODO: Add error (FAULT, line, parity) handling here?  RESEND on parity error?
  
  // Turnaround or idle cycle, always leave SWDIO an output
  SWDIO_Out = 0;
  _SetSWDIOasOutput;
  _StrobeSWCLK
    
    // Update the global error accumulator if there was an error
  if ( ack != SW_ACK_OK )
  {
    ack_error = ack;
  }
  return ack;
}

//-----------------------------------------------------------------------------
// SW_ShiftByteOut
//-----------------------------------------------------------------------------
//
// Shifts an 8-bit byte out the SWDIO pin.
//
// Parameters:
//    byte - The 8-bit byte to shift out on SWDIO.
//
// Uses:
//    io_byte - Holds byte as it is shifted out.
//
#pragma OT(8, SPEED)
void SW_ShiftByteOut( U8 byte )
{
  // Make sure SWDIO is an output
  _SetSWDIOasOutput;
  
  // Copy data to bit addressable location
  io_byte = byte;
  
  // Shift 8-bits out on SWDIO
  SWDIO_Out = iob_0;
  _StrobeSWCLK
  SWDIO_Out = iob_1;
  _StrobeSWCLK
  SWDIO_Out = iob_2;
  _StrobeSWCLK
  SWDIO_Out = iob_3;
  _StrobeSWCLK
  SWDIO_Out = iob_4;
  _StrobeSWCLK
  SWDIO_Out = iob_5;
  _StrobeSWCLK
  SWDIO_Out = iob_6;
  _StrobeSWCLK
  SWDIO_Out = iob_7;
  _StrobeSWCLK
}

//-----------------------------------------------------------------------------
// SW_ShiftByteIn
//-----------------------------------------------------------------------------
//
// Shifts an 8-bit byte in from the SWDIO pin.
//
// Returns:
//    8-bit byte value shifted in on SWDIO.
//
// Uses:
//    io_byte - Holds byte as it is shifted in.
//
#pragma OT(8, SPEED)
U8 SW_ShiftByteIn( void )
{
  // Make sure SWDIO is an input
  _SetSWDIOasInput;
  
  // Shift 8-bits in on SWDIO
  iob_0 = SWDIO_In;
  _StrobeSWCLK
  iob_1 = SWDIO_In;
  _StrobeSWCLK
  iob_2 = SWDIO_In;
  _StrobeSWCLK
  iob_3 = SWDIO_In;
  _StrobeSWCLK
  iob_4 = SWDIO_In;
  _StrobeSWCLK
  iob_5 = SWDIO_In;
  _StrobeSWCLK
  iob_6 = SWDIO_In;
  _StrobeSWCLK
  iob_7 = SWDIO_In;
  _StrobeSWCLK
    
    // Return the byte that was shifted in
  return io_byte;
}
//
// Copyright (c) 2013 SILICON LABORATORIES, INC.
//
// FILE NAME   : main.c
// TARGET MCU  : C8051F380
// DESCRIPTION : ARM Debug Interface for a 32-bit Programmer
//
// This program demonstrates the basic Serial Wire interface functionality.
// It does not include the procedures to write, erase, or read flash.
//
// NOTES:
// 1) Remove J15 from the 'F38x Target Board.
// 2) Connect SWDIO (P1.1), SWCLK (P1.3), and ground to the 10-pin CoreSight
//    connector of an SiM3U/C/L.
// 3) Run the code and observe that transfer_data contains the correct IDCODE
//    to validate the SW interface.
//
//

#include <compiler_defs.h>
#include <C8051F380_defs.h>
#include "32bit_prog_defs.h"
#include "Init.h"
#include "bin_array.h"
//-----------------------------------------------------------------------------
// Variables Declarations
//-----------------------------------------------------------------------------

// Debug Port (DP) type. Tracks the type of the current DP connection.
U8 DP_Type;

// Possible values for DP_Type.
enum
{
  DP_TYPE_NONE,
  DP_TYPE_SWD
};

// Cortex M3 Debug Registers (AHB addresses)
#define DDFSR   0xE000ED30      // Debug Fault StatusRegister
#define DHCSR   0xE000EDF0      // Debug Halting Control and Status Register
#define DCRSR   0xE000EDF4      // Debug Core Register Selector Register
#define DCRDR   0xE000EDF8      // Debug Core Register Data Register
#define DEMCR   0xE000EDFC      // Debug Exception and Monitor Control Register
#define AIRCR   0xE000ED0C      // The Application Interrupt and Reset Control Register

//  Cortex M3 Memory Access Port
#define MEMAP_BANK_0  0x00000000       // BANK 0 => CSW, TAR, Reserved, DRW
#define MEMAP_BANK_1  0x00000010       // BANK 1 => BD0, BD1, BD2, BD3

// SiM3 Chip Access Port (SiLabs specific Debug Access Port)
#define CHIPAP_BANK_0  0x0A000000      // BANK 0 => CTRL1, CTRL2, LOCK, CRC
#define CHIPAP_BANK_1  0x0A000010      // BANK 1 => INIT_STAT, DAP_IN, DAP_OUT, None
#define CHIPAP_BANK_F  0x0A0000F0      // BANK F => None, None, None, ID

// MEMAP register addresses
#define MEMAP_CSW  0x01
#define MEMAP_TAR  0x05
#define MEMAP_DRW_WR  0x0D
#define MEMAP_DRW_RD  0x0F

// CHIPAP register addresses
#define CHIPAP_CTRL1_WR     0x01
#define CHIPAP_CTRL2_WR     0x05
#define CHIPAP_ID_WR        0x0D
#define CHIPAP_ID_RD        0x0F

#ifdef SRAM_PROGRAMMING
void connect_and_halt_core()
{ 
  U32 rw_data;

  rw_data = CHIPAP_BANK_F;
  SWD_DAP_Move(0, DAP_SELECT_WR, &rw_data);
  SWD_DAP_Move(0, CHIPAP_ID_RD, &rw_data);
  if (rw_data != 0x2430002)
  { 
    return;
  }

  // CTRL1.core_reset_ap = 1
  rw_data = CHIPAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &rw_data);
  rw_data = 0x08;
  SWD_DAP_Move(0, CHIPAP_CTRL1_WR, &rw_data);

  // Select MEM BANK 0
  rw_data = MEMAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &rw_data);

  // 32 bit memory access, auto increment
  rw_data = 0x23000002;
  SWD_DAP_Move(0, MEMAP_CSW, &rw_data);

  // DHCSR.C_DEBUGEN = 1
  rw_data = DHCSR;
  SWD_DAP_Move(0, MEMAP_TAR, &rw_data);
  rw_data = 0xA05F0001;
  SWD_DAP_Move(0, MEMAP_DRW_WR, &rw_data);

  // DEMCR.VC_CORERESET = 1
  rw_data = DEMCR;
  SWD_DAP_Move(0, MEMAP_TAR, &rw_data);
  rw_data = 0x1;
  SWD_DAP_Move(0, MEMAP_DRW_WR, &rw_data);

  // reset the core
  rw_data = AIRCR;
  SWD_DAP_Move(0, MEMAP_TAR, &rw_data);
  rw_data = 0xFA050004;
  SWD_DAP_Move(0, MEMAP_DRW_WR, &rw_data);

  // CTRL1.core_reset_ap = 0
  rw_data = CHIPAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &rw_data);
  rw_data = 0;
  SWD_DAP_Move(0, CHIPAP_CTRL1_WR, &rw_data);

  // Select MEM BANK 0
  rw_data = MEMAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &rw_data);
}

void write_sequential_words(U32 addr, U32 len, U32 *rw_data)
{ 
  U32 i, tmp;
  U32 *buf = rw_data;

  tmp = MEMAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &tmp);
  // 32 bit memory access, auto increment
  tmp = 0x23000012;
  SWD_DAP_Move(0, MEMAP_CSW, &tmp);

  SWD_DAP_Move(0, MEMAP_TAR, &addr);
  for (i = 0; i < len; i++)
  { 
    SWD_DAP_Move(0, MEMAP_DRW_WR, buf++);
  }
}

void read_sequential_words(U32 addr, U32 len, U32 *rw_data)
{ 
  U32 i, tmp;
  U32 *buf = rw_data;

  tmp = MEMAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &tmp);
  // 32 bit memory access, auto increment
  tmp = 0x23000012;
  SWD_DAP_Move(0, MEMAP_CSW, &tmp);

  SWD_DAP_Move(0, MEMAP_TAR, &addr);
  for (i = 0; i < len; i++)
  { 
    SWD_DAP_Move(0, MEMAP_DRW_RD, buf++);
  }
}

void swd_write_core_register(U32 n, U32 *rw_data)
{ 
  U32 tmp;
  tmp = MEMAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &tmp);
  tmp = 0x23000002;
  SWD_DAP_Move(0, MEMAP_CSW, &tmp);
  tmp = DCRDR;
  SWD_DAP_Move(0, MEMAP_TAR, &tmp);
  SWD_DAP_Move(0, MEMAP_DRW_WR, rw_data);

  tmp = DCRSR;
  SWD_DAP_Move(0, MEMAP_TAR, &tmp);
  n = n | (0x10000);
  SWD_DAP_Move(0, MEMAP_DRW_WR, &n);
}

void swd_read_core_register(U32 n, U32 *rw_data)
{ 
  U32 tmp;
  tmp = MEMAP_BANK_0;
  SWD_DAP_Move(0, DAP_SELECT_WR, &tmp);
  tmp = 0x23000002;
  SWD_DAP_Move(0, MEMAP_CSW, &tmp);
  tmp = DCRSR;
  SWD_DAP_Move(0, MEMAP_TAR, &tmp);
  SWD_DAP_Move(0, MEMAP_DRW_WR, &n);

  tmp = DCRDR;
  SWD_DAP_Move(0, MEMAP_TAR, &tmp);
  SWD_DAP_Move(0, MEMAP_DRW_RD, rw_data);
}

void programming_sram()
{ 
  U32 i, size, count, addr = 0x20000000;

  size = sizeof(binraw) / 4;

  for (i = 0; i < size; i += 1024)
  { 
    if ((i + 1024) < size)
    { 
      count = 1024;
    }
    else
    { 
      count = size - i;
    }
    write_sequential_words(addr + i * 4, count, &binraw[i]);
  }

  write_sequential_words(0xe000ed08, 1, &addr);
  addr = binraw[1] & 0xFFFFFFFE;
  swd_write_core_register(15, &addr);
  addr = binraw[0];
  swd_write_core_register(13, &addr);
  addr = 0xA05F0000;
  write_sequential_words(DHCSR, 1, &addr);
}
#endif

//-----------------------------------------------------------------------------
// main()
//-----------------------------------------------------------------------------
void main( void )
{
  U32 transfer_data;
  
  WDT_Init( );
  Oscillator_Init( );
  Port_Init( );
  
  // These pins are grounded on the CoreSight debug connector
  P1_4 = 0;
  P1_2 = 0;
  
  // There is no debug port connection at this point
  DP_Type = DP_TYPE_NONE;
  
  SWD_Initialize( );
  SWD_Configure( DP_TYPE_SWD );
  SWD_Connect( );
  
  transfer_data = 0x00000000;
  
  // Read the IDCODE from the connected device
  SWD_DAP_Move( 0, DAP_IDCODE_RD, &transfer_data );
  
  // The return value from DAP_IDCODE_RD for SiM3U1xx devices is 0x2BA01477
  
  // Write the CTRLSTAT register to enable the debug hardware
  transfer_data = 0x50000000;
  SWD_DAP_Move( 0, DAP_CTRLSTAT_WR, &transfer_data );
  SWD_ClearErrors( );
  connect_and_halt_core( );
  programming_sram( );
  
  transfer_data = 0x00000000;
  SWD_DAP_Move( 0, DAP_CTRLSTAT_WR, &transfer_data );
  SWD_Disconnect( );
  
  while ( 1 )
  {
  }
}

//-----------------------------------------------------------------------------
// Initialization
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Subroutines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// DBG_Reset
//-----------------------------------------------------------------------------
//
// This function returns all debug pins to a neutral state:
//   1. Disconnects from the target.
//   2. Resets all I/O pins.
//
//
void DBG_Reset( void )
{
  SWD_Connect( );
  
  // Reset all I/O ports
  Port_Init( );
  
  // We are disconnecting, so release nSRST
  _ReleaseTargetReset;
}
原文地址:https://www.cnblogs.com/shangdawei/p/4750723.html