Definir GPIO Banco Mux Mode

1

Estou trabalhando com uma máquina ARM que possui uma campainha conectada ao pino 102 do GPIO. A máquina está executando o Linux 2.6, portanto, temos uma interface sysfs para os pinos em / sys / class / gpio. Quando tentei acionar a campainha pela primeira vez, tentei algo como o seguinte:

# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value

Para meu espanto, a máquina não fez nenhum barulho. No entanto, verificando o código-fonte do driver da campainha escrito para WinCE, notei que o multiplexador GPIO deveria estar configurado em um determinado modo. Eu não sou muito bom com coisas fora do software-terra, então eu ainda não sei exatamente o que isso significa. No entanto, como recebi o código-fonte da versão do U-Boot usada para inicializar o Linux na máquina, consegui editá-lo para definir o modo de banco GPIO adicionando essa linha de código ao arquivo de cabeçalho da placa ( u-boot/board/somecompany/someboard/someboard.h ):

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

Eu re-compilei o gerenciador de inicialização, copiei-o, reiniciei a máquina e executei novamente o teste acima e funcionou! Eu pensei que tinha realizado minha tarefa. No entanto, fui informado de que a maneira como fiz isso pode não ter sido segura, já que o banco do GPIO pode ser usado para outros drivers. Quando eu montei debugfs e verifiquei /sys/kernel/debug/gpio , parece que outros pinos GPIO no banco de GPIO estão sendo usados para drivers.

Eu então tentei uma abordagem diferente - já que o bipe é mais importante na inicialização, eu decidi tentar adicionar algum código ao bootloader para bipar:

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

if(!gpio_request(102, "buzzer")){
    gpio_direction_output(102, 1);
    udelay (500000);
    gpio_direction_output(102, 0);
}

MUX_VAL(CP(CCDC_DATA3), (IEN  | PTD | DIS | M0));

Isso funciona já que o gerenciador de inicialização é single-threaded, então ele não precisa lutar pelo banco de dados GPIO. A última linha redefine o modo mux do banco GPIO para a forma como é definido anteriormente no código.

Isso bipa com sucesso durante a execução do bootloader e, até onde eu saiba, ele não interfere em nenhum driver, pois o banco do GPIO é restaurado para o estado requerido. No entanto, não é tão útil quanto eu gostaria, porque o bipe durante a seqüência do bootloader não indica necessariamente que a inicialização completa foi bem-sucedida. Em vez disso, seria muito melhor se eu pudesse acessar a campainha de dentro do Linux, para indicar uma inicialização bem-sucedida ou outros eventos. No entanto, não estou tendo a menor chance de encontrar documentação sobre como configurar um modo mux de banco GPIO no Linux. Minha pergunta, portanto, é a seguinte:

Existe uma maneira de definir o modo mux de um banco GPIO do espaço do kernel?

    
por millinon 01.06.2017 / 21:52

0 respostas