Definir modo GPIO Bank Mux

Definir modo GPIO Bank Mux

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 fazer a campainha funcionar pela primeira vez, tentei algo como o seguinte:

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

Para minha consternação, a máquina não fez nenhum barulho. No entanto, verificando o código-fonte do driver de campainha escrito para WinCE, percebi que o multiplexador GPIO deveria estar configurado em um determinado modo. Não sou muito bom com coisas fora do mundo do software, então ainda não tenho certeza do que isso significa. Porém, 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 do banco GPIO adicionando esta 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));

Recompilei o bootloader, copiei-o, reiniciei a máquina e executei novamente o teste acima e funcionou! Achei que tinha cumprido minha tarefa. Porém, fui informado que a forma como fiz pode não ter sido segura, já que o banco GPIO pode ser utilizado para outros motoristas. Quando monto debugfs e check /sys/kernel/debug/gpio, parece que outros pinos GPIO no banco GPIO estão sendo usados ​​para drivers.

Então tentei uma abordagem diferente - como o bipe é mais importante na inicialização, decidi tentar adicionar algum código ao bootloader para emitir um bipe:

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 porque o bootloader é single-threaded, então não precisa brigar pelo banco GPIO. A última linha redefine o modo mux do banco GPIO para a forma como foi definido anteriormente no código.

Isso emite um sinal sonoro durante a execução do bootloader e, até onde sei, não interfere em nenhum driver, já que o banco GPIO é restaurado ao estado necessário. No entanto, não é tão útil quanto eu gostaria, porque o bipe durante a sequê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 sorte em 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 no espaço do kernel?

informação relacionada