Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial Internet of Things >> Tecnología de Internet de las cosas

Desarrollo de controladores de dispositivos Linux:el subsistema de control de pines

Nota del editor:El kernel de Linux integrado ya juega un papel vital en los sistemas integrados y está ganando importancia para satisfacer los diversos requisitos de Internet de las cosas (IoT). A su vez, los controladores de dispositivos proporcionan el vínculo crítico entre las aplicaciones y los propios dispositivos de IoT. En Desarrollo de controladores de dispositivos Linux, el autor John Madieu ofrece una visión completa del desarrollo de estos controladores, combinando una explicación detallada con muchos ejemplos de código.

Este extracto, el Capítulo 14 del libro, se centra en el control de pines y los GPIO, un área de particular importancia para los desarrolladores de sistemas integrados que buscan interactuar con dispositivos de hardware personalizados. Esta primera entrega de este extracto presenta el subsistema de control de pines.

Adaptado de Desarrollo de controladores de dispositivos Linux, por John Madieu.


Capítulo 14. Control de pines y subsistema GPIO
Por John Madieu

La mayoría de los ingenieros de kernel y controladores de Linux integrados escriben utilizando GPIO o juegan con multiplexación de pines. Por pines, me refiero a la línea de componente saliente. SoC multiplexa pines, lo que significa que un pin puede tener varias funciones, por ejemplo, MX6QDL_PAD_SD3_DAT1 en arch / arm / boot / dts / imx6dl-pinfunc.h puede ser una línea de datos SD3 1, cts / rts de UART1, Rx de Flexcan2 o GPIO normal.

El mecanismo por el cual uno elige el modo en el que debe funcionar un pin se llama muxing de pin. El sistema responsable se llama controlador de pin. En la segunda parte del capítulo, analizaremos la entrada y salida de propósito general ( GPIO ), que es una función (modo) especial en la que puede operar un pin.

En este capítulo:

Subsistema de control de pines

El control de PIN ( pinctrl ) permite la gestión de multiplexación de pines. En el DT, los dispositivos que necesitan que los pines se multiplexen de cierta manera deben declarar la configuración de control de pines que necesitan.

El subsistema pinctrl proporciona:

El propósito de este libro se limita al uso de funciones exportadas por el controlador del controlador de clavija y no explica cómo escribir un controlador de controlador de clavija.

Pinctrl y el árbol de dispositivos

El pinctrl no es más que una forma de recopilar pines (no solo GPIO) y pasarlos al controlador. El controlador del controlador de pines es responsable de analizar las descripciones de los pines en el DT y de aplicar su configuración en el chip. El controlador generalmente necesita un conjunto de dos nodos anidados para describir configuraciones de grupo de pines. El primer nodo describe la función del grupo (para qué se usará el grupo), el segundo contiene la configuración de los pines.

La forma en que se asignan los grupos de pines en el DT depende en gran medida de la plataforma y, por lo tanto, del controlador del controlador de pines. A cada estado de control de pin se le asigna un ID entero que comienza en 0 y es contiguo. Se puede usar una propiedad de nombre, que se asignará encima de las ID, de modo que el mismo nombre siempre apunte a la misma ID.

El enlace propio de cada dispositivo cliente determina el conjunto de estados que se deben definir en su nodo DT y si se debe definir el conjunto de ID de estado que se deben proporcionar o si se debe definir el conjunto de nombres de estado que se deben proporcionar. En cualquier caso, se puede asignar un nodo de configuración de pines a un dispositivo mediante dos propiedades:

El siguiente es un extracto de DT, que muestra algunos nodos de dispositivo, junto con sus nodos de control de pines:

En el ejemplo anterior, una configuración de pines se da en la forma . Por ejemplo:

MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x80000000

MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 representa la función de pin, que es GPIO en este caso, y 0x80000000 representa la configuración de pin. Para esta línea,

MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1

MX6QDL_PAD_EIM_D25__UART3_RX_DATA representa la función pin, que es la línea RX de UART3, y 0x1b0b1 representa la configuración.

La función de pin es una macro cuyo valor es significativo solo para el controlador del controlador de pin. Estos se definen generalmente en archivos de encabezado ubicados en arch // boot / dts /. Si uno usa un quad UDOO, por ejemplo, que tiene un i.MX6 quad core (ARM), el encabezado de la función pin sería arch / arm / boot / dts / imx6q-pinfunc.h. La siguiente es la macro correspondiente a la quinta línea del controlador GPIO5:

#define MX6QDL_PAD_DISP0_DAT11__GPIO5_IO05 0x19c 0x4b0 0x000 0x5 0x0

se puede usar para configurar cosas como pull-ups, pull-downs, keepers, drive power, etc. La forma en que debe especificarse depende de la vinculación del controlador de pin, y el significado de su valor depende de la hoja de datos del SoC, generalmente en la sección IOMUX. En i.MX6 IOMUXC, solo se utilizan menos de 17 bits para este propósito.

Estos nodos precedentes se llaman desde el correspondiente nodo específico del controlador. Además, estos pines se configuran durante la inicialización del controlador correspondiente. Antes de seleccionar un estado de grupo de pines, primero se debe obtener el control de pines usando la función pinctrl_get (), llamar a pinctrl_lookup_state () para verificar si el estado solicitado existe o no, y finalmente pinctrl_select_state () para aplicar el estado.

El siguiente es un ejemplo que muestra cómo obtener un pincontrol y aplicar su configuración predeterminada:

Por lo general, se realizan estos pasos durante la inicialización del controlador. El lugar adecuado para este código podría estar dentro de la función probe ().

pinctrl_select_state () llama internamente a pinmux_enable_setting (), que a su vez llama a pin_request () en cada pin del nodo de control de pin.

Se puede liberar un control de pin con la función pinctrl_put (). Se puede utilizar la versión de la API con gestión de recursos. Dicho esto, uno puede usar pinctrl_get_select (), dado el nombre del estado a seleccionar, para configurar pinmux. La función se define en include / linux / pinctrl / consumer.h de la siguiente manera:

estructura estática pinctrl * pinctrl_get_select (estructura dispositivo * dev,
const char * nombre)

donde * nombre es el nombre del estado tal como está escrito en la propiedad pinctrl-name. Si el nombre del estado es predeterminado, uno puede simplemente llamar a la función pinctr_get_select_default (), que es un envoltorio alrededor de pinctl_get_select ():

static struct pinctrl * pinctrl_get_select_default (
struct device * dev)
{
return pinctrl_get_select (dev, PINCTRL_STATE_DEFAULT);
}

Veamos un ejemplo real en un archivo dts específico de la placa (am335x-evm.dts):

dcan1:d_can @ 481d0000 {
status ="okay";
pinctrl-names ="predeterminado";
pinctrl-0 =<&d_can1_pins>;
};

Y en el controlador correspondiente:

pinctrl =devm_pinctrl_get_select_default (&pdev-> dev);
if (IS_ERR (pinctrl))
dev_warn (&pdev-> dev, ”los pines no están configurados desde el controlador”);

El núcleo de control de pines reclamará automáticamente el estado pinctrl predeterminado para nosotros cuando se pruebe el dispositivo. Si uno define un estado de inicio, el núcleo pinctrl establecerá automáticamente pinctrl en este estado antes de la función probe (), y luego cambiará al estado predeterminado después de probe () (a menos que el controlador ya haya cambiado los estados explícitamente).

La próxima entrega discutirá el subsistema GPIO.

Reproducido con permiso de Packt Publishing. Derechos de autor © 2017 Packt Publishing


John Madieu es un ingeniero de kernel y Linux integrado que vive en Francia, en París. Sus principales actividades consisten en desarrollar drivers y Board Support Packages (BSP) para empresas en dominios como automatización, transporte, salud, energía y militares. John trabaja en EXPEMB, una empresa francesa pionera en el diseño de placas electrónicas basadas en computadora en módulo y en soluciones Linux integradas. Es un entusiasta del código abierto y los sistemas integrados, convencido de que solo compartiendo conocimientos se aprende más.


Tecnología de Internet de las cosas

  1. Abordar las vulnerabilidades de seguridad del IoT industrial
  2. El desarrollo de plásticos modernos
  3. Perspectivas para el desarrollo de IoT industrial
  4. ¿Quién está a cargo del automóvil conectado? Pregunte al conductor en el bucle
  5. Seis pasos para proteger los sistemas integrados en IoT
  6. El punto de inflexión para SaaS en el desarrollo de productos (Parte 2)
  7. El punto de inflexión para SaaS en el desarrollo de productos:Parte 1
  8. Desafíos para seleccionar el proveedor de desarrollo de IoT adecuado
  9. Los requisitos de IPC del control complejo
  10. ¿Cuáles son los impulsores clave para el desarrollo exitoso de la IoT empresarial?
  11. Impacto de IoT en el futuro del diseño y desarrollo de aplicaciones web