jueves, 22 de octubre de 2009

Karmic Koala: Spartan 3E Starter Kit y cable usb

El problema fue que al actualizar a Karmic Koala, me dejo de detectar la tarjeta. Que es lo que pasa cuando conectamos la Tarjeta a la PC:

1.- Cuando conectamos la tarjeta a un puerto USB, udev detecta el dispositivo.
2.- Ya que lo detecto el siguiente paso es que le actualize el firmware con fxload (según las reglas que tenga para dicho dispositivo, y se encuentran en el archivo /etc/udev/rules.d/xusbdfwu.rules).
3- Si tuvo exito se enciende un led de color verde que se encuentra a lado derecho del conector usb de la tarjeta y además al hacer lusb veremos que que el dispositivo lo identifica como 03fd:0008, en el caso contrarío veremos 03fd:000d.

¿Como solucionar este problema?

En caso de que hicieron una actualización de Jaunty a Karmic:

1.- Tienen que editar el archivo de reglas, que se encuentra en /etc/udev/rules.d

sudo gedit /etc/udev/rules.d/xusbdfwu.rules

Y reemplazar todos los $TEMPNODE por $tempnode

2.- Reinicar el servicio udev

sudo service udev restart o sudo /etc/init.d/udev restart

En caso de ser una instalación nueva:

0.- Requisitos: Tener instaldo el ISE Webpack y los paquetes fxload, libusb-dev y el build-essential.

sudo apt-get install fxload libusb-dev build-essential


1.- Suponiendo que ya tenemos instalado el ISE Webpack 11.1 (ó el 10.x), nos movemos al la ruta donde quedó instalado.

cd /ruta_instalación_Xilinx/11.1/ISE/bin/lin/ o cd /ruta_instalación_Xilinx/11.1/ISE/bin/lin64/

Ahí encontraremos los siguientes archivos

$ ls *.hex
xusbdfwu.hex xusb_emb.hex xusb_xlp.hex xusb_xp2.hex xusb_xpr.hex xusb_xse.hex xusb_xup.hex

Los cuales copiaremos a /usr/share

sudo cp xusb*.hex /usr/share/

2.- Enseguida editamos el archivo xusbdfwu.rules

gedit xusbdfwu.rules
# version 0003
SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0008", MODE="666"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xup.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_emb.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xlp.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0013", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xp2.hex -D $TEMPNODE"
BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0015", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xse.hex -D $TEMPNODE"


Cambiando $TEMPNODE por $tempnode, si lo dejan tan y como esta, no les va a funcionar. El contenido les debe de quedar algo como:

# version 0003 SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0008", MODE="666" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xup.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_emb.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xlp.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0013", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xp2.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0015", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xse.hex -D $tempnode"

3.- Ya que lo modificamos lo copiamos a /etc/

sudo cp xusbdfwu.rules /etc/udev/rules.d/

4.- reiniciamos el servicio udev

sudo service udev restart o sudo /etc/init.d/udev restart

5.- Ahora nos movemos al $HOME creamos una carpeta tmp

cd
mkdir tmp

cd tmp

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

Y descargamos de ahí el archivo usb-driver-HEAD.tar.gz en la carpeta que acabamos de crear

6.- estando en tmp descomprimimos el archivo y entramos al directorio recién creado y ejecutamos el make

tar -xvzf usb-driver-HEAD.tar.gz
cd usb-driver
make

7.- Lo anterior nos generará dos archivos, libusb-driver-DEBUG.so y libusb-driver.so los cuales copiaremos a /usr/lib/

sudo cp *.so /usr/lib/

8.- Ya podemos conectar nuestra tarjeta al la PC con el Karmic Kola y ver

$ lsusb | grep Xilinx Bus 001 Device 007: ID 03fd:0008 Xilinx, Inc.

en lugar del

$ lsusb | grep Xilinx
Bus 001 Device 007: ID 03fd:000d Xilinx, Inc.


Que al actualizar de versión me venía saliendo

En la versión 11.1 para que el impact use el libusb-driver.so en vez de los windrvr, ya no es necesario hacer lo de "export LD_PRELOAD=/ruta/libusb-driver.so" antes de ejecutarlo.


7 comentarios:

Unknown dijo...

Hola,

sabes si funciona tambien con una placa nexys2 de digilent,

Es que seguido tu tutorial y no consigo que me detecte la placa.

Gracias.

tskyW1lk dijo...

nexys2 usa otro protocolo diferente, pero econtré un programa que te puede ayudar:

http://plausible.org/andy/nexys2prog.tar.gz

Viene un README, aunque tenga la extención gz no esta comprimido

tar -xvf nexys2prog.tar.gz

En el README dice que
tienes que instalar el fxload y el libftdi1

sudo apt-get install fxload libftdi1,

Descargar el UrJTAG de http://urjtag.org

Compilarlo e Instalarlo,

Y para usarlo sería con
nexys2prog programa.bit

http://www.edaboard.com/ftopic345414.html

http://www.sensicomm.com/main/projects/fpga/digilent_nexys_usb.shtml

Mx dijo...

Hola, logré instalar todo y me funciona perfecto en linux, pero ahora en windows no funciona, tu sabes si puedo restaurarla de nuevo para que funcione en windows??

tskyW1lk dijo...

Mx no tengo ni la menor idea ya que no tengo una de esas tarjetas a la mano (supongo que es la tarjeta nexys2) supuestamente al momento que enciendes la tarjeta carga el firmware de una flash y lo que hace el proceso descrito en el post anterior es sólo cargar un firmware (de manera temporal) que trabaje en Linux, supuestamente no deberías tener problemas al usarlo en los dos SO.

cousteau dijo...

Mejor que copiar todos los archivos a /usr/share, es más limpio modificar el .rules y cambiar donde pone /usr/share a (Xilinx)/ISE/bin/lin (en mi caso, /opt/Xilinx/12.1/ISE_DS/ISE/bin/lin). Así todos los archivos propios de Xilinx quedan en la carpeta de instalación de Xilinx.

Unknown dijo...

Hola,

Tengo una spartan 3E, ubuntu 12.04 de 64 bits y no logro que el impact reconozca mi tarjeta, me sale el mensaje: "iMPACT:923 - Can not find cable, check cable setup !"

Si me pudieras ayudar te agradecería mucho

tskyW1lk dijo...

Que version de ISE usas y si es posible que procedimiento seguiste para instalarlo.

verifica con lusb para ver si te esta reconociendo la tarjeta.

Que informacion adicional muestra aparte de "IMPACT:923 - Can not find cable, check cable setup !"

En el caso que sea

Cable is LOCKED. Retrying...
The cable is being used by another application.
Please try opening the cable connection at a later time."

Desde la linea de comando ejecutas el impact con

impact -batch

Dentro desbloqueas el cable y sales

cleancablelock
exit

En caso de que no sea ese el problema, voy a buscar el procedimiento que me funciono, de hecho hice un PDF.

Saludos