» »

Rate limit ali kako moderno USB misko priklopiti na star 16 bitni racunalnik

Rate limit ali kako moderno USB misko priklopiti na star 16 bitni racunalnik

BigWhale ::

Crosspost iz FB skupine Slovenski Developerji. No, da vidmo, mal se bom razpisal. :) Tole je stvar s katero se zadnje case igram: Atari ST / Amiga mouse project. Oziroma po domace: dejmo stlacit RPi v Atarija/Amigo in emulirat en kup hardware-a za native platformo, ker emulacija cele masine je prevec enostavna in trivialna. In to ze vsi delajo + obstojece emulacije misk pokrivajo samo stare PS/2 misi + Atari in Amiga miski sta sranje. :D

Mis je na teh racunalnikih delovala sila preprosto. Dva signala za vsako os in en signal za vsak gumb. Gumba nista problem. Problem emulirat premikanje misi. Ozroma, problem je to narest tako, da je uporabno. Tole so omejitve:

- Atari zazna premik misi, ko pride do spremembe signala na pinih XA in XB, se pravi, ko signala prideta iz LOW v HIGH state ali obratno. Glede na to kateri signal flipne prvi, se ugotavlja smer.

- Atari ima maximum rate pri katerem se zaznava spremembe (to lahko fiksiramo nekje na 300Hz, izmerjen rate na atarijevi miski).

- Uporabljamo USB misko in DPIja misi ne vemo.

- USB (/dev/input/mice) bruha ven podatke z nekajkrat vecjim rate-om.

- Podatki so trije byti, x, y, gumbi in pri x/y gre za signed byte, ki pove vrednost premika miske. Ce misko premikas pocasi, so vse vrednosti 1 oz -1.

- Signala XA in XB sta vedno zamaknjena za polovico casa

Koncna resitev mora znati:

- rate limit (v prvi fazi je ze nek cist foolproof divider in enostavno polovico (prej tri cetrt) prebranih vrednosti iz USBja vrzes stran)

- mouse acceleration, glede na vrednost X/Y, ki pride iz USBja.

- dinamicno generiranje pulzev, razlicnih dolzin z razlicnim presledki

- hkratno obdelavo X in Y osi, while zanka in obravnava X/Y parametrov posebaj je sicer ok ampak privede do grdega premika miske pri vecjih vrednostih.

Torej, rabim en control bucket v katerega not kapljajo stvari, ven jim moram pa kontrolirano spuscat. Scenariji, ki jih je treba pokriti:

- mis se premika zelo pocasi: USB vraca ven zelo nizke vrednosti X/Y, rate limiter mora vedeti, da gre za pocasno premikanje in mora vecino vrednosti vrzt v smeti, drugace bo zabil input na Atariju.

- mis se premika hitreje: USB se vedno vraca pretezno nizke vrednosti X/Y vendar jih je vec in prihajajo veliko hitreje.

- mis se premika se hitreje: X/Y vrednosti so vecje, avtomatsko vemo, da gre za hitrejse premikanje iz samih vrednosti X/Y, v tem primerju je Atarijev input prakticno vedno popolnoma zabasan.

Evo, kako bi se lotili zadeve? Jaz imam narejenih ze nekaj prototipov, vsaj mal slabsi od drucga in noben ne dela cist tko kot bi moral.

V bistvu ne rabim rate limiterja, rabim scaler. :D

jype ::

https://docs.scipy.org/doc/scipy/refere... bi moral biti načeloma vse, kar potrebuješ za tako početje, ima pa atarijeva miš itak že od nekdaj tak "feel", da nič ne pomaga, če hitro premakneš, ker "acceleration" ne deluje.

BigWhale ::

Tist je overkill, k se ga ne nuca. :>

https://github.com/BigWhale/STuffEmu

Evo, USB mouse in USB joystick za Atari ST. :)

Brane3 ::

USB mouse ponavadi lahko zdresiraš, da dela s PS/2, samo priklopiti jo moraš na ustrezen način.

Tisto je potem najbrž lažje obdelati. Sploh ker se ne Atari ne Amiga ne sekirata za sample rate, saj imajo vsi ti strojčki direkt vhod za kvadraturo ( se pravi, na en pin pride signal z ene diode, na drugega pa z diode, ki jje za pol zoba zamaknjena).

Druga rešitev bi bil nek mikrokontroler, ki lahko fura USB host ali OTG. Ta potem sempla miško in generira kvadraturo iz tega.

Tretja rešitev bi bila mogoče:

Za ST predelava programa v keyboard controllerju (HD neki) za ST ali pa predelava driverja za Amigo.

Zgodovina sprememb…

  • spremenilo: Brane3 ()

Brane3 ::

Kar se opisane USB rešitve tiče, kje je problem ?

Recimo, da se omejiš na recimo 250 Hz.

Preko USB ITG semplaš miško in v X,Y word vpisuješ dodajaš vsak novi odčitek za svojo os.

Ko pride 250Hz_INT, se za vsako os posebej odločiš ali je treba narediti korak naprej, nazaj ali nič.

Brane3 ::

BTW, kar se ST-ja tiče, imaš projekt norega nemca, ki je celega STja stlačil na relativno poceni FPGA, in to vse.

CPU,MMU,mislim da blitter, flopi kontroler itd. Celo mašino, ki špila mislim da clock perfect.

V nasprotju z ostalimi se ni grebel za višji performans, hotel je samo 1:1 kopijo.

Drugi so šli v nextgen stroje.

Amigaši imajo baje precj kompletno platformo z neobstoječo MC68050, na QL-u je baje nastalo nekaj podobnega itd.
"Baje" zato ker Peter Graf nikoli ni stvari pripeljal do konca toliko, da bi jo razkril.

Pa ST team dela tudi na nečem podobnem.

BigWhale ::

USB miska, ki dela na USB HID ne zna delat s PS/2 protokolom. Imas pa stare USB miske, ki pa v bistvu govorijo PS/2 ampak dandanes so redke.

Problem, ki sem ga imel je bil bolj zaradi samo delnega poznavanja arhitekture. In kako tocno deluje mis. Ko sem to zgruntal, je bil problem samo kodo lepo skupaj zlozit. :) Sedaj imam delujoco resitev, ki zna emulirati mis in joystick. Vsekakor je RPi overkill ampak lahko sluzi za vec reci. V koncni fazi bi rad imel RPi Zero, ki bo sluzil kot emulator za mis in joystick, hkrati se bo pa obnasal se kot USB drive in bo priklopljen direktno na GOTEK floppy emulator. Vse skupaj lahko potem zaprem v STja in popolnoma skrijem. Napajanje pa lahko vlece iz Atarijevega napajalnika.

Drugace imas PICe, ki sluzijo kot USB HID stack ampak je stvar precej bolj nerodna za uporabo. :D

Brane3 ::

Ne, mnoge USB miške preklopijo na PS/2 protokol, če jih preko "adapterja" ( samo dva konektorja in štiri žičke) priklopiš na PS/2.

Ravno tako tudi mnoge USB tipkovnice.

BigWhale je izjavil:

USB miska, ki dela na USB HID ne zna delat s PS/2 protokolom. Imas pa stare USB miske, ki pa v bistvu govorijo PS/2 ampak dandanes so redke.

Problem, ki sem ga imel je bil bolj zaradi samo delnega poznavanja arhitekture. In kako tocno deluje mis. Ko sem to zgruntal, je bil problem samo kodo lepo skupaj zlozit. :) Sedaj imam delujoco resitev, ki zna emulirati mis in joystick. Vsekakor je RPi overkill ampak lahko sluzi za vec reci. V koncni fazi bi rad imel RPi Zero, ki bo sluzil kot emulator za mis in joystick, hkrati se bo pa obnasal se kot USB drive in bo priklopljen direktno na GOTEK floppy emulator. Vse skupaj lahko potem zaprem v STja in popolnoma skrijem. Napajanje pa lahko vlece iz Atarijevega napajalnika.

Drugace imas PICe, ki sluzijo kot USB HID stack ampak je stvar precej bolj nerodna za uporabo. :D


V bistvu mogoče niti tega ne rabiš, mogoče je dosti samo kernel modulček za 250 Hz interrupt in par drobnarij.

Z enim mouse driverjem zasedeš recimo miško, ki jo določiš in iz nje bereš pač pakete, ki pridejo in updateaš old_mouse_struct.

Z drugim kernel driverjem vpelješ 250Hz interrupt, ki pač bere ta struct in oddela kar je pač treba.

Zgodovina sprememb…

  • spremenilo: Brane3 ()

Brane3 ::

V bistvu mogoče niti tega ne rabiš.

V kernelu lahko določiš frekevenco interrupta za task scheduler.

Ta je bila včasih ponavadi 1kHz, pa se jo je dalo spreminjati glede na potrebe, sedaj pa je vsaj pri meni default tickless.

Lahko pač mogoče izkoristiš ta int. Postaviš gana teh 1KHz, dodaš v listo svojo rutino in ji pač določiš, da se izvede na vsak četrti INT...

Brane3 ::

BTW, kolk bi blo zanimanja, če bi se lotili česa takega z FPGAjem ?

Brane3 ::

Zanimiva varianta bi bila tudi, če bi ti OS laufal native ( torej v tem primeru ARM) in bi imel možnost tako tudi poganjati programe.

Nato pa stvar postaviti na kaj v stilu RedPitaya STEM-a (ki ima Zynq) ali česa podbnega ali pa recimo tanov Libre Computerjev "Renegade Elite" ali kaj takega.

Koneckoncev kak ZynQ devboard ne bi bil butasta izbira. Cenovno bi moral biti dostopen, ima quadcore ARM, FPGA part za logiko, veliko I/O pa Linux laufa.

Brane3 ::

Brane3 ::

Še ena ideja:

Zakaj fizično emulirati ST ?

Mogoče bi bila bolj pametna fizična emulacija Mega izvedbe oziroma korespondečne Amige ( ločeno ohišje).

Takrat imaš lahko kakovostno mini tipkovnico in škatlo posebej...

BigWhale ::

Brane3 je izjavil:

Ne, mnoge USB miške preklopijo na PS/2 protokol, če jih preko "adapterja" ( samo dva konektorja in štiri žičke) priklopiš na PS/2.

Ravno tako tudi mnoge USB tipkovnice.


Ja, mogoce leta 2005. Sam ne vec dans. :) Ce mis/keyboard ne pride skupi z PS/2 adapterjem, potem lahk kr pozabis na kako PS/2 emulacijo. Ce je brezzicna pa se tolk prej.

Brane3 je izjavil:


V bistvu mogoče niti tega ne rabiš, mogoče je dosti samo kernel modulček za 250 Hz interrupt in par drobnarij.
Z enim mouse driverjem zasedeš recimo miško, ki jo določiš in iz nje bereš pač pakete, ki pridejo in updateaš old_mouse_struct.
Z drugim kernel driverjem vpelješ 250Hz interrupt, ki pač bere ta struct in oddela kar je pač treba.


No, to sem imel v mislih, ko sem rekel, da je ful velik nepotrebnega kompliciranja. :> En kup lotanja in programiranja vs. pognat en program na RPiju, zlotat mors pa en kabl s sestimi dratki, pa sest uporov mors dat vmes. :>

BigWhale ::

Brane3 je izjavil:

BTW, kolk bi blo zanimanja, če bi se lotili česa takega z FPGAjem ?


Men je fajn met staro masino doma, in neki jury-riggat gor. Emulirat celo zadevo na nekem modernem procesorju k je vec tisockrat hitrejsi s tisockrat vec rama in milijonkrat vec trdega diska, je pa brez veze. :D

https://jamesfriend.com.au/pce-js/atari...

To zna vsak. :>

Brane3 ::

Torej FPGA varianta ?

Če ne zgooglaš zadeve unga nemca, bom premetal svoje bookmarke...

BigWhale ::

Zdej mi stvar dela. :) Ne rabim nic vec. Drgac za Atari ST obstaja CosmosEx, k je disk emulator, floppy emulator, mouse emulator in keyboard emulator, vse v enem. Sam stane 160 EUR, vkljucuje RPi in se en kup enga cipovja ampak je pac overkill za vse skupi. Stane tolk k Atari na ebayu. :D

Brane3 ::

Kako si uredil zadeve ?

BigWhale ::

Sej sem dal zgoraj github link. :)

Zgruntat je blo treba kako tocn dela mis. Info na netu je bil pomanjkljiv in sem prehitro posiljal signale. Potem, ko sem izmeril, da RPi lahko bere mis samo vsakih 16ms in da dejansko nastane problem nekje drugje, ne zaradi USBja, sem sel gledat bolj podrobno kaj se dogaja na Atarijevi strani. Jaz sem imel info, da en pulz za misko pomeni dve menjavi stanj za vsak XA in XB pin. Torej, XA high, XB high, XA low, XB low. V resnici pa se vsaka menjava registrira in se steje kot premik misi. Pol je blo pa vse skupi sam se pisanje kode. Tist sem mel narjen pol v dveh urah. :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Tweakanje osveževanja USB mišk (strani: 1 2 3 4 5 )

Oddelek: Igre
224139105 (55048) BorutO
»

Miška reagira na klic z mobitela

Oddelek: Pomoč in nasveti
201936 (1247) trek@s
»

Pedala za narekovanje na COM port

Oddelek: Elektrotehnika in elektronika
161839 (1464) vuego
»

Mogočni mišek na pohodu (strani: 1 2 3 )

Oddelek: Novice / Ostale najave
10910806 (8354) Jaka83

Več podobnih tem