2012-06-15 11 views
5

Tengo una placa powerpc con kernel 3.2 ejecutándose en ella. Acceder a gpio con sysfs funciona como se espera, p.linux gpio c api

> echo 242 > /sys/class/gpio/export 
> cat /sys/class/gpio/gpio242/value 
> 1 

¿No hay una API para dirigir el acceso gpio pins desde el espacio de usuario? ¿Debo lidiar con la interfaz sysfs basada en texto?

Busco algo como: gpio_set (int no, int val);

Gracias Klaus

+0

Pruebe [this] (http://foxlx.acmesystems.it/?id=22) o [este] (http://www.mjmwired.net/kernel/Documentation/gpio.txt). –

Respuesta

1

Una vez que tenga los dispositivos creados en el árbol de VFS, puede abrirlos como archivos típicos suponiendo que tiene un conductor por escrito y tienen los números mayor y menor correcto asignados en el archivo makedev que crea los pines gpio en el árbol vfs.

-1

Cada GPIO se mapea en memoria como un registro, por lo que puede acceder a él a través de/dev/mem. Ver here. Si desea acceder directamente a un GPIO, debe trabajar en el nivel de espacio del kernel

+1

Lo siento: ¡eso está mal! Linux proporciona una interfaz de controlador bien definida para todos los IO. También proporciona acceso a IO a los que no se accede mediante registros en el chip central. Eso le permite también acceder a los pines en chips "extensibles". Si lee mi pregunta, verá que hay una interfaz de controlador. La pregunta no es cómo acceder a un pin mapeado de registro desde el controlador del kernel. En cambio, la pregunta era cómo acceder al controlador sin una asignación de sistema de archivos. – Klaus

+1

La memoria asignada es una alternativa para acceder a gpio en lugar de sysfs – b0b0b

+0

El acceso a la memoria física no es ni una buena ni siquiera tolerable forma de acceder a ningún componente de hardware, depende del código que asume muy fuerte sobre el objetivo en el que se ejecuta. ¿Qué sucede si el código tiene errores o debe ser portado? –

2

sysfs es el nivel más bajo en el que podrá manipular GPIO en kernels recientes. Puede ser un poco tedioso pero ofrece varias ventajas sobre el viejo estilo de la API:

  • Sin fea ioctl
  • puede ser escrito con mucha facilidad (piensa scripts de inicio)
  • Para las entradas, el archivo "valor" se puede encuestar fácilmente para subir/bajar/ambos bordes y será muy reactivo con las interrupciones de hardware

No tengo un código de ejemplo por el momento, pero al acceder a ellos a través del código C, a menudo implementé un muy simple envoltorio manipulación de descriptores de archivos y tener variaciones de la siguiente int erface:

int gpio_open(int number, int out); /* returns handle (fd) */ 
int gpio_close(int gpio); 
int gpio_set(int gpio, int up); 
int gpio_get(int gpio, int *up); 
int gpio_poll(int gpio, int rising_edge, int timeout); 

A partir de entonces, la implementación es bastante sencilla.