GPIO Bank 멀티플렉싱 모드 설정

GPIO Bank 멀티플렉싱 모드 설정

저는 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/gpioGPIO 그룹의 다른 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 그룹의 멀티플렉싱 모드를 설정하는 방법이 있습니까?

관련 정보