small ep mods for fx2, added xilprg patch to support bitbanging the fx2
authorhackbard <hackbard>
Sat, 7 Apr 2007 15:38:47 +0000 (15:38 +0000)
committerhackbard <hackbard>
Sat, 7 Apr 2007 15:38:47 +0000 (15:38 +0000)
fx2/cypress_fx2_xilprg.patch [new file with mode: 0644]
fx2/fx2.c

diff --git a/fx2/cypress_fx2_xilprg.patch b/fx2/cypress_fx2_xilprg.patch
new file mode 100644 (file)
index 0000000..96d9eab
--- /dev/null
@@ -0,0 +1,208 @@
+diff -Nur xilprg-0.5/makefile xilprg-new/makefile
+--- xilprg-0.5/makefile        2006-08-23 07:41:20.000000000 +0200
++++ xilprg-new/makefile        2007-04-07 17:09:16.000000000 +0200
+@@ -40,6 +40,7 @@
+       $(SRC_DIR)/prgfile.cpp \\r
+       $(SRC_DIR)/chip.cpp \\r
+       $(SRC_DIR)/parport.cpp \\r
++      $(SRC_DIR)/onbusb.cpp \\r
+       $(SRC_DIR)/cable.cpp \\r
+       $(SRC_DIR)/digilent.cpp \\r
+       $(SRC_DIR)/xilinx.cpp\r
+diff -Nur xilprg-0.5/src/cable.cpp xilprg-new/src/cable.cpp
+--- xilprg-0.5/src/cable.cpp   2006-08-23 07:38:34.000000000 +0200
++++ xilprg-new/src/cable.cpp   2007-04-07 17:20:55.000000000 +0200
+@@ -49,6 +49,7 @@
+ #include "chip.h"\r
+ #include "cmdline.h"\r
+ #include "digilent.h"\r
++#include "onbusb.h"\r
+ #include "parport.h"\r
\r
+ cable::cable()\r
+@@ -587,6 +588,9 @@
+     if (stricmp(argv[0], "dusb") == 0)\r
+         cbl = new digilent;\r
+     else\r
++    if (stricmp(argv[0], "ousb") ==0)\r
++      cbl = new onbusb;\r
++    else\r
+     {\r
+         msgf(STR_INVALID_CABLE_DEF);\r
+         return NULL;\r
+diff -Nur xilprg-0.5/src/onbusb.cpp xilprg-new/src/onbusb.cpp
+--- xilprg-0.5/src/onbusb.cpp  1970-01-01 01:00:00.000000000 +0100
++++ xilprg-new/src/onbusb.cpp  2007-04-07 17:15:34.000000000 +0200
+@@ -0,0 +1,113 @@
++/*\r
++ * onboard usb\r
++ *\r
++ * author: till & frank zirkelbach\r
++ *\r
++ */\r
++\r
++#include "xilprg.h"\r
++#include "utils.h"\r
++#include "onbusb.h"\r
++\r
++onbusb::onbusb()\r
++{\r
++   handle=NULL;\r
++}\r
++\r
++onbusb::~onbusb()\r
++{\r
++}\r
++\r
++int onbusb::open()\r
++{\r
++   \r
++    struct usb_bus *bus; \r
++\r
++    usb_init();\r
++    usb_find_busses();\r
++    usb_find_devices();\r
++\r
++    bus=usb_get_busses();\r
++    while(bus) {\r
++      dev=bus->devices;\r
++      while(dev) {\r
++              if(dev->descriptor.idVendor==USB_VENDOR_ID &&\r
++                 dev->descriptor.idProduct==USB_PRODUCT_ID)\r
++                      /* found the device */\r
++                      return 0;\r
++              dev=dev->next;\r
++      }\r
++      bus=bus->next;\r
++    }\r
++\r
++    return -1;\r
++\r
++    handle=usb_open(dev);\r
++    if(handle==NULL)\r
++      goto cleanup;\r
++\r
++    if(usb_set_configuration(handle,1)<0)\r
++      goto cleanup;\r
++\r
++    if(usb_claim_interface(handle,0)<0)\r
++      goto cleanup;\r
++\r
++    if(usb_set_altinterface(handle,1)<0)\r
++      goto cleanup;\r
++\r
++    data = 0x10;\r
++\r
++    reset_tap_state();\r
++\r
++    return 0;\r
++\r
++cleanup:\r
++\r
++    close();\r
++\r
++    return 1;\r
++\r
++}\r
++\r
++int onbusb::close()\r
++{\r
++\r
++    usb_close(handle);\r
++\r
++    return 0;\r
++}\r
++\r
++int onbusb::get_description(string& desc)\r
++{\r
++    char s[256];\r
++    sprintf(s, "onboard usb bitbanging");\r
++    desc = s;\r
++    return 0;\r
++}\r
++\r
++void onbusb::set_tdi(int bit)\r
++{\r
++    if (bit) data |= 0x04; else data &= ~0x04;\r
++    data|=0xa0;\r
++    usb_bulk_write(handle,0x01,&data,1,0);\r
++}\r
++\r
++void onbusb::set_tck(int bit)\r
++{\r
++    if (bit) data |= 0x10; else data &= ~0x10;\r
++    data|=0xa0;\r
++    usb_bulk_write(handle,0x01,&data,1,0);\r
++}\r
++\r
++void onbusb::set_tms(int bit)\r
++{\r
++    if (bit) data |= 0x08; else data &= ~0x08;\r
++    data|=0xa0;\r
++    usb_bulk_write(handle,0x01,&data,1,0);\r
++}\r
++\r
++int onbusb::get_tdo()\r
++{\r
++    usb_bulk_read(handle,0x81,&data,1,0);\r
++    return data & 0x01 ? 1 : 0;\r
++}\r
+diff -Nur xilprg-0.5/src/onbusb.h xilprg-new/src/onbusb.h
+--- xilprg-0.5/src/onbusb.h    1970-01-01 01:00:00.000000000 +0100
++++ xilprg-new/src/onbusb.h    2007-04-07 17:14:07.000000000 +0200
+@@ -0,0 +1,43 @@
++/*\r
++ * onboard usb\r
++ *\r
++ * author: till & frank zirkelbach\r
++ *\r
++ */\r
++\r
++#ifndef _ONBUSB_H_INCLUDED_\r
++#define _ONBUSB_H_INCLUDED_\r
++\r
++#include "cable.h"\r
++\r
++#include <usb.h>\r
++\r
++class onbusb : public cable\r
++{\r
++public:\r
++      onbusb();\r
++      virtual ~onbusb();\r
++\r
++    enum\r
++    {\r
++      USB_VENDOR_ID   = 0x04b4,\r
++      USB_PRODUCT_ID  = 0x8613\r
++    };\r
++\r
++    virtual int open();\r
++    virtual int close();\r
++\r
++    virtual int get_description(string&);\r
++\r
++    virtual void set_tdi(int);\r
++    virtual void set_tck(int);\r
++    virtual void set_tms(int);\r
++    virtual int get_tdo();\r
++\r
++protected:\r
++    char data;\r
++    struct usb_device *dev;\r
++    usb_dev_handle *handle;\r
++};\r
++\r
++#endif\r
+diff -Nur xilprg-0.5/src/strtable.cpp xilprg-new/src/strtable.cpp
+--- xilprg-0.5/src/strtable.cpp        2006-08-23 07:38:34.000000000 +0200
++++ xilprg-new/src/strtable.cpp        2007-04-07 16:56:25.000000000 +0200
+@@ -137,7 +137,7 @@
+     //STR_CMD_CABLE\r
+     "cable\0" \r
+     "Sets programmer cable\0"\r
+-    "cable {xil3 [ioaddr]|dusb}\0",\r
++    "cable {xil3 [ioaddr]|dusb|ousb}\0",\r
+     //STR_CMD_CHIPS\r
+     "chips\0"\r
+     "Prints supported devices\0" \r
index c52c81b..90e40e9 100644 (file)
--- a/fx2/fx2.c
+++ b/fx2/fx2.c
@@ -40,6 +40,8 @@ xdata at 0xe618 volatile u8 EP2FIFOCFG;
 xdata at 0xe619 volatile u8 EP4FIFOCFG;
 xdata at 0xe61a volatile u8 EP6FIFOCFG;
 xdata at 0xe61b volatile u8 EP8FIFOCFG;
+xdata at 0xe620 volatile u8 EP2AUTOINLENH;
+xdata at 0xe621 volatile u8 EP2AUTOINLENL;
 xdata at 0xe624 volatile u8 EP6AUTOINLENH;
 xdata at 0xe625 volatile u8 EP6AUTOINLENL;
 
@@ -64,6 +66,7 @@ void power_init() {
 
        /* configure pin 7 of port d as output */
        OED|=(1<<7);
+       SYNCDELAY;
 
 }
 
@@ -76,6 +79,8 @@ void toggle_power() {
        else
                IOD|=(1<<7);
 
+       SYNCDELAY;
+
 }
 
 void cpu_init() {
@@ -132,20 +137,19 @@ void slave_fifo_init() {
 
        /* endpoint configuration:
         *
-        * ep2: bulk in 4x512
-        * ep6: bulk out 4x512
+        * ep2: bulk out 4x512
+        * ep6: bulk in 4x512
         *
         * 0xa0 = 1 0 1 0 0 0 0 0 = bulk out 4x512
         * 0xe0 = 1 1 1 0 0 0 0 0 = bulk in 4x512
-        * 0x01 = 0 0 0 0 0 0 0 1 = invalid (bit,type,buf)
         */
        EP2CFG=0xa0;
        SYNCDELAY;
-       EP4CFG=0x01;
+       EP4CFG&=(~0x80);
        SYNCDELAY;
        EP6CFG=0xe0;
        SYNCDELAY;
-       EP8CFG=0x01;
+       EP8CFG&=(~0x80);
        SYNCDELAY;
 
        /* reset the fifo */