5 #include "debug_module.h"
6 #include "debug_defines.h"
20 #define DTMCONTROL_VERSION 0xf
21 #define DTMCONTROL_ABITS (0x3f << 4)
22 #define DTMCONTROL_DBUSSTAT (3<<10)
23 #define DTMCONTROL_IDLE (7<<12)
24 #define DTMCONTROL_DBUSRESET (1<<16)
27 #define DMI_DATA (0xffffffffL<<2)
28 #define DMI_ADDRESS ((1L<<(abits+34)) - (1L<<34))
30 #define DMI_OP_STATUS_SUCCESS 0
31 #define DMI_OP_STATUS_RESERVED 1
32 #define DMI_OP_STATUS_FAILED 2
33 #define DMI_OP_STATUS_BUSY 3
37 #define DMI_OP_WRITE 2
38 #define DMI_OP_RESERVED 3
40 jtag_dtm_t::jtag_dtm_t(debug_module_t
*dm
) :
42 _tck(false), _tms(false), _tdi(false), _tdo(false),
43 dtmcontrol((abits
<< DTM_DTMCS_ABITS_OFFSET
) | 1),
44 dmi(DMI_OP_STATUS_SUCCESS
<< DTM_DMI_OP_OFFSET
),
45 _state(TEST_LOGIC_RESET
)
49 void jtag_dtm_t::reset() {
50 _state
= TEST_LOGIC_RESET
;
53 void jtag_dtm_t::set_pins(bool tck
, bool tms
, bool tdi
) {
54 const jtag_state_t next
[16][2] = {
55 /* TEST_LOGIC_RESET */ { RUN_TEST_IDLE
, TEST_LOGIC_RESET
},
56 /* RUN_TEST_IDLE */ { RUN_TEST_IDLE
, SELECT_DR_SCAN
},
57 /* SELECT_DR_SCAN */ { CAPTURE_DR
, SELECT_IR_SCAN
},
58 /* CAPTURE_DR */ { SHIFT_DR
, EXIT1_DR
},
59 /* SHIFT_DR */ { SHIFT_DR
, EXIT1_DR
},
60 /* EXIT1_DR */ { PAUSE_DR
, UPDATE_DR
},
61 /* PAUSE_DR */ { PAUSE_DR
, EXIT2_DR
},
62 /* EXIT2_DR */ { SHIFT_DR
, UPDATE_DR
},
63 /* UPDATE_DR */ { RUN_TEST_IDLE
, SELECT_DR_SCAN
},
64 /* SELECT_IR_SCAN */ { CAPTURE_IR
, TEST_LOGIC_RESET
},
65 /* CAPTURE_IR */ { SHIFT_IR
, EXIT1_IR
},
66 /* SHIFT_IR */ { SHIFT_IR
, EXIT1_IR
},
67 /* EXIT1_IR */ { PAUSE_IR
, UPDATE_IR
},
68 /* PAUSE_IR */ { PAUSE_IR
, EXIT2_IR
},
69 /* EXIT2_IR */ { SHIFT_IR
, UPDATE_IR
},
70 /* UPDATE_IR */ { RUN_TEST_IDLE
, SELECT_DR_SCAN
}
74 // Positive clock edge.
79 dr
|= (uint64_t) _tdi
<< (dr_length
-1);
83 ir
|= _tdi
<< (ir_length
-1);
88 _state
= next
[_state
][_tms
];
90 case TEST_LOGIC_RESET
:
114 D(fprintf(stderr
, "state=%2d, tdi=%d, tdo=%d, tms=%d, tck=%d, ir=0x%02x, "
116 _state
, _tdi
, _tdo
, _tms
, _tck
, ir
, dr
));
123 void jtag_dtm_t::capture_dr()
136 dr_length
= abits
+ 34;
139 D(fprintf(stderr
, "Unsupported IR: 0x%x\n", ir
));
142 D(fprintf(stderr
, "Capture DR; IR=0x%x, DR=0x%lx (%d bits)\n",
146 void jtag_dtm_t::update_dr()
148 D(fprintf(stderr
, "Update DR; IR=0x%x, DR=0x%lx (%d bits)\n",
153 unsigned op
= get_field(dr
, DMI_OP
);
154 uint32_t data
= get_field(dr
, DMI_DATA
);
155 unsigned address
= get_field(dr
, DMI_ADDRESS
);
160 if (op
== DMI_OP_READ
) {
162 if (dm
->dmi_read(address
, &value
)) {
163 dmi
= set_field(dmi
, DMI_DATA
, value
);
167 } else if (op
== DMI_OP_WRITE
) {
168 success
= dm
->dmi_write(address
, data
);
172 dmi
= set_field(dmi
, DMI_OP
, DMI_OP_STATUS_SUCCESS
);
174 dmi
= set_field(dmi
, DMI_OP
, DMI_OP_STATUS_FAILED
);
176 D(fprintf(stderr
, "dmi=0x%lx\n", dmi
));