Configurar el modo Mux del banco GPIO

Configurar el modo Mux del banco GPIO

Estoy trabajando con una máquina ARM que tiene un zumbador conectado al pin GPIO 102. La máquina ejecuta Linux 2.6, por lo que tenemos una interfaz sysfs para los pines en /sys/class/gpio. La primera vez que intenté hacer funcionar el timbre, intenté algo como lo siguiente:

# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value

Para mi consternación, la máquina no hizo ningún ruido. Sin embargo, al verificar el código fuente del controlador del zumbador escrito para WinCE, noté que se suponía que el multiplexor GPIO estaba configurado en un modo determinado. No soy muy bueno con cosas fuera del mundo del software, así que todavía no estoy exactamente seguro de lo que esto significa. Sin embargo, como me dieron el código fuente de la versión de U-Boot utilizada para iniciar Linux en la máquina, pude editarlo para configurar el modo de banco GPIO agregando esta línea de código al archivo de encabezado de la placa ( u-boot/board/somecompany/someboard/someboard.h):

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

Volví a compilar el gestor de arranque, lo copié, reinicié la máquina y volví a ejecutar la prueba anterior, ¡y funcionó! Pensé que había cumplido mi tarea. Sin embargo, me informaron que la forma en que lo hice tal vez no haya sido segura, ya que el banco GPIO puede usarse para otros conductores. Cuando monto debugfs y verifico /sys/kernel/debug/gpio, parece que se están utilizando otros pines GPIO en el banco GPIO para los controladores.

Luego probé un enfoque diferente: dado que el pitido es más importante en el arranque, decidí intentar agregar algo de código al gestor de arranque para que emita un pitido:

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

if(!gpio_request(102, "buzzer")){
    gpio_direction_output(102, 1);
    udelay (500000);
    gpio_direction_output(102, 0);
}

MUX_VAL(CP(CCDC_DATA3), (IEN  | PTD | DIS | M0));

Esto funciona porque el gestor de arranque es de un solo subproceso, por lo que no tiene que pelear por el banco GPIO. La última línea restablece el modo mux del banco GPIO a la forma en que se configuró anteriormente en el código.

Esto emite un pitido con éxito durante la ejecución del gestor de arranque y, hasta donde puedo decir, no interfiere con ningún controlador ya que el banco GPIO se restaura al estado requerido. Sin embargo, no es tan útil como me gustaría, porque el pitido durante la secuencia del cargador de arranque no necesariamente indica que el arranque completo fue exitoso. En cambio, sería mucho mejor si pudiera acceder al timbre desde Linux, para indicar un arranque exitoso u otros eventos. Sin embargo, no tengo suerte para encontrar documentación sobre cómo configurar un modo mux de banco GPIO en Linux. Mi pregunta, por tanto, es la siguiente:

¿Hay alguna manera de configurar el modo mux de un banco GPIO desde el espacio del kernel?

información relacionada