iTop4412驱动开发之七:RTC驱动

    技术2024-08-12  73

    #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) { //phys_addr = S3C_PA_RTC; //ioresource = request_mem_region(phys_addr, 0x60, "RTC"); //virt_addr = (unsigned long)ioremap(phys_addr, 0x60); //RTCCON = (unsigned long *)(virt_addr + 0x40); //unsigned long value = ioread32(RTCCON); //value |= 0x1; //iowrite32(value, RTCCON); 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");
    Processed: 0.012, SQL: 9