Difference between revisions of "Xilinx ISE WebPACK"

From ArchWiki
Jump to: navigation, search
(Other useful links)
m
Line 73: Line 73:
 
http://www.jungo.com/st/download/WD920LN.tgz
 
http://www.jungo.com/st/download/WD920LN.tgz
  
  tar xzg WD920LN.tgz  
+
  tar xzf WD920LN.tgz  
  
 
yields a directory named WinDriver/ Within this directory you'll find:
 
yields a directory named WinDriver/ Within this directory you'll find:

Revision as of 00:47, 17 May 2008


Xilinx ISE WebPACK is a complete FPGA/CPLD programmable logic design suite providing:

  • specification of programmable logic, via schematic capture or verilog/VHDL
  • synthesis and fit of specified logic into Xilinx CoolRunner and Spartan devices
  • behavioral and post-fit simulation
  • download of configuration into target device via communications cable
  • support for Linux based development system host

The ISE WebPACK version is downloadable:

http://www.xilinx.com/support/download/index.htm

The download requires registration and licensing agreement, but there is no charge, i.e. it's free as in "Free Beer", but not free as in "Free Speech".

Make sure you select the Linux version.

There are a couple of very helpful HOWTO's at Gentoo:

http://gentoo-wiki.com/HOWTO_Xilinx#Installing_Cable_Driver_Kernel_Modules

http://gentoo-wiki.com/Talk:HOWTO_Xilinx/Archive_1

http://gentoo-wiki.com/HOWTO_Xilinx

and this is a Xilinx tip for usb install on Linux:

http://www.xilinx.com/support/answers/22648.htm

Some other useful links:

http://developer.petalogix.com/wiki/Other/XilinxOnLinux

http://www.itee.uq.edu.au/~listarch/microblaze-uclinux/archive/2007/03/msg00101.html

http://groups.google.com/group/comp.arch.fpga/msg/2dfa36541174a4f2

http://groups.google.com/group/comp.arch.fpga/browse_thread/thread/24884c2d0e90b97f

http://groups.google.com/group/comp.arch.fpga/browse_thread/thread/f149e5b6028e2c70/066766d9510e407a#066766d9510e407a

Once ready to download I used, and recommend, the "Download Files Individually" option, once you reach the download page. This downloads the entire installer and installation is performed afterward via:

tar xf webpack_SFD.tar
cd webpack
./setup

Xilinx only provides official support for redhat and suse distributions, but I found the initial install of ISE to go smoothly on archlinux with kernel-headers 2.6.24.3-1.

I first installed ISE WebPACK for Linux version 9.2i, but 10.1 was released shortly thereafter. I was pleased to see this updated version was available for linux at the same time as 10.1 for windoze.

After installation, ISE worked fine for design capture, synthesis and simulation. However once I reached the point of trying to download a design to a target device I ran into some trouble. Installing the cable drivers for talking to the target interface cable yielded errors.

I downloaded the standalone driver installation utility from:

ftp://ftp.xilinx.com/pub/utilities/fpga/install_drivers.tar.gz

This download yields a file named install_drivers.tar.gz

tar xzf install_drivers.tar.gz 

yields a directory named install_drivers/ When I attempted to build the drivers from this file I encountered the following errors:

linux_wrappers.c:48:31: error: linux/ioctl32.h: No such file or directory

and

linux_wrappers.c:1398: error: ‘struct scatterlist’ has no member named ‘page’

Reading in the Gentoo HOWTO's listed above led me to download the latest Jungo source code, which is the core of the Xilinix linux USB support. I modified the link after reading that the latest Jungo driver was 9.20. I got WinDriver 9.20 from:

http://www.jungo.com/st/download/WD920LN.tgz

tar xzf WD920LN.tgz 

yields a directory named WinDriver/ Within this directory you'll find:

ls WinDriver/redist/ 

configure*      linux_wrappers.c  makefile.in      wdreg*             wdusb_linux.c     windrvr_gcc_v3.a
linux_common.h  linux_wrappers.h  setup_inst_dir*  wdusb_interface.h  windrvr_gcc_v2.a  windrvr_gcc_v3_regparm.a

These are the same core files also found in:

ls install_drivers/linux_drivers/windriver32/windrvr/

config.cache    LINUX.2.6.24-ARCH.i386/  makefile         wdusb_interface.h  windrvr_gcc_v3_regparm.a
config.log      linux_common.h           makefile.in      wdusb_linux.c
config.status*  linux_wrappers.c         setup_inst_dir*  windrvr_gcc_v2.a
configure*      linux_wrappers.h         wdreg*           windrvr_gcc_v3.a

So I copied the 9.20 WinDriver files over those found in the install_drivers/ subdirectory:

cp -p WinDriver/redist/* install_drivers/linux_drivers/windriver32/windrvr/

This update to the Jungo driver eliminated the error: linux/ioctl32.h: No such file or directory, but the error: ‘struct scatterlist’ has no member named ‘page’ was still persisting.

After research regarding changes to scatterlist.h lead to these discussions:

http://kerneltrap.org/Linux/SG_Chaining_Merged

Which describe changes in scatter/gather lists that were implemented in kernel 2.6.23 in Oct 2007.

I implemented the following:

cd install_drivers/linux_drivers/windriver32/windrvr/

and apply the patch indicated below to linux_wrappers.c:

124a125,127
> /* added to fix scatterlist without page compile bug -jea 2008-05-09 */
> // #include <linux/scatterlist.h>
>
1791c1794
<     sgl[0].page = pages[0];
---
>     sgl[0].page_link = (unsigned long)pages[0];
1798c1801
<             sgl[i].page = pages[i];
---
>             sgl[i].page_link = (unsigned long)pages[i];
1823c1826
<         void *va = page_address(sgl[i].page) + sgl[i].offset;
---
>         void *va = page_address((struct page *)sgl[i].page_link) + sgl[i].offset;
1954,1956c1957,1959
<         if (!PageReserved(sgl[i].page))
<             SetPageDirty(sgl[i].page);
<         page_cache_release(sgl[i].page);
---
>         if (!PageReserved((struct page *)sgl[i].page_link))
>             SetPageDirty((struct page *)sgl[i].page_link);
>         page_cache_release((struct page *)sgl[i].page_link);

or, viewed as a unified patch:

--- before/install_drivers/linux_drivers/windriver32/windrvr/linux_wrappers.c   2008-02-19 09:58:43.000000000  -0800
+++ after/install_drivers/linux_drivers/windriver32/windrvr/linux_wrappers.c    2008-05-15 20:02:23.000000000  -0700
@@ -122,6 +122,9 @@
     static struct pci_dev *pci_root_dev;
 #endif 

+/* added to fix scatterlist without page compile bug -jea 2008-05-09 */
+// #include <linux/scatterlist.h>
+
 typedef struct
 {
     struct page **pages;
@@ -1788,14 +1791,14 @@ 

     memset (sgl, 0, sizeof(struct scatterlist) * page_count);
     sgl[0].offset = ((unsigned long)buf) & (~PAGE_MASK);
-    sgl[0].page = pages[0];
+    sgl[0].page_link = (unsigned long)pages[0];
     if (page_count > 1)
     {
         sgl[0].length = PAGE_SIZE - sgl[0].offset;
         size -= sgl[0].length;
         for (i=1; i < page_count ; i++, size -= PAGE_SIZE)
         {
-            sgl[i].page = pages[i];
+            sgl[i].page_link = (unsigned long)pages[i];
             sgl[i].length = size < PAGE_SIZE ? size : PAGE_SIZE;
         }
     }
@@ -1820,7 +1823,7 @@
     for (i=0; i<*dma_sglen; i++)
     {
 #if defined(_CONFIG_SWIOTLB)
-        void *va = page_address(sgl[i].page) + sgl[i].offset;
+        void *va = page_address((struct page *)sgl[i].page_link) + sgl[i].offset;
         dma_addr_t dma_addr = virt_to_phys(va); 

         if (dma_addr & ~mask)
@@ -1951,9 +1954,9 @@
 #if defined(_CONFIG_SWIOTLB)
         pci_unmap_single(dev_handle, sg_dma_address(&sgl[i]), sg_dma_len(&sgl[i]), (int)dma_direction);
 #endif
-        if (!PageReserved(sgl[i].page))
-            SetPageDirty(sgl[i].page);
-        page_cache_release(sgl[i].page);
+        if (!PageReserved((struct page *)sgl[i].page_link))
+            SetPageDirty((struct page *)sgl[i].page_link);
+        page_cache_release((struct page *)sgl[i].page_link);
     }
     vfree(sgl);
 #elif defined(LINUX_24)

This corrected the compile errors in the Jungo USB driver and produced the windrvr6.ko kernel module. However there was still a nagging error in the compilation of install_drivers/linux_drivers/xpc4drvr2_6/xpc4drvr/

scripts/Makefile.build:46: *** CFLAGS was changed in "/home/johnea/src/before/install_drivers/linux_drivers/xpc4drvr2_6/xpc4drvr/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.
make[1]: *** [_module_/home/johnea/src/before/install_drivers/linux_drivers/xpc4drvr2_6/xpc4drvr] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.24-ARCH'
make: *** [default] Error 2

which was corrected by the following brutal hack to the Makefile:

diff before/install_drivers/linux_drivers/xpc4drvr2_6/xpc4drvr/Makefile  \ 
      after/install_drivers/linux_drivers/xpc4drvr2_6/xpc4drvr/Makefile

25c25
< ifeq ($(GET_USER_SIZE_SYM),0)
---
> #ifeq ($(GET_USER_SIZE_SYM),)
27c27
< endif
---
> #endif

This corrected all compilation errors, but the xpc4drvr.ko still yielded the following error in /var/log/everything.log whenever it was attempted to be loaded:

xpc4drvr: Unknown symbol get_user_size

However this did allow compilation of the entire driver tree and the install script was able to successfully install the drivers via:

cd install_drivers/
./install_drivers

There is also a udev rule entry that will make the driver accessible to all users after each reboot. (Which I haven't yet applied)

So after this brief modification, I am able to successfully run ISE on ArchLinux-2.6.24 with full USB cable support.

There is a GPL'd libusb based driver mentioned in the Gentoo HOWTO:

http://www.rmdir.de/~michael/xilinx/

that I was particularly interested in using. However while the source built without error, I continued to receive runtime errors when attempting to run it in ISE.

I never attempted to use the Xup driver.

There were quite a few pertinent facts along the way that I'm failing to capture here. Such as the fact that I discovered the same directory:

install_drivers/ 

in the base install of the entire ISE package under:

/opt/Xilinx/10.1/common/bin/lin/install_script/install_drivers/

I would expect that this procedure could be applied directly to that without the additional step of downloading the install_drivers.tar.gz but I haven't tried this.

Additionally, as a housekeeping note, the commands above expect all files to be downloaded and untared in the same working directory.

All in all this is the crux of what was necessary for me to get the USB support running on Arch.

Sorry for the somewhat fragmented description, but hopefully this allows others to get this great tool for linux users running on the post 2.6.23 kernels.

Happy Hardware Hacking!!!

android