2011-10-12 16 views
7

Estoy creando un pequeño módulo de núcleo para proporcionar acceso de espacio de usuario a algunas funciones de modo de núcleo de un chip ARMv7 (específicamente, control de caché). Estoy leyendo Linux Device Drivers por Corbet, Rubini y Hartman. En él describen cómo hacer un controlador + dispositivo + bus completo. No quiero crear un controlador de autobús en absoluto. De hecho, el 'controlador' que estoy creando realmente no necesita coincidir con ninguna definición de dispositivo: está implícitamente relacionado con la CPU de la plataforma. ¿Alguien me puede explicar:Acceso de controlador de Linux a través de sysfs

  1. ¿Dónde en sysfs deberían ir mis atributos? ¿Debería estar en mi entrada de módulo en /sysfs/modules/mymodule? /sys/devices/platform parece prometedor también, y también lo hace /sys/devices/system/cpu.
  2. Si hay un lugar donde debería poner mis atributos kobject /, ¿cómo lo enchufo? ¿Cómo obtengo el necesario kset? Todos los ejemplos que he visto crean un kset y luego un enlace desde el kobject - No he visto una API para solicitar un nombre existente kset?

Lo siento si esto es simplemente obvio, o si hay algún ejemplo realmente sencillo y fácil de descubrir en algún lugar que no he descubierto por alguna razón. ¿Alguien puede aclarar esto?

Respuesta

8

No he trabajado mucho con sysfs, pero encontré un ejemplo simple que es bastante similar a lo que estás haciendo (naturalmente, también está bajo ARM). Eche un vistazo a arch/arm/mach-omap1/pm.c, específicamente el archivo sysfs idle_show/idle_store. Se registra (usando sysfs_create_file()) como /sys/power/sleep_while_idle y utiliza el kobj global (definido en include/linux/kobject.h). Hay algunos otros kobj globales definidos allí que podría usar, aunque no creo que ninguno sean adecuados para su controlador.

¿Va a ser esto un controlador de plataforma? Como un conductor que no cabe debajo de ningún autobús, parece una buena opción. Los controladores de plataforma obtienen su propio directorio en/sys/devices/platform y pueden tener atributos allí. Eche un vistazo a drivers/hwmon/coretemp.c, que tiene temp1_crit, temp1_crit_alarm, temp1_input, etc. como atributos. Parece bastante simple: cree los atributos (tal vez con __ATTR()?), Enumere todos en una matriz, defina attribute_group, regístrelo con sysfs_create_group() en la función probe() y anule el registro con sysfs_remove_group() en la función remove().

Probablemente haya otros controladores de plataforma que definan atributos (busque sysfs_create_group) si necesita otros ejemplos. ¡Espero que esto ayude!

+0

Echaré un vistazo al controlador coretemp.c. ¡Gracias! –

+0

Una actualización: el módulo coretemp era la plantilla perfecta. Obtuve algunos atributos sysfs funcionando bastante bien. Gracias de nuevo. –

Cuestiones relacionadas