S3C2440 rtc 平台设备驱动 卸载问题 oops

发布者:Haifeeng最新更新时间:2024-06-13 来源: elecfans关键字:S3C2440  rtc  oops 手机看文章 扫描二维码
随时随地手机看文章
  •     {  

  •         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行,注释掉就好了。

    平台设备驱动 -- 相关函数及结构体

    1. 文件 drivers/base/platform.c  

    2. /** 

    3.  *    platform_get_irq - get an IRQ for a device 

    [1] [2] [3] [4] [5] [6] [7] [8] [9]
    关键字:S3C2440  rtc  oops 引用地址:S3C2440 rtc 平台设备驱动 卸载问题 oops

    上一篇:S3C2440 触摸屏驱动(针对Android版)
    下一篇:S3C2440 Linux 触摸屏驱动

    推荐阅读最新更新时间:2024-11-09 23:13

    万物互联时代,大普通信RTC芯片乘风来了
    集微网报道,在5G、大数据、云计算等技术带动下,万物互联时代正在加速到来,时间信息成为智能万物的必需品,精准的时间提供了基于时间信息的应用和服务。 大普通信RTC产品线总监刘炜表示,RTC芯片在整个时钟链路中是一个非常重要的环节,万物互联的时代催生了各行各业对时间精度和记录的需求,也让RTC芯片有了新的定义和海量需求。 需求与供给缺口较大,新晋品牌迎补位机遇 刘炜称,当前RTC芯片行业市场呈现出高速增长的趋势,一些原本不会用到RTC芯片的应用领域,正逐渐呈现出强劲的需求预期。例如,在热水器、壁挂炉、冰箱、抽油烟机等智能家电领域,增加时间信息可以满足消费者对于品质的深度体验要求,它们作为智能家电的终端,需要也必须更“Smart”。R
    [手机便携]
    万物互联时代,大普通信<font color='red'>RTC</font>芯片乘风来了
    s3c2440的A/D转换应用
    A/D转换,又称为模数转换,是将模拟信号转换为计算机能够处理的数字信号。s3c2440集成了8通道10位CMOS A/D转换器。 对于s3c2440来说,实现A/D转换比较简单,主要应用的是ADC控制寄存器ADCCON和ADC转换数据寄存器ADCDAT0。寄存器ADCDAT0的低10位用于存储A/D转换后的数据。寄存器ADCCON的第15位用于标识A/D转换是否结束。第14位用于使能是否进行预分频,而第6位到第13位则存储的是预分频数值,因为A/D转换的速度不能太快,所以要通过预分频处理才可以得到正确的A/D转换速度,如我们想要得到A/D转换频率为1MHz,则预分频的值应为49。第3位到第5位表示的是A/D转换的通道选
    [单片机]
    <font color='red'>s3c2440</font>的A/D转换应用
    S3C2440的ADC程序
    使用ADC只需要对相应的寄存器进行配置,然后启动ADC即可,启动ADC有两种方法: 1. 手动完成启动。 2. 读取上一次转换结果后自动启动下一次ADC转换。 得到ADC是否转换完成的信息的方法有两种方法: 1. 查询法:查询寄存器ADCCON的第15位(ADC的转换完成位)。 2. 中断法:转换完成后,产生ADC中断信号。 当不使用触摸屏时,与ADC相关的寄存器主要有据寄存器ADCCON和寄存器ADCDAT0。寄存器ADCCON主要用于选择ADC的启动方式、设置ADC转换时钟以及ADC转换结束标志位等。寄存器ADCDAT0中存放了ADC抓换所得的结果,ADC转换结束后,可以直接读改寄存器的值来得到转换结果。 注意:普通
    [单片机]
    stm32 rtc 晶振问题解决
    这几天在鼓捣stm32的rtc,先焊了一个板子(从stm家园, www.stmsky.com 弄了几块stmsky001pcb板),试了一下rtc显示时间的程序,ok,兴奋呀! 第二天便有网友在移植rtt系统说板子上的rtc不能起振,感觉很奇怪,一样的板子怎么可能会出现这种情况,赶忙我又试了一下我的板子,奇怪的是,昨天还好好的,今天也是不行了。不能起振了。找原因吧。 于是没有多想,肯定是硬件的原因,因为程序昨天跑的好好的。无外乎 晶振和电容,电容我用的10pf,晶振6p的。什么原因呢? 网友dami也和我一样的板子 他的一直ok 所以问了一下,人家晶振随便从别的板子上搞得就ok,我的就是不行,换了20pf 30pf 电容均不行
    [单片机]
    STM32复习笔记(十二)RTC实时时钟(低功耗待机唤醒)
    一、RTC实时时钟特征与原理: ★ RTC (Real Time Clock):实时时钟 ★ RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。 ★ RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。 (1)RTC特征: (2)RTC工作原理框图: (3)RTC由两部分组成: APB1接口:用来和APB1总
    [单片机]
    STM32复习笔记(十二)<font color='red'>RTC</font>实时时钟(低功耗待机唤醒)
    STM32单片机中RTC的秒中断的原理解析
    RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的。 该文主要讲述关于RTC的秒中断功能,这个功能类似SysTIck系统滴答的功能。RTC秒中断功能其实是每计数一次就中断一次。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。 本文章提供的实例工程,其实验效果是: 主函数间隔0.5秒LED变化一次; 秒中断一次打印数据“RTC Sec.。.”; 也就是LED变化一次,串口打印一次数据“RTC Sec.。.” 扩展部分的功能RTC计数:可以实现RTC闹钟,本文
    [单片机]
    STM32单片机中<font color='red'>RTC</font>的秒中断的原理解析
    松翰单片机 RTC 应用注意
    有部分 SN 单片机型号的芯片,内部带有 RTC 功能(实时时钟),它为双时钟芯片的一大特色!也为需要使用 RTC 的项目提供了方便. 我曾经使用过 SN8P2501A/B,SN8P2308,SN8P2612/13(早期版本),sn8p2614等芯片的 RTC 功能,效果都不错. 应用 RTC 需要注意的问题: (1).代码选项必须选择:IHRC_RTC.同时,硬件上在芯片接外部晶体的位置接上 32768HZ 的时钟晶体,精度尽量使用好一些的.推荐 5ppm 的.不要使用便宜货或者玩具里使用的晶体品种. (2).实时时钟大多占用定时器 T0 的资源,必须置位 T0M 的 T0TB 位(T0M.0=1).无需对 T0C 赋值.记得一定
    [单片机]
    基于Linux环境下串口通信的应用设计
      0 引言   数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。   1 硬件连接   s3c2440 是三星公司生产的基于ARM9 核的处理器,采用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的
    [单片机]
    基于Linux环境下串口通信的应用设计
    小广播
    设计资源 培训 开发板 精华推荐

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

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

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

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