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
00091 #ifndef __LIBSWD_H__
00092 #define __LIBSWD_H__
00093
00094
00095
00097
00098 #define SWD_REQUEST_START_BITNUM 7
00099
00100 #define SWD_REQUEST_APnDP_BITNUM 6
00101
00102 #define SWD_REQUEST_RnW_BITNUM 5
00103
00104 #define SWD_REQUEST_ADDR_BITNUM 4
00105
00106 #define SWD_REQUEST_A2_BITNUM 4
00107
00108 #define SWD_REQUEST_A3_BITNUM 3
00109
00110 #define SWD_REQUEST_PARITY_BITNUM 2
00111
00112 #define SWD_REQUEST_STOP_BITNUM 1
00113
00114 #define SWD_REQUEST_PARK_BITNUM 0
00115
00117 #define SWD_REQUEST_START_VAL 1
00118
00119 #define SWD_REQUEST_STOP_VAL 0
00120
00121 #define SWD_REQUEST_PARK_VAL 1
00122
00123 #define SWD_REQUEST_BITLEN 8
00124
00126 #define SWD_ADDR_MINVAL 0
00127
00128 #define SWD_ADDR_MAXVAL 3
00129
00131 #define SWD_ACK_BITLEN 3
00132
00133 #define SWD_ACK_OK_VAL 4
00134
00135 #define SWD_ACK_WAIT_VAL 2
00136
00137 #define SWD_ACK_FAULT_VAL 1
00138
00140 #define SWD_DP_ADDR_IDCODE 0
00141
00142 #define SWD_DP_ADDR_ABORT 0
00143
00144 #define SWD_DP_ADDR_CTRLSTAT 1
00145
00146 #define SWD_DP_ADDR_WCR 1
00147
00148 #define SWD_DP_ADDR_RESEND 2
00149
00150 #define SWD_DP_ADDR_SELECT 2
00151
00152 #define SWD_DP_ADDR_RDBUF 3
00153
00155
00156 #define SWD_ABORT_BITNUM_DAPABORT 0
00157
00158 #define SWD_ABORT_BITNUM_DSTKCMPCLR 1
00159
00160 #define SWD_ABORT_BITNUM_DSTKERRCLR 2
00161
00162 #define SWD_ABORT_BITNUM_DWDERRCLR 3
00163
00164 #define SWD_ABORT_BITNUM_DORUNERRCLR 4
00165
00167
00168 #define SWD_CTRLSTAT_BITNUM_ORUNDETECT 0
00169
00170 #define SWD_CTRLSTAT_BITNUM_OSTICKYORUN 1
00171
00172 #define SWD_CTRLSTAT_BITNUM_OTRNMODE 2
00173
00174 #define SWD_CTRLSTAT_BITNUM_OSTICKYCMP 4
00175
00176 #define SWD_CTRLSTAT_BITNUM_OSTICKYERR 5
00177
00178 #define SWD_CTRLSTAT_BITNUM_OREADOK 6
00179
00180 #define SWD_CTRLSTAT_BITNUM_OWDATAERR 7
00181
00182 #define SWD_CTRLSTAT_BITNUM_OMASKLANE 8
00183
00184 #define SWD_CTRLSTAT_BITNUM_OTRNCNT 12
00185
00186 #define SWD_CTRLSTAT_BITNUM_OCDBGRSTREQ 26
00187
00188 #define SWD_CTRLSTAT_BITNUM_OCDBGRSTACK 27
00189
00190 #define SWD_CTRLSTAT_BITNUM_OCDBGPWRUPREQ 28
00191
00192 #define SWD_CTRLSTAT_BITNUM_OCDBGPWRUPACK 29
00193
00194 #define SWD_CTRLSTAT_BITNUM_OCSYSPWRUPREQ 30
00195
00196 #define SWD_CTRLSTAT_BITNUM_OCSYSPWRUPACK 31
00197
00198
00199 #define SWD_MASKLANE_0 0b0001
00200
00201 #define SWD_MASKLANE_1 0b0010
00202
00203 #define SWD_MASKLANE_2 0b0100
00204
00205 #define SWD_MASKLANE_3 0b1000
00206
00208
00209 #define SWD_SELECT_BITNUM_CTRLSEL 0
00210
00211 #define SWD_SELECT_BITNUM_APBANKSEL 4
00212
00213 #define SWD_SELECT_BITNUM_APSEL 24
00214
00216
00217 #define SWD_WCR_BITNUM_PRESCALER 0 ///< PRESCALER bit number.
00218
00219 #define SWD_WCR_BITNUM_WIREMODE 6 ///< WIREMODE bit number.
00220
00221 #define SWD_WCR_BITNUM_TURNROUND 8 ///< TURNROUND bit number.
00222
00223
00224 #define SWD_TURNROUND_1_CODE 0 ///< TRN takes one CLK cycle.
00225 #define SWD_TURNROUND_1_VAL 1
00226
00227 #define SWD_TURNROUND_2_CODE 1 ///< TRN takes two CLK cycles.
00228 #define SWD_TURNROUNT_2_VAL 2
00229
00230 #define SWD_TURNROUND_3_CODE 2 ///< TRN takes three CLK cycles.
00231 #define SWD_TURNROUND_3_VAL 3
00232
00233 #define SWD_TURNROUND_4_CODE 3 ///< TRN takes four CLK cycles. ????
00234 #define SWD_TURNROUND_4_VAL 4
00235
00236 #define SWD_TURNROUND_MIN_VAL SWD_TURNROUND_1_VAL ///< shortest TRN time.
00237 #define SWD_TURNROUND_MIN_CODE SWD_TURNOUND_1_CODE
00238
00239 #define SWD_TURNROUND_MAX_VAL SWD_TURNROUND_4_VAL ///< longest TRN time.
00240 #define SWD_TURNROUND_MAX_CODE SWD_TURNROUND_4_CODE
00241
00242 #define SWD_TURNROUND_DEFAULT_VAL SWD_TURNROUND_1_VAL ///< Default TRN length is one CLK.
00243
00245
00246 #define AHB_AP_CONTROLSTATUS 0x00 ///< R/W, 32bit, reset value: 0x43800042
00247
00248 #define AHB_AP_TAR 0x04 ///< R/W, 32bit, reset value: 0x00000000
00249
00250 #define AHB_AP_DRW 0x0C ///< R/W, 32bit
00251
00252 #define AHB_AP_BD0 0x10 ///< R/W, 32bit
00253
00254 #define AHB_AP_BD1 0x14 ///< R/W, 32bit
00255
00256 #define AHB_AP_BD2 0x18 ///< R/W, 32bit
00257
00258 #define AHB_AP_BD3 0x1C ///< R/W, 32bit
00259
00260 #define AHB_AP_DROMT 0xF8 ///< RO, 32bit, reset value: 0xE00FF000
00261
00262 #define AHB_AP_IDR 0xFC ///< RO, 32bit, reset value: 0x24770001
00263
00265
00266 static const char SWD_CMD_SWDPRESET[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00};
00268 static const char SWD_CMD_JTAG2SWD[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xe7};
00270 static const char SWD_CMD_SWD2JTAG[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0xe7};
00272 static const char SWD_CMD_IDLE[] = {0x00};
00273
00275
00276 typedef enum {
00277 SWD_OK = 0,
00278 SWD_ERROR_GENERAL =-1,
00279 SWD_ERROR_NULLPOINTER =-2,
00280 SWD_ERROR_NULLQUEUE =-3,
00281 SWD_ERROR_NULLTRN =-4,
00282 SWD_ERROR_PARAM =-5,
00283 SWD_ERROR_OUTOFMEM =-6,
00284 SWD_ERROR_RESULT =-7,
00285 SWD_ERROR_RANGE =-8,
00286 SWD_ERROR_DEFINITION =-9,
00287 SWD_ERROR_NULLCONTEXT =-10,
00288 SWD_ERROR_QUEUE =-11,
00289 SWD_ERROR_ADDR =-12,
00290 SWD_ERROR_APnDP =-13,
00291 SWD_ERROR_RnW =-14,
00292 SWD_ERROR_PARITY =-15,
00293 SWD_ERROR_ACK =-16,
00294 SWD_ERROR_ACKUNKNOWN =-19,
00295 SWD_ERROR_ACKNOTDONE =-20,
00296 SWD_ERROR_ACKMISSING =-21,
00297 SWD_ERROR_ACKMISMATCH =-22,
00298 SWD_ERROR_ACKORDER =-23,
00299 SWD_ERROR_BADOPCODE =-24,
00300 SWD_ERROR_NODATACMD =-25,
00301 SWD_ERROR_DATAPTR =-26,
00302 SWD_ERROR_NOPARITYCMD =-27,
00303 SWD_ERROR_PARITYPTR =-28,
00304 SWD_ERROR_NOTDONE =-29,
00305 SWD_ERROR_QUEUEROOT =-30,
00306 SWD_ERROR_QUEUETAIL =-31,
00307 SWD_ERROR_BADCMDTYPE =-32,
00308 SWD_ERROR_BADCMDDATA =-33,
00309 SWD_ERROR_TURNAROUND =-34,
00310 SWD_ERROR_DRIVER =-35,
00311 SWD_ERROR_ACK_WAIT =-36,
00312 SWD_ERROR_ACK_FAULT =-37,
00313 SWD_ERROR_QUEUENOTFREE=-38,
00314 SWD_ERROR_TRANSPORT =-39,
00315 SWD_ERROR_DIRECTION =-40,
00316 SWD_ERROR_LOGLEVEL =-41
00317 } swd_error_code_t;
00318
00320
00321 typedef enum {
00322 SWD_LOGLEVEL_MIN = 0,
00323 SWD_LOGLEVEL_SILENT = 0,
00324 SWD_LOGLEVEL_ERROR = 1,
00325 SWD_LOGLEVEL_WARNING = 2,
00326 SWD_LOGLEVEL_NORMAL = 3,
00327 SWD_LOGLEVEL_INFO = 4,
00328 SWD_LOGLEVEL_DEBUG = 5,
00329 SWD_LOGLEVEL_MAX = 5
00330 } swd_loglevel_t;
00331
00333
00334 #define SWD_DATA_MAXBITCOUNT 32
00335
00336 #define SWD_DATA_BYTESIZE 8
00337
00338 #define SWD_DATA_BITLEN 32
00339
00340 #define SWD_CMDQLEN_DEFAULT 1024;
00341
00347
00348 typedef enum {
00349 SWD_CMDTYPE_MOSI_DATA =-7,
00350 SWD_CMDTYPE_MOSI_REQUEST =-6,
00351 SWD_CMDTYPE_MOSI_TRN =-5,
00352 SWD_CMDTYPE_MOSI_PARITY =-4,
00353 SWD_CMDTYPE_MOSI_BITBANG =-3,
00354 SWD_CMDTYPE_MOSI_CONTROL =-2,
00355 SWD_CMDTYPE_MOSI =-1,
00356 SWD_CMDTYPE_UNDEFINED =0,
00357 SWD_CMDTYPE_MISO =1,
00358 SWD_CMDTYPE_MISO_ACK =2,
00359 SWD_CMDTYPE_MISO_BITBANG =3,
00360 SWD_CMDTYPE_MISO_PARITY =4,
00361 SWD_CMDTYPE_MISO_TRN =5,
00362 SWD_CMDTYPE_MISO_DATA =6
00363 } swd_cmdtype_t;
00364
00366 typedef enum {
00367 SWD_DIR_LSBFIRST =0,
00368 SWD_DIR_MSBFIRST =1
00369 } swd_shiftdir_t;
00370
00372 typedef enum {
00373 SWD_OPERATION_FIRST =1,
00374 SWD_OPERATION_ENQUEUE =1,
00375 SWD_OPERATION_EXECUTE =2,
00376 SWD_OPERATION_TRANSMIT_HEAD =3,
00377 SWD_OPERATION_TRANSMIT_TAIL =4,
00378 SWD_OPERATION_TRANSMIT_ALL =5,
00379 SWD_OPERATION_TRANSMIT_ONE =6,
00380 SWD_OPERATION_TRANSMIT_LAST =7,
00381 SWD_OPERATION_LAST =7
00382 } swd_operation_t;
00383
00390 typedef struct swd_cmd_t {
00391 union {
00392 char TRNnMOSI;
00393 char request;
00394 char ack;
00395 int misodata;
00396 int mosidata;
00397 int data32;
00398 char misobit;
00399 char mosibit;
00400 char parity;
00401 char control;
00402 char data8;
00403 };
00404 char bits;
00405 swd_cmdtype_t cmdtype;
00406 char done;
00407 struct swd_cmd_t *prev;
00408 struct swd_cmd_t *next;
00409 } swd_cmd_t;
00410
00412 typedef struct {
00413 char initialized;
00414 char trnlen;
00415 int maxcmdqlen;
00416 swd_loglevel_t loglevel;
00417 } swd_context_config_t;
00418
00420 typedef struct {
00421 char ack;
00422 char parity;
00423 int idcode;
00424 int abort;
00425 int ctrlstat;
00426 int wcr;
00427 int select;
00428 int rdbuf;
00429 } swd_swdp_t;
00430
00432 typedef struct {
00433 char ack;
00434 int controlstatus;
00435 int tar;
00436 int drw;
00437 int bd0;
00438 int bd1;
00439 int bd2;
00440 int bd3;
00441 int dromt;
00442 int idr;
00443 } swd_ahbap_t;
00444
00446 typedef struct {
00447 char request;
00448 char ack;
00449 int data;
00450 int control;
00451 char parity;
00452 } swd_transaction_t;
00453
00457 typedef struct {
00458 void *device;
00459 } swd_driver_t;
00460
00462 typedef enum {
00463 SWD_FALSE=0,
00464 SWD_TRUE=1
00465 } swd_bool_t;
00466
00476 typedef struct {
00477 swd_cmd_t *cmdq;
00478 swd_context_config_t config;
00479 swd_driver_t *driver;
00480 struct {
00481 swd_swdp_t dp_read;
00482 swd_swdp_t dp_write;
00483 swd_ahbap_t ap_read;
00484 swd_ahbap_t ap_write;
00485 swd_transaction_t read;
00486 swd_transaction_t write;
00487 } log;
00488 } swd_ctx_t;
00489
00492 int swd_bin8_parity_even(char *data, char *parity);
00493 int swd_bin32_parity_even(int *data, char *parity);
00494 int swd_bin8_print(char *data);
00495 int swd_bin32_print(int *data);
00496 char *swd_bin8_string(char *data);
00497 char *swd_bin32_string(int *data);
00498 int swd_bin8_bitswap(unsigned char *buffer, int bitcount);
00499 int swd_bin32_bitswap(unsigned int *buffer, int bitcount);
00500
00501 int swd_cmdq_init(swd_cmd_t *cmdq);
00502 swd_cmd_t* swd_cmdq_find_root(swd_cmd_t *cmdq);
00503 swd_cmd_t* swd_cmdq_find_tail(swd_cmd_t *cmdq);
00504 int swd_cmdq_append(swd_cmd_t *cmdq, swd_cmd_t *cmd);
00505 int swd_cmdq_free(swd_cmd_t *cmdq);
00506 int swd_cmdq_free_head(swd_cmd_t *cmdq);
00507 int swd_cmdq_free_tail(swd_cmd_t *cmdq);
00508 int swd_cmdq_flush(swd_ctx_t *swdctx, swd_operation_t operation);
00509
00510 int swd_cmd_enqueue(swd_ctx_t *swdctx, swd_cmd_t *cmd);
00511 int swd_cmd_enqueue_mosi_request(swd_ctx_t *swdctx, char *request);
00512 int swd_cmd_enqueue_mosi_trn(swd_ctx_t *swdctx);
00513 int swd_cmd_enqueue_miso_trn(swd_ctx_t *swdctx);
00514 int swd_cmd_enqueue_miso_nbit(swd_ctx_t *swdctx, char **data, int count);
00515 int swd_cmd_enqueue_mosi_nbit(swd_ctx_t *swdctx, char *data, int count);
00516 int swd_cmd_enqueue_mosi_parity(swd_ctx_t *swdctx, char *parity);
00517 int swd_cmd_enqueue_miso_parity(swd_ctx_t *swdctx, char **parity);
00518 int swd_cmd_enqueue_miso_data(swd_ctx_t *swdctx, int **data);
00519 int swd_cmd_enqueue_miso_data_p(swd_ctx_t *swdctx, int **data, char **parity);
00520 int swd_cmd_enqueue_miso_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00521 int swd_cmd_enqueue_mosi_data(swd_ctx_t *swdctx, int *data);
00522 int swd_cmd_enqueue_mosi_data_ap(swd_ctx_t *swdctx, int *data);
00523 int swd_cmd_enqueue_mosi_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00524 int swd_cmd_enqueue_mosi_n_data_ap(swd_ctx_t *swdctx, int **data, int count);
00525 int swd_cmd_enqueue_mosi_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00526 int swd_cmd_enqueue_miso_ack(swd_ctx_t *swdctx, char **ack);
00527 int swd_cmd_enqueue_mosi_control(swd_ctx_t *swdctx, char *ctlmsg, int len);
00528 int swd_cmd_enqueue_mosi_dap_reset(swd_ctx_t *swdctx);
00529 int swd_cmd_enqueue_mosi_idle(swd_ctx_t *swdctx);
00530 int swd_cmd_enqueue_mosi_jtag2swd(swd_ctx_t *swdctx);
00531 int swd_cmd_enqueue_mosi_swd2jtag(swd_ctx_t *swdctx);
00532
00533 char *swd_cmd_string_cmdtype(swd_cmd_t *cmd);
00534
00535 int swd_bus_setdir_mosi(swd_ctx_t *swdctx);
00536 int swd_bus_setdir_miso(swd_ctx_t *swdctx);
00537 int swd_bus_write_request
00538 (swd_ctx_t *swdctx, swd_operation_t operation, char *APnDP, char *RnW, char *addr);
00539 int swd_bus_read_ack(swd_ctx_t *swdctx, swd_operation_t operation, char **ack);
00540 int swd_bus_write_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00541 int swd_bus_write_data_ap(swd_ctx_t *swdctx, swd_operation_t operation, int *data);
00542 int swd_bus_read_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int **data, char **parity);
00543 int swd_bus_write_control(swd_ctx_t *swdctx, swd_operation_t operation, char *ctlmsg, int len);
00544
00545 int swd_bitgen8_request(swd_ctx_t *swdctx, char *APnDP, char *RnW, char *addr, char *request);
00546
00547 int swd_drv_transmit(swd_ctx_t *swdctx, swd_cmd_t *cmd);
00548 extern int swd_drv_mosi_8(swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int nLSBfirst);
00549 extern int swd_drv_mosi_32(swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int nLSBfirst);
00550 extern int swd_drv_miso_8(swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int nLSBfirst);
00551 extern int swd_drv_miso_32(swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int nLSBfirst);
00552 extern int swd_drv_mosi_trn(swd_ctx_t *swdctx, int clks);
00553 extern int swd_drv_miso_trn(swd_ctx_t *swdctx, int clks);
00554
00555 int swd_dap_reset(swd_ctx_t *swdctx, swd_operation_t operation);
00556 int swd_dap_select(swd_ctx_t *swdctx, swd_operation_t operation);
00557 int swd_dap_detect(swd_ctx_t *swdctx, swd_operation_t operation, int **idcode);
00558
00559 int swd_dp_read_idcode(swd_ctx_t *swdctx, swd_operation_t operation, int **idcode);
00560
00561 int swd_log(swd_ctx_t *swdctx, swd_loglevel_t loglevel, char *msg, ...);
00562 int swd_log_level_set(swd_ctx_t *swdctx, swd_loglevel_t loglevel);
00563 extern int swd_log_level_inherit(swd_ctx_t *swdctx, int loglevel);
00564 char *swd_error_string(swd_error_code_t error);
00565
00566 swd_ctx_t *swd_init(void);
00567 int swd_deinit_ctx(swd_ctx_t *swdctx);
00568 int swd_deinit_cmdq(swd_ctx_t *swdctx);
00569 int swd_deinit(swd_ctx_t *swdctx);
00570
00571 #endif