Cómo controlar diodos emisores de luz LED con la placa de desarrollo 4412
En el diagrama esquemático anterior, puede ver que un extremo de los dos LED está conectado a la fuente de alimentación VSYS y el otro extremo está conectado a tierra a través del triodo controlando la base del triodo. , el LED se puede encender o apagar. Las bases de los dos transistores están conectadas al GPIO GPL2_0 y GPK1_1 del Exynos 4412 en la placa base a través de la placa base.
El capítulo anterior ya habló sobre el controlador GPIO en la placa de desarrollo iTOP-4412. El controlador LED utilizará varias funciones para operar GPIO presentadas en el capítulo anterior.
La función de entrada del controlador LED es leds_init, que se implementa de la siguiente manera:
static?int?__init?leds_init(void)
{ p>
return?platform_driver_register(amp; leds_driver);
}
Esta función llamará a la función del kernel platform_driver_register para registrar un dispositivo de hardware con el kernel. La función es una estructura platform_driver, definición de leds_driver como sigue:
static?struct?platform_driver?leds_driver?=?{
.probe?=?leds_probe,
.remove?=?leds_remove,
p>
.suspend?=?leds_suspend,
.resume?=?leds_resume,
.driver? =?{
.name?= ?DRIVER_NAME,
.owner?=?ESTE_MODULE,
},
};
Cuando el kernel llama a platform_driver_register para registrar un dispositivo de hardware, eventualmente llamará a la función de detección de sonda en la estructura platform_driver. La función de detección en el controlador LED de la placa de desarrollo iTOP-4412 es leds_probe, que se define como. siguiente:
static?int?leds_probe(struct?platform_device?*pdev)
{
int?ret,?i;
char?*banner?=?"leds?Initialize\n";
printk(banner);
for(i=0;?ilt;LED_NUM;?i)
{
ret?=?gpio_request(led_gpios[ i],?"LED");
si?(ret)?{
printk("s:?request?GPIO?d?for?LED?failed,?ret ?=?d\n",?DRIVER_NAME,
led_gpios[i],?ret);
return?ret;
}
s3c_gpio_cfgpin(led_gpios[i],?S3C_GPIO_OUTPUT);
gpio_set_value(led_gpios[i], ?1);
}
ret?= ?misc_register(amp; leds_dev);
if(retlt;0)
{
printk("leds: ¿registro? ¿dispositivo? ¡falló!\n" );
ir a?salir;
}
return?0;
salir:
misc_deregister( amp; leds_dev);
return?ret;
}
En esta función, la función de operación GPIO se utilizará para configurar los dos pines GPIO del LED. La función es salida y la salida predeterminada es de alto nivel.
Los dos GPIO que controlan el LED se definen en el array led_gpios, de la siguiente manera:
static?int?led_gpios[]?=?{
EXYNOS4_GPL2(0),
EXYNOS4_GPK1(1),
};
Luego regrese a la función de detección de LED y mire hacia abajo, y luego se llamará a misc_register para registrar el dispositivo de caracteres con el kernel. . El tipo de parámetro pasado por la función misc_register es miscdevice. Miscdevice se denomina dispositivo misceláneo y es un controlador de dispositivo comúnmente utilizado en sistemas integrados. Hay un archivo Miscdevice.h en el directorio include/linux del kernel de Linux. Debe definir aquí su propio número de dispositivo secundario de dispositivo misc. De hecho, es porque estos dispositivos de caracteres no cumplen con la categoría de dispositivo de caracteres predeterminada. ¿Todos estos dispositivos usan el número mayor 10 y pertenecen a misc_device? De hecho, misc_register llama a Register_chrdev() con el número mayor 10. La estructura de miscdevice en el controlador LED de la placa de desarrollo iTOP-4412 se define de la siguiente manera:
static?struct?miscdevice?leds_dev?=?{
.minor?=? MISC_DYNAMIC_MINOR,
.fops=?leds_ops,
.name=?"leds",
};
Como se puede observar de la definición anterior El número de dispositivo menor se define como MISC_DYNAMIC_MINOR. Si el número de dispositivo se define como MISC_DYNAMIC_MINOR en el subsistema misceláneo, cuando se registra el controlador, el kernel asignará dinámicamente un número de subdispositivo al dispositivo. El controlador LED creará los LED del nodo del dispositivo en el registro /devu.
El controlador proporciona varias funciones operativas del archivo del dispositivo: abrir, liberar e ioctl. La aplicación de la capa superior primero llama a la función de apertura para abrir el dispositivo LED y luego llama a ioctl para encender el LED. y apagado. La implementación de la función leds_ioctl es la siguiente:
long?leds_ioctl(struct?file?*filp, unsigned?int?cmd, unsigned?long?arg)
{ p>
printk("debug:?leds_ioctl?cmd?is?d\n"?,?cmd);
cambiar(cmd)
{
caso?0:
caso?1:
si?(arg?gt;?LED_NUM)?{
regresar?-EINVAL;
}
gpio_set_value(led_gpios[arg],?cmd);
romper;
predeterminado:
return? -EINVAL;
}
return?0;
}
A través del código anterior, puede saber que la parte superior La aplicación usa ioctl, que requiere pasar dos parámetros cmd y arg cmd es el estado del LED (0 está apagado, 1 está encendido) y arg representa qué LED operar.