zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    蓝牙的HFP协议笔记
    23种设计模式
    读QT5.7源码(三)Q_OBJECT 和QMetaObject
    实现私有化(Pimpl) --- QT常见的设计模式
    蓝牙Profile的概念和常见种类(转)
    git分支合并
    git log的常见用法
    QThread详解
    git查看某个文件的修改历史
    因为代理原因导致的NotSerializableException
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4750723.html
Copyright © 2011-2022 走看看