SWD(Serial Wire Debug) interface

Dependents:   USBMSD_LPC_HelloWorld lpcterm2 Simple-CMSIS-DAP 11u35_usbLocalFilesystem

Committer:
va009039
Date:
Sat Jul 05 07:52:18 2014 +0000
Revision:
1:794d2801ff94
Parent:
0:86fde86e144f
remove mydebug.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:86fde86e144f 1 // SWD.h 2013/9/13
va009039 0:86fde86e144f 2 #pragma once
va009039 0:86fde86e144f 3 #include "mbed.h"
va009039 0:86fde86e144f 4
va009039 0:86fde86e144f 5 #define SWD_OK 0x01
va009039 0:86fde86e144f 6 #define SWD_WAIT 0x02
va009039 0:86fde86e144f 7 #define SWD_FAULT 0x04
va009039 0:86fde86e144f 8 #define SWD_ERROR 0x08
va009039 0:86fde86e144f 9
va009039 0:86fde86e144f 10 #define SWD_APnDP 0x01
va009039 0:86fde86e144f 11 #define SWD_RnW 0x02
va009039 0:86fde86e144f 12
va009039 0:86fde86e144f 13 #define DP_ABORT 0<<0|0<<1|0x00
va009039 0:86fde86e144f 14 #define DP_IDCODE 0<<0|1<<1|0x00
va009039 0:86fde86e144f 15 #define DP_CTRL_STAT 0<<0|0<<1|0x04
va009039 0:86fde86e144f 16 #define DP_CTRL_STAT_R 0<<0|1<<1|0x04
va009039 0:86fde86e144f 17 #define DP_SELECT 0<<0|0<<1|0x08
va009039 0:86fde86e144f 18 #define DP_RDBUFF 0<<0|1<<1|0x0c
va009039 0:86fde86e144f 19
va009039 0:86fde86e144f 20 #define AP_CSW 1<<0|0<<1|0x00
va009039 0:86fde86e144f 21 #define AP_CSW_R 1<<0|1<<1|0x00
va009039 0:86fde86e144f 22 #define AP_TAR 1<<0|0<<1|0x04
va009039 0:86fde86e144f 23 #define AP_TAR_R 1<<0|1<<1|0x04
va009039 0:86fde86e144f 24 #define AP_DRW_W 1<<0|0<<1|0x0c
va009039 0:86fde86e144f 25 #define AP_DRW_R 1<<0|1<<1|0x0c
va009039 0:86fde86e144f 26
va009039 0:86fde86e144f 27 #define CSYSPWRUPACK 0x80000000
va009039 0:86fde86e144f 28 #define CDBGPWRUPACK 0x20000000
va009039 0:86fde86e144f 29 #define CSYSPWRUPREQ 0x40000000
va009039 0:86fde86e144f 30 #define CDBGPWRUPREQ 0x10000000
va009039 0:86fde86e144f 31
va009039 0:86fde86e144f 32 #define TRNNORMAL 0x00000000
va009039 0:86fde86e144f 33 #define MASKLANE 0x00000f00
va009039 0:86fde86e144f 34
va009039 0:86fde86e144f 35 // AP Control and Status Word definitions
va009039 0:86fde86e144f 36 #define CSW_SIZE 0x00000007
va009039 0:86fde86e144f 37 #define CSW_SIZE8 0x00000000
va009039 0:86fde86e144f 38 #define CSW_SIZE16 0x00000001
va009039 0:86fde86e144f 39 #define CSW_SIZE32 0x00000002
va009039 0:86fde86e144f 40 #define CSW_ADDRINC 0x00000030
va009039 0:86fde86e144f 41 #define CSW_NADDRINC 0x00000000
va009039 0:86fde86e144f 42 #define CSW_SADDRINC 0x00000010
va009039 0:86fde86e144f 43 #define CSW_PADDRINC 0x00000020
va009039 0:86fde86e144f 44 #define CSW_DBGSTAT 0x00000040
va009039 0:86fde86e144f 45 #define CSW_TINPROG 0x00000080
va009039 0:86fde86e144f 46 #define CSW_HPROT 0x02000000
va009039 0:86fde86e144f 47 #define CSW_MSTRTYPE 0x20000000
va009039 0:86fde86e144f 48 #define CSW_MSTRCORE 0x00000000
va009039 0:86fde86e144f 49 #define CSW_MSTRDBG 0x20000000
va009039 0:86fde86e144f 50 #define CSW_RESERVED 0x01000000
va009039 0:86fde86e144f 51
va009039 0:86fde86e144f 52 #define CSW_VALUE (CSW_RESERVED | CSW_MSTRDBG | CSW_HPROT | CSW_DBGSTAT | CSW_SADDRINC)
va009039 0:86fde86e144f 53
va009039 0:86fde86e144f 54 /** SWD(Serial Wire Debug) interface
va009039 0:86fde86e144f 55 *
va009039 0:86fde86e144f 56 * Example:
va009039 0:86fde86e144f 57 * @code
va009039 0:86fde86e144f 58 * #include "SWD.h"
va009039 0:86fde86e144f 59 * #include "BaseDAP.h"
va009039 0:86fde86e144f 60 * #include "USBDAP.h"
va009039 0:86fde86e144f 61 *
va009039 0:86fde86e144f 62 * USBDAP hid(64, 64, 0x0d28, 0x0204);
va009039 0:86fde86e144f 63 *
va009039 0:86fde86e144f 64 * SWD swd(PTB8,PTB9,PTB10); // SWDIO(dp12),SWCLK(dp3),nReset(dp23)
va009039 0:86fde86e144f 65 * DigitalOut connected(LED_GREEN);
va009039 0:86fde86e144f 66 * DigitalOut running(LED_RED);
va009039 0:86fde86e144f 67 * class myDAP : public BaseDAP {
va009039 0:86fde86e144f 68 * public:
va009039 0:86fde86e144f 69 * myDAP(SWD* swd):BaseDAP(swd){};
va009039 0:86fde86e144f 70 * virtual void infoLED(int select, int value) {
va009039 0:86fde86e144f 71 * switch(select) {
va009039 0:86fde86e144f 72 * case 0: connected = value^1; running = 1; break;
va009039 0:86fde86e144f 73 * case 1: running = value^1; connected = 1; break;
va009039 0:86fde86e144f 74 * }
va009039 0:86fde86e144f 75 * }
va009039 0:86fde86e144f 76 * };
va009039 0:86fde86e144f 77 *
va009039 0:86fde86e144f 78 * int main()
va009039 0:86fde86e144f 79 * {
va009039 0:86fde86e144f 80 * HID_REPORT recv_report;
va009039 0:86fde86e144f 81 * HID_REPORT send_report;
va009039 0:86fde86e144f 82 *
va009039 0:86fde86e144f 83 * myDAP* dap = new myDAP(&swd);
va009039 0:86fde86e144f 84 * while(1) {
va009039 0:86fde86e144f 85 * if(hid.readNB(&recv_report)) {
va009039 0:86fde86e144f 86 * dap->Command(recv_report.data, send_report.data);
va009039 0:86fde86e144f 87 * send_report.length = 64;
va009039 0:86fde86e144f 88 * hid.send(&send_report);
va009039 0:86fde86e144f 89 * }
va009039 0:86fde86e144f 90 * }
va009039 0:86fde86e144f 91 * }
va009039 0:86fde86e144f 92 * @endcode
va009039 0:86fde86e144f 93 */
va009039 0:86fde86e144f 94 class SWD {
va009039 0:86fde86e144f 95 public:
va009039 0:86fde86e144f 96 /** Create SWD(Serial Wire Debug) interface
va009039 0:86fde86e144f 97 * @param swdio SWD(swdio) pin
va009039 0:86fde86e144f 98 * @param swclk SWD(swclk) pin
va009039 0:86fde86e144f 99 * @param reset reset pin
va009039 0:86fde86e144f 100 */
va009039 0:86fde86e144f 101 SWD(PinName swdio, PinName swclk, PinName reset);
va009039 0:86fde86e144f 102 virtual ~SWD() {}
va009039 0:86fde86e144f 103 void Setup();
va009039 0:86fde86e144f 104 void SWJSequence(int count, const uint8_t* data);
va009039 0:86fde86e144f 105 uint8_t SWJPins(uint32_t value, uint32_t select ,int waittime_us = 0);
va009039 0:86fde86e144f 106 void SWJClock(uint32_t clock_hz);
va009039 0:86fde86e144f 107 void TransferConfigure(int idle_cycles, int retry_count);
va009039 0:86fde86e144f 108 void Configure(int turnaround, int data_phase);
va009039 0:86fde86e144f 109 uint8_t Transfer(uint8_t request, uint32_t *data);
va009039 0:86fde86e144f 110 __IO bool TransferAbort;
va009039 0:86fde86e144f 111 void reset();
va009039 0:86fde86e144f 112 private:
va009039 0:86fde86e144f 113 uint8_t rawTransfer(uint8_t request, uint32_t *data);
va009039 0:86fde86e144f 114 void pin_delay();
va009039 0:86fde86e144f 115 void clock_cycle(int n = 1);
va009039 0:86fde86e144f 116 void write_bit(uint32_t data, int n = 1);
va009039 0:86fde86e144f 117 uint32_t read_bit(int n = 1);
va009039 0:86fde86e144f 118 protected:
va009039 0:86fde86e144f 119 struct {
va009039 0:86fde86e144f 120 int turnaround;
va009039 0:86fde86e144f 121 int data_phase;
va009039 0:86fde86e144f 122 } conf;
va009039 0:86fde86e144f 123 int idle_cycles;
va009039 0:86fde86e144f 124 int retry_count;
va009039 0:86fde86e144f 125 int _cpu_delay_count;
va009039 0:86fde86e144f 126 DigitalInOut _swdio;
va009039 0:86fde86e144f 127 DigitalOut _swclk;
va009039 0:86fde86e144f 128 DigitalInOut _nreset;
va009039 0:86fde86e144f 129 };