View Full Version : [Assembler] USB?
grogdunn
07-04-2008, 19:43
salve,
qualcuno sa come comunicare tramite porta usb con assembler?
oppure in alternativa quei "adattatori" USB-Seriale vengono visti come porte seriali a tutti gli effetti? (perché in questo caso la cosa si semplifica :D)
per i curiosi mi serve per un progetto universitario... ma il mio primo problema è stato come diavolo ci comunico? io che non ho porte seriali??
poi costruirò la periferica e tutto il resto :D
uso win vista home premium a 32 bit se può essere utile...
khelidan1980
07-04-2008, 20:03
oppure in alternativa quei "adattatori" USB-Seriale vengono visti come porte seriali a tutti gli effetti? (perché in questo caso la cosa si semplifica :D)
Ho un amico che come lavoro installa e programma impianti antifurto e quindi centraline...credo ne abbiano comprati circa trenta di quegli adattatori prima di trovare uno che funzionasse bene! :asd:
Su Windows devi ad ogni costo passare dalle API di Windows. Sotto DOS non c'è lo stack USB.
Quindi l'assembler è la scelta peggiore per fare un programma del genere.
grogdunn
08-04-2008, 09:33
Su Windows devi ad ogni costo passare dalle API di Windows. Sotto DOS non c'è lo stack USB.
Quindi l'assembler è la scelta peggiore per fare un programma del genere.
eeee so... ma mi tocca usare assembler per il corso... quindi...
cmq proverò con i convertitori usb-seriale... sperando di non doverne comprare 30 :D (porto il portatile in negozio e provo finchè non viene riconosciuta come com1 (o 2 3 4))
khelidan1980
08-04-2008, 09:46
eeee so... ma mi tocca usare assembler per il corso... quindi...
cmq proverò con i convertitori usb-seriale... sperando di non doverne comprare 30 :D (porto il portatile in negozio e provo finchè non viene riconosciuta come com1 (o 2 3 4))
mi ha detto che quelli che funzionano meglio sono quelli che non hanno il filo di mezzo,hanno la porta usb collegata proprio fisicamente alla seriale! ;)
eeee so... ma mi tocca usare assembler per il corso... quindi...
cmq proverò con i convertitori usb-seriale... sperando di non doverne comprare 30 :D (porto il portatile in negozio e provo finchè non viene riconosciuta come com1 (o 2 3 4))
Sì, ma ripeto: sotto Windows devi usare le API e sotto DOS non hai lo stack usb e quindi nemmeno il driver per la porta seriale virtuale.
khelidan1980
08-04-2008, 09:55
Sì, ma ripeto: sotto Windows devi usare le API e sotto DOS non hai lo stack usb e quindi nemmeno il driver per la porta seriale virtuale.
quindi è impossibile accedere all'usb via assembly?
quindi è impossibile accedere all'usb via assembly?
Sì, tramite le API ;)
Oppure ti puoi scrivere uno stack usb per DOS :sofico:
Sì, tramite le API ;)
Tanto per intendersi, la stessa cosa avviene per le seriali. Non è possibile accedere alla seriale con le istruzioni IN/OUT o tramite interrupt.
cdimauro
08-04-2008, 12:51
Se è in DOS, può farlo. Anzi, è proprio quello si faceva (e ho fatto, sebbene in Turbo Pascal): accedere direttamente ai registri delle porte seriali, e installare l'hook per gestire il relativo interrupt.
variabilepippo
08-04-2008, 12:52
Tanto per intendersi, la stessa cosa avviene per le seriali. Non è possibile accedere alla seriale con le istruzioni IN/OUT
A meno di usare appositi driver (Inp-Out32, Virtual Serial Kit, WinIO, DriverLinx Port I/O, ...). ;)
A meno di usare appositi driver (Inp-Out32, Virtual Serial Kit, WinIO, DriverLinx Port I/O, ...). ;)
Sì, chiaro...ma se bisogna usare la CreateFile per accedere al driver (se non sbaglio GiveIO e WinIO funzionano così) tanto vale scriversi un paio di procedure per aprire la seriale (CreateFile) accedere in lettura (ReadFile) e scrittura (WriteFile) ;)
Se è in DOS, può farlo. Anzi, è proprio quello si faceva (e ho fatto, sebbene in Turbo Pascal): accedere direttamente ai registri delle porte seriali, e installare l'hook per gestire il relativo interrupt.
Sì, ma lui non ha un seriale. Ha un adattatore USB-seriale.
eeee so... ma mi tocca usare assembler per il corso... quindi... in tal caso usa il MASM; è possibile, ma non ti credere che userai le istruzioni IN e OUT perché su Windows NT chiamate a Ring3 non fanno altro che lanciare un'eccezione. semplicemente dovrai chiamare tramite assembly le API di Windows.
Se usi il C# e la
System.Port.Serialport integrata
puoi accedere alla seriale delle USB-Seriale come se fosse una seriale normale.
puoi accedere alla seriale delle USB-Seriale come se fosse una seriale normale.
Vorrei anche vedere che dopo tutto non si possa usare come una seriale normale ;)
Però a meno che non voglia richiamare .Net dall'assembly x86 :D
variabilepippo
08-04-2008, 15:58
ma se bisogna usare la CreateFile per accedere al driver (se non sbaglio GiveIO e WinIO funzionano così)
No, si accede in maniera "diretta" alle porte:
if (bResult)
{
// Under Windows NT/2000/XP, after calling InitializeWinIo,
// you can call _inp/_outp instead of using GetPortVal/SetPortVal
GetPortVal(0x378, &dwPortVal, 4);
SetPortVal(0x378, 10, 4);
unsigned char value;
printf("IoExample for PortTalk V2.0\nCopyright 2001 Craig Peacock\nhttp://www.beyondlogic.org\n");
OpenPortTalk();
outportb(0x378, 0xFF);
value = inportb(0x378);
printf("Value returned = 0x%02X \n",value);
outp(0x378, 0xAA);
value = inp(0x378);
printf("Value returned = 0x%02X \n",value);
ClosePortTalk();
...
In ogni caso io costruirei un mio wrapper sulle API di Windows in base alle specifiche esigenze. ;)
Sì ma OpenPortTalk() credo non faccia altro che chiamare una CreateFile ;)
Almeno GiveIO funziona così: prima bisogna chiamare una CreateFile e dopo si possono usare le istruzioni IN e OUT.
Edit: infatti:
PortTalk_Handle = CreateFile("\\\\.\\PortTalk",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
Sono tutti uguali questi cosi ;)
variabilepippo
08-04-2008, 16:09
Sono tutti uguali questi cosi
Sì, ma io vedevo il loro uso dall'ottica dell'utente finale, di solito è sufficiente attivare/disattivare la comunicazione con il driver e richiamare le funzioni di IN/OUT senza preoccuparsi di CreateFile/ReadFile/WriteFile (ci penseranno GiveIO&Co). ;)
Se usi il C# e la
System.Port.Serialport integrata
puoi accedere alla seriale delle USB-Seriale come se fosse una seriale normale. Cesare, ci sei? stiamo aspettando il predicozzo su Python :asd:
cdimauro
08-04-2008, 21:41
Ci sono, ma il topic parla di Assembly per cui, anche se è stato citato C#, mi astengo dall'intervenire. :Prrr:
salve,
qualcuno sa come comunicare tramite porta usb con assembler?
oppure in alternativa quei "adattatori" USB-Seriale vengono visti come porte seriali a tutti gli effetti? (perché in questo caso la cosa si semplifica :D)
Io mi ero appeso alla "Oppure..."
Poiche' so che almeno sotto C# quell'oppure vale, ho sparato la mia sul C#, quindi puoi appenderti con il Python anche questa volta :D
Poiche' le porte dalla USB non vengono viste come seriali COM1-4 ma (almeno quella che avevo io) come COM5+, non mi impelagherei in porte e assembly.
In realta' so per certo che funzionava tanto bene anche sotto C++, aprendo un file verso la COM5 e leggendovi/scrivendovi i dati, dato che quando l'avevo usata non c'era ancora la System.Port.SerialPort introdotta dal Framework 2.0
Pero' se non ricordo male funzionava bene sotto Win2000, ma non sotto WinXP. Boh?
SerialPort sp = new SerialPort("COM5",9600,Parity.None,8,1);
sp.WriteLine("D3BO");
string letto=sp.ReadLine();
sp.Close();
cdimauro
09-04-2008, 07:19
Poiche' le porte dalla USB non vengono viste come seriali COM1-4 ma (almeno quella che avevo io) come COM5+, non mi impelagherei in porte e assembly.
Esattamente: chissà dove saranno mappate nello spazio di I/O.
Esattamente: chissà dove saranno mappate nello spazio di I/O.
In teoria si dovrebbe poter vedere dalle proprietà sulla porta nella lista dell'hardware.
cdimauro
09-04-2008, 08:08
In DOS? Mi sa che si dovrà effettuare lo scan dei device PCI a caccia di quelli seriali (o USB), per poi andare a guardare quale spazio di I/O gli è stato assegnato, ed eventualmente quale IRQ.
No, in Windows. In DOS non credo nemmeno che ci sia qualche possibilità che possa funzionare.
cdimauro
09-04-2008, 09:20
Vabbé, in Windows di "workaround" ce ne sono. :)
Ma pensavo che l'utente in questione dovesse lavorare in DOS, per cui ho fornito quelle risposte. :p
Ma pensavo che l'utente in questione dovesse lavorare in DOS, per cui ho fornito quelle risposte. :p
Parla di Vista nel primo post :boh:
cdimauro
09-04-2008, 12:48
La droga, si sa, fa male... ma io non ne ho mai fatto uso. Il che è anche peggio. :muro: :muro: :muro:
Ho un amico che come lavoro installa e programma impianti antifurto e quindi centraline...credo ne abbiano comprati circa trenta di quegli adattatori prima di trovare uno che funzionasse bene! :asd:
confermo che non sono il massimo della vita quei cosi...
io ne avevo tre, di cui uno andava bene solo in windows, gli altri erano decenti anche con linux
in ogni caso, almeno in linux, una volta che li colleghi vengono visti come delle seriali normalissime. io ci collegavo un modem esterno e chiaramente non avendo più la seriale sul laptop dovevo usare quegli affari
hanno qualche problema con il controllo di flusso, io alla fine lo usavo software se ben ricordo perché quello hw funzionava male
nuovoUtente86
12-04-2008, 16:04
Tanto per intendersi, la stessa cosa avviene per le seriali. Non è possibile accedere alla seriale con le istruzioni IN/OUT o tramite interrupt.
Domanda terra terra....Come mai è imposibile accedere in modo nativo alla porta?In fondo i programmatori windows a basso livello avranno scritto delle funzioni per farlo..perchè scrivendo codice assembly,senza le API windows, non si può fare?
Perché entra in gioco il meccanismo di protezione della CPU che impedisce al codice utente di andare ad eseguire le istruzioni IN/OUT/INT/IRET.
nuovoUtente86
12-04-2008, 16:30
Perché entra in gioco il meccanismo di protezione della CPU che impedisce al codice utente di andare ad eseguire le istruzioni IN/OUT/INT/IRET.
capito!
Esiste qualche tipo di operazione sulle porte e quindi sulle periferiche che si puo fare in User-Mode?
capito!
Esiste qualche tipo di operazione sulle porte e quindi sulle periferiche che si puo fare in User-Mode?
Praticamente tutte le periferiche si accedono tramite in, out e int (ovviamente con il gate giusto). Ci sono però anche periferiche memory mapped (ci si accede quindi con MOV), di cui un esempio è la memoria video della testuale. Anche per queste essendo un sistema a memoria virtuale è comunque il SO a decidere quale hardware mappare nella memoria del processo e quale no ;)
nuovoUtente86
12-04-2008, 18:43
di cui un esempio è la memoria video della testuale.
scusa la mia ignoranza,ma cosa è?
Inoltre le funzioni outp() e bioscom() in che modo si interfacciano con la seriale?
Inoltre le funzioni outp() e bioscom() in che modo si interfacciano con la seriale?
in e out, ma funzionano solo per programmi a 16 bit, o meglio non so nemmeno se da Windows 2000 in poi funzionano ancora.
nuovoUtente86
12-04-2008, 19:20
in e out, ma funzionano solo per programmi a 16 bit, o meglio non so nemmeno se da Windows 2000 in poi funzionano ancora.
quindi sono system call di windows, non funzioni assembly?
nuovoUtente86
12-04-2008, 19:26
Sento o meglio leggo spesso della porta seriale abbinata alla programmazione assembly: è qualcosa usato solo a scopo didattico o solo su sistemi senza "bit modale" come mi pare sia il dos?
cdimauro
12-04-2008, 20:30
in e out, ma funzionano solo per programmi a 16 bit, o meglio non so nemmeno se da Windows 2000 in poi funzionano ancora.
Le In e Out di sicuro non funzionano da NT in poi, a meno di usare driver / librerie apposite.
Sento o meglio leggo spesso della porta seriale abbinata alla programmazione assembly: è qualcosa usato solo a scopo didattico o solo su sistemi senza "bit modale" come mi pare sia il dos?
L'assembly scordatelo: da anni si usano le API di Windows (eventualmente incapsulate in componenti per i vari linguaggi) per usare seriale e parallela.
Le In e Out di sicuro non funzionano da NT in poi, a meno di usare driver / librerie apposite.
Per i programmi a 16 bit non so sinceramente, magari vengono "virtualizzate" in qualche modo.
cdimauro
13-04-2008, 06:18
Per qualunque applicazione, sia essa a 16 o 32 bit (e 64 di recente :D), IN, OUT, INS, OUTS, CLI, STI e qualche altra istruzione vengono sempre "virtualizzate" da NT in poi.
Normalmente viene sollevata un'eccezione di priviledge violation o simile, ma usando opportuni driver è possibile utilizzare almeno le IN*/OUT*.
Intedevo "virtualizzate" le seriali.
Da quello che mi ricordo, saranno ormai 7 anni, vidi un programma a 16 bit per programmare PIC tramite seriale e sotto Windows 2000 funzionava.
cdimauro
13-04-2008, 15:07
Mumble. Onestamente è passato troppo tempo e non ricordo, ma è probabile sia così (e anche per la porta parallela).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.