내가 이것을 원하는 이유는 무엇입니까?
저는 임베디드 장치에서 적외선 신호를 보내기 위해 pwm-ir-tx 커널 모듈을 사용하고 있습니다. 그러나 부팅 중에 PWM 커널 모듈이 로드되면 이 핀이 High가 됩니다. lirc irsend 신호를 사용하여 낮게 설정하는 데 약 10초 정도 걸립니다. IR-LED가 PWM 모드에서만 사용되고 영구적으로 켜지지 않는 경우 원칙적으로 IR-LED를 "오버드라이브"하여 더 밝게 만들 수 있습니다. 그러나 시작하는 동안 10초가 이 전략을 망쳤습니다.
지금까지 내 시스템은 무엇을 하고 있나요(예: 실행 중인 작업, DT-Overlay 파일 등)?
나는 Armbian을 사용하고 있으며 메인라인 커널의 pwm-ir-tx 드라이버를 수정하여 전송 후 상태가 낮게 보장되도록 했습니다(듀티 사이클을 0으로 설정하고 장치에서 PWM 채널을 비활성화하면 무작위입니다). 1 또는 0).
저는 장치 트리 오버레이를 사용하여 pwm 및 pwm-ir-tx를 활성화하고 있습니다.
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun4i-a10";
fragment@0 {
target = <&pwm>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&pwm0_pin>, <&pwm1_pin>;
status = "okay";
};
};
fragment@1 {
target-path = "/";
__overlay__ {
pwm-ir-transmitter {
compatible = "pwm-ir-tx";
pwms = <&pwm 0 0 0>;
};
};
};
};
부팅하면 pwm-sun4i 모듈과 pwm-ir-tx가 로드되고 /dev/lircx 문자 장치를 사용할 수 있습니다. LED를 끄기 위해 LED를 끄는 장치 항목 "After=lircd.service"를 사용하여 systemd 서비스 "lircd-out"을 활성화했지만 부팅 프로세스 후 약 10초 동안 실행됩니다.
DT 오버레이의 모듈을 "비활성화"로 설정한 다음 modprobe를 사용하여 로드해도 효과가 없습니다(pwm 또는 rc 장치 또는 /dev/lircx 문자 장치가 sysfs에 생성되지 않음). 어쩌면 이러한 모듈이 내장되어 있기 때문일 수도 있지만(즉, .config 파일에서 "M"이 아닌 "Y"로 구성됨), 제 이해가 여전히 약간 모호하다는 점을 인정해야 합니다.
이상적인 것은 무엇입니까?
pwm-sun4i가 로드된 후 스크립트를 실행하여 pwm 핀을 낮게 설정한 다음 pwm-ir-tx를 로드할 수 있도록 pwm-sun4i 및 pwm-ir-tx 모듈의 로드를 제어하는 기능. 그러나 앞서 언급했듯이 이러한 모듈을 수동으로 로드하면 sysfs가 해당 모듈에 액세스할 수 없습니다.
또는fragment@0의 매개변수를 pwm에 전달하여 low로 설정할 수 있습니다. 하지만 어떻게 해야 할지 모르겠고, pwm-sun4i.c 코드에서도 이를 허용하는 내용이 전혀 보이지 않습니다. 업데이트와의 호환성을 유지하기 위해 커널 소스 코드를 수정하고 싶지 않습니다.
어떤 제안이 있으십니까?
답변1
이에 일치하는 udev 규칙을 만듭니다.
"모듈이 로드된 후" 스크립트를 실행할 필요는 없습니다. 이는 특정 장치를 다루므로 "장치가 감지된 후" 실행하는 것이 더 좋습니다. 그것은 중요하지 않습니다어떻게해당 장치는 커널이 "새" 장치로 보고하는 한 작동합니다.
즉, 모듈은 장치와 마찬가지로 /sys에 존재합니다. 즉, udev 규칙을 트리거하고 해당 모듈에 대해 시스템화된 .device 단위를 생성할 수도 있습니다.
예를 들어 pwm-sun4i가 로드되자마자 서비스를 트리거하려면 다음 udev 규칙을 사용합니다.
ACTION=="add", SUBSYSTEM=="module", KERNEL=="pwl-sun4i", \
TAG+="systemd", ENV{SYSTEMD_WANTS}+="fixup-pwl.service"
간단한 일회성 명령을 실행하려면 다음을 수행하십시오.
ACTION=="add", SUBSYSTEM=="module", KERNEL=="pwl-sun4i", RUN+="/etc/fix-pwl.sh"