s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(3)

发布者:qiuxubiao最新更新时间:2022-06-14 来源: eefocus关键字:s3c6410  linux  WATCHDOG  TIMER 手机看文章 扫描二维码
随时随地手机看文章

前面两篇一篇分析了看门狗定时器的驱动架构,另一篇分析了平台设备对应的probe函数,虽然对应的remove函数没分析,其实和别的平台设备驱动一样,做和probe函数相反的工作。这一篇要说点啥呢?


S3c2410_wdt.c (linux2.6.28driverswatchdog)在这个文件中还有很多函数,我们都没有分析过,这一篇就找些重要的函数分析下。


1、那就先从s3c2410wdt_start函数开始,此函数开启看门狗,源码如下:


static void s3c2410wdt_start(void)

{

unsigned long wtcon;


spin_lock(&wdt_lock);


__s3c2410wdt_stop();先停止看门狗便于设置


wtcon = readl(wdt_base + S3C2410_WTCON);读控制寄存器WTCON

wtcon |= S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128;


这里的定义:


#define S3C2410_WTCON_ENABLE  (1<<5)


#define S3C2410_WTCON_DIV128  (3<<3)


对照下面的寄存器图,更直观:

if (soft_noboot) {   这个标志第一篇中说明了它的作用,不明的可以回过去查看。等于1,作为定时器使用。


wtcon |= S3C2410_WTCON_INTEN;使能中断

wtcon &= ~S3C2410_WTCON_RSTEN;不允许发出复位信号

} else {等于0,看门狗做复位电路使用

wtcon &= ~S3C2410_WTCON_INTEN;禁止中断

wtcon |= S3C2410_WTCON_RSTEN;允许复位

}


DBG("%s: wdt_count=0x%08x, wtcon=%08lxn",

   __func__, wdt_count, wtcon);


writel(wdt_count, wdt_base + S3C2410_WTDAT);写数据寄存器

writel(wdt_count, wdt_base + S3C2410_WTCNT);写计数器寄存器

writel(wtcon, wdt_base + S3C2410_WTCON);写控制寄存器

spin_unlock(&wdt_lock);

}


2、接着说s3c2410wdt_stop函数,停止看门狗工作。


static void s3c2410wdt_stop(void)

{

spin_lock(&wdt_lock);

__s3c2410wdt_stop();

spin_unlock(&wdt_lock);

}


static void __s3c2410wdt_stop(void)

{

unsigned long wtcon;


wtcon = readl(wdt_base + S3C2410_WTCON);

wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN);使看门狗不工作,不发出复位信号

writel(wtcon, wdt_base + S3C2410_WTCON);

}


3、s3c2410wdt_shutdown此函数用于停止看门狗


static void s3c2410wdt_shutdown(struct platform_device *dev)

{

s3c2410wdt_stop();

}


4、s3c2410wdt_suspend该函数用于电源管理,挂起设备


static int s3c2410wdt_suspend(struct platform_device *dev, pm_message_t state)

{

/* Save watchdog state, and turn it off. */保存看门狗当前状态

wtcon_save = readl(wdt_base + S3C2410_WTCON);

wtdat_save = readl(wdt_base + S3C2410_WTDAT);


/* Note that WTCNT doesn't need to be saved. */

s3c2410wdt_stop();关闭看门狗


return 0;

}


5、s3c2410wdt_resume也与电源管理有关,挂起后的恢复


static int s3c2410wdt_resume(struct platform_device *dev)

{

/* Restore watchdog state. */恢复各寄存器的设置

writel(wtdat_save, wdt_base + S3C2410_WTDAT);

writel(wtdat_save, wdt_base + S3C2410_WTCNT); /* Reset count */

writel(wtcon_save, wdt_base + S3C2410_WTCON);


printk(KERN_INFO PFX "watchdog %sabledn",

      (wtcon_save & S3C2410_WTCON_ENABLE) ? "en" : "dis");


return 0;

}


6、再来看s3c2410wdt_fops结构体中的函数:


static const struct file_operations s3c2410wdt_fops = {

.owner  = THIS_MODULE,

.llseek  = no_llseek,

.write  = s3c2410wdt_write,

.unlocked_ioctl= s3c2410wdt_ioctl,

.open = s3c2410wdt_open,

.release  = s3c2410wdt_release,

};


6.1、先看s3c2410wdt_open函数:在用户调用open函数时被调用。源码如下:


/*

 * /dev/watchdog handling

 */

static int s3c2410wdt_open(struct inode *inode, struct file *file)

{


printk("s3c2410wdt_open.n");

if (test_and_set_bit(0, &open_lock))

return -EBUSY;

调用此函数测试open_lock的第0位。为0则表示此函数返回0,表示设备没有被另外的程序打开。如果第0位为1,则表示设备已经被打开,返回EBUSY


if (nowayout)不为0,表示看门狗不允许关闭,则增加看门狗模块的引用计数。

__module_get(THIS_MODULE);


allow_close = CLOSE_STATE_NOT;设为不允许关闭


/* start the timer */

s3c2410wdt_start();打开设备

return nonseekable_open(inode, file);不允许调用seek函数,即不允许对设备进行定位。

}


6.2、接着看s3c2410wdt_release函数,在close函数中被调用。函数源码如下:


static int s3c2410wdt_release(struct inode *inode, struct file *file)

{

/*

* Shut off the timer.

* Lock it in if it's a module and we set nowayout

*/

if (allow_close == CLOSE_STATE_ALLOW)看门狗为允许关闭

s3c2410wdt_stop();关闭看门狗

else {

dev_err(wdt_dev, "Unexpected close, not stopping watchdogn");

s3c2410wdt_keepalive();使看门狗为活动状态

}


其中s3c2410wdt_keepalive函数源码如下:


static void s3c2410wdt_keepalive(void)

{

spin_lock(&wdt_lock);

writel(wdt_count, wdt_base + S3C2410_WTCNT);重新写计数寄存器

spin_unlock(&wdt_lock);

}


allow_close = CLOSE_STATE_NOT;设为不允许关闭

clear_bit(0, &open_lock);将open_lock的第0位设为0,允许打开

return 0;

}


6.3、再来看s3c2410wdt_write函数,该函数主要用来设置allow_close变量为允许关闭状态。如果向设备中写入V,那么就允许关闭设备。源码如下:


static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,

size_t len, loff_t *ppos)

{

/*

* Refresh the timer.

*/

printk("s3c2410wdt_write.n");

if (len) {

if (!nowayout) {  允许关闭

size_t i;


/* In case it was set long ago */

allow_close = CLOSE_STATE_NOT 不允许关闭


           for (i = 0; i != len; i++) {

char c;


if (get_user(c, data + i))

return -EFAULT;

if (c == 'V')

allow_close = CLOSE_STATE_ALLOW;

}如果往看门狗设备中写入V,允许关闭

}

s3c2410wdt_keepalive();

}

return len;

}


6.4、现在来看一个比较重要的函数,s3c2410wdt_ioctl函数用来接受系统的命令,设置看门狗的状态。


static long s3c2410wdt_ioctl(struct file *file, unsigned int cmd,

unsigned long arg)

{

void __user *argp = (void __user *)arg;

int __user *p = argp;

int new_margin;

printk("s3c2410wdt_ioctl.n");


switch (cmd) {

case WDIOC_GETSUPPORT:获取看门狗的信息

return copy_to_user(argp, &s3c2410_wdt_ident,

sizeof(s3c2410_wdt_ident)) ? -EFAULT : 0;


其中有定义:


#define OPTIONS WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE


static const struct watchdog_info s3c2410_wdt_ident = {

.options          =     OPTIONS,

.firmware_version = 0,

.identity         = "S3C2410 Watchdog",

};

case WDIOC_GETSTATUS:

case WDIOC_GETBOOTSTATUS: 获得看门狗状态

return put_user(0, p);

case WDIOC_KEEPALIVE: 对看门狗进行喂狗

s3c2410wdt_keepalive();

return 0;

case WDIOC_SETTIMEOUT:设置新的超时时间

if (get_user(new_margin, p))

return -EFAULT;

if (s3c2410wdt_set_heartbeat(new_margin))

return -EINVAL;

s3c2410wdt_keepalive();

return put_user(tmr_margin, p);

case WDIOC_GETTIMEOUT:获得看门狗的当前超时时间

return put_user(tmr_margin, p);

default:

return -ENOTTY;

}

}

6.5、不知道你还记得吗?我们在probe函数中,申请的中断,并设置中断处理函数是s3c2410wdt_irq,现在来说这个函数,源码如下:


/* interrupt handler code */

static irqreturn_t s3c2410wdt_irq(int irqno, void *param)

{

dev_info(wdt_dev, "watchdog timer expired (irq)n");



s3c2410wdt_keepalive();

return IRQ_HANDLED;

}


其实就是喂狗。

————————————————

版权声明:本文为CSDN博主「tianxiawuzhei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/tianxiawuzhei/article/details/7588824


关键字:s3c6410  linux  WATCHDOG  TIMER 引用地址:s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(3)

上一篇:s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(1)
下一篇:s3c6410的RTC在linux中的驱动(2)

推荐阅读最新更新时间:2024-11-10 19:15

iTOP-4412开发板驱动lcd显卡以及linux开机log的修改方法
iTOP-4412 开发板 LCD 的屏幕驱动,iTOP-4412 开发板支持 4.3寸,7 寸,9.7 寸的 lcd 显示屏。其中 4.3 寸屏是用的 cpu 直接出来的 RGB 信号,7 寸屏和 9.7寸屏是用的 LVDS 信号,硬件上使用了一个 RGB 转 LVDS 的芯片实现的。我们来看下显示驱动,显示驱动在内核的“drivers/video/samsung”目录下面,这个驱动是三星提供好的,我们这支只讲下我们需要修改的几个文件。 首先是关于屏幕的分辨率的修改, 因为不同的屏幕分辨率, 频率以及其他一些硬件参数是不同的,所以我们需要根据这些参数去配置 cpu 的显示控制器,关于这些参数是在“driversvideo/s
[单片机]
Linux 圈曝出“灾难”级漏洞:已存在 10 多年,影响几乎所有发行版
9 月 27 日消息,Linux 圈曝出严重远程代码执行(RCE)漏洞,已存在 10 多年,几乎影响所有 GNU / Linux 发行版,目前尚未有修复补丁,不过可以缓解。 软件开发人员 Simone Margaritelli 于 9 月 23 日在 X 平台发布推文,率先曝料了这些 RCE 漏洞,目前已经通知相关开发团队,并会在未来两周内完全披露。 漏洞破坏力 Margaritelli 表示这些漏洞目前没有分配 CVE 追踪编号,不过至少会有 3 个,理想状态下会达到 6 个。 Canonical(Ubuntu 开发商)、Red Hat 以及其他发行版的开发团队和公司已确认了这些 RCE 漏洞的严重程度,预估 CVSS 评分达到
[嵌入式]
<font color='red'>Linux</font> 圈曝出“灾难”级漏洞:已存在 10 多年,影响几乎所有发行版
Linux将成为21世纪汽车主流操作系统
据科技博客ZDNet报道,开源软件组织Linux基金会表示,Linux操作系统将成为21世纪汽车产品的主流操作系统。   Linux将成为21世纪汽车主流操作系统 Linux系统不仅支持电脑服务器产品,还能通过Android运行在用户的智能手机上;此外,在汽车上也能找到它的踪影。当然,没有人在购买汽车产品时考虑它使用了何种操作系统,但是包括丰田、尼桑、捷豹路虎、福特、马自达、三菱和斯巴鲁等主流汽车品牌在内,它们的车载信息娱乐、显示、车载4G网络、Wi-Fi系统,都离不开Linux操作系统的支持。 各大软件厂商也都纷纷加入了面向汽车行业的这场移动物联网盛宴当中。Movimento、甲骨文、高通、德仪、UIEvolu
[嵌入式]
PIC32MZ tutorial -- Core Timer
  Core Timer is a very popular feature of PIC32 since it is a piece of the MIPS M4K core itself and is common to all MIPS processors. Most RTOS's timer are based on core timer. This timer has a fixed prescaler 1:2, and it is a 32-bit timer, no need to combine with two 16-bit timer like we do with other timers (Tim
[单片机]
arm-linux-objcopy
被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换 示例: arm-linux-objcopy –O binary –S file.elf file.bin 常用的选项(大写): input-file , outflie 输入和输出文件,如果没有outfile,则输出文件名为输入文件名 2.-l bfdname或—input-target=bfdname 用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析 3.-O bfdname 输出的格式 4.-F bfdname 同时指明源文件,目的文件的格式 5.-R sectionn
[单片机]
ARM7&ARM9双核平台的技术分析
目前嵌入式系统教学平台市场上的主导产品都是基于ARM7或ARM9架构的,一般都认为ARM7属于低端产品、ARM9属于高端产品,也出现了所谓的“ARM7&ARM9覆盖高端&低端的教学平台”。宣传“两套 CPU 子板都是可以自由插拔,一套实验系统变化为两套, ARM7 的实验系统可以实现基础的 ARM 嵌入式教学,主要包括指令实验,基础接口实验, UCOS-II 操作系统实验和 uCLinux 操作系统实验; ARM9 的实验系统可以实现高端的 ARM 嵌入式教学,主要包括扩展接口实验, Linux 操作系统实验和 WinCE 操作系统实验。” 这种观点有误导用户的嫌疑。因为ARM9和ARM7同属于ARMv41,是属于中
[单片机]
【蓝桥杯单片机组】(4)Timer0/1 定时器
需要使用的寄存器:TMOD(工作方式寄存器) TCON(控制寄存器)THx TLx TMOD TMOD D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T M1 M0 GATE C/T M1 M0 T1 T1 T1 T1 T0 T0 T0 T0 GATE: GATE = 0:定时器开始或结束仅由TCON^TRx控制 GATE = 1:定时器开始或结束仅由TCON^TRx与外部中断引脚的电平共同控制(INTx = 1 && TRx = 1 时开始计数) C/T: C/T = 0:定时器模式 C/T = 1:计数器模式 M1 M0 工作方式 0 0 13 bit Timer&Counter 0 1
[单片机]
车载OS盘点及特点分析一:车载OS几大系统介绍
OS,英文全称operating system,即操作系统,意思是指用于管理计算机硬件和软件资源,并提供通用服务的计算机程序。 对于我们日常接触的OS而言,操作系统就是Windows、Macos、Android,基于工程师们比较钟爱的Linux等。但是对于车载OS而言,一般就比较陌生了,车载OS,顾名思义,就是在汽车上使用的OS,与普通电脑、移动终端的OS不同,这类OS使用在汽车上。但是车载OS也有很多的分类和用途。 未来,汽车将演变为移动智能终端,软件将定义汽车,OS是传统车企实现数字转型的关键,成为各企业必争的战略要地。在汽车领域,OS包括与安全相关的控制系统OS和与用户体验相关的IVI(信息娱乐系统)OS两大部分。
[汽车电子]
车载OS盘点及特点分析一:车载OS几大系统介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved