10

Sto provando a controllare (on/off) un regolatore di tensione che è mappato su un pin GPIO e alimenta un dispositivo esterno. L'albero dei dispositivi per il regolatore ha la seguente voce:Interpretazione di gpio: nella registrazione ad albero del dispositivo a regolatore fisso?

reg_usb1_vbus: usb1_vbus { 
     compatible = "regulator-fixed"; 
     regulator-name = "usb1_vbus"; 
     regulator-min-microvolt = <5000000>; 
     regulator-max-microvolt = <5000000>; 
     gpio = <&gpio3 28 0>; 
     enable-active-high; 
    }; 

Mentre leggevo the documentation mi sono confuso per esso afferma:

proprietà opzionali:

  • GPIO: GPIO da usare per abilitare il controllo

Tuttavia, non posso esportare l'interfaccia sysfs di quel GPIO e usarlo per controllare l'alimentazione (solo on/off) per il dispositivo esterno. Inoltre, se commento l'gpio = <&gpio3 28 0>; dall'albero del dispositivo, il dispositivo esterno non riceve alimentazione (quando non è commentato, il dispositivo è sempre alimentato).

il regolatore ha un'interfaccia sysfs esportato:

80090000.usb-vbus  power     suspend_standby_state 
device     state     type 
microvolts    subsystem    uevent 
name     suspend_disk_state 
num_users    suspend_mem_state 

, tuttavia, non mi può scrivere qualsiasi file.

Qual è il modo corretto di interpretare la voce gpio:?

  • GPIO da utilizzare per attivare il controllo

    Nel qual caso mi manca una mappatura tra un perno su cui voglio avere tensione del regolatore.

  • GPIO che avrà la tensione dal regolatore per alimentare qualche unità esterna

    Nel qual caso mi manca un modo per accendere e spegnere

+1

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

+0

@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

+0

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

risposta

6

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.

0

non sono estremamente familiare con il core del regolatore nel kernel, ma mi sembra che l'interfaccia del regolatore debba darvi accesso al GPIO in modo diverso rispetto al metodo GPIO di esportazione standad.

Non ho esaminato questo, ma è possibile che l'interfaccia del regolatore apra un dispositivo di carattere allo spazio utente per il controllo sul regolatore. (Non trattenerlo)

Vedo nella documentazione e nel codice sorgente del driver drivers/regulator/fixed.c che il GPIO non è un attributo DT obbligatorio. Potresti essere in grado di lasciarlo fuori dal DT, nel qual caso il Driver non acquisirà mai il tuo GPIO, quindi potrai controllarlo manualmente attraverso l'interfaccia GPIO di esportazione standard.

+0

* "Potrebbe essere possibile escluderlo dal DT ... quindi è possibile controllarlo manualmente tramite l'interfaccia GPIO di esportazione standard." * - Questo è illogico. Se non è specificato alcun numero GPIO nel driver, come fa il driver a sapere quale numero GPIO utilizzare? Un driver ben scritto (per la portabilità) non dovrebbe avere un numero GPIO codificato. Ti manca il punto di usare un albero dei dispositivi. – sawdust

+0

@sawdust C'è un motivo per cui il driver gli consente di essere opzionale. È perché non è necessario per il corretto funzionamento del regolatore. Non sarebbe hardcoded, semplicemente non sarebbe usato. Da drivers/regulator/fixed.c "of_get_named_gpio() non distingue tra una proprietà mancante (che andrebbe bene qui, dato che il GPIO è opzionale) e qualche altro errore." Il GPIO è utilizzato per un'abilitazione e, sebbene io sia d'accordo, un buon guidatore dovrebbe occuparsi di tutte le interfacce hardware con il regolatore, questo non richiede che sia così. – whh4000

+0

È anche possibile che per il regolatore particolare, il progettista abbia deciso che sia permanentemente abilitato, e quindi l'hardware dovrebbe avere questo pin tirato direttamente allo stato appropriato. Quindi non avrebbe senso forzare il driver ad avere un GPIO. – whh4000

Problemi correlati