
저는 GPIO 핀 102에 버저가 연결된 ARM 시스템으로 작업하고 있습니다. 시스템은 Linux 2.6을 실행하므로 /sys/class/gpio의 핀에 대한 sysfs 인터페이스가 있습니다. 처음 부저를 작동시키려고 시도했을 때 다음과 같은 것을 시도했습니다.
# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value
놀랍게도 기계에서는 아무 소리도 나지 않았습니다. 그런데 WinCE용으로 작성된 버저 드라이버의 소스 코드를 확인해 보니 GPIO 멀티플렉서가 특정 모드로 설정되어 있어야 한다는 사실을 발견했습니다. 나는 소프트웨어 분야 밖의 일에는 별로 능숙하지 않기 때문에 이것이 무엇을 의미하는지 아직도 정확히 모르겠습니다. 그러나 머신에서 Linux를 부팅하는 데 사용되는 U-Boot 버전의 소스 코드가 제공되었으므로 보드의 헤더 파일( u-boot/board/somecompany/someboard/someboard.h
)에 다음 코드 줄을 추가하여 GPIO 뱅크 모드를 설정하도록 편집할 수 있었습니다.
MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));
부트로더를 다시 컴파일하고 복사한 다음 머신을 재부팅하고 위의 테스트를 다시 실행했더니 제대로 작동했습니다! 나는 내 임무를 완수했다고 생각했다. 하지만 GPIO 뱅크가 다른 운전자에게 사용될 수 있기 때문에 제가 한 방식이 안전하지 않을 수도 있다는 통보를 받았습니다. debugfs를 마운트하고 확인하면 /sys/kernel/debug/gpio
GPIO 뱅크의 다른 GPIO 핀이 드라이버에 사용되고 있는 것으로 보입니다.
그런 다음 다른 접근 방식을 시도했습니다. 경고음은 부팅 시 가장 중요하기 때문에 경고음이 울리도록 부트로더에 일부 코드를 추가하기로 결정했습니다.
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));
이는 부트로더가 단일 스레드이기 때문에 작동하므로 GPIO 뱅크를 놓고 싸울 필요가 없습니다. 마지막 줄은 GPIO 뱅크 다중화 모드를 코드에서 이전에 설정된 방식으로 재설정합니다.
부트로더 실행 중에 경고음이 성공적으로 울리고 GPIO 뱅크가 필요한 상태로 복원되므로 드라이버를 방해하지 않는다고 알 수 있습니다. 그러나 부트로더 시퀀스 중 경고음이 반드시 전체 부팅이 성공했음을 나타내는 것은 아니기 때문에 원하는 만큼 유용하지는 않습니다. 대신 성공적인 부팅이나 기타 이벤트를 표시하기 위해 Linux 내에서 부저에 액세스할 수 있다면 훨씬 더 좋을 것입니다. 그러나 Linux에서 GPIO 뱅크 다중화 모드 설정에 대한 문서를 찾는 데 행운이 없습니다. 그러므로 내 질문은 다음과 같습니다.
커널 공간에서 GPIO 뱅크의 다중화 모드를 설정하는 방법이 있습니까?