1.概述
本文主要講述了Linux的PWM驅動框架、實現方法、驅動添加方法和調試方法。
示例Linux內核版本:6.2.8。
2.原理
PWM是Pulse-Width Modulation的簡稱,中文譯作脈沖寬度調制。 作為一種調制技術,PWM的原理是通過調整周期性波形的高電平時間寬度,從而改變有效信號的占空比,實現對設備的供電控制。 PWM技術的常見應用領域包括屏幕背光亮度調節、電機轉速控制和風扇轉速控制等。
Linux內核支持PWM驅動框架,該驅動框架采用結構體數據類型對PWM控制器和PWM信號進行了抽象,提供了PWM驅動框架核心代碼和sysfs接口代碼。 PWM驅動開發者可以方便地利用該驅動框架,添加特定PWM控制器的驅動程序,并使用sysfs接口進行功能調試。
3.驅動框架及實現方法
3.1驅動框架源碼
PWM驅動框架的主要源碼:
./include/linux/pwm.h //PWM驅動框架頭文件
./drivers/pwm/core.c //PWM驅動框架核心代碼
./drivers/pwm/sysfs.c //PWM驅動框架sysfs接口代碼
3.2驅動框架數據結構
(1)struct pwm_chip結構體,表示PWM控制器。
驅動開發者可以根據需要設計專用的PWM控制器結構體,以struct pwm_chip結構體作為一個成員變量,下面是一個示例,在./drivers/pwm/pwm-ab8500.c驅動中定義。
(2)struct pwm_ops結構體,包括PWM控制器的操作函數。 其中應該由驅動開發者實現的2個基礎函數為apply函數和get_state函數; apply函數用于配置PWM控制器,包括配置PWM信號的使能狀態、周期、占空比、極性等; get_state函數用于在注冊PWM控制器時獲取指定PWM通道信號的初始狀態,包括使能狀態、周期、占空比、極性等。
(3)struct pwm_device結構體,表示PWM控制器輸出的PWM信號。
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,將probe和remove函數分別命名為xx_pwm_probe和xx_pwm_remove,將PWM控制器結構體定義為struct xx_pwm_chip。./drivers/pwm路徑下文件如下。
(2)apply函數和get_state函數定義
根據PWM控制器手冊,由驅動開發者定義apply函數和get_state函數。
(3)xx_pwm_probe函數定義
xx_pwm_probe函數的實現方法為:首先對PWM控制器結構體struct 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-cells數量,按需添加中斷、時鐘、復位等屬性。
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通道信號
echo n > /sys/class/pwm/pwmchip0/export
//n為通道編號
(3)設置PWM信號周期
echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period
//pvalue為周期值
(4)設置PWM信號占空比
echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
//dvalue為有效電平寬度值
(5)使能某個PWM通道信號
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
(6)禁止某個PWM通道信號
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
-
控制器
+關注
關注
114文章
16959瀏覽量
182857 -
內核
+關注
關注
3文章
1408瀏覽量
41084 -
PWM
+關注
關注
116文章
5364瀏覽量
217993 -
Linux
+關注
關注
87文章
11456瀏覽量
212750 -
驅動框架
+關注
關注
0文章
14瀏覽量
4138
發布評論請先 登錄
RT-Thread系統的PWM驅動框架設計實現
嵌入式Linux的USB驅動設計

Linux驅動程序缺陷檢測研究

Linux DMA Engine框架的介紹
如何使用Linux內核實現USB驅動程序框架

嵌入式Linux驅動開發從基礎到框架

Linux驅動分析之RTC框架

Linux Regmap 驅動框架

評論