{
dev_err(dev, 'failed to reserve memory regionn');
ret = -ENOENT;
goto exit_err;
}
s3c2440_rtc_base = ioremap(res->start, res->end - res->start + 1);
if (s3c2440_rtc_base == NULL)
{
dev_err(dev, 'failed ioremap()n');
ret = -EINVAL;
goto exit_err;
}
// 是用linux源码中的s3c2410-rtc.c移植的,不知道为什么要写这么一行,没看出有什么用。
//s3c2440_rtc_mem = res;
// 导致卸载时出现'Internal error: Oops: 13 [#1]'
pr_debug('s3c2440_rtc_base=%pn', s3c2440_rtc_base);
pr_debug('s3c2440_rtc: RTCCON=%02xn', readb(S3C2410_RTCCON));
/* check to see if everything is setup correctly */
s3c2440_rtc_enable(dev, 1);
pr_debug('s3c2440_rtc: RTCCON=%02xn', readb(S3C2410_RTCCON));
/*
* s3c2440a手册中描述:
* TICK TIME INTERRUPT
* The RTC tick time is used for interrupt request. The TICNT register has an interrupt enable bit and the count value for
* the interrupt. The count value reaches '0' when the tick time interrupt occurs. Then the period of interrupt is as
* follows:
* — Period = ( n+1 ) / 128 second
* — n: Tick time count value (1~127)
* 此函数将rtc的tick中断时间间隔设置为:(1/s3c2440_rtc_freq)second,即1s
*/
s3c2440_rtc_setfreq(s3c2440_rtc_freq);
// 注册rtc设备,并且创建/proc中的节点,将s3c2440_rtc_proc与该节点绑定。
register_rtc(&s3c2440_rtcops);
return 0;
exit_err:
dev_err(dev, 'error %d during initialisationn', ret);
return ret;
}/* s3c2440_rtc_probe(struct device *dev) */
static int s3c2440_rtc_remove(struct device *dev)
{
printk('@@@@@@@@@@@@@@@@@@@@@@ngzliu s3c2440_rtc_remove()n@@@@@@@@@@@@@@@@@@@@@@@@n');
unregister_rtc(&s3c2440_rtcops);
// 0 - disable tick time interrupt
s3c2440_rtc_setpie(0);
// 0 - disable alarm
s3c2440_rtc_setaie(0);
if (s3c2440_rtc_mem != NULL)
{
pr_debug('s3c2440_rtc: releasing s3c2440_rtc_memn');
iounmap(s3c2440_rtc_base);
release_resource(s3c2440_rtc_mem);
kfree(s3c2440_rtc_mem);
}
return 0;
}
#ifdef CONFIG_PM
/* S3C2440 RTC 电源管理控制 */
static struct timespec s3c2440_rtc_delta;
static int ticnt_save;
static int s3c2440_rtc_suspend(struct device *dev, pm_message_t state, u32 level)
{
struct rtc_time tm;
struct timespec time;
printk('@@@@@@@@@@@@@@@@@@@@@@ngzliu s3c2440_rtc_suspend()n@@@@@@@@@@@@@@@@@@@@@@@@n');
time.tv_nsec = 0;
if (level == SUSPEND_POWER_DOWN)
{
/* save TICNT for anyone using periodic interrupts */
ticnt_save = readb(S3C2410_TICNT);
/* calculate time delta for suspend */
s3c2440_rtc_gettime(&tm);
rtc_tm_to_time(&tm, &time.tv_sec);
save_time_delta(&s3c2440_rtc_delta, &time);
s3c2440_rtc_enable(dev, 0);
}
return 0;
}
static int s3c2440_rtc_resume(struct device *dev, u32 level)
{
struct rtc_time tm;
struct timespec time;
printk('@@@@@@@@@@@@@@@@@@@@@@ngzliu s3c2440_rtc_resume()n@@@@@@@@@@@@@@@@@@@@@@@@n');
time.tv_nsec = 0;
s3c2440_rtc_enable(dev, 1);
s3c2440_rtc_gettime(&tm);
rtc_tm_to_time(&tm, &time.tv_sec);
restore_time_delta(&s3c2440_rtc_delta, &time);
writeb(ticnt_save, S3C2410_TICNT);
return 0;
}
#else
#define s3c2440_rtc_suspend NULL
#define s3c2440_rtc_resume NULL
#endif
static struct device_driver s3c2440_rtcdrv =
{
.name = 's3c2440-rtc',
.bus = &platform_bus_type,
.probe = s3c2440_rtc_probe,
.remove = s3c2440_rtc_remove,
.suspend = s3c2440_rtc_suspend,
.resume = s3c2440_rtc_resume,
};
static int __init s3c2440_rtc_init(void)
{
printk('@@@@@@@@@@@@@@@@@@@@@@ngzliu s3c2440_rtc_init()n@@@@@@@@@@@@@@@@@@@@@@@@n');
return driver_register(&s3c2440_rtcdrv);
}
static void __exit s3c2440_rtc_exit(void)
{
printk('@@@@@@@@@@@@@@@@@@@@@@ngzliu s3c2440_rtc_exit()n@@@@@@@@@@@@@@@@@@@@@@@@n');
driver_unregister(&s3c2440_rtcdrv);
}
module_init(s3c2440_rtc_init);
module_exit(s3c2440_rtc_exit);
MODULE_DESCRIPTION('S3C2440 RTC Driver');
MODULE_AUTHOR('gzLiu,
MODULE_LICENSE('GPL');
(2)编译成模块形式,加载没问题,卸载时出现如下问题:
(3)经检查源码,发现问题处在上面源码中580行,注释掉就好了。
平台设备驱动 -- 相关函数及结构体
文件 drivers/base/platform.c
/**
* platform_get_irq - get an IRQ for a device
上一篇:S3C2440 触摸屏驱动(针对Android版)
下一篇:S3C2440 Linux 触摸屏驱动
推荐阅读最新更新时间:2024-11-09 23:13
设计资源 培训 开发板 精华推荐
- DC1528A,使用 LTC5582IDD、40MHz 至 6GHz RMS 检波器的演示板
- AM1D-4815DH30-RZ ±15V 1 瓦 DC-DC 转换器的典型应用
- 使用 MaxLinear, Inc 的 AS1117 的参考设计
- T12 Project
- LTC2924,使用停机引脚的四个电源排序器
- LTC1871、2.5V 至 3.3V 输入、5.0V/2A 输出升压转换器
- LTC2378-18、18 位、1Msps、低功耗 SAR ADC 的典型应用电路
- NUCLEO-F042K6,STM32 Nucleo-32开发板,带STM32F042K6T6 MCU,支持Arduino连接
- 使用 Analog Devices 的 LTC1458LISW 的参考设计
- 用于 MCU 系统负载感应的 NCP300HSN18T1 1.8V 电压检测器的典型应用
- 如何加快你的FPGA设计步伐
- 借助 TI 工业应用参考设计,加快产品上市时间
- 下载汽车电气化精品文章,赢【体脂秤、罗技鼠标、手持风扇】,开启MPS汽车技术进阶之旅!
- 提交创意【免费赢取600元DIY物料】,参赛冲击万元大奖!2022得捷创新设计大赛火热报名中
- 有奖直播已结束【如何利用 TI MSPM0 汽车微控制器提高检测和控制性能】
- 看这里!发表个人原创就有机会获得E金币啦~~
- Silicon Labs BG22-EK4108A 开发套件 用科技连接未来 申请进行时!
- ADI有奖下载活动之19:ADI可编程逻辑控制器(PLC)解决方案(更新版)
- 关注 PI 最新 SCALE-iDriver IC产品系列 答题有好礼!