]>
git.zerfleddert.de Git - usb-driver/blob - jtagkey.c
9891f4b70302d77a43283db5dbbcf16de3c2454d
3 #include "usb-driver.h"
8 static struct ftdi_context ftdic
;
10 int jtagkey_init(unsigned short vid
, unsigned short pid
) {
14 if ((ret
= ftdi_init(&ftdic
)) != 0) {
15 fprintf(stderr
, "unable to initialise libftdi: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
19 if ((ret
= ftdi_usb_open(&ftdic
, vid
, pid
)) != 0) {
20 fprintf(stderr
, "unable to open ftdi device: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
24 if ((ret
= ftdi_usb_reset(&ftdic
)) != 0) {
25 fprintf(stderr
, "unable reset device: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
29 if ((ret
= ftdi_set_interface(&ftdic
, INTERFACE_A
)) != 0) {
30 fprintf(stderr
, "unable to set interface: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
35 if ((ret
= ftdi_write_data_set_chunksize(&ftdic
, 1)) != 0) {
36 fprintf(stderr
, "unable to set write chunksize: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
41 if ((ret
= ftdi_set_latency_timer(&ftdic
, 1)) != 0) {
42 fprintf(stderr
, "unable to set latency timer: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
46 if ((ret
= ftdi_set_baudrate(&ftdic
, 500000)) != 0) {
47 fprintf(stderr
, "unable to set baudrate: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
52 ftdi_write_data(&ftdic
, &c
, 1);
54 if ((ret
= ftdi_set_bitmode(&ftdic
, JTAGKEY_TCK
|JTAGKEY_TDI
|JTAGKEY_TMS
|JTAGKEY_OEn
, BITMODE_SYNCBB
)) != 0) {
55 fprintf(stderr
, "unable to enable bitbang mode: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
59 if ((ret
= ftdi_usb_purge_buffers(&ftdic
)) != 0) {
60 fprintf(stderr
, "unable to purge buffers: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
));
67 void jtagkey_close() {
68 ftdi_disable_bitbang(&ftdic
);
69 ftdi_usb_close(&ftdic
);
73 void jtagkey_state(unsigned char data
) {
74 fprintf(stderr
,"Pins high: ");
76 if (data
& JTAGKEY_TCK
)
77 fprintf(stderr
,"TCK ");
79 if (data
& JTAGKEY_TDI
)
80 fprintf(stderr
,"TDI ");
82 if (data
& JTAGKEY_TDO
)
83 fprintf(stderr
,"TDO ");
85 if (data
& JTAGKEY_TMS
)
86 fprintf(stderr
,"TMS ");
88 if (data
& JTAGKEY_VREF
)
89 fprintf(stderr
,"VREF ");
94 int jtagkey_transfer(WD_TRANSFER
*tr
, int fd
, unsigned int request
, int ppbase
, int ecpbase
, int num
) {
100 static unsigned char last_data
= 0;
101 static unsigned char last_write
= 0x00;
102 static unsigned char writebuf
[USBBUFSIZE
], *writepos
= writebuf
;
103 static unsigned char readbuf
[USBBUFSIZE
], *readpos
;
104 unsigned char data
, prev_data
;
107 for (i
= 0; i
< num
; i
++)
108 if (tr
[i
].cmdTrans
== PP_READ
)
111 /* Write combining */
112 if ((writepos
-writebuf
> sizeof(writebuf
)-num
) || (nread
&& writepos
-writebuf
)) {
113 DPRINTF("writing %d bytes due to %d following reads in %d chunks or full buffer\n", writepos
-writebuf
, nread
, num
);
115 ftdi_write_data(&ftdic
, writebuf
, writepos
-writebuf
);
118 while (i
< writepos
-writebuf
) {
119 i
+= ftdi_read_data(&ftdic
, readbuf
, sizeof(readbuf
));
121 DPRINTF("read %d/%d bytes\n", i
, writepos
-writebuf
);
125 for (i
= 0; i
< num
; i
++) {
126 DPRINTF("dwPort: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n",
127 (unsigned long)tr
[i
].dwPort
, tr
[i
].cmdTrans
, tr
[i
].dwBytes
,
128 tr
[i
].fAutoinc
, tr
[i
].dwOptions
);
130 port
= (unsigned long)tr
[i
].dwPort
;
131 val
= tr
[i
].Data
.Byte
;
134 if (tr
[i
].cmdTrans
== 13)
135 DPRINTF("write byte: %d\n", val
);
138 /* Pad writebuf for read-commands in stream */
139 *writepos
= last_data
;
140 prev_data
= last_data
;
142 if (port
== ppbase
+ PP_DATA
) {
143 DPRINTF("data port\n");
146 switch(tr
[i
].cmdTrans
) {
148 ret
= 0; /* We don't support reading of the data port */
190 fprintf(stderr
,"!!!Unsupported TRANSFER command: %lu!!!\n", tr
[i
].cmdTrans
);
196 if (nread
|| (*writepos
!= prev_data
))
202 DPRINTF("writing %d bytes\n", writepos
-writebuf
);
203 ftdi_write_data(&ftdic
, writebuf
, writepos
-writebuf
);
204 DPRINTF("reading %d bytes\n", writepos
-writebuf
);
207 while (i
< writepos
-writebuf
) {
208 i
+= ftdi_read_data(&ftdic
, readbuf
, sizeof(readbuf
));
210 DPRINTF("read %d bytes\n", i
);
214 hexdump(writebuf
, writepos
-writebuf
);
227 for (i
= 0; i
< num
; i
++) {
228 DPRINTF("dwPort: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n",
229 (unsigned long)tr
[i
].dwPort
, tr
[i
].cmdTrans
, tr
[i
].dwBytes
,
230 tr
[i
].fAutoinc
, tr
[i
].dwOptions
);
232 port
= (unsigned long)tr
[i
].dwPort
;
233 val
= tr
[i
].Data
.Byte
;
236 if (port
== ppbase
+ PP_DATA
) {
237 if (tr
[i
].cmdTrans
== PP_WRITE
) {
240 } else if (port
== ppbase
+ PP_STATUS
) {
241 DPRINTF("status port (last write: 0x%x)\n", last_write
);
242 switch(tr
[i
].cmdTrans
) {
246 DPRINTF("READ: 0x%x\n", data
);
251 if ((data
& JTAGKEY_TDO
) && (last_write
& PP_PROG
))
254 if (!(last_write
& PP_PROG
))
257 if (last_write
& 0x40)
264 ret
= 0; /* Status Port is readonly */
268 fprintf(stderr
,"!!!Unsupported TRANSFER command: %lu!!!\n", tr
[i
].cmdTrans
);
276 tr
[i
].Data
.Byte
= val
;
278 DPRINTF("dwPortReturn: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n",
279 (unsigned long)tr
[i
].dwPort
, tr
[i
].cmdTrans
, tr
[i
].dwBytes
,
280 tr
[i
].fAutoinc
, tr
[i
].dwOptions
);
282 if (tr
[i
].cmdTrans
== 10)
283 DPRINTF("read byte: %d\n", tr
[i
].Data
.Byte
);