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_QUEUETAIL =-31,
00271 SWD_ERROR_BADCMDTYPE =-32,
00272 SWD_ERROR_BADCMDDATA =-33,
00273 SWD_ERROR_TURNAROUND =-34,
00274 SWD_ERROR_DRIVER =-35,
00275 SWD_ERROR_ACK_WAIT =-36,
00276 SWD_ERROR_ACK_FAULT =-37,
00277 SWD_ERROR_QUEUENOTFREE=-38,
00278 SWD_ERROR_TRANSPORT =-39
00279 } swd_error_code_t;
00280
00282
00283 typedef enum SWD_LOGLEVEL{
00285 SWD_LOGLEVEL_SILENT = 0,
00287 SWD_LOGLEVEL_INFO = 1,
00289 SWD_LOGLEVEL_WARNING = 2,
00291 SWD_LOGLEVEL_ERROR = 3,
00293 SWD_LOGLEVEL_DEBUG = 4
00294 } swd_loglevel_t;
00295
00297
00298 #define SWD_DATA_MAXBITCOUNT 32
00299
00300 #define SWD_DATA_BYTESIZE 8
00301
00302 #define SWD_DATA_BITLEN 32
00303
00304 #define SWD_CMDQLEN_DEFAULT 1024;
00305
00311
00312 typedef enum SWD_CMDTYPE {
00313 SWD_CMDTYPE_MOSI_DATA =-7,
00314 SWD_CMDTYPE_MOSI_REQUEST =-6,
00315 SWD_CMDTYPE_MOSI_TRN =-5,
00316 SWD_CMDTYPE_MOSI_PARITY =-4,
00317 SWD_CMDTYPE_MOSI_BITBANG =-3,
00318 SWD_CMDTYPE_MOSI_CONTROL =-2,
00319 SWD_CMDTYPE_MOSI =-1,
00320 SWD_CMDTYPE_UNDEFINED =0,
00321 SWD_CMDTYPE_MISO =1,
00322 SWD_CMDTYPE_MISO_ACK =2,
00323 SWD_CMDTYPE_MISO_BITBANG =3,
00324 SWD_CMDTYPE_MISO_PARITY =4,
00325 SWD_CMDTYPE_MISO_TRN =5,
00326 SWD_CMDTYPE_MISO_DATA =6
00327 } swd_cmdtype_t;
00328
00330 typedef enum SWD_SHIFTDIR {
00331 SWD_DIR_LSBFIRST =0,
00332 SWD_DIR_MSBFIRST =1
00333 } swd_shiftdir_t;
00334
00336 typedef enum SWD_OPERATION {
00337 SWD_OPERATION_FIRST =1,
00338 SWD_OPERATION_ENQUEUE =1,
00339 SWD_OPERATION_EXECUTE =2,
00340 SWD_OPERATION_TRANSMIT_HEAD =3,
00341 SWD_OPERATION_TRANSMIT_TAIL =4,
00342 SWD_OPERATION_TRANSMIT_ALL =5,
00343 SWD_OPERATION_TRANSMIT_ONE =6,
00344 SWD_OPERATION_TRANSMIT_LAST =7,
00345 SWD_OPERATION_LAST =7
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 swd_cmdtype_t 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
00438 int swd_bin8_parity_even(char *data, char *parity);
00439 int swd_bin32_parity_even(int *data, char *parity);
00440 int swd_bin8_print(char *data);
00441 int swd_bin32_print(int *data);
00442 char *swd_bin8_string(char *data);
00443 char *swd_bin32_string(int *data);
00444 int swd_bin8_bitswap(unsigned char *buffer, int bitcount);
00445 int swd_bin32_bitswap(unsigned int *buffer, int bitcount);
00446
00447 int swd_cmdq_init(swd_cmd_t *cmdq);
00448 swd_cmd_t* swd_cmdq_find_root(swd_cmd_t *cmdq);
00449 swd_cmd_t* swd_cmdq_find_tail(swd_cmd_t *cmdq);
00450 int swd_cmdq_append(swd_cmd_t *cmdq, swd_cmd_t *cmd);
00451 int swd_cmdq_free(swd_cmd_t *cmdq);
00452 int swd_cmdq_free_head(swd_cmd_t *cmdq);
00453 int swd_cmdq_free_tail(swd_cmd_t *cmdq);
00454
00455 int swd_cmd_enqueue(swd_ctx_t *swdctx, swd_cmd_t *cmd);
00456 int swd_cmd_enqueue_mosi_request(swd_ctx_t *swdctx, char *request);
00457 int swd_cmd_enqueue_mosi_trn(swd_ctx_t *swdctx);
00458 int swd_cmd_enqueue_miso_trn(swd_ctx_t *swdctx);
00459 int swd_cmd_enqueue_miso_nbit(swd_ctx_t *swdctx, char **data, int count);
00460 int swd_cmd_enqueue_mosi_nbit(swd_ctx_t *swdctx, char *data, int count);
00461 int swd_cmd_enqueue_mosi_parity(swd_ctx_t *swdctx, char *parity);
00462 int swd_cmd_enqueue_miso_parity(swd_ctx_t *swdctx, char *parity);
00463 int swd_cmd_enqueue_miso_data(swd_ctx_t *swdctx, int *data);
00464 int swd_cmd_enqueue_miso_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00465 int swd_cmd_enqueue_miso_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00466 int swd_cmd_enqueue_mosi_data(swd_ctx_t *swdctx, int *data);
00467 int swd_cmd_enqueue_mosi_data_ap(swd_ctx_t *swdctx, int *data);
00468 int swd_cmd_enqueue_mosi_data_p(swd_ctx_t *swdctx, int *data, char *parity);
00469 int swd_cmd_enqueue_mosi_n_data_ap(swd_ctx_t *swdctx, int **data, int count);
00470 int swd_cmd_enqueue_mosi_n_data_p(swd_ctx_t *swdctx, int **data, char **parity, int count);
00471 int swd_cmd_enqueue_miso_ack(swd_ctx_t *swdctx, char *ack);
00472 int swd_cmd_enqueue_mosi_control(swd_ctx_t *swdctx, char *ctlmsg, int len);
00473 int swd_cmd_enqueue_mosi_dap_reset(swd_ctx_t *swdctx);
00474 int swd_cmd_enqueue_mosi_jtag2swd(swd_ctx_t *swdctx);
00475 int swd_cmd_enqueue_mosi_swd2jtag(swd_ctx_t *swdctx);
00476
00477 int swd_bus_setdir_mosi(swd_ctx_t *swdctx);
00478 int swd_bus_setdir_miso(swd_ctx_t *swdctx);
00479 int swd_bus_transmit(swd_ctx_t *swdctx, swd_cmd_t *cmd);
00480
00481 int swd_bitgen8_request(swd_ctx_t *swdctx, char *APnDP, char *RnW, char *addr, char *request);
00482
00483 extern int swd_drv_mosi_8(swd_ctx_t *swdctx, char *data, int bits, int nLSBfirst);
00484 extern int swd_drv_mosi_32(swd_ctx_t *swdctx, int *data, int bits, int nLSBfirst);
00485 extern int swd_drv_miso_8(swd_ctx_t *swdctx, char *data, int bits, int nLSBfirst);
00486 extern int swd_drv_miso_32(swd_ctx_t *swdctx, int *data, int bits, int nLSBfirst);
00487
00488 int swd_cmdq_flush(swd_ctx_t *swdctx, swd_operation_t operation);
00489
00490 int swd_mosi_request
00491 (swd_ctx_t *swdctx, swd_operation_t operation, char *APnDP, char *RnW, char *addr);
00492 int swd_miso_ack(swd_ctx_t *swdctx, swd_operation_t operation, char *ack);
00493 int swd_mosi_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00494 int swd_mosi_data_ap(swd_ctx_t *swdctx, swd_operation_t operation, int *data);
00495 int swd_miso_data_p(swd_ctx_t *swdctx, swd_operation_t operation, int *data, char *parity);
00496 int swd_mosi_jtag2swd(swd_ctx_t *swdctx, swd_operation_t operation);
00497 int swd_mosi_dap_reset(swd_ctx_t *swdctx, swd_operation_t operation);
00498
00499 int swd_idcode(swd_ctx_t *swdctx, swd_operation_t operation, int *idcode, char *ack, char *parity);
00500 int swd_dap_select_swj(swd_ctx_t *swdctx, swd_operation_t operation);
00501 int swd_dap_idcode(swd_ctx_t *swdctx, swd_operation_t operation);
00502 int swd_dap_reset_select_idcode(swd_ctx_t *swdctx, swd_operation_t operation);
00503
00504 int swd_log(swd_loglevel_t loglevel, char *msg);
00505 char *swd_error_string(swd_error_code_t error);
00506
00507 swd_ctx_t *swd_init(void);
00508 int swd_deinit_ctx(swd_ctx_t *swdctx);
00509 int swd_deinit_cmdq(swd_ctx_t *swdctx);
00510 int swd_deinit(swd_ctx_t *swdctx);
00511
00512 int swd_drv_mosi_trn(swd_ctx_t *swdctx, int clks);
00513 int swd_drv_miso_trn(swd_ctx_t *swdctx, int clks);
00514
00515 #endif