00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00063 #ifndef __LIBSWD_H__
00064 #define __LIBSWD_H__
00065
00066
00067
00069
00070 #define SWD_REQUEST_START_BITNUM 7
00071
00072 #define SWD_REQUEST_APnDP_BITNUM 6
00073
00074 #define SWD_REQUEST_RnW_BITNUM 5
00075
00076 #define SWD_REQUEST_ADDR_BITNUM 4
00077
00078 #define SWD_REQUEST_A2_BITNUM 4
00079
00080 #define SWD_REQUEST_A3_BITNUM 3
00081
00082 #define SWD_REQUEST_PARITY_BITNUM 2
00083
00084 #define SWD_REQUEST_STOP_BITNUM 1
00085
00086 #define SWD_REQUEST_PARK_BITNUM 0
00087
00089 #define SWD_REQUEST_START_VAL 1
00090
00091 #define SWD_REQUEST_STOP_VAL 0
00092
00093 #define SWD_REQUEST_PARK_VAL 1
00094
00095 #define SWD_REQUEST_BITLEN 8
00096
00098 #define SWD_ADDR_MINVAL 0
00099
00100 #define SWD_ADDR_MAXVAL 3
00101
00103 #define SWD_ACK_BITLEN 3
00104
00105 #define SWD_ACK_OK_VAL 4
00106
00107 #define SWD_ACK_WAIT_VAL 2
00108
00109 #define SWD_ACK_FAULT_VAL 1
00110
00112 #define SWD_DP_ADDR_IDCODE 0
00113
00114 #define SWD_DP_ADDR_ABORT 0
00115
00116 #define SWD_DP_ADDR_CTRLSTAT 1
00117
00118 #define SWD_DP_ADDR_WCR 1
00119
00120 #define SWD_DP_ADDR_RESEND 2
00121
00122 #define SWD_DP_ADDR_SELECT 2
00123
00124 #define SWD_DP_ADDR_RDBUF 3
00125
00127
00128 #define SWD_ABORT_BITNUM_DAPABORT 0
00129
00130 #define SWD_ABORT_BITNUM_DSTKCMPCLR 1
00131
00132 #define SWD_ABORT_BITNUM_DSTKERRCLR 2
00133
00134 #define SWD_ABORT_BITNUM_DWDERRCLR 3
00135
00136 #define SWD_ABORT_BITNUM_DORUNERRCLR 4
00137
00139
00140 #define SWD_CTRLSTAT_BITNUM_ORUNDETECT 0
00141
00142 #define SWD_CTRLSTAT_BITNUM_OSTICKYORUN 1
00143
00144 #define SWD_CTRLSTAT_BITNUM_OTRNMODE 2
00145
00146 #define SWD_CTRLSTAT_BITNUM_OSTICKYCMP 4
00147
00148 #define SWD_CTRLSTAT_BITNUM_OSTICKYERR 5
00149
00150 #define SWD_CTRLSTAT_BITNUM_OREADOK 6
00151
00152 #define SWD_CTRLSTAT_BITNUM_OWDATAERR 7
00153
00154 #define SWD_CTRLSTAT_BITNUM_OMASKLANE 8
00155
00156 #define SWD_CTRLSTAT_BITNUM_OTRNCNT 12
00157
00158 #define SWD_CTRLSTAT_BITNUM_OCDBGRSTREQ 26
00159
00160 #define SWD_CTRLSTAT_BITNUM_OCDBGRSTACK 27
00161
00162 #define SWD_CTRLSTAT_BITNUM_OCDBGPWRUPREQ 28
00163
00164 #define SWD_CTRLSTAT_BITNUM_OCDBGPWRUPACK 29
00165
00166 #define SWD_CTRLSTAT_BITNUM_OCSYSPWRUPREQ 30
00167
00168 #define SWD_CTRLSTAT_BITNUM_OCSYSPWRUPACK 31
00169
00170
00171 #define SWD_MASKLANE_0 0b0001
00172
00173 #define SWD_MASKLANE_1 0b0010
00174
00175 #define SWD_MASKLANE_2 0b0100
00176
00177 #define SWD_MASKLANE_3 0b1000
00178
00180
00181 #define SWD_SELECT_BITNUM_CTRLSEL 0
00182
00183 #define SWD_SELECT_BITNUM_APBANKSEL 4
00184
00185 #define SWD_SELECT_BITNUM_APSEL 24
00186
00188
00189 #define SWD_WCR_BITNUM_PRESCALER 0 ///< PRESCALER bit number.
00190
00191 #define SWD_WCR_BITNUM_WIREMODE 6 ///< WIREMODE bit number.
00192
00193 #define SWD_WCR_BITNUM_TURNROUND 8 ///< TURNROUND bit number.
00194
00195
00196 #define SWD_TURNROUND_1 0 ///< TRN takes one CLK cycle.
00197
00198 #define SWD_TURNROUND_2 1 ///< TRN takes two CLK cycles.
00199
00200 #define SWD_TURNROUND_3 2 ///< TRN takes three CLK cycles.
00201
00202 #define SWD_TURNROUND_4 3 ///< TRN takes four CLK cycles. ????
00203
00204 #define SWD_TURNROUND_MIN SWD_TURNROUND_1 ///< shortest TRN time.
00205
00206 #define SWD_TURNROUND_MAX SWD_TURNROUND_4 ///< longest TRN time.
00207
00208 #define SWD_TURNROUND_DEFAULT SWD_TURNROUND_1 ///< Default TRN length is one CLK.
00209
00211
00212 #define AHB_AP_CONTROLSTATUS 0x00 ///< R/W, 32bit, reset value: 0x43800042
00213
00214 #define AHB_AP_TAR 0x04 ///< R/W, 32bit, reset value: 0x00000000
00215
00216 #define AHB_AP_DRW 0x0C ///< R/W, 32bit
00217
00218 #define AHB_AP_BD0 0x10 ///< R/W, 32bit
00219
00220 #define AHB_AP_BD1 0x14 ///< R/W, 32bit
00221
00222 #define AHB_AP_BD2 0x18 ///< R/W, 32bit
00223
00224 #define AHB_AP_BD3 0x1C ///< R/W, 32bit
00225
00226 #define AHB_AP_DROMT 0xF8 ///< RO, 32bit, reset value: 0xE00FF000
00227
00228 #define AHB_AP_IDR 0xFC ///< RO, 32bit, reset value: 0x24770001
00229
00231
00232 static const char SWD_CMD_SWDPRESET[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
00234 static const char SWD_CMD_JTAG2SWD[] = {0x79, 0xe7};
00236 static const char SWD_CMD_SWD2JTAG[] = {0x3c, 0xe7};
00237
00239
00240 typedef enum SWD_ERROR_CODE {
00241 SWD_OK = 0,
00242 SWD_ERROR_GENERAL =-1,
00243 SWD_ERROR_NULLPOINTER =-2,
00244 SWD_ERROR_NULLQUEUE =-3,
00245 SWD_ERROR_NULLTRN =-4,
00246 SWD_ERROR_PARAM =-5,
00247 SWD_ERROR_OUTOFMEM =-6,
00248 SWD_ERROR_RESULT =-7,
00249 SWD_ERROR_RANGE =-8,
00250 SWD_ERROR_DEFINITION =-9,
00251 SWD_ERROR_NULLCONTEXT =-10,
00252 SWD_ERROR_QUEUE =-11,
00253 SWD_ERROR_ADDR =-12,
00254 SWD_ERROR_APnDP =-13,
00255 SWD_ERROR_RnW =-14,
00256 SWD_ERROR_PARITY =-15,
00257 SWD_ERROR_ACK =-16,
00258 SWD_ERROR_ACKUNKNOWN =-19,
00259 SWD_ERROR_ACKNOTDONE =-20,
00260 SWD_ERROR_ACKMISSING =-21,
00261 SWD_ERROR_ACKMISMATCH =-22,
00262 SWD_ERROR_ACKORDER =-23,
00263 SWD_ERROR_BADOPCODE =-24,
00264 SWD_ERROR_NODATACMD =-25,
00265 SWD_ERROR_DATAADDR =-26,
00266 SWD_ERROR_NOPARITYCMD =-27,
00267 SWD_ERROR_PARITYADDR =-28,
00268 SWD_ERROR_NOTDONE =-29,
00269 SWD_ERROR_QUEUEROOT =-30,
00270 SWD_ERROR_BADCMDTYPE =-31,
00271 SWD_ERROR_BADCMDDATA =-32,
00272 SWD_ERROR_TURNAROUND =-33,
00273 SWD_ERROR_DRIVER =-34,
00274 SWD_ERROR_ACK_WAIT =-35,
00275 SWD_ERROR_ACK_FAULT =-36,
00276 SWD_ERROR_QUEUENOTFREE=-37,
00277 SWD_ERROR_TRANSPORT =-38
00278 } swd_error_code_t;
00279
00281
00282 typedef enum SWD_LOGLEVEL{
00284 SWD_LOGLEVEL_SILENT = 0,
00286 SWD_LOGLEVEL_INFO = 1,
00288 SWD_LOGLEVEL_WARNING = 2,
00290 SWD_LOGLEVEL_ERROR = 3,
00292 SWD_LOGLEVEL_DEBUG = 4
00293 } swd_loglevel_t;
00294
00296
00297 #define SWD_DATA_MAXBITCOUNT 32
00298
00299 #define SWD_DATA_BYTESIZE 8
00300
00301 #define SWD_DATA_BITLEN 32
00302
00303 #define SWD_CMDQLEN_DEFAULT 1024;
00304
00310
00311 typedef enum SWD_CMDTYPE {
00312 SWD_CMDTYPE_MOSI_DATA =-7,
00313 SWD_CMDTYPE_MOSI_REQUEST =-6,
00314 SWD_CMDTYPE_MOSI_TRN =-5,
00315 SWD_CMDTYPE_MOSI_PARITY =-4,
00316 SWD_CMDTYPE_MOSI_BITBANG =-3,
00317 SWD_CMDTYPE_MOSI_CONTROL =-2,
00318 SWD_CMDTYPE_MOSI =-1,
00319 SWD_CMDTYPE_UNDEFINED =0,
00320 SWD_CMDTYPE_MISO =1,
00321 SWD_CMDTYPE_MISO_ACK =2,
00322 SWD_CMDTYPE_MISO_BITBANG =3,
00323 SWD_CMDTYPE_MISO_PARITY =4,
00324 SWD_CMDTYPE_MISO_TRN =5,
00325 SWD_CMDTYPE_MISO_DATA =6
00326 } swd_cmdtype_t;
00327
00329 typedef enum SWD_SHIFTDIR {
00330 SWD_DIR_LSBFIRST =0,
00331 SWD_DIR_MSBFIRST =1
00332 } swd_shiftdir_t;
00333
00335 typedef enum SWD_OPERATION {
00336 SWD_OPERATION_FIRST =1,
00337 SWD_OPERATION_QUEUE_APPEND =1,
00338 SWD_OPERATION_TRANSMIT_HEAD =2,
00339 SWD_OPERATION_TRANSMIT_TAIL =3,
00340 SWD_OPERATION_TRANSMIT_ALL =4,
00341 SWD_OPERATION_TRANSMIT_ONE =5,
00342 SWD_OPERATION_TRANSMIT_LAST =6,
00343 SWD_OPERATION_EXECUTE =7,
00344 SWD_OPERATION_LAST =7
00345 } swd_operation_t;
00346
00353 typedef struct swd_cmd_t {
00354 union {
00355 char TRNnMOSI;
00356 char request;
00357 char ack;
00358 int misodata;
00359 int mosidata;
00360 char misobit;
00361 char mosibit;
00362 char parity;
00363 char control;
00364 };
00365 char bits;
00366 char cmdtype;
00367 char done;
00368 struct swd_cmd_t *prev, *next;
00369 } swd_cmd_t;
00370
00372 typedef struct {
00373 char initialized;
00374 char trnlen;
00375 int maxcmdqlen;
00376 swd_loglevel_t loglevel;
00377 } swd_context_config_t;
00378
00380 typedef struct {
00381 char ack;
00382 int idcode;
00383 int abort;
00384 int ctrlstat;
00385 int wcr;
00386 int select;
00387 int rdbuf;
00388 } swd_swdp_t;
00389
00391 typedef struct {
00392 int controlstatus;
00393 int tar;
00394 int drw;
00395 int bd0;
00396 int bd1;
00397 int bd2;
00398 int bd3;
00399 int dromt;
00400 int idr;
00401 } swd_ahbap_t;
00402
00406 typedef struct {
00407 void *device;
00408 } swd_driver_t;
00409
00411 typedef enum {
00412 SWD_FALSE=0,
00413 SWD_TRUE=1
00414 } swd_bool_t;
00415
00425 typedef struct {
00426 swd_cmd_t *cmdq;
00427 swd_context_config_t config;
00428 swd_driver_t *driver;
00429 swd_swdp_t misoswdp;
00430 swd_swdp_t mosiswdp;
00431 swd_ahbap_t misoahbap;
00432 swd_ahbap_t mosiahbap;
00433 } swd_ctx_t;
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449 int swd_bin8_parity_even(char *data, char *parity);
00450 int swd_bin32_parity_even(int *data, char *parity);
00451 int swd_bin8_print(char *data);
00452 int swd_bin32_print(int *data);
00453 char *swd_bin8_string(char *data);
00454 char *swd_bin32_string(int *data);
00455
00456 int swd_bin8_bitswap(unsigned char *buffer, int bitcount);
00457 int swd_bin32_bitswap(unsigned int *buffer, int bitcount);
00460
00461
00462
00463
00464
00465 int swd_cmd_queue_init(swd_cmd_t *cmdq);
00466 swd_cmd_t* swd_cmd_queue_find_root(swd_cmd_t *cmdq);
00467 swd_cmd_t* swd_cmd_queue_find_tail(swd_cmd_t *cmdq);
00468 int swd_cmd_queue_append(swd_cmd_t *cmdq, swd_cmd_t *cmd);
00469 int swd_cmd_queue_free(swd_cmd_t *cmdq);
00470 int swd_cmd_queue_free_head(swd_cmd_t *cmdq);
00471 int swd_cmd_queue_free_tail(swd_cmd_t *cmdq);
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490 int swd_cmd_queue_append_mosi_request(swd_ctx_t *swdctx, char *request);
00491 int swd_cmd_queue_append_mosi_trn(swd_ctx_t *swdctx);
00492 int swd_cmd_queue_append_miso_trn(swd_ctx_t *swdctx);
00493 int swd_cmd_queue_append_miso_nbit(swd_ctx_t *swdctx, char **data, int count);
00494 int swd_cmd_queue_append_mosi_nbit(swd_ctx_t *swdctx, char *data, int count);
00495 int swd_cmd_queue_append_mosi_parity(swd_ctx_t *swdctx, char *parity);
00496 int swd_cmd_queue_append_miso_parity(swd_ctx_t *swdctx, char *parity);
00497 int swd_cmd_queue_append_miso_data(swd_ctx_t *swdctx, int *data);
00498 int swd_cmd_queue_append_miso_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00499 int swd_cmd_queue_append_miso_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00500 int swd_cmd_queue_append_mosi_data(swd_ctx_t *swdctx, int *data);
00501 int swd_cmd_queue_append_mosi_data_ap(swd_ctx_t *swdctx, int *data);
00502 int swd_cmd_queue_append_mosi_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00503 int swd_cmd_append_mosi_n_data_ap(swd_ctx_t *swdctx, int **data, int count);
00504 int swd_cmd_append_mosi_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00505 int swd_cmd_queue_append_miso_ack(swd_ctx_t *swdctx, char *ack);
00506 int swd_cmd_queue_append_mosi_control(swd_ctx_t *swdctx, char *ctlmsg, int len);
00507 int swd_cmd_queue_append_swdpreset(swd_ctx_t *swdctx);
00508 int swd_cmd_queue_append_jtag2swd(swd_ctx_t *swdctx);
00509 int swd_cmd_queue_append_swd2jtag(swd_ctx_t *swdctx);
00510
00511 int swd_bus_setdir_mosi(swd_ctx_t *swdctx);
00512 int swd_bus_setdir_miso(swd_ctx_t *swdctx);
00515
00516
00517
00518
00519
00520 int swd_bit8_gen_request(swd_ctx_t *swdctx, char *APnDP, char *RnW, char *addr, char *request);
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535 int swd_transmit(swd_ctx_t *swdctx, swd_cmd_t *cmd);
00536 int swd_cmd_queue_flush(swd_ctx_t *swdctx, swd_operation_t operation);
00539
00540
00541
00542
00543
00544
00545
00546
00547 int swd_mosi_request
00548 (swd_ctx_t *swdctx, swd_operation_t operation, char *APnDP, char *RnW, char *addr);
00549 int swd_miso_ack(swd_ctx_t *swdctx, swd_operation_t operation, char *ack);
00550 int swd_mosi_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00551 int swd_mosi_data_ap(swd_ctx_t *swdctx, swd_operation_t operation, int *data);
00552 int swd_miso_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00553 int swd_mosi_jtag2swd(swd_ctx_t *swdctx, swd_operation_t operation);
00556
00557
00558
00559
00560
00561
00562
00563
00564 int swd_jtag2swd(swd_ctx_t *swdctx, swd_operation_t operation);
00565 int swd_idcode(swd_ctx_t *swdctx, swd_operation_t operation, int *idcode, char *ack, char *parity);
00568
00569
00570
00571
00572
00573 int swd_log(swd_loglevel_t loglevel, char *msg);
00576
00577
00578
00579
00580
00581 char *swd_error_string(swd_error_code_t error);
00584
00585
00586
00587
00588
00589 swd_ctx_t *swd_init(void);
00590 int swd_deinit_ctx(swd_ctx_t *swdctx);
00591 int swd_deinit_cmdq(swd_ctx_t *swdctx);
00592 int swd_deinit(swd_ctx_t *swdctx);
00595
00596
00597
00598
00599
00600 int swd_drv_mosi_8(swd_ctx_t *swdctx, char *data, int bits, int direction);
00601 int swd_drv_mosi_32(swd_ctx_t *swdctx, int *data, int bits, int direction);
00602 int swd_drv_miso_8(swd_ctx_t *swdctx, char *data, int bits, int direction);
00603 int swd_drv_miso_32(swd_ctx_t *swdctx, int *data, int bits, int direction);
00604 int swd_drv_mosi_trn(swd_ctx_t *swdctx, int clks);
00605 int swd_drv_miso_trn(swd_ctx_t *swdctx, int clks);
00608 #endif