Pirmiausia- disclaimer: nieko dar nesuprantu, todėl čia milionas klaidų. Šiaip tai užrašai, kad neužmirsčiau kaip dariau.
Darom naują folderį, jame naują uVision projektą: usbsoft, pasirenkam čipą. Pakeičiam projekto pavadinimą į USBIS.
Į naują folderį kopijuojam failus iš pavyzdinio projekto “bulkloop”:
fw.c – usb firmware.
dscr.a51 – usb įrenginio aprašymas.
folderį inc, kuriame yra: Fx2.h, fx2regs.h, fx2regs.inc, fx2sdly.h, syncdly.h. Šiaip jie visi nereikalingi, ir šiaip galima susikonfiguruoti, kad imtu iš inkludų bibliotekos. Tačiau dar nemoku.
folderį lib, kuriame yra: EZUSB.LIB, USBJmpTb.a51, USBJmpTb.OBJ (tas pats komentaras kaip ir su inc).
Kopijuojam failą “bulkloop.c” ir jį persivardinam kaip savo, sakysim “pimpis.c”.
Failą pimpis.c, fw.c, EZUSB.LIB, USBJmpTb.OBJ, dscr.a51 prikabinam prie projekto.
Kaip ir senesnėje žinutė modifikuojam projekto nustatymus (Options for Target ‘USBIS’): output->create hex, “BL51 Locate” nuimam varnelę, o grafoje “Code Range:” rašom “0×80-0×0FFF”, o “Xdata Range:” rašom “0×1000″.
Failuose “fw.c”, “pimpis.c” … reikia pataisyti nuorodą į inc folderį, nes pas mus jis biški kitaip stovi. Arba folderius iškelti aukščiau. Kol kas, kad nesigadinti, ir kad būtų pilnai “portable” pakeičiam:
#include "inc\fx2.h"
#include "inc\fx2regs.h"
#include "inc\syncdly.h"
Dabar viskas turėtu susikompiliuoti be klaidų ir ispėjimų. Pradedam modifikuoti “pimpis.c” kodą:
Mūsų pradinėm reikmėm yra dvi paprogramės:
Tai inicializacijos TD_Init(void) kurioje surašoma viską ką reikia inicializuoti įjungiant mašinėlę. O kita mums labiausiai dominanti funkcija- TD_Poll(void) kuri visada sukasi, kai tik būna laisvas procesoriukas.
Ten pavyzduke yra zonos kurios prasideda if(!(EP2468STAT & bmEP2EMPTY))… ir if(!(EP2468STAT & bmEP4EMPTY))… va jas pilnai perdarom į nepriklausomas:
if(!(EP2468STAT & bmEP2EMPTY)) { ... } // bulk endpoint 0x02
if(!(EP2468STAT & bmEP6FULL)) { ... } //bulk endpoint 0x86
if(!(EP2468STAT & bmEP4EMPTY)) { ... } //bulk endpoint 0x04
if(!(EP2468STAT & bmEP8FULL)) { ... } //bulk endpoint 0x88
Šios zonos iškviečiamos kai gaunamas užklausimas iš hosto kaip “Bulk in endpoint” ir “Bulk out endpoint” su atitinkamai numeriais. Tie patys endpoint aprašyti “dscr.a51” faile. Bet kol kas neliečiai nei VID/PID nei USB aprašymo.
Kitų paprogramių kol kas neliečiam. Dar į pimpis.c įmečiau kelis globalius kintamuosius, kad persinešinėti informaciją.
Programos veikimo principas toks, kad pagal išorines užklausas atliekam veiksmus su buferiais EP2, EP4, EP6 ir EP8. Dėmesio yra dvigubas buferizavinas, todėl nereikia stebėtis, kad kai kurie informacijos pokyčiai atsiranda “pavėluotai”, tik po antro užklausimo. Nugi dvigubas buferis.
Eksperimentinė programa daro tai:
Host rašymo užklausa 0x02 papračiausiai pasiima vieną baitą iš USB paketo ir paruošia buferį naujam darbui. Aš nesu tikras, ar tik nereikia du kartus pakartoti “rearm” komandos?
Host rašymo užklausa 0x04 irgi protingo nieko nedaro- bando nusiskaityti siustų duomenų ilgį ir šiaip skaičiuoja užklausų kiekį. Informacija pasideda į globalius kintamuosius.
Host skaitymo užklausa 0x86 paprasčiausiai kopijuoja tekstą į USB buferį ir jį persiunčia į hostą.
Host skaitymo užklausa 0x88 paprasčiausiai išspjauna “XXX” seriją, tik keli baitai pakeisti į įvairius seniau surinktus globalius kintamuosius.
Tai tik tiek. Bendravimas su hardware daromas su Cypress USB Control Center
Dabar galima pagal USB užklausas atlikti kokius nors primityvius paskaičiavimus. Tačiau tai softwarinis sprendimas, čia nėra atliekamas tiesioginis GPIO valdymas (Ports mode). Visgi tik antra- pirma pamokėlė. 🙂
Cypress FX2LP soft USB source code.