Agenda - Linux device drivers

Informações gerais

Tópicos principais Introdução ao kernel Linux, configurando e compilando o kernel, desenvolvendo um módulo do kernel, desenvolvimento de um driver de dispositivo de caractere, acesso a registradores via I/O mapeado em memória, desenvolvimento de um driver de LED, frameworks do kernel, utilizando a camada de GPIO do kernel (gpiolib), integração com o driver model do kernel, infraestrutura de barramento, trabalhando com device tree, gerenciamento de processos, threads do kernel, mecanismos de sincronização, trabalhando com interrupções, desenvolvimento de um driver de botão, gerenciamento de concorrência, trabalhando com um driver de expansora de GPIO no barramento SPI, livros e referências para estudos
Duração 3 dias - 24 horas - 50% de teoria e 50% de prática
Instrutor Sergio Prado
Público-alvo Estudantes, engenheiros, desenvolvedores e líderes de equipes de desenvolvimento de software para sistemas embarcados
Pré-requisitos Terminal de comandos, linguagem C, arquitetura de sistemas com Linux embarcado
Material de estudo O material de estudo é composto pelos slides, o livro de atividades e exercícios, os guias de referência e documentos de estudo adicional. Todo o material é fornecido de forma eletrônica no início do treinamento
Kit de desenvolvimento Os kits de desenvolvimento são emprestados aos alunos durante o treinamento para a execução das atividades práticas. É utilizado por padrão o módulo Colibri i.MX6 (ARM Cortex-A9) da Toradex. Se necessário, e conforme a necessidade da empresa contratante, o treinamento pode ser realizado em uma outra plataforma de hardware

Agenda detalhada

Dia 1 - manhã


Apresentação: Introdução ao kernel Linux - Responsabilidades do kernel, arquitetura geral, processo de desenvolvimento e versionamento, visão geral do código-fonte, licença, ferramentas de navegação.

Apresentação: Configuração e compilação do kernel - configurando o kernel Linux, compilando o kernel, imagens geradas, instalando o kernel, compilando o device tree, passando parâmetros para o kernel.

Laboratório: Preparando o ambiente de desenvolvimento - Neste exercício, iremos preparar o ambiente de desenvolvimento do treinamento, incluindo os testes de comunicação com a console serial, configuração e compilação do kernel, e o boot do sistema operacional.

Apresentação: Módulos do kernel - kernel monolítico e microkernel, módulos do kernel Linux, vantagens do uso de módulos, compilando e instalando os módulos, ferramentas de gerenciamento de módulos, passando parâmetros para módulos, desenvolvendo um módulo do kernel, integrando o módulo no código-fonte do kernel.

Laboratório: Implementando módulos do kernel - Nesta atividade aprenderemos a compilar e instalar os módulos do kernel, desenvolver um módulo do kernel customizado, e integrar módulos no código-fonte do kernel.

Dia 1 - tarde


Apresentação: Dispositivos de hardware - acesso a hardware no Linux, classes de dispositivos, driver de dispositivo de caractere, major/minor number, implementando as operações em arquivo do driver, trocando dados com o espaço de usuário, registrando um driver de dispositivo de caractere, desalocando recursos, tratamento de erros.

Laboratório: Implementando drivers de dispositivo - Nesta atividade aprenderemos a desenvolver um driver de dispositivo de caractere.

Apresentação: Acessando o hardware - formas de acesso a I/O (bus I/O, port I/O, memory mapped I/O), memory mapped I/O com MMU, requisitando uma região de I/O, mapeando um endereço físico para um endereço virtual, acessando os registradores, APIs de acesso a I/O.

Laboratório: Acessando o hardware - Nesta atividade aprenderemos a utilizar as APIs do kernel Linux para acessar um dispositivo de I/O cujos registradores estão mapeados em memória.

Dia 2 - manhã


Apresentação: Frameworks - Linux driver model, frameworks do kernel (tty, alsa, framebuffer, v4l, mtd, input, hwmon, watchdog, rtc, etc), driver de framebuffer, driver de power supply, driver de input, framework de LEDs.

Laboratório: Integrando no framework de LED - Nesta atividade aprenderemos a integrar o driver no framework de LEDs do kernel Linux.

Apresentação: GPIOLIB - acessando GPIOs no Linux, GPIOLIB, acesso a GPIOs em espaço de usuário (sysfs e chardev), APIs de acesso a GPIO no kernel.

Laboratório: Integrando com a GPIOLIB - Nesta atividade aprenderemos a integrar o driver de LED na camada de GPIO do kernel (GPIOLIB).

Dia 2 - tarde


Apresentação: Infraestrutura de barramento - introdução à infraestrutura de barramento, arquitetura e vantagens, gerenciamento de energia, bus code e bus adapters, análise do barramento I2C, analisando o driver de um dispositivo I2C, registrando um dispositivo no barramento, platform bus, platform drivers e platform devices.

Laboratório: Integrando com o Linux Driver Model - Nesta atividade iremos integrar o driver de LED à infraestrutura de barramento do kernel Linux.

Apresentação: Device tree - histórico e introdução ao device tree, sintaxe do device tree, propriedades e nós, exemplos de device tree, analisando alguns nós de device tree, alterações no driver para suportar device tree, APIs de device tree, organização do device tree, device tree bindings.

Dia 3 - manhã


Laboratório: Trabalhando com device tree - Nesta atividade iremos adaptar o driver de LED para suportar o registro de dispositivos via device tree.

Apresentação: Gerenciamento de processos - processos e threads no Linux, os estados de uma tarefa, escalonador, tarefas de tempo real, kernel threads, API de threads do kernel, eventos e sincronização, wait queues, completion variable.

Laboratório: Threads do kernel e sincronização - Nesta atividade estudaremos sobre threads do kernel e sincronização através do desenvolvimento de um driver de botão.

Apresentação: Tratamento de interrupções - eventos de hardware interrupção, tratamento de interrupção no kernel, registrando uma ISR, restrições no tratamento de interrupções, como implementar uma ISR, dividindo o tratamento de uma ISR em duas partes (top half e bottom half), tasklets, work queues, threaded IRQs.

Dia 3 - tarde


Laboratório: Tratando interrupções - Nesta atividade aprenderemos a tratar interrupções em espaço de kernel, alterando o driver de botão para reportar eventos utilizando threaded IRQs.

Apresentação: Gerenciamento de concorrência - multitarefa e concorrência, concorrência no kernel Linux, seções críticas e exclusão mútua, operações atômicas, locking, mutex, spinlocks.

Laboratório: Gerenciamento de concorrência - Nesta atividade aprenderemos a utilizar um mutex para proteger seções críticas em um driver no Linux.

Apresentação: Considerações finais - Links e recursos adicionais, recomendações de livros, dúvidas e comentários finais, encerramento.