Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial Internet of Things >> Tecnologia da Internet das Coisas

Dominando o Subsistema de Controle de Pinos para Drivers de Dispositivos Linux

Dominando o Subsistema de Controle de Pinos para Drivers de Dispositivos Linux Nota do Editor: Linux Embarcado está se tornando a espinha dorsal da Internet das Coisas, e drivers de dispositivo são a ponte entre aplicações e hardware. Em "Linux Device Drivers Development", o autor John Madieu oferece um guia detalhado e rico em código para construir esses drivers.

Este trecho — Capítulo 14 do livro — mergulha em controle de pinos e GPIOs, área crítica para desenvolvedores que precisam interligar hardware customizado com o kernel. A primeira parte introduz o subsistema de controle de pinos.

Adaptado de Linux Device Drivers Development, por John Madieu.


Capítulo 14. Subsistema de Controle de Pinos e GPIO
Por John Madieu

No Linux embarcado, drivers quase sempre interagem com GPIOs ou configuram multiplexação de pinos. Um "pino" é a linha de saída física de um componente, e muitos SoCs reutilizam o mesmo pino para várias funções. Por exemplo, o pino i.MX6QDL MX6QDL_PAD_SD3_DAT1 pode servir como linha de dados SD, linha UART RTS/CTS, linha FlexCAN Rx, ou GPIO genérico.

O processo de selecionar a função de um pino é chamado pin muxing, e o componente do kernel que orquestra isso é o pin controller. Na segunda parte deste capítulo exploraremos o subsistema General Purpose Input/Output (GPIO), uma função comum de pino.

Neste capítulo você irá:

Subsistema de controle de pinos

O subsistema pinctrl gerencia multiplexação e configuração de pinos. Dispositivos que requerem um arranjo específico de pinos devem descrever esse arranjo na Device Tree. O driver do pin‑controller parseia essas descrições e programa o controlador de I/O do SoC conforme necessário.

O subsistema oferece:

Note que este livro foca no uso da API do pin‑controller; não cobre escrita de um driver de pin‑controller em si.

Pinctrl e a Device Tree

Na Device Tree, um nó de pin‑controller descreve todos os grupos de pinos e funções disponíveis. Cada grupo recebe um ID inteiro, opcionalmente acompanhado por um pinctrl-name que mapeia nomes legíveis por humanos para IDs.

O binding de um dispositivo especifica os estados de pino que ele requer. Duas propriedades vinculam um dispositivo a estados de pino:

Abaixo está um trecho típico de Device Tree mostrando configuração de pino para dois dispositivos:

Dominando o Subsistema de Controle de Pinos para Drivers de Dispositivos Linux

Cada linha segue o formato <PIN_FUNCTION> <PIN_SETTING>:

MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x80000000 MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1 

O primeiro token (MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09) identifica a função do pino; o segundo token (0x80000000) codifica bits de configuração (pull‑up/down, drive strength, etc.). Essas macros são definidas em arquivos de header específicos da arquitetura como arch/arm/boot/dts/imx6q-pinfunc.h.

Para programar um estado de pino em código de driver, siga estes passos durante a inicialização (tipicamente em probe()):

struct pinctrl *pinctrl; pinctrl = devm_pinctrl_get_select_default(&pdev->dev); if (IS_ERR(pinctrl)) dev_warn(&pdev->dev, "pins are not configured from the driver"); 

O helper pinctrl_get_select_default() recupera e aplica automaticamente o estado default. Se um dispositivo fornece um estado init, o core aplicará esse estado antes do probe() e então reverterá para default depois, a menos que o driver o altere.

Quando terminar, libere o controller com pinctrl_put(pinctrl) ou use a variante resource‑managed devm_pinctrl_put(pinctrl).

Aqui está um exemplo concreto do arquivo am335x-evm.dts:

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

No driver correspondente:

pinctrl = devm_pinctrl_get_select_default(&pdev->dev); if (IS_ERR(pinctrl)) dev_warn(&pdev->dev, "pins are not configured from the driver");

No momento em que o probe() do driver roda, a configuração de pino default já está em vigor.

A próxima parcela cobrirá o subsistema GPIO em detalhes.

Reimpresso com permissão da Packt Publishing. Copyright © 2017 Packt Publishing


John Madieu é engenheiro de kernel e Linux embarcado baseado em Paris. Desenvolve drivers e BSPs para clientes em automação, transporte, saúde, energia e defesa. John trabalha na EXPEMB, pioneira em design computer‑on‑module, e é um advogado ativo de open‑source que acredita que compartilhamento de conhecimento acelera inovação.


Tecnologia da Internet das Coisas

  1. Por Que Sistemas Industrial IoT São Alvos Principais para Ciberataques — e Como Protegê‑los
  2. Do Marfim à Baquelite: Traçando a Evolução dos Plásticos Modernos
  3. Perspectiva Futura: Avançando Industrial IoT para Excelência em Produção
  4. Quem Comanda o Carro Conectado? Insights da Perspectiva do Motorista
  5. Seis Passos Comprovados para Proteger Sistemas Embarcados de IoT
  6. Adoção de SaaS Dispara no Desenvolvimento de Produtos: Principais Obstáculos e Oportunidades — Parte 2
  7. Adoção de SaaS Atinge Ponto de Virada no Desenvolvimento de Produtos — Insights da PTC
  8. Como Escolher Parceiro Ideal de Desenvolvimento IoT: Desafios-Chave & Soluções
  9. PCs Industriais: A Pedra Angular do Controlo Complexo na Revolução IIoT
  10. Principais Fatores para Desenvolvimento IoT Empresarial Bem-Sucedido: Insights de Especialistas da Nokia