imx6PWM學習筆記1

2021-10-08 11:07:28 字數 3433 閱讀 5691

使用zlg的m6708開發板時(核心kernel3.0.15),由於自帶得開開發板系統只有一路pwm,並且該路pwm已經給了lcd作背光調節,為此接下來學習如何將其他io口修改為pwm輸出。

首先參考emb_hao的部落格:linux系統pwm驅動

在linux核心中有乙個規律,linux核心開發者把通用的東西都總結出來,個性化的東西就留出介面,和gpio驅動類似,pwm驅動在核心中也提供了對應的介面函式,核心提供的介面函式宣告在include/linux/pwm.h中

//申請乙個pwm資源

struct pwm_device *pwm_request(int pwm_id, const char *label);

//釋放乙個pwm資源

void pwm_free(struct pwm_device *pwm);

//配置pwm

int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);

//使能pwm

int pwm_enable(struct pwm_device *pwm);

//不使能pwm

void pwm_disable(struct pwm_device *pwm);

針對核心的框架,imx6對這些函式的實現位於arch/arm/plat-mxc/pwm.c中,利用這些介面函式我們就可以編寫自己的pwm驅動程式

步驟:1 新增對pwm埠的初始化(本驅動基於飛思卡爾imx6(zlgm6708dl),這部分不同的板子會有些許不同)

在arch/arm/mach-mx6/board-m6708dl.h

在mx6q_pad_sd1_dat3__pwm1_pwmo,後面新增

mx6q_pad_sd1_dat1__pwm3_pwmo,

mx6q_pad_sd1_cmd__pwm4_pwmo,

mx6q_pad_sd1_dat2__pwm2_pwmo,

2 使用pwm_request,pwm_free,pwm_config,pwm_enable,pwm_disable五個函式編寫混雜裝置驅動

編寫pwm_drv.c

#include

#include

#include

#include

#include

#include

#define pwm_on 0x100001

#define pwm_off 0x100002

struct pwm_device *pwm_dev_2;

struct pwm_device *pwm_dev_3;

static

long

pwm_ioctl

(struct file *file,

unsigned

int cmd,

unsigned

long arg)

ret =

pwm_config

(pwm_dev_3,

30000

,50000);

if(ret <0)

pwm_enable

(pwm_dev_2)

;pwm_enable

(pwm_dev_3)

;printk

("pwm_enable init success\n");

break

;case pwm_off:

ret =

pwm_config

(pwm_dev_2,0,

50000);

if(ret <0)

ret =

pwm_config

(pwm_dev_3,0,

50000);

if(ret <0)

pwm_disable

(pwm_dev_2)

;pwm_disable

(pwm_dev_3)

;break;}

return0;

}//定義初始化硬體操作方法

static

struct file_operations pwm_fops =

;//定義初始化混雜裝置物件

static

struct miscdevice pwm_misc =

;static

intpwm_init

(void

) pwm_dev_3 =

pwm_request(2

,"pwm_3");

if(pwm_dev_3 ==

null

) ret =

pwm_config

(pwm_dev_2,0,

50000);

if(ret <0)

ret =

pwm_config

(pwm_dev_3,0,

50000);

if(ret <0)

ret =

pwm_enable

(pwm_dev_2);if

(ret ==0)

if(ret <0)

ret =

pwm_enable

(pwm_dev_3);if

(ret ==0)

if(ret <0)

//2.註冊混雜裝置

misc_register

(&pwm_misc)

;return0;

}static

void

pwm_exit

(void

)module_init

(pwm_init)

;module_exit

(pwm_exit)

;module_license

("gpl"

);

編寫pwn_test測試程式

#include

"stdio.h"

#include

"unistd.h"

#include

"sys/types.h"

#include

"sys/stat.h"

#include

"fcntl.h"

#include

"stdlib.h"

#include

"string.h"

#define pwm_on 0x100001

#define pwm_off 0x100002

intmain

(void

)close

(fd)

;return0;

}

將pwm_drv.c編譯為驅動模組,pwm_test.c編譯後測試,成功輸出pwm

imx6ul 正點原子 imx6ul學習筆記(1)

目錄 linux imx6ull uboot alientek uboot 檔名 mx6ull alientek emmc.sh 編譯方法 mx6ull alientek emmc.sh目錄 f imx6ull alientek uboot cd alientek uboot 進入正點原子 uboo...

imx6ul 正點原子 imx6ul學習筆記(2)

目錄 home jk9 linux imx6ull alientek linux 編譯,vscode工程建立 2020.3.12 目錄 home jk9 linux nxp nxp linux 編譯 2020.3.12.23 32 1 新增開發板預設配置檔案 2 新增開發板對應的裝置樹檔案cp ar...

qemu gdb 除錯imx6學習筆記

準備對linux的記憶體管理單元進行學習,單純閱讀原始碼還是不如一步一步除錯核心理解深刻,對於除錯核心的方法,網上也有不少,主要是利用qemu gdb imx6對核心進行除錯。qemu的英文單詞是 quickemulator,它是乙個小巧的模擬器。還有很多模擬器,比如vmware virtual b...