이 글에서는 개발자가 이 기능을 더 잘 이해하고 사용할 수 있도록 구현 원리, 드라이버 추가 방법 및 디버깅 방법을 포함하여 Linux의 PWM(Pulse-Width Modulation) 드라이버 프레임워크에 대해 심층적으로 소개합니다.
이 문서에 표시된 샘플 Linux 커널 버전은 6.2.8입니다.
PWM 기술은 일반적으로 사용되는 변조 기술로서 주기적인 파형의 높은 수준의 시간 폭을 조정하여 유효 신호의 듀티 사이클을 변경함으로써 장치의 전원 공급 장치를 제어할 수 있습니다. 일반적인 PWM 응용 분야에는 화면 백라이트 밝기 조정, 모터 속도 제어 및 팬 속도 제어가 포함됩니다. Linux 커널은 PWM 드라이버 프레임워크를 지원하고, PWM 컨트롤러 및 PWM 신호의 구조 데이터 유형을 추상화하여 PWM 드라이버 프레임워크 코어 코드와 sysfs 인터페이스 코드를 제공합니다. 개발자는 이 드라이버 프레임워크를 사용하여 고유한 특정 PWM 컨트롤러 드라이버를 쉽게 추가하고 기능 디버깅을 위해 sysfs 인터페이스를 사용할 수 있습니다.
드라이버 개발자는 struct pwm_chip 구조를 멤버 변수로 사용하여 필요에 따라 전용 PWM 컨트롤러 구조를 설계할 수 있습니다. 다음은 ./drivers/pwm/pwm-ab8500.c 드라이버에 정의된 예입니다.
(2) PWM 컨트롤러의 작동 기능을 포함한 struct pwm_ops 구조. 드라이버 개발자가 구현해야 하는 두 가지 기본 기능은 적용 기능이며, get_state 기능은 PWM 신호의 활성화 상태, 주기, 듀티 사이클, 극성 등을 구성하는 것을 포함하여 PWM 컨트롤러를 구성하는 데 사용됩니다. ; get_state 함수가 사용됩니다. 활성화 상태, 기간, 듀티 사이클, 극성 등을 포함하여 PWM 컨트롤러를 등록할 때 지정된 PWM 채널 신호의 초기 상태를 얻습니다.
(3) PWM 컨트롤러의 PWM 신호 출력을 나타내는 struct pwm_device 구조.
3.3 드라이버 프레임워크 핵심 기능
(1) pwmchip_add 함수. 새로운 PWM 컨트롤러 장치를 등록하는 데 사용됩니다. ./drivers/pwm/core.c에 정의되어 있습니다.
(2) pwmchip_remove 함수. PWM 컨트롤러 장치를 제거하는 데 사용됩니다. ./drivers/pwm/core.c에 정의되어 있습니다.
3.4 드라이버의 일반적인 구현 방법
(1) 요약
PWM 드라이버 소스 파일은 ./drivers/pwm 경로에 있습니다. 드라이버 개발자는 해당 소스 파일을 추가해야 합니다. 소스 파일 디자인은 다른 제조업체의 드라이버 코드를 참조할 수 있습니다. 원본 코드의 명명 스타일을 참조하면 새로 추가된 드라이버 소스 파일의 이름을 pwm-xx.c로 지정하고, 프로브 및 제거 기능의 이름을 각각 xx_pwm_probe 및 xx_pwm_remove로 지정하고, PWM 컨트롤러 구조를 struct xx_pwm_chip으로 정의할 수 있습니다. ./drivers/pwm 경로에 있는 파일은 다음과 같습니다.
(2) 적용 함수 및 get_state 함수 정의
PWM 컨트롤러 매뉴얼에 따르면 Apply 함수와 get_state 함수는 드라이버 개발자가 정의합니다.
(3)xx_pwm_probe 함수 정의
xx_pwm_probe 함수의 구현 방법은 다음과 같습니다. 먼저 PWM 컨트롤러 구조 구조체 xx_pwm_chip 변수를 초기화한 다음 PWM 드라이버 프레임워크 핵심 함수 pwmchip_add를 호출하여 새 PWM 컨트롤러 장치를 등록합니다.
(4)xx_pwm_remove 함수 정의
xx_pwm_remove 함수는 PWM 드라이버 프레임워크 핵심 함수 pwmchip_remove를 호출하여 PWM 컨트롤러 장치를 제거함으로써 구현됩니다.
4. 드라이버 추가 방법
4.1 드라이버 소스 파일 추가
3.4절에 설명된 방법에 따라 드라이버 소스 파일 pwm-xx.c를 작성하고 ./drivers/pwm 경로에 추가합니다.
4.2에는 컴파일 지원이 추가되었습니다
(1) ./drivers/pwm 경로에서 Kconfig 파일을 수정하고 추가된 PWM 드라이버 구성 옵션을 추가합니다.
(2) ./drivers/pwm 경로의 Makefile 파일을 수정하고 pwm-xx.c의 컴파일 옵션을 추가합니다.
(3) memuconfig 인터페이스에서 추가된 PWM 드라이버를 활성화합니다. 구성 인터페이스는 다음과 같습니다.
4.3 PWM 컨트롤러 장치 트리 노드 추가
장치 트리에 PWM 컨트롤러 장치 트리 노드를 추가합니다. 이 노드의 기본 속성에는 호환성, 레지스터 및 #pwm 셀 수가 포함됩니다. 필요에 따라 인터럽트, 클럭, 재설정 및 기타 속성을 추가합니다.
PWM 컨트롤러 디바이스 트리 설계 방법은 ./Documentation/devicetree/bindings/pwm을 참조하세요.
아래는 PWM 컨트롤러 장치 트리 노드의 예입니다. 참고 문서는 다음과 같습니다:
./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml.
5.디버깅 방법
sysfs 인터페이스를 사용하여 PWM 드라이버를 기능적으로 디버깅합니다. 주요 디버깅 명령의 예는 다음과 같습니다.
(1) PWM 컨트롤러 노드 보기
ls /sys/class/pwm/pwmchip0
(2) 지정된 PWM 채널 신호를 켭니다
에코 n > /sys/class/pwm/pwmchip0/export
//n은 채널 번호입니다
(3) PWM 신호 주기 설정
echo p값 > /sys/class/pwm/pwmchip0/pwm0/기간
//pvalue는 기간 값입니다
(4)PWM 신호 듀티 사이클 설정
echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
//dvalue는 유효 레벨 너비 값입니다
(5) 특정 PWM 채널 신호 활성화
에코 1 > /sys/class/pwm/pwmchip0/pwm0/enable
(6) 특정 PWM 채널 신호 비활성화
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
위 내용은 리눅스 PWM 드라이버의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!