開啟裝置的時鐘
struct clk *my_clk; //定義時鐘結構體
my_clk = clk_get(null, "watchdog"); //獲取裝置的時鐘資訊
clk_enable(my_clk); //開啟時鐘
clk_disable(my_clk); //關閉時鐘
所有有關時鐘的裝置,只有開啟時鐘後設定裝置的暫存器才有效。
看門狗驅動
原理圖
pclk = 66mhz模組許可wtcon
[15:8] 0x80
[5] 0x1
[4:3] 0x2
wtcnt
0x8000
載入函式
註冊字元裝置
對映獲取時鐘
解除安裝函式
操作集合
feed_dog
開啟時鐘
設定計數器wtcnt
使能看門狗wtcon
release關閉時鐘
pwm脈衝調製
gpd0_1
tcntb1 0x1e
tcmpb1 0xf
tcfg0[7:0] 0xff
tcfg1[7:4] 0x4
最後設定
tcon[11:8] 0x2
模組許可
載入函式
申請裝置號
註冊字元裝置
對映暫存器
open函式
設定預分頻、設定再分頻
設定tcnt、tcmp
設定gpd0_1為tout_1輸出
使能tcon,手動更新tcnt,tcmp
解除安裝函式
關閉tcon
操作集合
beep_on
設定自動重灌tcon、tcmp
beep_off
關閉tcon
set_cntb1
安裝引數更新tcon、tcmp
pwm產考**
#include看門狗參考**#include
#include
#include
#include
#include
//#include
//#include
#include "fs210_pwm.h"
module_license("dual bsd/gpl");
module_author("farsight");
#define gpd0con 0xe02000a0
struct pwm_timer
*pwm_timer;
static int pwm_major = 250;
static int pwm_minor = 0;
static struct cdev pwm_cdev;
void *gpd0con;
static void beep_init(void)
static void beep_on(void)
static void beep_off(void)
static void set_cnt(unsigned long count)
static int fs210_pwm_open(struct inode *inode, struct file *file)
static int fs210_pwm_close(struct inode *inode, struct file *file)
static long fs210_pwm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return 0;
}
static struct file_operations fs210_pwm_ops = ;
static int pwm_setup_cdev(struct cdev *cdev,
struct file_operations *fops)
return 0;
}
static int __init fs210_pwm_init(void)
result = pwm_setup_cdev(&pwm_cdev, &fs210_pwm_ops);
if (result)
return result;
gpd0con = ioremap(gpd0con, 4);
pwm_timer = ioremap(0xe2500000, sizeof(struct pwm_timer));
printk("pwm: driver installed with major %d!\n", pwm_major);
return 0;
}
static void __exit fs210_pwm_exit(void)
module_init(fs210_pwm_init);
module_exit(fs210_pwm_exit);
#include#include
#include
#include
#include
#include
#include
//#include
#include
//#include
#include
#define watchdog_magic 'k'
#define feed_dog _io(watchdog_magic,1)
#define watchdog_major 250
#define device_name "s5pv210_watchdog"
module_license("gpl");
module_author("farsight");
module_description("s5pv210 watchdog");
#define s5pv210_pa_wtcon 0xe2700000
#define s5pv210_pa_wtcnt 0xe2700008
void *s5pv210_wtcon;
void *s5pv210_wtcnt;
struct clk *clk;
static int watchdog_major = watchdog_major;
static struct cdev watchdog_cdev;
static int watchdog_open(struct inode *inode ,struct file *file)
static int watchdog_release(struct inode *inode,struct file *file)
//餵狗
static long watchdog_ioctl(struct file *file,unsigned int cmd,unsigned long arg)
return 0;
}
//將裝置註冊到系統之中
static void watchdog_setup_dev(struct cdev *dev,int minor,struct file_operations *fops)
static struct file_operations watchdog_ops = ;
//註冊裝置驅動程式,主要完成主裝置號的註冊
static int __init s5pv210_watchdog_init(void)
printk(kern_notice"[debug] watchdog device major is %d\n",watchdog_major);
watchdog_setup_dev(&watchdog_cdev, 0, &watchdog_ops);
s5pv210_wtcon = ioremap(s5pv210_pa_wtcon, 4);
s5pv210_wtcnt = ioremap(s5pv210_pa_wtcnt, 4);
clk = clk_get(null, "watchdog");
if (is_err(clk))
return 0;
}
//驅動模組解除安裝
static void s5pv210_watchdog_exit(void)
module_init(s5pv210_watchdog_init);
module_exit(s5pv210_watchdog_exit);
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...