移植smdk2410的rtc驱动到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  ,看看时间是否在流逝

原创文章 13 获赞 5 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cgq081616/article/details/5497218
今日推荐