Tak jsem se pustil do sepisování.
Začnu trochou omáčky okolo, třeba si v tom neznalý situace udělají trochu jasno a ty co tomu rozumí můžou přeskočit.
Mesa používá nekolik typu FPGA polí, kontrétně tuším Spartan II Spartan 3 a Spartan 6 a dalsi. Z toho plynou určitá omezení v použití vyvojového prostředi od Xilinxu a to takova, že verze vyssi nez 10.x neumí kompilovat firmware pro Spartan II. Naopak pro kompilaci firmw. novejsich karet je potreba pouzit verzi 11 a nahoru.
Zkoušel sem ruzné verze a nakonec se mi osvědčili 10.1 a 13.4. S nejnovější 14.7 sem mel problémy s 9 taky. V návodu popíšu obě, ale samozřejmě stačí instalovat ta pro vaší kartu.
Dál je asi potřeba vysvětlit zkratky v popisu firmware.
SS = Smart Serial
TP = Třífázové PWM
RS = Resolver
UA = UART
SV = servo
ST = stepgen
a další jako FA TW který sem ještě nezkoumal.
Takže vlastní soubory firmware pro MESA karty jsou v LINUXCNC uloženy v adresáři /lib/firmware/hm2/ nasledují podadresáře podle jména karty jako 5i22 4i65 7i43 atd. a vnich jsou ulozeny vsechyn potrebne soubory.
vlastni firmware v binarnim tvaru s koncovkou BIT
xml soubor pro PNCCONF, aby veděl co má kam nastrkat
a někdy i soubor PIN kde je popsáno co na kterým pinu hledat. Tenhle soubor neni na nic jinýho nez pro přehlednost, zadný system ho nepotrebuje.
Takže například soubor SVSS8_16_96.BIT říká že obsahuje 8xSV to znamená 8x encoder + 8x pwm a 16x SSerial (2x8) a ta 96 na konci znaci ze je to generovano pro karty, ktere maji 96 IO pinu. Například 5i22
Toto značení se bude hodit dál pro hledáni správneho souboru pro kompilaci.
Toliko kecy na uvod a přejdem k samotnému návodu.
Testoval jsme to na dvou strojích, jeden byl virtual ve vmware a druhej fyzicka mašina s kartou 5i22-1.5 na testováni hotovych výrobků. Na obou strojích beží debian wheezy
http://www.linuxcnc.org/linuxcnc-2.7-wheezy.iso" onclick="window.open(this.href);return false;
Jako první stáhneme git repozitář s vlasním softem
git clone git://git.linuxcnc.org/git/hostmot2-firmware.git" onclick="window.open(this.href);return false; ~/hostmot
v něm je vše potřebné
ted je potřeba nainstalovat vyvojové prostředí Xilinxu. Bacha ma to dohromady asi 10G
instalace 13.4
tady to jde stahnout
http://www.xilinx.com/support/download/ ... chive.html
přímo link na instalačku jak pro win tak pro Linux.
https://secure.xilinx.com/webreg/regist ... xd.3.0.tar
tar -xvf Xilinx_ISE_DS_13.4_O.87xd.3.0.tar
cd Xilinx_ISE_DS_13.4_O.87xd.3.0
sudo ./xsetup
pri instalaci vyberte pouze webpack. to je ta cast kterou potrebujem a je zadarmo. Je ale potreba se registrovat aby vam přišel licenční soubor.
Na konci instalace se to tuším ptá, kde je tento lic soubor uložen.
Parkrat se mi stalo, že soft pri kompilaci nejak zapomnel, ze sem mu daval cestu na licencni soubor a tvrdilo to, ze neni zalicencovano.
Pak je idealni soubor Xilinx.lic kterej vam prijde postou nakopirovat do adresare ~/.Xilinx Tam ho hleda jako prvni.
http://www.xilinx.com/getlicense
takhle se dá ověřit že instalace proběhla dobře
. /opt/Xilinx/13.4/ISE_DS/settings32.sh
ise
mělo by naskočit vývojové prostředí a když si kliknete na Help / About je vidět jestli je produkt registrován
následuje popis instalace starší verze 10.1
https://secure.xilinx.com/webreg/regist ... ISE_DS.tar
tar -xvf webpack_SFD_10.1.tar
cd webpack/
sudo ./setup
Tahle verze nechce licenční soubor ale vygenerovany klíč, který opět ziskáte na stránkach Xilinxu. Neptejte se mě ale na postup, to už si nepamatuju a nehodlám to dělat podruhé.
opět ověření funkčností
source /opt/Xilinx/10.1/ISE/settings32.sh
ise
help/about/regisstration ID:xxxxxxxxx
když máme obě vývojový prostředí je ještě potřeba nainstalovat GHDL
GHDL je VHDL simulátor používající GCC, přičemž VHDL je jazyk pro vývoj elektronických systémů. Říká internet
wget
http://ghdl.free.fr/site/uploads/Main/g ... latest.tar" onclick="window.open(this.href);return false;
tar -xvf ghdl-i686-linux-latest.tar
cd ghdl-0.29-i686-pc-linux/
tar -C / -jxvf ghdl-0.29-i686-pc-linux.tar.bz2
to nahrne vše potřebné někam do systému a můžem vesele kompilovat.
ted už se stačí jen přepnout do adresaře hostmot kam jsme nalili repozitář a tvořit.
vlastní kompilace se spustí příkazem
make
ale to by generovalo všechny předpřipravený firmwary a je to na nekolik hodin.
mnohem lepší je si vytvořit nový soubor firmwares-local.txt a do nej nahazet jen to co chceme kompilovat.
např.
i22_1500 4x7I65_96
i22_1500 SVSS8_16_96
kde první položka je jmeno karty a druhá položka názeb vhd souboru zacínajici PIN_xxxxx ale prave bez toho PIN s definicí toho co ma firmware obsahovat.
když spustíte přikaz
./build.py
vypíše to seznam dostupnych karet a seznam hotovych vhd souborů. neco jako
Available cards: i20 i22_1000 i22_1500 i23 i24 i25 i43_200 i43_400 i65
i68 i80db16 i80db25 i80hd16 i80hd25 i90epp i90spi x20_1000
x20_1500 x20_2000
Available pinouts: 24XQCTRONLY_72 2X7I65_72 2X7I65_7I44_72
3x7I65_1x7I44_96 4x7I65_96 7I65_7I44_72 7I74_7I76_34
7I74_7I77_34 7I74x2_34 7I74x4_68 7I76E_51 7I76P_7I76_34
7I76_34 7I76_7I74_34 7I76_7I78_34 7I76_7I85S_34 7I76_7I85_34
7I76x2R_34 7I76x2_34 7I76x2_7I74x2_68 7I76x2_7I77x2_68
7I76x2_biss_34 7I76x2_ssi_34 7I76x3_68 7I76x3_7I74_68 7I77E_51
7I77_72 7I77_7I74_34 7I77_7I74_34_toromatic 7I77_7I74_SSI_34
7I77_7I74_SSI_FANUC_34 7I77_7I76P_34 7I77_7I76_34 7I77_7I78_34
......
..........
.......
Do začátku je asi dobrý si najit co nejpodobnější vhd soubor tomu co potřebujete, zkopirovat si ho pod jine jmeno, upravit a pak kompilovat.
Na začátku vhd souboru je položka package a ta se musí jmenovat stejne jako soubor samotny bez koncovky. to samy je pak na konci souboru (end package)
doporučuju si projít nejaky vhd soubory a pochopit logiku skládaní
v podstate na začátku modulu se vyjmenujou jednotlivý komponenty s uvedenym poctem kusu a v dalsi sekci se pak nadefinuje, kde má která komponenta vyvody ven.
(WatchDogTag, x"00", ClockLowTag, x"01", WatchDogTimeAddr&PadT, WatchDogNumRegs, x"00", WatchDogMPBitMask),
(IOPortTag, x"00", ClockLowTag, x"03", PortAddr&PadT, IOPortNumRegs, x"00", IOPortMPBitMask),
(MuxedQcountTag, MQCRev, ClockLowTag, x"06", MuxedQcounterAddr&PadT, MuxedQCounterNumRegs, x"00", MuxedQCounterMPBitMask),
(MuxedQCountSelTag, x"00", ClockLowTag, x"01", NullAddr&PadT, x"00", x"00", x"00000000"),
(SSerialTag, x"00", ClockLowTag, x"01", SSerialCommandAddr&PadT, SSerialNumRegs, x"10", SSerialMPBitMask),
(LEDTag, x"00", ClockLowTag, x"01", LEDAddr&PadT,
.
.
.
.
.
IOPortTag & x"00" & PWMTag & PWMAOutPin, -- I/O 11
IOPortTag & x"00" & PWMTag & PWMBDirPin, -- I/O 12
IOPortTag & x"01" & PWMTag & PWMAOutPin, -- I/O 13
IOPortTag & x"01" & PWMTag & PWMBDirPin, -- I/O 14
IOPortTag & x"02" & PWMTag & PWMAOutPin, -- I/O 15
.
.
.
.
tohle asi nemá cenu popisovat do detailu, tim uz se musi kazdej prokousat sam.
Takže když to všechno uděláte správně a spustíte přikaz make, tak to bude tak 15 minut chroupat a nakonec z toho vylezou tři soubory popisovane na začátku.
jsou uloženy v podsložce fw/nazev karty
*.BIT
*.xml
*.PIN
a ty pak stačí nakopirovat do patřičného adresaře kde je linuxcnc hledá a je to.
cd fw/5i22-1.5/
cp * /lib/firmware/hm2/5i22-1.5/
Samozřejmě že záleží na velikosti vnitřní paměti fpga pole , takže třeba do 5i20 se toho moc nevejde. Zkoušel sem tam dostat SSerial plus nejaky stepgeny a nakonec sem musel skoro všechno vyhazet.
Během kompilace to píše jak je to velky a kolik to čeho žere, takže když to skončí errorem a napiše obsazenost 156% je jasny kde je chyba.
Takhle nejak to vypada.
Device Utilization Summary:
Slice Logic Utilization:
Number of Slice Registers: 7,045 out of 30,064 23%
Number used as Flip Flops: 7,045
Number used as Latches: 0
Number used as Latch-thrus: 0
Number used as AND/OR logics: 0
Number of Slice LUTs: 9,583 out of 15,032 63%
Number used as logic: 9,002 out of 15,032 59%
Number using O6 output only: 6,157
Number using O5 output only: 112
Number using O5 and O6: 2,733
Number used as ROM: 0
Number used as Memory: 530 out of 3,664 14%
Number used as Dual Port RAM: 412
Number using O6 output only: 64
Number using O5 output only: 2
Number using O5 and O6: 346
Number used as Single Port RAM: 0
Number used as Shift Register: 118
Number using O6 output only: 34
Number using O5 output only: 0
Number using O5 and O6: 84
Number used exclusively as route-thrus: 51
Number with same-slice register load: 41
Number with same-slice carry load: 10
Number with other load: 0
Slice Logic Distribution:
Number of occupied Slices: 3,096 out of 3,758 82%
Nummber of MUXCYs used: 3,332 out of 7,516 44%
Number of LUT Flip Flop pairs used: 10,284
Number with an unused Flip Flop: 4,530 out of 10,284 44%
Number with an unused LUT: 701 out of 10,284 6%
Number of fully used LUT-FF pairs: 5,053 out of 10,284 49%
Number of slice register sites lost
to control set restrictions: 0 out of 30,064 0%
Ještě poznámka na závěr. Celý to je ve stádiu vývoje a občas se něco dodělává, když budete chtít poslední verzi stačí v adresari hostmot spustit
git pull
a vse se dotahne na poslední verzi
evidentne jeste nemaj doladeny názvosloví, protože právě pro SSerial karty to pojmenovavá piny jinak než PNCCONF očekává, takže je z toho zmatenej.
Ale stačí ručně zeditovat soubor idrom_tools.vhd kde se nachazejí definice nazvu pro xml soubor
řádky začínající minusem nahradit těmy co začínají plusem. Puvodne tam byla definice jen pro 5 sserialu ja sem ji upravil a rozšířil na 8 kusu.
------------------------------- idrom_tools.vhd -------------------------------
- if(pin = SSerialTX0Pin) then return "Serial Transmit 0 (out)";
- elsif(pin = SSerialTX1Pin) then return "Serial Transmit 1 (out)";
- elsif(pin = SSerialTX2Pin) then return "Serial Transmit 2 (out)";
- elsif(pin = SSerialTX3Pin) then return "Serial Transmit 3 (out)";
- elsif(pin = SSerialTX4Pin) then return "Serial Transmit 4 (out)";
- elsif(pin = SSerialTX5Pin) then return "Serial Transmit 5 (out)";
- elsif(pin = SSerialTXEN0Pin) then return "Serial Transmit Enable 0 (in)";
- elsif(pin = SSerialTXEN1Pin) then return "Serial Transmit Enable 1 (in)";
- elsif(pin = SSerialTXEN2Pin) then return "Serial Transmit Enable 2 (in)";
- elsif(pin = SSerialTXEN3Pin) then return "Serial Transmit Enable 3 (in)";
- elsif(pin = SSerialTXEN4Pin) then return "Serial Transmit Enable 4 (in)";
- elsif(pin = SSerialTXEN5Pin) then return "Serial Transmit Enable 5 (in)";
- elsif(pin = SSerialRX0Pin) then return "Serial Receive 0 (in)";
- elsif(pin = SSerialRX1Pin) then return "Serial Receive 1 (in)";
- elsif(pin = SSerialRX2Pin) then return "Serial Receive 2 (in)";
- elsif(pin = SSerialRX3Pin) then return "Serial Receive 3 (in)";
- elsif(pin = SSerialRX4Pin) then return "Serial Receive 4 (in)";
- elsif(pin = SSerialRX5Pin) then return "Serial Receive 5 (in)";
+ if(pin = SSerialTX0Pin) then return "TXData1 (out)";
+ elsif(pin = SSerialTX1Pin) then return "TXData2 (out)";
+ elsif(pin = SSerialTX2Pin) then return "TXData3 (out)";
+ elsif(pin = SSerialTX3Pin) then return "TXData4 (out)";
+ elsif(pin = SSerialTX4Pin) then return "TXData5 (out)";
+ elsif(pin = SSerialTX5Pin) then return "TXData6 (out)";
+ elsif(pin = SSerialTX6Pin) then return "TXData7 (out)";
+ elsif(pin = SSerialTX7Pin) then return "TXData8 (out)";
+ elsif(pin = SSerialTXEN0Pin) then return "TXEn1 (in)";
+ elsif(pin = SSerialTXEN1Pin) then return "TXEn2 (in)";
+ elsif(pin = SSerialTXEN2Pin) then return "TXEn3 (in)";
+ elsif(pin = SSerialTXEN3Pin) then return "TXEn4 (in)";
+ elsif(pin = SSerialTXEN4Pin) then return "TXEn5 (in)";
+ elsif(pin = SSerialTXEN5Pin) then return "TXEn6 (in)";
+ elsif(pin = SSerialTXEN6Pin) then return "TXEn7 (in)";
+ elsif(pin = SSerialTXEN7Pin) then return "TXEn8 (in)";
+ elsif(pin = SSerialRX0Pin) then return "RXData1 (in)";
+ elsif(pin = SSerialRX1Pin) then return "RXData2 (in)";
+ elsif(pin = SSerialRX2Pin) then return "RXData3 (in)";
+ elsif(pin = SSerialRX3Pin) then return "RXData4 (in)";
+ elsif(pin = SSerialRX4Pin) then return "RXData5 (in)";
+ elsif(pin = SSerialRX5Pin) then return "RXData6 (in)";
+ elsif(pin = SSerialRX6Pin) then return "RXData7 (in)";
+ elsif(pin = SSerialRX7Pin) then return "RXData8 (in)";
To je celé.
Existuje i jina cesta, jako třeba použit přímo grafické vývojové prostředí v něm poupravit vhd soubory a generovat bit file, ale pak to negeneruje xml soubory. Tohle mi připadá elegantnější a jednodušší.
Víc mě ted nenapadá. Případně to můžu časem doplnit.
M