0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux的PWM驅(qū)動(dòng)框架及實(shí)現(xiàn)方法

CHANBAEK ? 來源:嵌入式系統(tǒng)研發(fā) ? 作者:ESDev ? 2023-05-14 15:24 ? 次閱讀

1.概述

本文主要講述了Linux的PWM驅(qū)動(dòng)框架、實(shí)現(xiàn)方法、驅(qū)動(dòng)添加方法和調(diào)試方法。

示例Linux內(nèi)核版本:6.2.8。

2.原理

PWM是Pulse-Width Modulation的簡(jiǎn)稱,中文譯作脈沖寬度調(diào)制。 作為一種調(diào)制技術(shù),PWM的原理是通過調(diào)整周期性波形的高電平時(shí)間寬度,從而改變有效信號(hào)的占空比,實(shí)現(xiàn)對(duì)設(shè)備的供電控制。 PWM技術(shù)的常見應(yīng)用領(lǐng)域包括屏幕背光亮度調(diào)節(jié)、電機(jī)轉(zhuǎn)速控制和風(fēng)扇轉(zhuǎn)速控制等。

Linux內(nèi)核支持PWM驅(qū)動(dòng)框架,該驅(qū)動(dòng)框架采用結(jié)構(gòu)體數(shù)據(jù)類型對(duì)PWM控制器和PWM信號(hào)進(jìn)行了抽象,提供了PWM驅(qū)動(dòng)框架核心代碼和sysfs接口代碼。 PWM驅(qū)動(dòng)開發(fā)者可以方便地利用該驅(qū)動(dòng)框架,添加特定PWM控制器的驅(qū)動(dòng)程序,并使用sysfs接口進(jìn)行功能調(diào)試。

3.驅(qū)動(dòng)框架及實(shí)現(xiàn)方法

3.1驅(qū)動(dòng)框架源碼

PWM驅(qū)動(dòng)框架的主要源碼:

./include/linux/pwm.h //PWM驅(qū)動(dòng)框架頭文件

./drivers/pwm/core.c //PWM驅(qū)動(dòng)框架核心代碼

./drivers/pwm/sysfs.c //PWM驅(qū)動(dòng)框架sysfs接口代碼

3.2驅(qū)動(dòng)框架數(shù)據(jù)結(jié)構(gòu)

(1)struct pwm_chip結(jié)構(gòu)體,表示PWM控制器。

poYBAGRgi-OAAtMoAAEmE9a1D2c384.png

驅(qū)動(dòng)開發(fā)者可以根據(jù)需要設(shè)計(jì)專用的PWM控制器結(jié)構(gòu)體,以struct pwm_chip結(jié)構(gòu)體作為一個(gè)成員變量,下面是一個(gè)示例,在./drivers/pwm/pwm-ab8500.c驅(qū)動(dòng)中定義。

poYBAGRgjAGAO7tRAAAXvxHCN6c010.png

(2)struct pwm_ops結(jié)構(gòu)體,包括PWM控制器的操作函數(shù)。 其中應(yīng)該由驅(qū)動(dòng)開發(fā)者實(shí)現(xiàn)的2個(gè)基礎(chǔ)函數(shù)為apply函數(shù)和get_state函數(shù); apply函數(shù)用于配置PWM控制器,包括配置PWM信號(hào)的使能狀態(tài)、周期、占空比、極性等; get_state函數(shù)用于在注冊(cè)PWM控制器時(shí)獲取指定PWM通道信號(hào)的初始狀態(tài),包括使能狀態(tài)、周期、占空比、極性等。

pYYBAGRgjAyAKgt-AAEsJ-v-fOA964.png

(3)struct pwm_device結(jié)構(gòu)體,表示PWM控制器輸出的PWM信號(hào)。

pYYBAGRgjBSAJZMjAAEK8Fcvqps175.png

3.3驅(qū)動(dòng)框架核心函數(shù)

(1)pwmchip_add函數(shù)。 用于注冊(cè)一個(gè)新的PWM控制器設(shè)備。 在./drivers/pwm/core.c中定義。

poYBAGRgjByAYaalAABNnZd9XME187.png

(2)pwmchip_remove函數(shù)。 用于移除一個(gè)PWM控制器設(shè)備。 在./drivers/pwm/core.c中定義。

pYYBAGRgjCOAHMcnAABijhvKx0A289.png

3.4驅(qū)動(dòng)典型實(shí)現(xiàn)方法

(1) 概述

PWM驅(qū)動(dòng)源文件位于./drivers/pwm路徑下,需要驅(qū)動(dòng)開發(fā)者添加相應(yīng)的源文件即可,源文件設(shè)計(jì)可參考其他廠家的驅(qū)動(dòng)代碼。參考原有代碼的命名風(fēng)格,可以將新添加的驅(qū)動(dòng)源文件命名為pwm-xx.c,將probe和remove函數(shù)分別命名為xx_pwm_probe和xx_pwm_remove,將PWM控制器結(jié)構(gòu)體定義為struct xx_pwm_chip。./drivers/pwm路徑下文件如下。

pYYBAGRgjDyAPI1JAADMoLbs774465.png

(2)apply函數(shù)和get_state函數(shù)定義

根據(jù)PWM控制器手冊(cè),由驅(qū)動(dòng)開發(fā)者定義apply函數(shù)和get_state函數(shù)。

(3)xx_pwm_probe函數(shù)定義

xx_pwm_probe函數(shù)的實(shí)現(xiàn)方法為:首先對(duì)PWM控制器結(jié)構(gòu)體struct xx_pwm_chip變量進(jìn)行初始化,然后調(diào)用PWM驅(qū)動(dòng)框架核心函數(shù)pwmchip_add注冊(cè)一個(gè)新的PWM控制器設(shè)備。

(4)xx_pwm_remove函數(shù)定義

xx_pwm_remove函數(shù)的實(shí)現(xiàn)方法為:調(diào)用PWM驅(qū)動(dòng)框架核心函數(shù)pwmchip_remove移除一個(gè)PWM控制器設(shè)備。

4.驅(qū)動(dòng)添加方法

4.1添加驅(qū)動(dòng)源文件

按3.4節(jié)所述方法,編寫驅(qū)動(dòng)源文件pwm-xx.c,添加到./drivers/pwm路徑下。

4.2添加編譯支持

(1)修改./drivers/pwm路徑下的Kconfig文件,添加所添加的PWM驅(qū)動(dòng)配置選項(xiàng)。

(2)修改./drivers/pwm路徑下的Makefile文件,添加pwm-xx.c的編譯選項(xiàng)。

(3)在memuconfig界面,使能所添加的PWM驅(qū)動(dòng)。 配置界面如下所示。

pYYBAGRgjFSAHkR0AAFpqZTALU0166.png

4.3添加PWM控制器設(shè)備樹節(jié)點(diǎn)

在設(shè)備樹添加PWM控制器設(shè)備樹節(jié)點(diǎn)。 該節(jié)點(diǎn)的基本屬性包括兼容性、寄存器和#pwm-cells數(shù)量,按需添加中斷、時(shí)鐘、復(fù)位等屬性。

PWM控制器設(shè)備樹設(shè)計(jì)方法可參考./Documentation/devicetree/bindings/pwm。

下面是PWM控制器設(shè)備樹節(jié)點(diǎn)的示例。 參考文檔如下:

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

poYBAGRgjGSAeJPUAAB7H1414_w009.png

5.調(diào)試方法

使用sysfs接口對(duì)PWM驅(qū)動(dòng)進(jìn)行功能調(diào)試,主要調(diào)試命令示例如下。

(1)查看PWM控制器節(jié)點(diǎn)

ls /sys/class/pwm/pwmchip0

(2)打開指定PWM通道信號(hào)

echo n > /sys/class/pwm/pwmchip0/export

//n為通道編號(hào)

(3)設(shè)置PWM信號(hào)周期

echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period

//pvalue為周期值

(4)設(shè)置PWM信號(hào)占空比

echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle

//dvalue為有效電平寬度值

(5)使能某個(gè)PWM通道信號(hào)

echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable

(6)禁止某個(gè)PWM通道信號(hào)

echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17013

    瀏覽量

    183228
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1410

    瀏覽量

    41164
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    116

    文章

    5422

    瀏覽量

    218372
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11473

    瀏覽量

    212986
  • 驅(qū)動(dòng)框架
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    4146
收藏 1人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    LinuxPWM驅(qū)動(dòng)

    本文主要講述了LinuxPWM驅(qū)動(dòng)框架實(shí)現(xiàn)方法、驅(qū)動(dòng)
    發(fā)表于 05-25 09:19 ?853次閱讀
    <b class='flag-5'>Linux</b>之<b class='flag-5'>PWM</b><b class='flag-5'>驅(qū)動(dòng)</b>

    linux驅(qū)動(dòng)框架是什么

    編寫linux驅(qū)動(dòng)先看一下驅(qū)動(dòng)框架是什么樣子的。驅(qū)動(dòng)編寫和應(yīng)用層編寫有什么區(qū)別呢?
    發(fā)表于 07-26 08:14

    Linux下的UART驅(qū)動(dòng)框架詳解

    Linux下的UART驅(qū)動(dòng)框架
    發(fā)表于 12-22 07:18

    Linux 驅(qū)動(dòng) = 軟件框架 + 硬件操作

    ??Linux 驅(qū)動(dòng) = 軟件框架 + 硬件操作??驅(qū)動(dòng)程序依賴于 Linux 內(nèi)核,你為開發(fā)板 A 開發(fā)
    發(fā)表于 12-17 07:11

    RT-Thread系統(tǒng)的PWM驅(qū)動(dòng)框架設(shè)計(jì)實(shí)現(xiàn)

    PWM驅(qū)動(dòng)框架PWM(脈沖寬度調(diào)制)簡(jiǎn)單的 PWM 主要兩個(gè)參數(shù):頻率占空比一般用在背光燈等要求不高的地方。高級(jí)特性不太適合通用
    發(fā)表于 05-31 16:28

    嵌入式Linux的USB驅(qū)動(dòng)設(shè)計(jì)

    本文主要介紹了 Linux 平臺(tái)的USB設(shè)備驅(qū)動(dòng)開發(fā)的一般步驟方法和技巧,通過詳細(xì)介紹USB的相關(guān)概念和Linux中USB設(shè)備驅(qū)動(dòng)程序的數(shù)據(jù)
    發(fā)表于 06-08 17:15 ?49次下載
    嵌入式<b class='flag-5'>Linux</b>的USB<b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)

    Linux驅(qū)動(dòng)程序缺陷檢測(cè)研究

    Linux驅(qū)動(dòng)程序缺陷檢測(cè)框架,以及多性質(zhì)制導(dǎo)的符號(hào)執(zhí)行方法,支持針對(duì)多個(gè)缺陷性質(zhì)的快速缺陷檢測(cè)。在LLVM和KLEE的基礎(chǔ)上實(shí)現(xiàn)了提出的
    發(fā)表于 11-21 15:26 ?9次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>程序缺陷檢測(cè)研究

    想要駕馭Linux驅(qū)動(dòng)開發(fā),必須深刻理解Linux總線設(shè)備驅(qū)動(dòng)框架

    想要駕馭Linux驅(qū)動(dòng)開發(fā),必須深刻理解Linux總線設(shè)備驅(qū)動(dòng)框架。之所以會(huì)形成這樣的框架,主要
    的頭像 發(fā)表于 03-22 11:08 ?1.1w次閱讀
    想要駕馭<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>開發(fā),必須深刻理解<b class='flag-5'>Linux</b>總線設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>框架</b>

    Linux DMA Engine框架的介紹

    此會(huì)話描述如何從設(shè)備驅(qū)動(dòng)程序在Linux中使用DMA。 這包括內(nèi)存分配,緩存控制和DMA設(shè)備控制。 詳細(xì)介紹了Linux DMA Engine框架。
    的頭像 發(fā)表于 11-23 06:29 ?6672次閱讀

    你對(duì)Linux總線設(shè)備驅(qū)動(dòng)框架是否了解

    Linux的設(shè)備驅(qū)動(dòng)模型,或者說,Linux的設(shè)備驅(qū)動(dòng)框架,都是同一個(gè)意思。應(yīng)該這樣理解,(Linux
    發(fā)表于 05-05 15:13 ?859次閱讀

    如何使用Linux內(nèi)核實(shí)現(xiàn)USB驅(qū)動(dòng)程序框架

    Linux內(nèi)核提供了完整的USB驅(qū)動(dòng)程序框架。USB總線采用樹形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。 Linux內(nèi)核從主機(jī)和設(shè)備兩個(gè)角度觀察USB總線結(jié)構(gòu)。本節(jié)介紹
    發(fā)表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>實(shí)現(xiàn)</b>USB<b class='flag-5'>驅(qū)動(dòng)</b>程序<b class='flag-5'>框架</b>

    嵌入式Linux驅(qū)動(dòng)開發(fā)從基礎(chǔ)到框架

    想講好嵌入式Linux驅(qū)動(dòng)開發(fā)并不容易,各位業(yè)界大神最基礎(chǔ)的字符驅(qū)動(dòng)到中斷并發(fā)再到驅(qū)動(dòng)框架、應(yīng)用層調(diào)用。但是總覺得業(yè)界寫的書都是點(diǎn)到為止,
    發(fā)表于 11-01 16:58 ?15次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)從基礎(chǔ)到<b class='flag-5'>框架</b>

    看看Linux為相機(jī)提供的驅(qū)動(dòng)框架

    ? V4L2 (Video Linux Two),是為支持Linux內(nèi)核設(shè)計(jì)的驅(qū)動(dòng)框架驅(qū)動(dòng)框架。
    的頭像 發(fā)表于 08-07 16:03 ?3747次閱讀
    看看<b class='flag-5'>Linux</b>為相機(jī)提供的<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>框架</b>

    Linux驅(qū)動(dòng)分析之RTC框架

    當(dāng)Linux內(nèi)核啟動(dòng)時(shí),它會(huì)從RTC中讀取時(shí)間與日期,作為基準(zhǔn)值。然后通過軟件來維護(hù)系統(tǒng)時(shí)間和日期。Linux系統(tǒng)中提供了RTC核心層,對(duì)于驅(qū)動(dòng)開發(fā)者而言,操作起來就變得很簡(jiǎn)單了。我們來看看整體
    的頭像 發(fā)表于 05-26 15:12 ?1210次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>分析之RTC<b class='flag-5'>框架</b>

    Linux Regmap 驅(qū)動(dòng)框架

    1、regmap 框架結(jié)構(gòu) regmap 驅(qū)動(dòng)框架如下圖所示: regmap 框架分為三層: ①、底層物理總線:regmap 就是對(duì)不同的物理總線進(jìn)行封裝,目前 regmap 支持的物
    的頭像 發(fā)表于 07-06 17:29 ?1380次閱讀
    <b class='flag-5'>Linux</b> Regmap <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>框架</b>

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品