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_QUEUE =7,
00344 SWD_OPERATION_EXECUTE =8,
00345 SWD_OPERATION_LAST =8
00346 } swd_operation_t;
00347
00354 typedef struct swd_cmd_t {
00355 union {
00356 char TRNnMOSI;
00357 char request;
00358 char ack;
00359 int misodata;
00360 int mosidata;
00361 char misobit;
00362 char mosibit;
00363 char parity;
00364 char control;
00365 };
00366 char bits;
00367 char cmdtype;
00368 char done;
00369 struct swd_cmd_t *prev, *next;
00370 } swd_cmd_t;
00371
00373 typedef struct {
00374 char initialized;
00375 char trnlen;
00376 int maxcmdqlen;
00377 swd_loglevel_t loglevel;
00378 } swd_context_config_t;
00379
00381 typedef struct {
00382 char ack;
00383 int idcode;
00384 int abort;
00385 int ctrlstat;
00386 int wcr;
00387 int select;
00388 int rdbuf;
00389 } swd_swdp_t;
00390
00392 typedef struct {
00393 int controlstatus;
00394 int tar;
00395 int drw;
00396 int bd0;
00397 int bd1;
00398 int bd2;
00399 int bd3;
00400 int dromt;
00401 int idr;
00402 } swd_ahbap_t;
00403
00407 typedef struct {
00408 void *device;
00409 } swd_driver_t;
00410
00412 typedef enum {
00413 SWD_FALSE=0,
00414 SWD_TRUE=1
00415 } swd_bool_t;
00416
00426 typedef struct {
00427 swd_cmd_t *cmdq;
00428 swd_context_config_t config;
00429 swd_driver_t *driver;
00430 swd_swdp_t misoswdp;
00431 swd_swdp_t mosiswdp;
00432 swd_ahbap_t misoahbap;
00433 swd_ahbap_t mosiahbap;
00434 } swd_ctx_t;
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450 int swd_bin8_parity_even(char *data, char *parity);
00451 int swd_bin32_parity_even(int *data, char *parity);
00452 int swd_bin8_print(char *data);
00453 int swd_bin32_print(int *data);
00454 char *swd_bin8_string(char *data);
00455 char *swd_bin32_string(int *data);
00456
00457 int swd_bin8_bitswap(unsigned char *buffer, int bitcount);
00458 int swd_bin32_bitswap(unsigned int *buffer, int bitcount);
00461
00462
00463
00464
00465
00466 int swd_cmd_queue_init(swd_cmd_t *cmdq);
00467 swd_cmd_t* swd_cmd_queue_find_root(swd_cmd_t *cmdq);
00468 swd_cmd_t* swd_cmd_queue_find_tail(swd_cmd_t *cmdq);
00469 int swd_cmd_queue_append(swd_cmd_t *cmdq, swd_cmd_t *cmd);
00470 int swd_cmd_queue_free(swd_cmd_t *cmdq);
00471 int swd_cmd_queue_free_head(swd_cmd_t *cmdq);
00472 int swd_cmd_queue_free_tail(swd_cmd_t *cmdq);
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491 int swd_cmd_queue_append_mosi_request(swd_ctx_t *swdctx, char *request);
00492 int swd_cmd_queue_append_mosi_trn(swd_ctx_t *swdctx);
00493 int swd_cmd_queue_append_miso_trn(swd_ctx_t *swdctx);
00494 int swd_cmd_queue_append_miso_nbit(swd_ctx_t *swdctx, char **data, int count);
00495 int swd_cmd_queue_append_mosi_nbit(swd_ctx_t *swdctx, char *data, int count);
00496 int swd_cmd_queue_append_mosi_parity(swd_ctx_t *swdctx, char *parity);
00497 int swd_cmd_queue_append_miso_parity(swd_ctx_t *swdctx, char *parity);
00498 int swd_cmd_queue_append_miso_data(swd_ctx_t *swdctx, int *data);
00499 int swd_cmd_queue_append_miso_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00500 int swd_cmd_queue_append_miso_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00501 int swd_cmd_queue_append_mosi_data(swd_ctx_t *swdctx, int *data);
00502 int swd_cmd_queue_append_mosi_data_ap(swd_ctx_t *swdctx, int *data);
00503 int swd_cmd_queue_append_mosi_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00504 int swd_cmd_append_mosi_n_data_ap(swd_ctx_t *swdctx, int **data, int count);
00505 int swd_cmd_append_mosi_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00506 int swd_cmd_queue_append_miso_ack(swd_ctx_t *swdctx, char *ack);
00507 int swd_cmd_queue_append_mosi_control(swd_ctx_t *swdctx, char *ctlmsg, int len);
00508 int swd_cmd_queue_append_swdpreset(swd_ctx_t *swdctx);
00509 int swd_cmd_queue_append_jtag2swd(swd_ctx_t *swdctx);
00510 int swd_cmd_queue_append_swd2jtag(swd_ctx_t *swdctx);
00511
00512 int swd_bus_setdir_mosi(swd_ctx_t *swdctx);
00513 int swd_bus_setdir_miso(swd_ctx_t *swdctx);
00516
00517
00518
00519
00520
00521 int swd_bit8_gen_request(swd_ctx_t *swdctx, char *APnDP, char *RnW, char *addr, char *request);
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536 int swd_transmit(swd_ctx_t *swdctx, swd_cmd_t *cmd);
00537 int swd_cmd_queue_flush(swd_ctx_t *swdctx, swd_operation_t operation);
00540
00541
00542
00543
00544
00545
00546
00547
00548 int swd_mosi_request
00549 (swd_ctx_t *swdctx, swd_operation_t operation, char *APnDP, char *RnW, char *addr);
00550 int swd_miso_ack(swd_ctx_t *swdctx, swd_operation_t operation, char *ack);
00551 int swd_mosi_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00552 int swd_mosi_data_ap(swd_ctx_t *swdctx, swd_operation_t operation, int *data);
00553 int swd_miso_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00556
00557
00558
00559
00560
00561
00562
00563
00564 int swd_idcode(swd_ctx_t *swdctx, swd_operation_t operation, int *idcode, char *ack, char *parity);
00567
00568
00569
00570
00571
00572 int swd_log(swd_loglevel_t loglevel, char *msg);
00575
00576
00577
00578
00579
00580 char *swd_error_string(swd_error_code_t error);
00583
00584
00585
00586
00587
00588 swd_ctx_t *swd_init(void);
00589 int swd_deinit_ctx(swd_ctx_t *swdctx);
00590 int swd_deinit_cmdq(swd_ctx_t *swdctx);
00591 int swd_deinit(swd_ctx_t *swdctx);
00594
00595
00596
00597
00598
00599 int swd_drv_mosi_8(swd_ctx_t *swdctx, char *data, int bits, int direction);
00600 int swd_drv_mosi_32(swd_ctx_t *swdctx, int *data, int bits, int direction);
00601 int swd_drv_miso_8(swd_ctx_t *swdctx, char *data, int bits, int direction);
00602 int swd_drv_miso_32(swd_ctx_t *swdctx, int *data, int bits, int direction);
00603 int swd_drv_mosi_trn(swd_ctx_t *swdctx, int clks);
00604 int swd_drv_miso_trn(swd_ctx_t *swdctx, int clks);
00607 #endif