Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638716
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2007-11-02 18:08:37

移植smdk2410rtc驱动到jk2410开发板碰到的问题的解决:

原本以为选中 Device Driver –> Character Device -> S3C2410 RTC Driver OK 了, 实际上,根本不行, 因为这个文件

Arch/arm/mach/mach-smdk2410.c

static struct platform_device *smdk2410_devices[] __initdata = {

       &s3c_device_usb,

       &s3c_device_lcd,

       &s3c_device_wdt,

       &s3c_device_i2c,

       &s3c_device_iis,

       &s3c_device_rtc,  //added by bob     //原本是没有的,

};

如果没有上面的s3c_device_rtc 的话, 即使选中了 [M]Device Driver –> Character Device -> S3C2410 RTC Driver (对应的driver s3c2410-rtc.c ),加载模块的时候, 报错:

# insmod /lib/s3c2410-rtc.ko

S3C2410 RTC, (c) 2004 Simtec Electronics

 init

 platform_driver_register = 0

# kobject_add failed for s3c2410-rtc with -EEXIST, don't try to register things with the same name in the same directory.

> insmod: cannot insert '/lib/s3c2410-rtc.ko': File exists (-1): File exists

 

 

 

 

 

 

 

 

 

 

 


---

事实上, 这个driverdrivers/char/s3c2410-rtc.c)是错误的,

与这个driver对应的header文件regs-rtc.h  里面

#define S3C2410_RTCREG(x) (x)  对应这个driver就是错误, 实际访问的寄存器地址根本没有加上虚拟地址, 仅仅是偏移,运行的时候一下子就NULL pointer ,什么非法访问 0x00000040 这个地址了。

 

Note 对于 2410RTC chip ,有两个driver drivers/char/s3c2410-rtc.c drivers/rtc/rtc-s3c.c

后者才适合我们的jk2410RTC 芯片,并且并没有作为misc设备(传统的RTC 的设备号是 ( 10,135 ) ,

drivers/rtc/rtc-s3c.c 的主设备号应该是kernel动态分配的,我的板子cat /proc/devices 得到的信息是(2540

而且 hwclock 最先读取的设备文件是 /dev/rtc  busybox里面的hwclock是这样实现的:

static int xopen_rtc(int flags)

{

         int rtc;

 

         if (!rtcname) {

                   rtc = open("/dev/rtc", flags);

                   if (rtc >= 0)

                            return rtc;

                   rtc = open("/dev/rtc0", flags);

                   if (rtc >= 0)

                            return rtc;

                   rtcname = "/dev/misc/rtc";

         }

         return xopen(rtcname, flags);

}

 

最终的解决办法

1>     修改

Arch/arm/mach/mach-smdk2410.c

static struct platform_device *smdk2410_devices[] __initdata = {

       &s3c_device_usb,

       &s3c_device_lcd,

       &s3c_device_wdt,

       &s3c_device_i2c,

       &s3c_device_iis,

       &s3c_device_rtc,  //added by bob     //原本是没有的,

};

2>     regs-rtc.h 保持原样不动,

3>     make menuconfig

Device Driver –>Real Time Clock -> [*]RTC Class

其他的不动,

再选中 [*] Samsung S3C Series SoC RTC

即可。

 

确保不要选中

Device Driver –> Character Device -> S3C2410 RTC Driver (对应的driver s3c2410-rtc.c

这个是错的,废弃了的

 

4>     在根文件系统的 做的动作, pc linux上的 /etc/localtime 复制到 板子的 /etc/下面即可

5>     mknod /dev/rtc c 254 0

 

 

下面的动作只需做一次 ,一旦写入RTC chip后, chip就自己计时了,除非电池没电了。

板子第一次启动后,

假如设置系统时间为20071021349分,可以这样设置

1>     date 100213492007

2>     hwclock –w

如果没有出错, 就已经把20071021349 写入RTC chip了,

测试:

反复执行hwclock ,看看是否时间在变化。

 

3> 重启板子, 测试, 执行hwclock  ,看看时间是否在流逝

 

阅读(3447) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

帆锅2008-08-29 15:39:01

大哥 你说的 Device Driver –>Real Time Clock -> [*]RTC Class 其他的不动, 再选中 [*] Samsung S3C Series SoC RTC 即可。 为什么我的内核配置里没有Device Driver –>Real Time Clock这个选项啊 在线等啊 一定要回答啊!!!!

帆锅2008-08-29 15:37:19

[root@FriendlyARM /]# hwclock -w hwclock: Could not set the RTC time: Unknown error 515 [root@FriendlyARM /]# hwclock hwclock: Could not read time from RTC: Unknown error 515