裝置驅動 十五

2021-06-20 19:55:50 字數 4486 閱讀 6317

開啟裝置的時鐘

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