Il modo migliore per aggiornare i dati del driver dallo spazio utente

0

Ho un'applicazione userspace che interagisce con un driver dello spazio del kernel in un ambiente Linux. Il driver, in questo caso, è un driver LED. In tipico * modo nix, il driver espone un file in /sys/class/leds/actled1:green/ chiamato value . Quando il valore di value supera una soglia, il LED si accende.

Quindi, la mia domanda è, qual è il modo migliore di aggiornare value dallo spazio utente in C?

Il mio attuale approccio è quello di scrivere semplicemente sul file, con un percorso file hardcoded:

int value = 0;
FILE *fp;

/* update value here... */

fp = fopen("/sys/class/leds/actled1:green/value", "w");
if(fp != NULL) fprintf(fp, "%d", value);
fclose(fp);

C'è un modo migliore per farlo? Sembra che ci dovrebbe essere un POSIX C api standard per questo, forse uno che consente la ricerca del driver (in modo da non dover codificare il percorso del file).

    
posta Woodrow Barlow 27.10.2015 - 20:45
fonte

1 risposta

1

Ci sono molte API del kernel di Linux. Per esempio. per citarne alcuni:

  • chiamate di sistema
  • dispositivi char e block (sotto /dev/ )
    • scrivi e leggi i dati
    • chiama ioctl() sul dispositivo aperto
  • socket netlink
  • sysfs
  • procfs
  • configfs

A volte gli obiettivi determinano l'API adatta da usare. A volte è un po 'arbitrario quale scegliere. Ad un certo punto è stata scelta un'API da uno o più sviluppatori che hanno creato l'API (probabilmente dopo alcune discussioni sulle mailing list del kernel di Linux).

Nel caso dei LED del kernel Linux, /sys/class/leds/ nel filesystem sysfs è l'API per le applicazioni userspace per il controllo dei LED. Quindi la tua app controllerà i LED scrivendo su un file in sysfs.

Ti consiglio solo di rendere il nome del LED configurabile nella tua applicazione. Puoi semplicemente rendere il nome configurabile (ad esempio actled1:green ) oppure puoi rendere l'intero percorso configurabile (ad esempio /sys/class/leds/actled1:green/brightness ). Ciò potrebbe consentire l'utilizzo di una sorta di API pseudo-LED userspace (ad esempio un'app dello spazio utente che controlla i LED su una connessione di rete, fornendo un'API pseudo-LED sotto /var/run/led-net/actled1:green/brightness ).

    
risposta data 02.06.2016 - 05:12
fonte

Leggi altre domande sui tag