SWD(Serial Wire Debug) interface

Dependents:   USBMSD_LPC_HelloWorld lpcterm2 Simple-CMSIS-DAP 11u35_usbLocalFilesystem

SWD.h

Committer:
va009039
Date:
2014-07-05
Revision:
1:794d2801ff94
Parent:
0:86fde86e144f

File content as of revision 1:794d2801ff94:

// SWD.h 2013/9/13
#pragma once
#include "mbed.h"

#define SWD_OK     0x01
#define SWD_WAIT   0x02
#define SWD_FAULT  0x04
#define SWD_ERROR  0x08

#define SWD_APnDP  0x01
#define SWD_RnW    0x02

#define DP_ABORT       0<<0|0<<1|0x00
#define DP_IDCODE      0<<0|1<<1|0x00
#define DP_CTRL_STAT   0<<0|0<<1|0x04
#define DP_CTRL_STAT_R 0<<0|1<<1|0x04
#define DP_SELECT      0<<0|0<<1|0x08
#define DP_RDBUFF      0<<0|1<<1|0x0c

#define AP_CSW         1<<0|0<<1|0x00
#define AP_CSW_R       1<<0|1<<1|0x00
#define AP_TAR         1<<0|0<<1|0x04
#define AP_TAR_R       1<<0|1<<1|0x04
#define AP_DRW_W       1<<0|0<<1|0x0c
#define AP_DRW_R       1<<0|1<<1|0x0c

#define CSYSPWRUPACK 0x80000000
#define CDBGPWRUPACK 0x20000000
#define CSYSPWRUPREQ 0x40000000
#define CDBGPWRUPREQ 0x10000000

#define TRNNORMAL    0x00000000
#define MASKLANE     0x00000f00

// AP Control and Status Word definitions
#define CSW_SIZE     0x00000007
#define CSW_SIZE8    0x00000000
#define CSW_SIZE16   0x00000001
#define CSW_SIZE32   0x00000002
#define CSW_ADDRINC  0x00000030
#define CSW_NADDRINC 0x00000000
#define CSW_SADDRINC 0x00000010
#define CSW_PADDRINC 0x00000020
#define CSW_DBGSTAT  0x00000040
#define CSW_TINPROG  0x00000080
#define CSW_HPROT    0x02000000
#define CSW_MSTRTYPE 0x20000000
#define CSW_MSTRCORE 0x00000000
#define CSW_MSTRDBG  0x20000000
#define CSW_RESERVED 0x01000000

#define CSW_VALUE  (CSW_RESERVED | CSW_MSTRDBG | CSW_HPROT | CSW_DBGSTAT | CSW_SADDRINC)

/** SWD(Serial Wire Debug) interface
 * 
 * Example:
 * @code
 * #include "SWD.h"
 * #include "BaseDAP.h"
 * #include "USBDAP.h"
 * 
 * USBDAP hid(64, 64, 0x0d28, 0x0204);
 * 
 * SWD swd(PTB8,PTB9,PTB10); // SWDIO(dp12),SWCLK(dp3),nReset(dp23)
 * DigitalOut connected(LED_GREEN);
 * DigitalOut running(LED_RED);
 * class myDAP : public BaseDAP {
 * public:
 *     myDAP(SWD* swd):BaseDAP(swd){};
 *     virtual void infoLED(int select, int value) {
 *         switch(select) {
 *             case 0: connected = value^1; running = 1; break;
 *             case 1: running = value^1; connected = 1; break;
 *         }
 *     } 
 * };
 * 
 * int main()
 * {
 *     HID_REPORT recv_report;
 *     HID_REPORT send_report;
 * 
 *     myDAP* dap = new myDAP(&swd);
 *     while(1) {
 *         if(hid.readNB(&recv_report)) {
 *             dap->Command(recv_report.data, send_report.data);
 *             send_report.length = 64;
 *             hid.send(&send_report);
 *         }
 *     }    
 * }
 * @endcode
 */
class SWD {
public:
    /** Create SWD(Serial Wire Debug) interface
     * @param swdio SWD(swdio) pin
     * @param swclk SWD(swclk) pin
     * @param reset reset pin
     */
    SWD(PinName swdio, PinName swclk, PinName reset);
    virtual ~SWD() {}
    void Setup();
    void SWJSequence(int count, const uint8_t* data);
    uint8_t SWJPins(uint32_t value, uint32_t select ,int waittime_us = 0);
    void SWJClock(uint32_t clock_hz);
    void TransferConfigure(int idle_cycles, int retry_count);
    void Configure(int turnaround, int data_phase);
    uint8_t Transfer(uint8_t request, uint32_t *data);
    __IO bool TransferAbort;
    void reset();
private:
    uint8_t rawTransfer(uint8_t request, uint32_t *data);
    void pin_delay();
    void clock_cycle(int n = 1);
    void write_bit(uint32_t data, int n = 1);
    uint32_t read_bit(int n = 1);
protected:
    struct {
        int turnaround;
        int data_phase;
    } conf;
    int idle_cycles;
    int retry_count;
    int _cpu_delay_count;
    DigitalInOut _swdio;
    DigitalOut _swclk;
    DigitalInOut _nreset;
};