使用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...