QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5761|回复: 19

把rtc编译到arm linux,结果hwclock出错

[复制链接]
发表于 2006-4-18 23:11:10 | 显示全部楼层 |阅读模式
如题,出错信息如下:
hwclock -w
Unable to handle kernel NULL pointer dereference at virtual address 00000070
pgd = c0e80000
[00000070] *pgd=00e85001, *pmd = 00e85001, *pte = 00000000, *ppte = 00000000
Internal error: Oops: 807
CPU: 0
pc : [<c00abbb8>]    lr : [<0000000c>]    Not tainted
sp : c0e87ed4  ip : 00000012  fp : 0000006a
r10: 401d7c98  r9 : c0e86000  r8 : 00000004
r7 : 00000004  r6 : 00000012  r5 : 00000070  r4 : bffffdc8
r3 : 80000093  r2 : 0000000b  r1 : 0000000f  r0 : 00000016
Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32  Segment user
Control: C000717F  Table: 00E80000  DAC: 00000015
Process hwclock (pid: 62, stack limit = 0xc0e86390)
Stack: (0xc0e87ed4 to 0xc0e88000)
7ec0:                                              00000000 c0e87f0c 00000000
7ee0: c0211264 c00393bc 00000000 0000000f 0000000c 00000016 00000012 00000004
7f00: 0000000f 0000000c 00000016 00000012 00000003 0000006a 00000002 0000006b
7f20: 00000000 401c5000 c0010620 c0010620 00000000 c00352bc c0e7f714 fffffffe
7f40: c0eade60 ffffffff c0e86000 401c5cf2 00000000 c001fc1c c0e86000 c0e87fec
7f60: 401c5cf2 c0e87fb0 00000007 c0f20be0 4024700a 00000003 bffffdc8 ffffffe7
7f80: c0e86000 401d7c98 00000000 c00532f0 00000003 bffffdc8 00000000 00000036
7fa0: c001a604 c001a460 00000003 c001a3fc 00000003 4024700a bffffdc8 00000000
7fc0: 00000003 bffffdc8 00000000 00000002 00000002 0000cf08 401d7c98 0008d224
7fe0: 401854c0 bffffdc4 0005fb1c 401854c4 60000010 00000003 00000000 00002001
Backtrace: invalid frame pointer
Code: e121f003 ea00007c e3a05070 e3a0200b (e5c52000)
Segmentation fault
 楼主| 发表于 2006-4-18 23:19:56 | 显示全部楼层
发现驱动已经装载,应该跟硬件无关吧?
在这里请大家指条明道,thx
回复

使用道具 举报

 楼主| 发表于 2006-4-20 22:20:01 | 显示全部楼层
怎么没人理我呀,请问一下用过arm开发板的同志是怎么用hwclock的?
回复

使用道具 举报

发表于 2006-4-21 15:36:31 | 显示全部楼层
是用什么硬件的系统?
如果是在2410的系统里出现这个问题,
那就是hwclock的问题了 - 修改hwclock可以解决.
主要是年份表示问题, RTC驱动输入输出的是完整的年份,而hwclock需要的只是2位.
回复

使用道具 举报

 楼主| 发表于 2006-4-22 21:31:35 | 显示全部楼层
因为我现在用的是ep9312,是自己开发的,还不确定是硬件问题,还是软件问题。
不过软件问题的可能性极大,因为这块板是用ds1337时钟芯片的,看了cirrus开发板所附的内核也没发现有对ds1337的支持,很纳闷,也没有用过cirrus的开发板,不知它的开发板是怎么测试ds1337芯片的。上网也查看说是用什么脚本,但是把源码翻了个遍也没看着,倒是看到有对时钟初始化的代码,暂时还未有时间去试。
对linux内核rtc的支持封装也不甚了解,大致有这么个看法,busybox的hwclock用rtc接口,
而rtc是依赖time的实现,但是我看到所附内核有对time的实现,只是不知这个time是不是另外的一个接口,因为实际上ds1337是跑i2c总线的,但是这个版本并不支持i2c,这个时钟实在是牵涉太多东西了。事实上像ds1337这样的一个应用,一般只是用来初始化一下时间就行了,大概只要读写功能,应该写个小程序就行了,只要不要做成系统接口就容易得多。不过要是写个小程序会不会受操作系统对硬件的保护限制,或者说应该放在什么地方去做(当然要有一定可用性,至少可以人机界面,可以方便设置时间)
回复

使用道具 举报

 楼主| 发表于 2006-4-22 21:35:51 | 显示全部楼层
[quote:d339510065="linuxwbwu"]是用什么硬件的系统?
如果是在2410的系统里出现这个问题,
那就是hwclock的问题了 - 修改hwclock可以解决.
主要是年份表示问题, RTC驱动输入输出的是完整的年份,而hwclock需要的只是2位.[/quote]
你的hwclock版本这么怪?我这边用也可以是4位年份啊
回复

使用道具 举报

发表于 2006-4-26 13:28:05 | 显示全部楼层
这是我改过的读取和写入RTC的函数,可参考!
我以前碰到过这个问题,就这样搞定的!

static time_t read_rtc(int utc)
{
        int rtc;
        struct tm tm;
        char *oldtz = 0;
        time_t t = 0;

        if (( rtc = open ( "/dev/rtc", O_RDONLY )) < 0 ) {
                if (( rtc = open ( "/dev/misc/rtc", O_RDONLY )) < 0 )
                        bb_perror_msg_and_die ( "Could not access RTC" );
        }
        memset ( &tm, 0, sizeof( struct tm ));
        if ( ioctl ( rtc, RTC_RD_TIME, &tm ) < 0 )
                bb_perror_msg_and_die ( "Could not read time from RTC" );
        tm. tm_isdst = -1; // not known
       
        printf("year:%i, month:%i, date:%i\n",tm.tm_year,tm.tm_mon,tm.tm_mday);
        close ( rtc );

        if ( utc ) {
                oldtz = getenv ( "TZ" );
                setenv ( "TZ", "UTC 0", 1 );
                tzset ( );
        }
        //add by wenbin on 2005/10/20
        //-------------------------------------------
        if (tm.tm_year > 1900)
                tm.tm_year -= 1900;
        printf("year:%i, month:%i, date:%i\n",tm.tm_year,tm.tm_mon,tm.tm_mday);
        //-------------------------------------------
        t = mktime ( &tm );
        if ( utc ) {
                if ( oldtz )
                        setenv ( "TZ", oldtz, 1 );
                else
                        unsetenv ( "TZ" );
                tzset ( );
        }
        return t;
}

static void write_rtc(time_t t, int utc)
{
        int rtc;
        struct tm tm;

        if (( rtc = open ( "/dev/rtc", O_WRONLY )) < 0 ) {
                if (( rtc = open ( "/dev/misc/rtc", O_WRONLY )) < 0 )
                        bb_perror_msg_and_die ( "Could not access RTC" );
        }
       
        printf("year:%i, month:%i, date:%i\n",t.year,t.mon,t.mday);
        printf("hour:%i, mins:%i, sec:%i\n",t.hour,t.min,t.sec);
       
        tm = *( utc ? gmtime ( &t ) : localtime ( &t ));
        //Add by wenbin on 2005/10/20
        //-----------------------------------------------
        if (tm.tm_year<1900)
                tm.tm_year += 1900;
        //-----------------------------------------------
        tm. tm_isdst = 0;

        if ( ioctl ( rtc, RTC_SET_TIME, &tm ) < 0 )
                bb_perror_msg_and_die ( "Could not set the RTC time" );

        close ( rtc );
}
回复

使用道具 举报

发表于 2006-4-26 15:49:42 | 显示全部楼层
查看src/drivers/char/rtc*,那些rtc的驱动程序源码。
分析驱动,会发行编写个rtc的用户程序很容易的:)

我的blog有rtc介绍
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:27:32 | 显示全部楼层
我用的是2.4版本的内核,我上网找了些支持ep9312 i2c总线及ds1337的移植过来的,问题可能出在没有实现rtc设备文件操作部分,所以hwclock出错,现找了个2.6.13版本的来试。
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:30:19 | 显示全部楼层
还有rtc.c好像是写cmos的,应该适用pc机的,对嵌入式可能还需要另外实现,我一直以为只要有ep9312 i2c总线及ds1337就行了.原来是错的
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:33:54 | 显示全部楼层
to linuxwbwu:
哈,你的程序应该属应用程序范围的吧?
不管怎么说,先说声谢谢了。
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:36:39 | 显示全部楼层
[quote:fc1c76fe6a="sandahrow"][quote:fc1c76fe6a="linuxwbwu"]是用什么硬件的系统?
如果是在2410的系统里出现这个问题,
那就是hwclock的问题了 - 修改hwclock可以解决.
主要是年份表示问题, RTC驱动输入输出的是完整的年份,而hwclock需要的只是2位.[/quote]
你的hwclock版本这么怪?我这边用也可以是4位年份啊[/quote]

前几天发现busybox是有个支持长日期的编译开关,不知是不是跟这个有关。
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:41:59 | 显示全部楼层
[quote:ef6e41202c="good02xaut"]查看src/drivers/char/rtc*,那些rtc的驱动程序源码。
分析驱动,会发行编写个rtc的用户程序很容易的:)

我的blog有rtc介绍[/quote]

对,说实在的,其实驱程还是很容易看懂的,每种类型的驱程框架都差不多。比我平时工作写的应用软件容易得多,至少从代码量来看,是很少的。但是写驱程关键是要看硬件的技术文档呀,好像也没你说的这么容易吧?
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:50:08 | 显示全部楼层
to linuxwbwu
linux-2.4.21/Documentation/rtc.txt
这里也有类似你的程序的代码。
回复

使用道具 举报

 楼主| 发表于 2006-4-26 21:53:18 | 显示全部楼层
娃哈哈,灌了好多水呀。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-29 11:09 , Processed in 0.045943 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表