Modelo de driver de dispositivo Linux

Modelo de driver de dispositivo Linux

Em geral, qualquer sistema operacional precisa de um software específico para o dispositivo. Este software entende a funcionalidade do dispositivo e é uma camada intermediária entre o sistema operacional e hardware. Driver de dispositivo é o termo usado para este software. Neste artigo, discutiremos sobre como o Linux lida com os dispositivos e drivers de dispositivo. Em palavras simples, exploraremos a estrutura do driver do dispositivo do Linux.

Descrição

Normalmente, em qualquer placa ou plataforma, vários dispositivos estão presentes e esses dispositivos estão conectados entre si por algumas linhas físicas ou protocolos. Esses protocolos de conexão são conhecidos como ônibus. Existem vários protocolos de barramento disponíveis. Poucos exemplos são I2C, SPI, AHB, APB, PCI, etc. Vamos dar um exemplo do dispositivo de memória EEPROM. A EEPROM está conectada ao sistema pelo barramento i2C. A CPU usará o protocolo I2C para ler/gravar dados da EEPROM. Do lado da CPU, esse manuseio de protocolo será feito pelo controlador de protocolo I2C. O controlador i2C na CPU atua como o dispositivo mestre. A EEPROM atua como o dispositivo escravo. Todos os detalhes do I2C estão disponíveis na especificação i2C.

Nos sistemas de braço baseados em Linux, os dispositivos EEPROM são preenchidos com a ajuda da árvore do dispositivo. Definir a EEPROM na árvore do dispositivo é suficiente para declarar o dispositivo no sistema. Com esta instância do dispositivo de entrada de árvore de dispositivo, será criada pelo kernel Linux enquanto inicializa. Quando o Linux aumenta, ele analisa a árvore do dispositivo e criou a instância dos dispositivos definidos na árvore do dispositivo.

Com este dispositivo, é criado no Linux, mas o Linux não será capaz de entender o dispositivo. Para a comunicação/operações do dispositivo, é necessário um software especial específico para o dispositivo. Isso será conhecido como o driver do dispositivo para o dispositivo. Voltando ao exemplo da EEPROM, o driver do dispositivo EEPROM será necessário para ler/escrever os dados da EEPROM.

Para vincular o driver do dispositivo ao dispositivo específico, é necessária uma sequência compatível. A sequência compatível é usada pelo kernel Linux para investigar o driver específico para o dispositivo enquanto inicializa. O kernel Linux também fornece a flexibilidade de que um driver de dispositivo possa ser carregado em tempo de execução. A única condição é que o driver não deve ser necessário para a plataforma inicializar. Driver de dispositivo que são adicionados posteriormente ao kernel são compilados como objetos do kernel. Estes são os arquivos presentes como .Ko. O comando insmod é usado para adicionar os objetos do kernel no kernel em execução.

Depois que o driver do dispositivo é sondado com o dispositivo, o dispositivo pode ser usado para as operações. O dispositivo EEPROM pode ser lido/escrito após a inicialização do driver da EEPROM no kernel Linux. O driver da EEPROM inicializa o dispositivo e fornece a capacidade ao kernel Linux para ler/escrever a EEPROM.

Vamos dar um exemplo do driver de dispositivo EEPROM como AT24, o código -fonte do dispositivo pode ser encontrado no link: https: // github.com/torvalds/linux/blob/master/drivers/misc/eeprom/at24.c

Esse driver suporta um número muito amplo de dispositivos EEPROM, conforme descrito nos comentários do motorista atmel at24c ou * microchip 24lc, etc.

A seguir, as informações da árvore do dispositivo a serem adicionadas para criar uma instância do dispositivo:

EEPROM@50
compatível = "atmel, 24c32";
reg = <0x50>;
PageSize = <32>;

Isso deve ser adicionado ao nó do controlador i2C específico, onde este dispositivo EEPROM está conectado.

Como podemos ver, há uma string compatível. Esta é a informação usada pelo kernel Linux para localizar o driver do dispositivo do dispositivo EEPROM.

Para obter as informações sobre os dispositivos e dispositivos presentes no sistema Linux, as entradas do SYSFS são o melhor lugar.

Para todos os dispositivos e driver no sistema, as entradas do SYSFS serão criadas pelo kernel. O usuário pode consultar esses arquivos SYSFS para diagnosticar o sistema.

Se virmos o conteúdo do diretório SYS no kernel Linux:


/sys/ônibus: Todos os ônibus presentes no sistema estão listados dentro disso.

O barramento i2c também pode ser visto. Como estávamos discutindo o exemplo do dispositivo i2C. Dentro do diretório de ônibus, temos o diretório de ônibus i2C.

Para qualquer ônibus no SYSFS, teremos todos os dispositivos e motoristas presentes naquele ônibus. Vamos ver o conteúdo do barramento i2C:

Se navegarmos ainda mais no diretório de dispositivos e drivers, obteremos a lista completa de dispositivos e drivers conhecidos pelo kernel Linux.

Dentro dos dispositivos, podemos ver que existem vários ônibus I2C presentes no sistema. I2C-0, I2C-1, I2C-5, etc., são diferentes ônibus I2C. 0-0018 e 0-001A são os dispositivos de escravos no I2C-0. 1-0050 e 1-0068 são os dispositivos escravos i2c no ônibus não. 1 i.e. I2C-1.

Dentro do diretório do motorista, temos a lista de todos os drivers de dispositivo escravo i2C.

Voltando ao nosso exemplo de dispositivo EEPROM, 1-0050 é o dispositivo escravo da EEPROM. Se mergulharmos no diretório 1-0050, veremos algo como abaixo:


Isso nos forneceu o conhecimento do driver que está controlando este dispositivo. No instantâneo, podemos ver o driver AT24 controla a EEPROM presente no sistema. Este é o driver que está ligado a este dispositivo EEPROM.

Para acessar o dispositivo EEPROM do espaço do usuário, o Driver criou o arquivo "EEPROM", que também pode ser visto no instantâneo.

Para ler os dados de 8K EEPROM e despejar no arquivo, o comando dd pode ser usado como abaixo:

dd if =/sys/bus/i2c/dispositivos/1-0050/eeprom de = eeprom_data.Bin BS = contagem de 1k = 8

Como pode ser visto dos troncos, 8K bytes são lidos na EEPROM e escritos para o EEPROM_DATA.arquivo de bin. Este arquivo bin terá os dados da EEPROM. O comando dd é o comando mais popular e comumente usado no mundo Linux.

Assim como este dispositivo EEPROM, outros dispositivos I2C também devem seguir as diretrizes fornecidas pelo Linux Kernel. Outros dispositivos I2C podem ser RTC, tela de toch, etc. No geral, essa estrutura de driver de dispositivo é aplicável até aos dispositivos fora do escopo i2C.

Pode ser um dispositivo SPI ou qualquer outro dispositivo. Haverá uma instância do dispositivo a ser criada e outra instância do driver. O dispositivo e o driver serão vinculados/conectados via driver de barramento. Esta é a estrutura genérica do driver de dispositivo no Linux.

Encadernação e desbaste do motorista

A ligação do driver com o dispositivo é o processo de associação ou vinculação do driver ao dispositivo que pode controlá -lo ou entender. Desbaste é o processo reverso, quando desvincularmos o driver com o dispositivo.

Existem arquivos Sysfs presentes em todos os drivers. Os nomes de arquivos são vinculados e desbotados. Estes são os arquivos que podem ser usados ​​para vincular e despir. A seguir, o instantâneo do driver da EEPROM AT24:

Desbobrar o driver com dispositivo

Como podemos ver, a instância do dispositivo está presente dentro do AT24. Isso significa que o dispositivo já está vinculado. Podemos ecoar o nome do dispositivo para desbaste o driver do dispositivo.

Desparecer o driver com o dispositivo pode ser visto no instantâneo.

eco 1-0050>/sys/barramento/i2c/drivers/at24/não; é o comando que fez o desbaste. Após esse comando, o dispositivo não está presente. Portanto, o dispositivo não está vinculado ao driver agora.

Ligação do driver com dispositivo

eco 1-0050>/sys/barramento/i2c/drivers/at24/bind; é o comando que faz a ligação do driver com o dispositivo.

O comando primeiro LS mostra que os detalhes do dispositivo não estão presentes no diretório AT24, o que significa que o dispositivo não está vinculado a nenhum driver. Em segundo lugar, emitimos um comando para vincular o dispositivo ao driver. Como resultado, vimos que as informações do dispositivo são preenchidas dentro do diretório do driver. Portanto, o motorista fica vinculado ao dispositivo com sucesso.

O dispositivo só pode ser acessado após a ligação bem -sucedida do driver com o dispositivo.

Conclusão

Discutimos a estrutura do driver do dispositivo no kernel Linux com um exemplo de dispositivo i2c EEPROM. Exploramos a criação do dispositivo EEPROM na árvore de dispositivos e a ligação do driver com o dispositivo. Alguma exploração foi feita nos arquivos SYSFS, que fornecem informações de diagnóstico muito boas sobre dispositivos e motoristas presentes no kernel Linux. Vimos um exemplo de acesso à EEPROM com a ajuda do comando dd. Também entendemos a estrutura genérica envolvendo dispositivos, drivers e ônibus. Por fim, também nos referimos as maneiras de vincular e desbloquear motoristas e dispositivos manualmente do espaço do usuário.