Sari la conținut
ELFORUM - Forumul electronistilor

Tastatura USB pentru Cobrra


roadrunner

Postări Recomandate

@BIZONUL66 @cloudy @aureli67 @nustiunimic

Am compilat un proiect de HID USB pentru atasarea unei tastaturi la CobRRA facuta pe genunchi, e scris in Verilog (trebuie sa scriu un un Wrapper VHDL ca s-o combin cu restul).

e scrisa foarte destept (am vazut codul cu ani in urma) autorul a facut un mic procesor de 4 biti care ruleaza microcod ca sa initializeze ENDpoint-ul din tastatura si sa faca poll la tastatura. (avea niste lucruri scrise un pic in ordinea gresita si dadea niste warning-uri dar le-am fixat)

Limitarea e ca lucreaza cu USB low speed (1.5Mbit/s) dar probabil ca majoritatea tastaturilor de 10$ sunt low speed, partea buna e ca nu e nevoie de PHY pentru USB merge direct din pini FPGA.

proiectul se original se alfla aici: https://github.com/nand2mario/usb_hid_host

O sa fac niste teste cu hardware-ul cand mai gasesc timp. 

RR

 

PS - O treaba care merita precizata e ca interfata asta prezinta 4 coduri de scan simultan din pachetul de date de la tastatura (adica poate citii 4 taste simultan) si asta ajuta enorm la imitarea unei tastaturi matrice (ca la Cobra) unde scrierea de la tatatura implica o gramada de shift si symbol-shift. 

RR

Editat de roadrunner
Link spre comentariu
  • Răspunsuri 22
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • roadrunner

    15

  • cloudy

    4

  • Ovidanie

    3

  • aureli67

    1

Top autori în acest subiect

Imagini postate

suuupppeerrr  🤩

asteptam , nu-i problema

inca o chestie

nu vad deloc proiectul de Cobra la tine pe blog

sunt 4 proiecte acolo , dar nu si asta de Cobra

da-ne un link direct spre acel proiect

mii de multumiri pentru timpul pierdut si eforturile depuse  🥰

Link spre comentariu

Trebuie sa curat un pic codul inainte sa-l pun public si sa rezov cateva buguri (unul enervant in video) o sa mai dureze un pic.(intre timp probabil ca o sa aiba si keyb pe USB)

Urmatoarea chestie e un PCB cu fpga in mijloc si VGA, HDMI, USB si nimc altceva (regulatoare si osc de clock) dar mai e cale lunga pana acolo...

am scris deja un wrapper de VHDL la parte asta de tastatura dar nu o unesc cu CobRRa pana nu o testata in izolare.

RR

 

Citat

mii de multumiri pentru timpul pierdut si eforturile depuse  

no problem, tot n-aveam ce face in pauza de masa. 

 

PS - cred ca partea cea mai interesanta (challenging) e sa testez daca merge. Nu pot sa simulez ca nu exista modele (la liber) pentru tastaturi USB (AI nu le poate scrie ca sunt prea multe layere de complexitate) osciloscop care sa-mi decodeze stream-ul de USB n-am. Tot ce pot sa fac e sa esantionez semnalele in FPGA in timp real (un fel de internal logic analyzer) 

asta e buna de intrebare la interviul de angajare....

RR

Editat de roadrunner
Link spre comentariu

nu e nevoie sa faci unul de mana ca stiu tool-urile de FPGA (au un IP core care trebuie numai configurat si instantiat) - in lumea AMD/Xilinx il cheama ILA (integrated logic analyzer) - isi trage datele capturate prin JTAG.

Problema e sa ai suficient block-ram sa poti captura ce vrei.

 

Cu ceva ani in urma (cam 10) era un tool separat chesta aia (ILA) se chema Chipscope si am dat pe el 1000$ acum e free integrat in tool-uri. (si-a scos banii in 5 zile ca numai 5 zile l-am folosit pana am prins bugu)

 

Ma uitam la un Pmod (care merge la placa mea) care are in afara de niste rezistente de bias si conectori un boost mic de la 3.3V la 5V ca sa alimenteze tastatura. (il crosetez eu de mana cumva ca sa fac experimente)

 

 

 

usb_host_pmod.jpg?raw=true

 

sunt 22R in serie cu liniile de USB si 15K pull down. si boost-ul ala de 3.3V /5V care-l sar si-i dau eu 5V de undeva de pe placa.

 

RR

 

Editat de roadrunner
Link spre comentariu

FPGA-ul cum incearca sa programeze END-pointul de date din tastatura ....se straduieste.

RR

 

usb.jpg

Editat de roadrunner
Link spre comentariu

Cred că o să fie destul de greu să faci debug pe comunicatia USB fara un analizor extern, dedicat.
Fac cei de la totalphase.com lucruri ok. Dar sunt scumpe.
Am avut ocazia să mă joc cu unul la un amic. Sunt foarte ok si hard si soft.
 

Link spre comentariu

cred ca merge si nu o sa trebuiasca sa fac debug la nivel de protocol USB. Ma uitam la osciloscop ca pate decoda LIN, CAN, I2C SPI, RS232 si cam atat. 

Oricum e suficient sa vad daca misca semnalele alea. Am sperat sa mearga tastatura cu 3.3V dar nu vrea o sa-i dau 5V extern ca mi-e lene sa caut unde 5V am pe placa. Si pun niste rez serie mai mari de 22R sa nu-mi parjeasca IO-urile de 3.3V cand le loveste cu 5V din tastatura (ca sigur o se se scurga prin clamp diodes de pe IO-uri in railul de 3.3V al placii FPGA)

RR 

Editat de roadrunner
Link spre comentariu
23 minutes ago, roadrunner said:

ca sigur o se se scurga prin clamp diodes

Am testat și eu, fără să vreau, rolul diodelor de protecție de pe IO-uri.
Am reușit chiar și 9v pe alimentarea uC-ului, prin rezistențele prin care vroiam să protejez IO-urile !
 

Editat de cloudy
Link spre comentariu

Partea misto e cand se deschid si nu mor ca-s mai trainice si curge tensiunea aia in tot rail-ul la care-s legate si mai omoara altceva pe placa (dar IO-ul ramane bun)

 

am dovedit USB-ul citeste de la tatatura merge brici. Ia-am dat 5V la tatatura si a luat-o fara probleme, dau din taste si vad starea unui registru de iesire de 8 bit (din cele 4) pe niste led-uri. 

Trebuie sa vad cand si cum vin scan codurile pe canalele astea 4 si daca scan codurile sunt la fel ca la tastaurile clasice. Caut documentatie pe net dar ma tem ca fiecare a facut-o altfel si a carpit-o in driver (in software)

Poate-i atasez un uart mic sa ma uit intr-un terminal serial ce dreaq vine pe tevile astea 4, si sa pun mai multe tastaturi sa vad daca-i la fel la ele (ca ma tot benoclez la niste leduri si ma intreb unde-i MSB-ul  ca sa-mi dau seama in Hex daca sunt scan codurile la fel.)

RR

Editat de roadrunner
Link spre comentariu
5 minutes ago, roadrunner said:

si vad starea unui registru de iesire de 8 bit (din cele 4) pe niste led-uri.

Am glumit mai sus cănd am zis de Analizor Logic cu Z80.
Totusi, de ce nu pui aceste valori in memoria RAM-video pe care oricum o afisezi pe VGA ?
 

Link spre comentariu

Proiectul asta cu USB keyboard e separat de CobRRa deocamdata ca sa pot simula (ca ala cu Cobra cam da simulatorul pe spate cu 64K initalizati cu cod si Z80 ruland)

Simulatorul asta din tool-urile de la Xilinx e free (vine cu tool-urile) si e departe de a fi perfect, a fost scris de un coleg de cubical (pe vremea cand lucram la Xilinx) inca mai tinem legatura e irish da s-a mutat in San Jose.

E mult mai usor de testat in izolare, cand sunt happy cu el si el cu mine il alipesc la CobRRa (si scot struto-camila aia cu PS2)

RR   

 

Tool-urile de la Altera vin cu modelsim (o versiune "soimii patriei") dar oricum mult mai de incredere.

RR

Editat de roadrunner
Link spre comentariu
Citat

Totusi, de ce nu pui aceste valori in memoria RAM-video pe care oricum o afisezi pe VGA ?

n-am raspuns la intrebarea asta asa ca raspund acum poate citeste vre-unul mai tanar si/sau deschis la minte.

 

Mie imi vin niste coduri de 8 biti (in 4 registrii separati ) scopul e sa vad ce vine (ideal in reprezentare hex ca e cea mai compacta) cum vine (adica in ce registrii) si cand vine si nu nu mai vine (cand ridici degetul de pe tasta, sau taste) - asta ca sa definim probelma de rezolvat.

 

Evident ca ma gandesc la solutia ce mai rapida ca sa obtin ce vreau.

 

1. Solutia propusa de tine - sa iau valorile acestor 4 bytes si sa le arunc in memoria video (alipind proiectul de fata la memoria RAM si controlorul video de la CobRRa) 

motivul pentru care nu folosesc metoda asta e ca as vedea niste pixeli care se aprind si se sting pe ecran. Ca sa vad valori hex trebuie sa convertesc valorile astea in HEX (text) si sa construiesc caracterele text pe ecran (cu un generator de caractere - ROM) si sa le scriu la niste adrese ciudate. (ca asa au ales aia de spectrum sa fie "destepti" la scrierea in memoria video)

deci o gramada de treaba ca sa vad 4 valori hex pe ecran. (nu mai zic ca trebuie sa fac si un fel de scroll sa vad pe o perioada mai mare de timp)

 

2. Solutia cu uart. DIn clock-ul de 12MHz ar USB-ului generez un baud rate de 9600bps si serializes cele 4 valori urmate de un x0D 0x0A -adica CR LF ca sa stiu unde incep si unde se temina pe ecran (adica sa fie pe randuri separate),  convertesc fiecare nibble de 4 bit in ascii (ma costa 8 LUT-uri de 4 intrari - adica nimic) si arata bine in terminal. Uart-ul cred ca nici nu trebuie sa-l scriu de mana cred ca e un block deja in tools. (evident clock-ul de 12MHz nu o sa-mi dea exact rata de baud dar e sub rata de eroare  acceptata) Maxim 100 de linii de cod cu rezultate spectaculoase in terminal.

 

3. M-am gandit si la o solutie ultra simpla sa fac un afisor de 4 bytes in hex pe 8 afisoare cu led cu 7 segmente (dar nu le gasesc pe unde le-am pus) - asta ar fi cea mai simpla in VHDL dar ar lua timp sa lipesc afisoarele (sau sa le pun pe bread board) 

 

RR

 

Editat de roadrunner
Link spre comentariu

La loc commanda. E destul de simplu am gasit standardul

key modifiers (SHIFT, CTRL etc.) sunt raportati de un registru separat. iar tastele apasate au niste reguli clare cum sunt prezentate. 

https://wiki.osdev.org/USB_Human_Interface_Devices

asta simplifica enorm translatarea in hardware in formatul tastaturii de Cobra/Sinclair.

 

pe mine ma interesa paragraful urmator (care face diferenta fata de PS2) totusi scan codurile sunt diferite. 

 

Keypress mechanism

USB keyboards send interrupts when a key is pressed or released, just like a PS/2 keyboard. However, unlike PS/2 keyboards, USB keyboard does not have the concept of "make" and "break" scancodes. When a user presses a key, the interrupt comes in with a scancode value in one of the keypress fields. When a key is released, the corresponding keypress field is returned zero in the next packet. To illustrate this more clearly and to illustrate why there are more than one keypress scancode field, let's look at the following examples. Assume the user pressed the "A" key, which is scancode 0x04. The returned interrupt packet would look like this:

00 00 04 00 00 00 00 00

Notice the modifier keys are zero, because the user isn't pressing any. The reserved field is also zero, as recommended by the USB HID spec. The first keypress field contains 0x04, which corresponds to the "A" key. Now, let's assume the user lets go of the "A" key. The packet sent would look like:

00 00 00 00 00 00 00 00

 

Deci trebuie sa ma uit la pachete succesive ca iau decizia ca s-a ridicat tasta respectiva sau s-a apasat. Easy peasy lemon squeezy.

 

am gasit si scan codurile si sunt diferite de PS2 

https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2

 

RR

Editat de roadrunner
Link spre comentariu
La 02.09.2024 la 15:27, roadrunner a spus:

Urmatoarea chestie e un PCB cu fpga in mijloc si VGA, HDMI, USB si nimc altceva (regulatoare si osc de clock) dar mai e cale lunga pana acolo...

 

Poate doua USB-uri? Unul pentru tastatura si celalalt pentru un stick? Sau poate un slot pentru un card microSD unde sa fie toate programele? 

Eventualele update-uri de soft pot fi incarcate in FPGA de pe stick-ul USB?

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări