Linux 4.8+의 관용적 GPIO 제어

Linux 4.8+의 관용적 GPIO 제어

GPIO의 사용자 공간 인터페이스는변경됨Linux 4.8에서는 문자 장치를 위해 이전 sysfs 인터페이스가 더 이상 사용되지 않습니다. 나는 이 새로운 모델을 내 사용 사례에 적합한 것으로 변환하는 방법을 찾으려고 노력하고 있습니다.

GPIO를 사용하여 ARM CPU에서 제어할 수 있는 주변 장치가 있습니다. 따라야 할 시작 순서가 있습니다. 먼저 5V 조정기(별도의 장치)를 켜고, 주변 전원을 켜고, 마지막으로 최소 5밀리초가 지난 후 재설정을 해제합니다. 따라서 3개의 GPIO, 5v_en, power_on 및 Reset_n이 있습니다. 주변기기의 전원 공급부터 작동까지 약 1분 정도 소요되므로 불필요한 재부팅이 발생하지 않습니다. 다른 요구 사항은 펌웨어/구성 업데이트를 완료하기 위해 재설정을 전환해야 하며 주변 장치와 조정기가 꺼지는 저전력 모드가 있어야 한다는 것입니다.

세 가지 옵션을 보았지만 그 중 어느 것도 이상적이지 않았습니다.

이러한 예에서는 gpio0=5v_en, gpio1=power_on 및 gpio2=reset_n을 가정합니다.


옵션 #1: Sysfs(더 이상 사용되지 않음)

cd /sys/class/gpio
echo 0 > export
echo 1 > export
echo 2 > export
echo out > gpio0/direction
echo out > gpio1/direction
echo out > gpio2/direction
echo 1 > gpio0/value
echo 1 > gpio1/value
sleep 1
echo 1 > gpio2/value

위의 내용을 init 스크립트에 넣으세요. 핀 값을 변경해야 할 경우 open값 파일에 새 값을 쓰기만 하면 됩니다. 이것은 나에게 가장 의미가 있습니다. 불행히도 이제는 더 이상 사용되지 않습니다.


옵션 #2:gpioset

gpioset -m signal -b 1 0=1
gpioset -m signal -b 1 1=1
sleep 1
gpioset -m signal -b 1 2=1

위의 내용을 init 스크립트에 넣으세요. 핀 값을 변경해야 할 경우 gpioset프로세스의 PID를 결정하고 kill새 값으로 프로세스를 다시 시작합니다. gpioset이 실행되고 있지 않으면 핀 상태는 기술적으로 "정의되지 않음"입니다. 갈 길이 아닌 것 같습니다.


옵션 #3: 데몬

gpioset을 실행하는 대신 gpio 문자 장치에 대한 열린 파일 설명자를 /dev에 보관하는 것이 유일한 목적인 나만의 사용자 정의 데몬을 작성했습니다. 프로그램은 충돌이 발생하면 관리 중인 모든 GPIO의 상태가 정의되지 않으므로 간단하고 최소화되어야 합니다. 그러나 GPIO를 제어하려는 다른 프로그램과 통신하려면 일종의 IPC도 유지해야 합니다. 기본적으로 GPIO를 사용하려는 항목이 GPIO를 직접 사용하는 것을 방지하기 위해 간접 계층을 설정했습니다.

이것은 완전히 과도하게 엔지니어링된 것처럼 느껴지며 IPC 프로토콜의 초안 작성, 구현 및 문서화는 모든 사람이 원하는 대로 /sys/gpio를 사용하도록 허용하는 것에 비해 정말 짜증납니다.


옵션 #3은 Linux가 향후 GPIO를 관리하기 위해 의도한 방식이지만 이 특정 사용 사례에서는 아무런 이점도 없이 많은 추가 작업을 추가하게 될 것 같습니다. 이 질문을 이해해 주셨으면 좋겠습니다.

  1. 제가 고려하지 않은 것 중 더 의미가 있는 다른 전략이 있습니까?
  2. 정의되지 않은 GPIO 상태로 인한 프로그램 충돌 위험을 줄이려면 어떻게 해야 합니까?

관련 정보