SWD(Serial Wire Debug) interface
Dependents: USBMSD_LPC_HelloWorld lpcterm2 Simple-CMSIS-DAP 11u35_usbLocalFilesystem
SWD.h@1:794d2801ff94, 2014-07-05 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |