1.概述
本文主要講述了Linux的PWM驅(qū)動框架、實現(xiàn)方法、驅(qū)動添加方法和調(diào)試方法。
示例Linux內(nèi)核版本:6.2.8。
2.原理
PWM是Pulse-Width Modulation的簡稱,中文譯作脈沖寬度調(diào)制。 作為一種調(diào)制技術(shù),PWM的原理是通過調(diào)整周期性波形的高電平時間寬度,從而改變有效信號的占空比,實現(xiàn)對設(shè)備的供電控制。 PWM技術(shù)的常見應用領(lǐng)域包括屏幕背光亮度調(diào)節(jié)、電機轉(zhuǎn)速控制和風扇轉(zhuǎn)速控制等。
Linux內(nèi)核支持PWM驅(qū)動框架,該驅(qū)動框架采用結(jié)構(gòu)體數(shù)據(jù)類型對PWM控制器和PWM信號進行了抽象,提供了PWM驅(qū)動框架核心代碼和sysfs接口代碼。 PWM驅(qū)動開發(fā)者可以方便地利用該驅(qū)動框架,添加特定PWM控制器的驅(qū)動程序,并使用sysfs接口進行功能調(diào)試。
3.驅(qū)動框架及實現(xiàn)方法
3.1驅(qū)動框架源碼
PWM驅(qū)動框架的主要源碼:
./include/linux/pwm.h //PWM驅(qū)動框架頭文件
./drivers/pwm/core.c //PWM驅(qū)動框架核心代碼
./drivers/pwm/sysfs.c //PWM驅(qū)動框架sysfs接口代碼
3.2驅(qū)動框架數(shù)據(jù)結(jié)構(gòu)
(1)struct pwm_chip結(jié)構(gòu)體,表示PWM控制器。
驅(qū)動開發(fā)者可以根據(jù)需要設(shè)計專用的PWM控制器結(jié)構(gòu)體,以struct pwm_chip結(jié)構(gòu)體作為一個成員變量,下面是一個示例,在./drivers/pwm/pwm-ab8500.c驅(qū)動中定義。
(2)struct pwm_ops結(jié)構(gòu)體,包括PWM控制器的操作函數(shù)。 其中應該由驅(qū)動開發(fā)者實現(xiàn)的2個基礎(chǔ)函數(shù)為apply函數(shù)和get_state函數(shù); apply函數(shù)用于配置PWM控制器,包括配置PWM信號的使能狀態(tài)、周期、占空比、極性等; get_state函數(shù)用于在注冊PWM控制器時獲取指定PWM通道信號的初始狀態(tài),包括使能狀態(tài)、周期、占空比、極性等。
(3)struct pwm_device結(jié)構(gòu)體,表示PWM控制器輸出的PWM信號。
3.3驅(qū)動框架核心函數(shù)
(1)pwmchip_add函數(shù)。 用于注冊一個新的PWM控制器設(shè)備。 在./drivers/pwm/core.c中定義。
(2)pwmchip_remove函數(shù)。 用于移除一個PWM控制器設(shè)備。 在./drivers/pwm/core.c中定義。
3.4驅(qū)動典型實現(xiàn)方法
(1) 概述
PWM驅(qū)動源文件位于./drivers/pwm路徑下,需要驅(qū)動開發(fā)者添加相應的源文件即可,源文件設(shè)計可參考其他廠家的驅(qū)動代碼。參考原有代碼的命名風格,可以將新添加的驅(qū)動源文件命名為pwm-xx.c,將probe和remove函數(shù)分別命名為xx_pwm_probe和xx_pwm_remove,將PWM控制器結(jié)構(gòu)體定義為struct xx_pwm_chip。./drivers/pwm路徑下文件如下。
(2)apply函數(shù)和get_state函數(shù)定義
根據(jù)PWM控制器手冊,由驅(qū)動開發(fā)者定義apply函數(shù)和get_state函數(shù)。
(3)xx_pwm_probe函數(shù)定義
xx_pwm_probe函數(shù)的實現(xiàn)方法為:首先對PWM控制器結(jié)構(gòu)體struct xx_pwm_chip變量進行初始化,然后調(diào)用PWM驅(qū)動框架核心函數(shù)pwmchip_add注冊一個新的PWM控制器設(shè)備。
(4)xx_pwm_remove函數(shù)定義
xx_pwm_remove函數(shù)的實現(xiàn)方法為:調(diào)用PWM驅(qū)動框架核心函數(shù)pwmchip_remove移除一個PWM控制器設(shè)備。
4.驅(qū)動添加方法
4.1添加驅(qū)動源文件
按3.4節(jié)所述方法,編寫驅(qū)動源文件pwm-xx.c,添加到./drivers/pwm路徑下。
4.2添加編譯支持
(1)修改./drivers/pwm路徑下的Kconfig文件,添加所添加的PWM驅(qū)動配置選項。
(2)修改./drivers/pwm路徑下的Makefile文件,添加pwm-xx.c的編譯選項。
(3)在memuconfig界面,使能所添加的PWM驅(qū)動。 配置界面如下所示。
4.3添加PWM控制器設(shè)備樹節(jié)點
在設(shè)備樹添加PWM控制器設(shè)備樹節(jié)點。 該節(jié)點的基本屬性包括兼容性、寄存器和#pwm-cells數(shù)量,按需添加中斷、時鐘、復位等屬性。
PWM控制器設(shè)備樹設(shè)計方法可參考./Documentation/devicetree/bindings/pwm。
下面是PWM控制器設(shè)備樹節(jié)點的示例。 參考文檔如下:
./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml。
5.調(diào)試方法
使用sysfs接口對PWM驅(qū)動進行功能調(diào)試,主要調(diào)試命令示例如下。
(1)查看PWM控制器節(jié)點
ls /sys/class/pwm/pwmchip0
(2)打開指定PWM通道信號
echo n > /sys/class/pwm/pwmchip0/export
//n為通道編號
(3)設(shè)置PWM信號周期
echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period
//pvalue為周期值
(4)設(shè)置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
-
控制器
+關(guān)注
關(guān)注
112文章
16464瀏覽量
179613 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1383瀏覽量
40442 -
PWM
+關(guān)注
關(guān)注
114文章
5201瀏覽量
214959 -
Linux
+關(guān)注
關(guān)注
87文章
11351瀏覽量
210497 -
驅(qū)動框架
+關(guān)注
關(guān)注
0文章
14瀏覽量
4076
發(fā)布評論請先 登錄
相關(guān)推薦
Linux 驅(qū)動 = 軟件框架 + 硬件操作
RT-Thread系統(tǒng)的PWM驅(qū)動框架設(shè)計實現(xiàn)
嵌入式Linux的USB驅(qū)動設(shè)計
![嵌入式<b class='flag-5'>Linux</b>的USB<b class='flag-5'>驅(qū)動</b>設(shè)計](https://file.elecfans.com/web2/M00/48/F9/pYYBAGKhtDGAHE3YAAAJku6lAvA733.jpg)
Linux驅(qū)動程序缺陷檢測研究
![<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動</b>程序缺陷檢測研究](https://file.elecfans.com/web2/M00/49/61/poYBAGKhwKqAYf13AAAU_NUFayQ946.jpg)
想要駕馭Linux驅(qū)動開發(fā),必須深刻理解Linux總線設(shè)備驅(qū)動框架
![想要駕馭<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動</b>開發(fā),必須深刻理解<b class='flag-5'>Linux</b>總線設(shè)備<b class='flag-5'>驅(qū)動</b><b class='flag-5'>框架</b>](https://file.elecfans.com/web1/M00/4C/08/o4YBAFqzHkOAWvUpAABTYB4ncho690.png)
Linux DMA Engine框架的介紹
你對Linux總線設(shè)備驅(qū)動框架是否了解
如何使用Linux內(nèi)核實現(xiàn)USB驅(qū)動程序框架
![如何使用<b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>實現(xiàn)</b>USB<b class='flag-5'>驅(qū)動</b>程序<b class='flag-5'>框架</b>](https://file.elecfans.com/web1/M00/CE/DE/pIYBAF-lIPeADODWAAI0W5hPQOg995.png)
嵌入式Linux驅(qū)動開發(fā)從基礎(chǔ)到框架
![嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動</b>開發(fā)從基礎(chǔ)到<b class='flag-5'>框架</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux驅(qū)動分析之RTC框架
![<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動</b>分析之RTC<b class='flag-5'>框架</b>](https://file1.elecfans.com/web2/M00/88/BC/wKgZomRwW7yAC1J9AAABitekKBY207.jpg)
Linux Regmap 驅(qū)動框架
![<b class='flag-5'>Linux</b> Regmap <b class='flag-5'>驅(qū)動</b><b class='flag-5'>框架</b>](https://file1.elecfans.com/web2/M00/8C/28/wKgaomSmiLGAWQXqAADe40k7Wh8718.jpg)
評論