#include <linux/init.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio.h>
#include <mach/gpio-exynos4.h>
#include <linux/platform_device.h>
#include <mach/regs-gpio.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
#include <mach/map-exynos4.h>
#define DRIVER_NAME "s3c-rtc"
struct resource *s3c_rtc_mem = NULL;
void __iomem *s3c_rtc_base = NULL;
volatile unsigned long virt_addr, phys_addr;
volatile unsigned long *RTCCON;
volatile unsigned long *BCDYEAR;
volatile unsigned long *BCDMON;
volatile unsigned long *BCDDAY;
volatile unsigned long *BCDHOUR;
volatile unsigned long *BCDMIN;
volatile unsigned long *BCDSEC;
static void rtc_device_init(struct platform_device *pdev)
{
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
s3c_rtc_mem = request_mem_region(res->start, resource_size(res), pdev->name);
s3c_rtc_base = ioremap(res->start, resource_size(res));
printk("%#x\n", res->start);
BCDYEAR = (unsigned long *)(s3c_rtc_base + 0x88);
BCDMON = (unsigned long *)(s3c_rtc_base + 0x84);
BCDDAY = (unsigned long *)(s3c_rtc_base + 0x80);
BCDHOUR = (unsigned long *)(s3c_rtc_base + 0x78);
BCDMIN = (unsigned long *)(s3c_rtc_base + 0x74);
BCDSEC = (unsigned long *)(s3c_rtc_base + 0x70);
}
static irqreturn_t eint9_interrupt(int irq, void *dev_id)
{
printk("%s-%d\n", __FUNCTION__, __LINE__);
int value = ioread32(BCDYEAR);
char year = (value & 0xf) + (value >> 4) * 10;
printk("value: %#x, year: %d\n", value, year);
value = ioread32(BCDMON);
char month = (value & 0xf) + (value >> 4) * 10;
printk("value: %#x, month: %d\n", value, month);
value = ioread32(BCDDAY);
char day = (value & 0xf) + (value >> 4) * 10;
printk("value: %#x, day: %d\n", value, day);
value = ioread32(BCDHOUR);
char hour = (value & 0xf) + (value >> 4) * 10;
printk("value: %#x, hour: %d\n", value, hour);
value = ioread32(BCDMIN);
char min = (value & 0xf) + (value >> 4) * 10;
printk("value: %#x, min: %d\n", value, min);
value = ioread32(BCDHOUR);
char sec = (value & 0xf) + (value >> 4) * 10;
printk("value: %#x, sec: %d\n", value, sec);
return IRQ_HANDLED;
}
static int rtc_probe(struct platform_device *pdev)
{
int ret;
char *banner = "rtc_test init.\n";
printk(banner);
rtc_device_init(pdev);
ret = gpio_request(EXYNOS4_GPX1(1), "EINT9");
s3c_gpio_cfgpin(EXYNOS4_GPX1(1), S3C_GPIO_SFN(0XF));
s3c_gpio_setpull(EXYNOS4_GPX1(1), S3C_GPIO_PULL_UP);
gpio_free(EXYNOS4_GPX1(1));
ret = request_irq(IRQ_EINT(9), eint9_interrupt, IRQ_TYPE_EDGE_FALLING, "eint9", pdev);
return 0;
}
static int rtc_remove(struct platform_device *pdev)
{
iounmap((void*)virt_addr);
release_mem_region(virt_addr, 0x60);
return 0;
}
static struct platform_driver rtc_driver = {
.probe = rtc_probe,
.remove = rtc_remove,
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
}
};
struct platform_device rtc_dev = {
.name = DRIVER_NAME,
.id = -1,
};
static int __init rtc_test_init(void)
{
platform_device_register(&rtc_dev);
platform_driver_register(&rtc_driver);
}
static void __exit rtc_test_exit(void)
{
platform_driver_unregister(&rtc_driver);
platform_device_unregister(&rtc_dev);
}
module_init(rtc_test_init);
module_exit(rtc_test_exit);
MODULE_LICENSE("Dual BSD/GPL");
转载请注明原文地址:https://ipadbbs.8miu.com/read-51504.html