Sto provando a controllare (on/off) un regolatore di tensione che è mappato su un pin GPIO e alimenta un dispositivo esterno.
...
Qual è il modo corretto di interpretare la gpio: voce?
Sembra che tu stia facendo una domanda XY.
Prima la parte Y relativa al GPIO.
La voce DT gpio
si riferisce a un controllo di abilitazione/disabilitazione da parte del framework regolatore. È destinato all'uso esclusivo da parte del regolatore per controllare l'hardware del regolatore (esterno?). Non è inteso per il controllo software del regolatore esterno al framework dall'utente (come si sta tentando di fare).
Questa GPIO è definita come uscita in driver/regolatore/core.c:
static int regulator_ena_gpio_request(struct regulator_dev *rdev,
const struct regulator_config *config)
{
...
ret = gpio_request_one(config->ena_gpio,
GPIOF_DIR_OUT | config->ena_gpio_flags,
rdev_get_name(rdev));
...
}
Il perno GPIO non viene letto per "abilitazione controllo", ma ha il suo valore impostato nel regulator_ena_gpio_ctrl() per abilitare o disabilitare attivamente il regolatore (esterno).
L'inablità di esportare lo stesso pin GPIO utilizzando sysfs quando quel pin è anche dichiarato nella Struttura dei dispositivi è facilmente spiegabile. Una volta che il driver acquisisce il GPIO specificato per il suo utilizzo (tramite DT), non è più inutilizzato e non è più possibile esportarlo tramite Sysfs. I GPIO sono una risorsa gestita e devono essere allocati e liberati (da un driver o sysfs) come qualsiasi altra risorsa come la memoria. Se tu fossi in grado di esportare questo GPIO che era anche usato dal driver, allora saresti in grado di mettere il GPIO in uno stato che era incoerente con quello che stava facendo il driver. Ciò a sua volta porterebbe a un codice instabile o che agisce in modo scorretto.
In tal caso mi manca una mappatura tra un pin su cui voglio avere la tensione del regolatore.
Il pin GPIO specificato nella Struttura dispositivi è un'uscita logica (cioè digitale). Non è l'uscita del regolatore, che sarebbe un'uscita analogica.
È necessario consultare lo schema della scheda per confermare che questo GPIO è collegato a un ingresso di controllo di un regolatore.
Quanto alla parte X relativa abilitazione/disabilitazione del regolatore:
Controllo software dell'uscita del regolatore è documentato in Documentation/power/regulator/consumer.txt
Un driver consumatore può ottenere l'accesso al suo regolatore di alimentazione da chiamata: -
regulator = regulator_get(dev, "Vcc");
Un consumatore può consentire l'alimentazione chiamando: -
int regulator_enable(regulator);
un consumatore può disabilitare la propria offerta quando non servono più chiamando: -
int regulator_disable(regulator);
Il "consumatore" è un dispositivo elettronico che io s alimentato da un regolatore.
Apparentemente il framework previsto è il "consumer driver" proprietario e controlla il suo regolatore e non consente ad un'interfaccia esterna (ad esempio sysfs) di interferire con questo "driver del consumatore". Se si desidera mantenere il controllo di userland, è possibile implementare un'interfaccia ioctl() o sysfs nel "driver consumer" (per evitare conflitti/conflitti con il driver del regolatore).
Nel qual caso mi manca un modo per accendere e spegnere
Quello che stai veramente cercando sembra essere (strato superiore) gestione potere, e che ha il proprio framework, di cui i regolatori sono uno strato inferiore (che normalmente non è accessibile per il controllo dell'utente). Dovresti studiare Documentation/power/devices.txt.
La voce gpio DT dovrebbe essere presumibilmente abilitata tramite HW. Una volta che il driver acquisisce il GPIO specificato per il suo utilizzo, non è più inutilizzato e non è più possibile esportare quel GPIO tramite sysfs. Apparentemente stai cercando un abilitazione SW o CLI? Cerca un'istanza esistente di questo GPIO in sysfs che non è necessario esportare. Cerca un'abilitazione controllata da SW utilizzando una chiamata ** ioctl() ** nel driver. Il caso peggiore sarebbe connettere un altro GPIO a questa abilitazione HW ?. – sawdust
@sawdust 'Una volta che il driver acquisisce il GPIO specificato per il suo utilizzo 'Questo è quello che sto cercando di capire qual è la direttiva per raggiungere questo obiettivo. Le documentazioni sull'albero del dispositivo dicono 'gpio: gpio da utilizzare per il controllo di abilitazione', ma lo sto sperimentando come direttiva per mappare il regolatore con un pin GPIO. – TheMeaningfulEngineer
Si tratta di allocazione delle risorse. Proprio come la memoria viene allocata e liberata, così come i pin GPIO. Controlla il driver per questo regolatore. Probabilmente recupera la voce DT per il suo GPIO con una chiamata a ** of_get_gpio() ** o ** of_property_read_u32() **. Il valore viene in genere testato con ** gpio_is_valid() **, quindi viene assegnato con ** gpio_request() **. Quando esporti un GPIO usando sysfs, sysfs deve (provare a) acquisire il pin. Cosa c'è in sysfs per questo regolatore, ad es. sotto **/sys/class/regolatore **? – sawdust