>  기사  >  시스템 튜토리얼  >  리눅스 PWM 드라이버

리눅스 PWM 드라이버

王林
王林앞으로
2024-02-05 15:40:031220검색

1. 개요

이 글에서는 개발자가 이 기능을 더 잘 이해하고 사용할 수 있도록 구현 원리, 드라이버 추가 방법 및 디버깅 방법을 포함하여 Linux의 PWM(Pulse-Width Modulation) 드라이버 프레임워크에 대해 심층적으로 소개합니다.

이 문서에 표시된 샘플 Linux 커널 버전은 6.2.8입니다.

2. 원리

PWM 기술은 일반적으로 사용되는 변조 기술로서 주기적인 파형의 높은 수준의 시간 폭을 조정하여 유효 신호의 듀티 사이클을 변경함으로써 장치의 전원 공급 장치를 제어할 수 있습니다. 일반적인 PWM 응용 분야에는 화면 백라이트 밝기 조정, 모터 속도 제어 및 팬 속도 제어가 포함됩니다. Linux 커널은 PWM 드라이버 프레임워크를 지원하고, PWM 컨트롤러 및 PWM 신호의 구조 데이터 유형을 추상화하여 PWM 드라이버 프레임워크 코어 코드와 sysfs 인터페이스 코드를 제공합니다. 개발자는 이 드라이버 프레임워크를 사용하여 고유한 특정 PWM 컨트롤러 드라이버를 쉽게 추가하고 기능 디버깅을 위해 sysfs 인터페이스를 사용할 수 있습니다.

리눅스 PWM 드라이버

드라이버 개발자는 struct pwm_chip 구조를 멤버 변수로 사용하여 필요에 따라 전용 PWM 컨트롤러 구조를 설계할 수 있습니다. 다음은 ./drivers/pwm/pwm-ab8500.c 드라이버에 정의된 예입니다.

리눅스 PWM 드라이버

(2) PWM 컨트롤러의 작동 기능을 포함한 struct pwm_ops 구조. 드라이버 개발자가 구현해야 하는 두 가지 기본 기능은 적용 기능이며, get_state 기능은 PWM 신호의 활성화 상태, 주기, 듀티 사이클, 극성 등을 구성하는 것을 포함하여 PWM 컨트롤러를 구성하는 데 사용됩니다. ; get_state 함수가 사용됩니다. 활성화 상태, 기간, 듀티 사이클, 극성 등을 포함하여 PWM 컨트롤러를 등록할 때 지정된 PWM 채널 신호의 초기 상태를 얻습니다.

리눅스 PWM 드라이버

(3) PWM 컨트롤러의 PWM 신호 출력을 나타내는 struct pwm_device 구조.

리눅스 PWM 드라이버

3.3 드라이버 프레임워크 핵심 기능

(1) pwmchip_add 함수. 새로운 PWM 컨트롤러 장치를 등록하는 데 사용됩니다. ./drivers/pwm/core.c에 정의되어 있습니다.

리눅스 PWM 드라이버

(2) pwmchip_remove 함수. PWM 컨트롤러 장치를 제거하는 데 사용됩니다. ./drivers/pwm/core.c에 정의되어 있습니다.

리눅스 PWM 드라이버

3.4 드라이버의 일반적인 구현 방법

(1) 요약

PWM 드라이버 소스 파일은 ./drivers/pwm 경로에 있습니다. 드라이버 개발자는 해당 소스 파일을 추가해야 합니다. 소스 파일 디자인은 다른 제조업체의 드라이버 코드를 참조할 수 있습니다. 원본 코드의 명명 스타일을 참조하면 새로 추가된 드라이버 소스 파일의 이름을 pwm-xx.c로 지정하고, 프로브 및 제거 기능의 이름을 각각 xx_pwm_probe 및 xx_pwm_remove로 지정하고, PWM 컨트롤러 구조를 struct xx_pwm_chip으로 정의할 수 있습니다. ./drivers/pwm 경로에 있는 파일은 다음과 같습니다.

리눅스 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 드라이버를 활성화합니다. 구성 인터페이스는 다음과 같습니다.

리눅스 PWM 드라이버

4.3 PWM 컨트롤러 장치 트리 노드 추가

장치 트리에 PWM 컨트롤러 장치 트리 노드를 추가합니다. 이 노드의 기본 속성에는 호환성, 레지스터 및 #pwm 셀 수가 포함됩니다. 필요에 따라 인터럽트, 클럭, 재설정 및 기타 속성을 추가합니다.

PWM 컨트롤러 디바이스 트리 설계 방법은 ./Documentation/devicetree/bindings/pwm을 참조하세요.

아래는 PWM 컨트롤러 장치 트리 노드의 예입니다. 참고 문서는 다음과 같습니다:

./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml.

리눅스 PWM 드라이버

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제