View Full Version : [c ] .. chiarimenti generici sul creare driver in generale
seymour.
06-01-2011, 23:45
Tempo fa affascinato dalla programmazione ho acquistato un libro sul c anche con la speranza di poter scrivere da solo i driver che mi mancavano con linux .... dopo averlo studiato ero capace di fare calcolatrici e programmi vari ma i driver per me sono sempre stati un mistero ...
cosa bisogna fare per creare un driver? bisogna conoscere l'hardware probabilmente ma come? smontandolo? esiste documentazione?
faccio un esempio ....tempo fa ho visto un filmato su come collegare un laser a una porta usb e mi sono chiesto ...' in che dannatissmo modo posso fare un programma che mi fa lampeggiare quel laser????????????' ....
so che la domanda è generica e abbastanza assurda ma ... :muro: aiuto XD
ps. nel regolamento di sezione si dice di specificare il compilatore , mi potreste spiegare il motivo?
seymour.
07-01-2011, 11:58
forse sono stato poco chiaro? XD ...... :mc:
se è così chiedetemi tutto
Premetto di non essere un esperto, comunque che io sappia esistono delle librerie che ti mettono a disposizione funzioni bell'e fatte (esempio (http://www.instructables.com/id/Tweet-a-Pot-Twitter-Enabled-Coffee-Pot/)).
Se invece è proprio il driver che vuoi scrivere, dai un'occhata qui (http://quequero.org/Il_Nostro_Primo_Driver), ma è un mondo per sadici! :D
seymour.
07-01-2011, 14:41
cavolo molto interessante questi due link :D sopratutto quello da sadici peccato che usino windows XD grazie mille
pabloski
07-01-2011, 16:39
La prima cosa da fare è separare la programmazione di un device driver in due blocchi.
Il primo riguarda l'interfaccia tra i driver e il sistema operativo e trovi un buon tutorial qui http://www.freesoftwaremagazine.com/articles/drivers_linux
Considera che il driver viene caricato/scaricato/riavviato dal sistema operativo e che tutte le sue funzionalità sono esposte tramite l'interfaccia del sistema operativo, quindi si capisce facilmente che devi sottostare a delle regole specifiche.
L'altra parte è ovviamente quella che riguarda come programmare l'hardware e lì dipende tutto dall'hardware. In generale si può dire che il tutto si riduce alla scrittura/lettura di valori da registri specifici della periferica e/o all'invio nella memoria della periferica di dati/programmi ( pensa agli shader delle schede video ).
Direi che la parte difficile è capire come la periferica s'interfaccia alla macchina ( una periferica usb pone problemi diversi da una pci express ), quali sono le sue procedure di inizializzazione e programmazione e spesso compaiono cose assurde come i timings, cioè inviati un dato al registro X e poi dopo tot millisecondi leggi dal registro Y.
Ovviamente queste informazioni le sa chi fa l'hardware e quindi o usi il reverse engineering per disassemblare i driver ufficiali e capire che fanno o il produttore è così gentile da rendere pubbliche le specifiche.
seymour.
07-01-2011, 21:41
aaa ecco inizio a capire .....
però scusa l'ignoranza ma le faccende riguardanti le porte usb oppure pci ecc non sono gestite già di base dal sistema operativo? devo comunque metterci le mani io??
(che brutta l'ignoranza)
pabloski
07-01-2011, 21:44
aaa ecco inizio a capire .....
però scusa l'ignoranza ma le faccende riguardanti le porte usb oppure pci ecc non sono gestite già di base dal sistema operativo? devo comunque metterci le mani io??
(che brutta l'ignoranza)
eh certo che sono gestite dal sistema operativo, ma una periferica pci express deve recuperare la sua configurazione dal bus pciex, lo stesso dicasi per una periferica usb
una periferica usb, ad esempio, deve capire su quale bus usb si trova, quindi configurarsi di conseguenza, oppure deve tramite plug&play settare l'irq, l'apertura in ram per l'i/o, ecc...
seymour.
07-01-2011, 21:51
e dimmi una cosa .. questo vale per qualsiasi periferica?
voglio dire una stampante usb ha bisogno di tutto questo, ma per una ventola usb la cui unica funzione è quella di girare alternativamente piano e veloce il discorso resta lo stesso?
(abbi pazienza forse sto capendo :D )
pabloski
07-01-2011, 21:57
e dimmi una cosa .. questo vale per qualsiasi periferica?
voglio dire una stampante usb ha bisogno di tutto questo, ma per una ventola usb la cui unica funzione è quella di girare alternativamente piano e veloce il discorso resta lo stesso?
(abbi pazienza forse sto capendo :D )
ovviamente, perchè la periferica appena collegata alla porta usb non sanno niente di sè stessa, di quali parti dello spazio d'indirizzamento deve usare, di quali irq allocare, ecc....
poi tieni presente che pure la programmazione cambia, perchè se devi inviare un byte al registro 0x4 della periferica non ci puoi arrivare direttamente come si fa ad esempio con l'altoparlante di sistema o il controller della tastiera, ma devi arrivarci tramite usb e quindi devi istruire il bus usb riguardo il trasferimento di dati ( ovviamente il sistema operativo in questo ti aiuta )
seymour.
07-01-2011, 22:06
grande :D ora l'ultima domanda e la più difficile ...
come faccio a imparare tutte queste cose? conosci qualche documento o qualche link oppure anche solo qualche parola chiave per iniziare la ricerca ..... qualsiasi cosa
pabloski
07-01-2011, 22:27
spassatela http://lwn.net/Kernel/LDD3/
però senza perdere troppo tempo ci sono delle guide sul wiki di osdev.org e osdever.net
ovviamente un libro è un libro e 18 capitoli sono difficile da riassumere in un paio di pagine
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.