RTC(实时钟)设备驱动(内核代码)

本文档提供了S3C2410/S3C2440/S3C24XX内建RTC驱动的内核源代码,详细解释了包括设置中断、读写时间、设置闹钟等功能的实现,以及中断处理函数和设备注册操作。适用于嵌入式Linux系统开发者了解和使用。
摘要由CSDN通过智能技术生成

代码在:drivers/rtc/rtc-dev.c

/* drivers/rtc/rtc-s3c.c
 *
 * Copyright (c) 2004,2006 Simtec Electronics
 * Ben Dooks, <ben@simtec.co.uk>
 * http://armlinux.simtec.co.uk/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * S3C2410/S3C2440/S3C24XX Internal RTC Driver
*/

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
#include <linux/clk.h>

#include <asm/hardware.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/rtc.h>

#include <asm/mach/time.h>

#include <asm/arch/regs-rtc.h>

/* I have yet to find an S3C implementation with more than one
 * of these rtc blocks in */

static struct resource *s3c_rtc_mem;

static void __iomem *s3c_rtc_base;
static int s3c_rtc_alarmno = NO_IRQ;
static int s3c_rtc_tickno  = NO_IRQ;
static int s3c_rtc_freq    = 1;

static DEFINE_SPINLOCK(s3c_rtc_pie_lock);
static unsigned int tick_count;

/* IRQ Handlers */

static irqreturn_t s3c_rtc_alarmirq(int irq, void *id)
{
 struct rtc_device *rdev = id;

 rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF);
 return IRQ_HANDLED;
}

static irqreturn_t s3c_rtc_tickirq(int irq, void *id)
{
 struct rtc_device *rdev = id;

 rtc_update_irq(rdev, tick_count++, RTC_PF | RTC_IRQF);
 return IRQ_HANDLED;
}

/* Update control registers */
static void s3c_rtc_setaie(int to)
{
 unsigned int tmp;

 pr_debug("%s: aie=%d\n", __FUNCTION__, to);

 tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN;

 if (to)
  tmp |= S3C2410_RTCALM_ALMEN;

 writeb(tmp, s3c_rtc_base + S3C2410_RTCALM);
}

static void s3c_rtc_setpie(int to)
{
 unsigned int tmp;

 pr_debug("%s: pie=%d\n", __FUNCTION__, to);

 spin_lock_irq(&s3c_rtc_pie_lock);
 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & ~S3C2410_TICNT_ENABLE;

 if (to)
  tmp |= S3C2410_TICNT_ENABLE;

 writeb(tmp, s3c_rtc_base + S3C2410_TICNT);
 spin_unlock_irq(&s3c_rtc_pie_lock);
}

static void s3c_rtc_setfreq(int freq)
{
 unsigned int tmp;

 spin_lock_irq(&s3c_rtc_pie_lock);
 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE;

 s3c_rtc_freq = freq;

 tmp |= (128 / freq)-1;

 writeb(tmp, s3c_rtc_base + S3C2410_TICNT);
 spin_unlock_irq(&s3c_rtc_pie_lock);
}

/* Time read/write */

static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
{
 unsigned int have_retried = 0;
 void __iomem *base = s3c_rtc_base;

 retry_get_time:
 rtc_tm->tm_min  = readb(base + S3C2410_RTCMIN);
 rtc_tm->tm_hour = readb(base + S3C2410_RTCHOUR);
 rtc_tm->tm_mday = readb(base + S3C2410_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值