]>
cvs.zerfleddert.de Git - usb-driver/blob - jtagkey.c
2be195451f13f2cbfa1aaa9c10ebd5666c420f8a
   3 #include "usb-driver.h" 
   6 #define USBBUFSIZE 4096 
   8 static struct ftdi_context ftdic
; 
   9 static unsigned int usb_maxlen 
= 0; 
  11 int jtagkey_init(unsigned short vid
, unsigned short pid
) { 
  15         if ((ret 
= ftdi_init(&ftdic
)) != 0) { 
  16                 fprintf(stderr
, "unable to initialise libftdi: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
)); 
  20         if ((ret 
= ftdi_usb_open(&ftdic
, vid
, pid
)) != 0) { 
  21                 fprintf(stderr
, "unable to open ftdi device: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
)); 
  25         if ((ret 
= ftdi_usb_reset(&ftdic
)) != 0) { 
  26                 fprintf(stderr
, "unable reset device: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
)); 
  30         if ((ret 
= ftdi_set_interface(&ftdic
, INTERFACE_A
)) != 0) { 
  31                 fprintf(stderr
, "unable to set interface: %d (%s)\n", ret
, ftdi_get_error_string(&ftdic
)); 
  36         if ((ret 
= ftdi_write_data_get_chunksize(&ftdic
, &usb_maxlen
))  != 0) { 
  37                 fprintf(stderr
, "unable to get 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_BITBANG
))  != 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                 unsigned char *pos 
= writebuf
; 
 115                 DPRINTF("writing %d bytes due to %d following reads in %d chunks or full buffer\n", writepos
-writebuf
, nread
, num
); 
 119                 while (pos 
< writepos
) { 
 120                         if (len 
> usb_maxlen
) 
 123                         DPRINTF("combined write of %d/%d\n",len
,writepos
-pos
); 
 124                         ftdi_write_data(&ftdic
, pos
, len
); 
 128                 DPRINTF("read %d/%d bytes\n", i
, writepos
-writebuf
); 
 132         for (i 
= 0; i 
< num
; i
++) { 
 133                 DPRINTF("dwPort: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n", 
 134                                 (unsigned long)tr
[i
].dwPort
, tr
[i
].cmdTrans
, tr
[i
].dwBytes
, 
 135                                 tr
[i
].fAutoinc
, tr
[i
].dwOptions
); 
 137                 port 
= (unsigned long)tr
[i
].dwPort
; 
 138                 val 
= tr
[i
].Data
.Byte
; 
 141                 if (tr
[i
].cmdTrans 
== 13) 
 142                         DPRINTF("write byte: %d\n", val
); 
 145                 /* Pad writebuf for read-commands in stream */ 
 146                 *writepos 
= last_data
; 
 147                 prev_data 
= last_data
; 
 149                 if (port 
== ppbase 
+ PP_DATA
) { 
 150                         DPRINTF("data port\n"); 
 153                         switch(tr
[i
].cmdTrans
) { 
 155                                         ret 
= 0; /* We don't support reading of the data port */ 
 197                                         fprintf(stderr
,"!!!Unsupported TRANSFER command: %lu!!!\n", tr
[i
].cmdTrans
); 
 203                 if (nread 
|| (*writepos 
!= prev_data
)) 
 209                 DPRINTF("writing %d bytes\n", writepos
-writebuf
); 
 210                 for (i
=0; i
<writepos
-writebuf
; i
++) { 
 211                         ftdi_write_data(&ftdic
, writebuf
+i
, 1); 
 212                         ftdi_read_pins(&ftdic
, readbuf
+i
); 
 217                 hexdump(writebuf
, writepos
-writebuf
); 
 230         for (i 
= 0; i 
< num
; i
++) { 
 231                 DPRINTF("dwPort: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n", 
 232                                 (unsigned long)tr
[i
].dwPort
, tr
[i
].cmdTrans
, tr
[i
].dwBytes
, 
 233                                 tr
[i
].fAutoinc
, tr
[i
].dwOptions
); 
 235                 port 
= (unsigned long)tr
[i
].dwPort
; 
 236                 val 
= tr
[i
].Data
.Byte
; 
 239                 if (port 
== ppbase 
+ PP_DATA
) { 
 240                         if (tr
[i
].cmdTrans 
== PP_WRITE
) { 
 243                 } else if (port 
== ppbase 
+ PP_STATUS
) { 
 244                         DPRINTF("status port (last write: 0x%x)\n", last_write
); 
 245                         switch(tr
[i
].cmdTrans
) { 
 249                                         DPRINTF("READ: 0x%x\n", data
); 
 254                                         if ((data 
& JTAGKEY_TDO
) && (last_write 
& PP_PROG
)) 
 257                                         if (!(last_write 
& PP_PROG
)) 
 260                                         if (last_write 
& 0x40) 
 267                                         ret 
= 0; /* Status Port is readonly */ 
 271                                         fprintf(stderr
,"!!!Unsupported TRANSFER command: %lu!!!\n", tr
[i
].cmdTrans
); 
 279                 tr
[i
].Data
.Byte 
= val
; 
 281                 DPRINTF("dwPortReturn: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n", 
 282                                 (unsigned long)tr
[i
].dwPort
, tr
[i
].cmdTrans
, tr
[i
].dwBytes
, 
 283                                 tr
[i
].fAutoinc
, tr
[i
].dwOptions
); 
 285                 if (tr
[i
].cmdTrans 
== 10) 
 286                         DPRINTF("read byte: %d\n", tr
[i
].Data
.Byte
);