Notas de estudio sobre el desarrollo del controlador de Linux [12]: Linux viene con un controlador de luz LED

Tabla de contenido

1. El kernel viene con LED drive enable

En segundo lugar, el kernel viene con análisis de controladores LED

Tres, el kernel viene con un controlador LED para usar


1. El kernel viene con LED drive enable

En el kernel de Linux, ya se proporciona el controlador de la luz LED y se utiliza el controlador de la plataforma de la plataforma. Antes de usarlo, debe configurar el kernel mediante make menuconfig para habilitar el controlador de la luz LED.

Guardar y salir tendrá múltiples macros CONFIG_LEDS_GPIO = y en el archivo de configuración .config en el directorio , y significa compilado en el kernel, si es m significa compilado en un módulo. Una vez completado, use make -j4 para agregar el controlador LED recién agregado al kernel. Aquí hay un truco para buscar cierto contenido en el archivo: En el modo normal (presione ESC), ingrese /, luego ingrese el contenido que desea buscar y presione Enter para encontrar el contenido que desea buscar.

CONFIG_LEDS_GPIO Una vez definida la macro, en el directorio / drivers / leds  se agregará Makefile en leds-gpio.o al kernel compilado.

También hay un método de configuración inverso, es decir, sé el nombre de la macro que se abrirá, ¿cómo puedo encontrar los elementos de configuración que se pueden habilitar en el menuconfig?

1. Ingrese make menuconfig

2. Entrada /

3. Ingrese la macro que desea buscar (yo busqué aquí (CONFIG_LEDS_GPIO), presione Enter, aparecerá la siguiente interfaz, y luego ingrese la etiqueta correspondiente 1 antes, saltará a la interfaz a configurar

En segundo lugar, el kernel viene con análisis de controladores LED

Abra /drivers/leds/leds-gpio.c , este archivo es el archivo de origen del controlador LED que viene con el kernel de Linux, y utiliza el árbol de dispositivos para que coincida con el controlador y el controlador de dispositivo de plataforma de plataforma del dispositivo. El controlador coincidirá con el nodo en el árbol de dispositivos de acuerdo con el valor compatible en la tabla de coincidencias of_gpio_leds_match . Si el nodo del árbol de dispositivos correspondiente está definido en el dispositivo, se ejecutará la función gpio_led_probe

static const struct of_device_id of_gpio_leds_match[] = {
	{ .compatible = "gpio-leds", },
	{},
};

MODULE_DEVICE_TABLE(of, of_gpio_leds_match);

static int gpio_led_probe(struct platform_device *pdev)
{
	struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev);
	struct gpio_leds_priv *priv;
	int i, ret = 0;

	if (pdata && pdata->num_leds) {
		priv = devm_kzalloc(&pdev->dev,
				sizeof_gpio_leds_priv(pdata->num_leds),
					GFP_KERNEL);
		if (!priv)
			return -ENOMEM;

		priv->num_leds = pdata->num_leds;
		for (i = 0; i < priv->num_leds; i++) {
			ret = create_gpio_led(&pdata->leds[i],
					      &priv->leds[i],
					      &pdev->dev, pdata->gpio_blink_set);
			if (ret < 0) {
				/* On failure: unwind the led creations */
				for (i = i - 1; i >= 0; i--)
					delete_gpio_led(&priv->leds[i]);
				return ret;
			}
		}
	} else {
		priv = gpio_leds_create(pdev);
		if (IS_ERR(priv))
			return PTR_ERR(priv);
	}

	platform_set_drvdata(pdev, priv);

	return 0;
}

static int gpio_led_remove(struct platform_device *pdev)
{
	struct gpio_leds_priv *priv = platform_get_drvdata(pdev);
	int i;

	for (i = 0; i < priv->num_leds; i++)
		delete_gpio_led(&priv->leds[i]);

	return 0;
}

static struct platform_driver gpio_led_driver = {
	.probe		= gpio_led_probe,
	.remove		= gpio_led_remove,
	.driver		= {
		.name	= "leds-gpio",
		.of_match_table = of_gpio_leds_match,
	},
};

/*同时完成了向内核注册和注销驱动的过程
 *platform_driver_register(&led_driver)
 *platform_driver_unregister(&led_driver)
*/
module_platform_driver(gpio_led_driver);

Tres, el kernel viene con un controlador LED para usar

1. Primero, compile el controlador en el kernel

2. Si hay un árbol de dispositivos, agregue la información del nodo del árbol de dispositivos correspondiente en el árbol de dispositivos .dts de acuerdo con el documento vinculante;

Si no hay un árbol de dispositivos, debe usar platform_device_register para registrar el dispositivo de luz LED con el bus

Según el documento vinculante, los nodos del árbol de dispositivos LED agregados son los siguientes:

/*自行添加的Linux内核LED驱动*/
linux_leds {
compatible = "gpio-leds";
pinctrl-0 = <&pinctrl_gpio_leds>;/*pinctrl子系统*/
    led0 {
        label = "sysrun";
        gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
        linux,default-trigger = "heartbeat";
        default-state = "off";
    };
};

etiqueta : Nombre

gpios : subsistema gpio

linux, default-trigger : indica el modo de disparo predeterminado, hay varias opciones de la siguiente manera:

  1. "luz de fondo": el LED actuará como una luz de fondo, controlada por el sistema framebuffers
  2. "default-on": el LED se encenderá (pero para leds-gpio, consulte la propiedad "default-state" en Documentation / devicetree / bindings / gpio / led.txt)
  3. "latido": el LED "doble" parpadea a una frecuencia basada en el promedio de carga
  4. "ide-disk": el LED indica la actividad del disco
  5. "temporizador": el LED parpadea a una velocidad fija y configurable

3. Ejecute la prueba

Ingrese el siguiente comando para actualizar el árbol de dispositivos y reiniciar la placa de desarrollo. En este momento, el LED parpadeará dos veces como una luz de latido y parpadeará una vez a máxima velocidad. Al mismo tiempo , puede ver el nodo linux_leds agregado en el directorio / sys / devices / platform

sudo cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /home/denghengli/linux/tftp/ -f

Si desea controlar el encendido y apagado del LED y modificar el modo de la luz LED, puede modificar el brillo y el disparador para lograr

 

Supongo que te gusta

Origin blog.csdn.net/m0_37845735/article/details/107328682
Recomendado
Clasificación