Lo stato di ogni scheda (indirizzi I/O, IRQ, ...) è memorizzato in una struttura specifica del driver che viene passata (direttamente o indirettamente) a ogni punto di ingresso del driver che può in questo modo differenziare il carte. In questo modo lo stesso codice può controllare diverse carte (il che significa che sì, il kernel mantiene solo un'istanza del modulo di un driver, indipendentemente dal numero di dispositivi che controlla).
Ad esempio, dare un'occhiata a drivers/video/backlight/platform_lcd.c
, che è un driver di alimentazione LCD molto semplice. Contiene una struttura denominata platform_lcd
privata di questo file e memorizza lo stato dell'LCD (indipendentemente dal fatto che sia alimentato e che sia sospeso). Un'istanza di questa struttura è allocata nella funzione probe
del driver tramite kzalloc
, ovvero una per dispositivo LCD, e memorizzata nel dispositivo della piattaforma che rappresenta l'LCD utilizzando platform_set_drvdata
. L'esempio che è stato assegnato per questo dispositivo viene quindi recuperato indietro all'inizio di tutte le altre funzioni del driver in modo che sappia che esempio si sta lavorando:
struct platform_lcd *plcd = to_our_lcd(lcd);
to_our_lcd
espande a lcd_get_data
che si espande ad dev_get_drvdata
(a controparte di platform_set_drvdata) se si guarda include/linux/lcd.h
. La funzione può quindi sapere per quale stato è stato invocato lo stato del dispositivo.
Questo è un esempio molto semplice e il driver platform_lcd
non controlla direttamente alcun dispositivo (questo è rinviato a un puntatore di funzione nei dati della piattaforma), ma aggiunge parametri specifici dell'hardware (IRQ, base I/O, ecc. .) e ottieni come funziona il 99% dei driver in Linux.
Grazie mille, so come aggiungere più di uno stesso dispositivo nel kernel, basta aumentare l'ID di platform_device struct, 0,1,2 ecc., Ora il driver può rilevare bene questi dispositivi. – liunx
Per i dispositivi della piattaforma, sì - e puoi anche impostare l'id su -1 per specificare che ci può essere solo un'istanza del dispositivo nel sistema (Linux quindi ometterà l'ID quando stamperà il nome del dispositivo per riflettere quello). Tieni presente che i dispositivi piattaforma sono particolari e che altri bus potrebbero funzionare in un modo diverso, ad es. identificando i dispositivi tramite i loro indirizzi anziché un numero. – Gnurou
Buoni consigli, grazie ancora! – liunx