#本文將深入介紹Linux的PWM(Pulse-Width Modulation)驅動框架,包括其實作原理、驅動添加方法以及調試方法,以幫助開發者更好地了解和使用此功能。
本文所示範例Linux核心版本為6.2.8。
#PWM技術作為一種常用的調製技術,可以透過調整週期性波形的高電平時間寬度來改變有效訊號的佔空比,從而實現對設備的供電控制。常見的PWM應用領域包括螢幕背光亮度調節、馬達轉速控制和風扇轉速控制等。 Linux核心支援PWM驅動框架,透過抽象化PWM控制器和PWM訊號的結構體資料類型,提供PWM驅動框架核心程式碼和sysfs介面程式碼。開發者可以使用該驅動框架輕鬆新增自己的特定PWM控制器驅動程序,並使用sysfs介面進行功能偵錯。
驅動開發者可以根據需要設計專用的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控制器結構定義為structstruct 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
以上是Linux之PWM驅動的詳細內容。更多資訊請關注PHP中文網其他相關文章!