Xilinx ISE 10.1 on OpenSuSE 10.3 x86_64

Xilinx ISE 10.1 works pretty well on my OpenSuSE 10.3/x86_64 on Intel’s Core2Quad processor. However, I couldn’t compile the included Platform Cable USB driver, so I couldn’t program my FPGA cards. There’s a possible solution (with a non-proprietary driver) on a wiki page in University of Heiderberg, but it was a little bit old and written in German.
Here’s my solution with the non-proprietary driver (the master site of the driver is written in English! I didn’t know…) I took yesterday:
[ Step 1: Things to be installed by YaST ]
– libusb-devel (a library to handle USB devices)
– fxload (something to load firmware on some USB devices, including the Xilinx cable)
[ Step 2: get driver stuff ]
– Checkout the driver by: wget ‘http://git.zerfleddert.de/cgi-bin/gitweb.cgi/usb-driver?a=snapshot;h=HEAD’
– Official documentation at http://www.rmdir.de/~michael/xilinx/.
[ Step 3: setup udev ]
– Confirm that Platform Cable USB’s firmware exists at: YOUR_ISE_HOME/bin/lin64/xusbdfwu.hex (it must be, if you have a valid ISE installation)
– Edit /etc/udev/rules.d/xusbdfwu.rules. You may want to write /usr/share/xusbdfwu.hex to ISE_HOME/bin/lin64/xusbdfwu.hex.
SYSFS{idVendor}==”03fd”, SYSFS{idProduct}==”0008″, NAME=”windrvr6″
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/xusbdfwu.hex -D $TEMPNODE”
BUS==”usb”, ACTION==”add”, SYSFS{idVendor}==”03fd”,SYSFS{idProduct}==”000b”, RUN+=”/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $TEMPNODE”
BUS==”usb”, ACTION==”add”, SYSFS{idVendor}==”03fd”,SYSFS{idProduct}==”000d”, RUN+=”/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $TEMPNODE”
BUS==”usb”, ACTION==”add”, SYSFS{idVendor}==”03fd”,SYSFS{idProduct}==”000f”, RUN+=”/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $TEMPNODE”
ACTION==”add”, BUS==”usb”, SYSFS{idVendor}==”03fd”, MODE=”666″
– Restart udev, or reboot the Linux box to load the firmware. Once the firmware is loaded successfully, the status LED of the cable will light.
[ Step 3: build the driver ]
– Extract the driver you got from gitweb in step 2.
– just do: cd usb-driver; make lib, and you’ll get libusb-driver.so. This library emulates the driver (I don’t know how, but this is really great…). If you’re running 32bit Linux, you may have to run “make lib32” instead, but I’m not sure.
– Copy libusb-driver.so to anywhere you like.
[ Step 4: hack iMPACT to use the driver ]
– cd to YOUR_ISE_HOME/bin/lin64
– mv _impact _impact.bin
– vi _impact
#!/bin/sh
LD_PRELOAD=/YOUR_PATH/TO/LIBUSB_DRIVER_DOT_SO/libusb-driver.so $0.bin $*
– chmod a+x _impact
And try to launch “impact”. Then you’ll get connected!
[ Appendix: problems currently I have ]
– iMPACT fails to detect the cable when iMPACT is launched from ISE.
– Once iMPACT have failed to connect, I have to reboot my Linux box 🙁

panic: No BIOS smap info from loader!

研究室の端末 PC はほとんどが hp 製品で、PentiumD 以降のプロセッサは EM64T なので、FreeBSD/amd64 を動かそうと思って準備している (いまは FreeBSD/i386 だが、diskless なので、親玉サーバでユーザ環境を作って DHCP の設定を変えるだけだ)。

ところが、最新の dx7400 を除くモデル (PentiumD な dc7600 や、Core2Duo な dx7300) では FreeBSD/i386 は起動するものの、FreeBSD/amd64 は kernel panic してしまう。

SMAP、というのはキムタクのあれではなくて、BIOS からもらえる System Memory mAP なのだが、これが hp のちょっと前の世代のマシンではうまく取得できないらしく、google で探すとかなりいろいろでてくるのだが、解決した気配はない。わかったことは、
– FreeBSD/i386 なら起動する、というマシンは loader prompt で smap コマンドを叩いても、何も出ない。つまり、FreeBSD/i386 でもちゃんと取得できていない (loader は同じみたいだしね)
– FreeBSD/amd64 がちゃんと起動するマシンは smap コマンドを叩くとちゃんとリストが出る
ということだ。

で、この panic を出しているのは
– sys/amd64/amd64/machdep.c の 898 行めで、loader が取得した値をそのまま使っている
– 対応するところは i386 だと、sys/i386/i386/machdep.c の 1751 行めあたりで、loader に頼らずに自力で取りにいっている
というわけだ。

さあて、どうするか。
私物の ThinkPad の SMAP table はこんな感じ。

SMAP type=01 base=00000000_00000000 len=00000000_0009d800
SMAP type=02 base=00000000_0009d800 len=00000000_00002800
SMAP type=02 base=00000000_000d2000 len=00000000_00002000
SMAP type=02 base=00000000_000e0000 len=00000000_00020000
SMAP type=01 base=00000000_00100000 len=00000000_bf5b0000
SMAP type=03 base=00000000_bf6b0000 len=00000000_0001c000
SMAP type=04 base=00000000_bf6cc000 len=00000000_00034000
SMAP type=02 base=00000000_bf700000 len=00000000_00100000
SMAP type=02 base=00000000_bf800000 len=00000000_00800000
SMAP type=02 base=00000000_f0000000 len=00000000_04000000
SMAP type=02 base=00000000_fec00000 len=00000000_00010000
SMAP type=02 base=00000000_fed00000 len=00000000_00000400
SMAP type=02 base=00000000_fed14000 len=00000000_00004000
SMAP type=02 base=00000000_fed18000 len=00000000_00001000
SMAP type=02 base=00000000_fed19000 len=00000000_00001000
SMAP type=02 base=00000000_fed1c000 len=00000000_00004000
SMAP type=02 base=00000000_fed20000 len=00000000_00070000
SMAP type=02 base=00000000_fee00000 len=00000000_00001000
SMAP type=02 base=00000000_ff000000 len=00000000_01000000
SMAP type=01 base=00000001_00000000 len=00000000_3c000000

http://www.uruk.org/orig-grub/mem64mb.html に、int 15h:e820h の説明がある。
Linux を dx7300 で起動してみると、

BIOS-provided physical RAM map:
BIOS-e820: 00000000_00000000 - 00000000_0009fc00 (usable)
BIOS-e820: 00000000_0009fc00 - 00000000_000a0000 (reserved)
BIOS-e820: 00000000_000e8000 - 00000000_00100000 (reserved)
BIOS-e820: 00000000_00100000 - 00000000_7efb1d00 (usable)
BIOS-e820: 00000000_7efb1d00 - 00000000_7f000000 (reserved)
BIOS-e820: 00000000_f4000000 - 00000000_f8000000 (reserved)
BIOS-e820: 00000000_fec00000 - 00000000_fed40000 (reserved)
BIOS-e820: 00000000_fed45000 - 00000001_00000000 (reserved)

みたいにちゃんと SMAP が取れているので、loader を hack すればなんとかなるかな?

FreeBSDのサイトの当該エントリもある。