原本以为选中 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
|
---
事实上, 这个driver(drivers/char/s3c2410-rtc.c)是错误的,
与这个driver对应的header文件regs-rtc.h 里面
#define S3C2410_RTCREG(x) (x) 对应这个driver就是错误, 实际访问的寄存器地址根本没有加上虚拟地址, 仅仅是偏移,运行的时候一下子就NULL pointer ,什么非法访问 0x00000040 这个地址了。
Note: 对于 2410的RTC chip ,有两个driver : drivers/char/s3c2410-rtc.c 和 drivers/rtc/rtc-s3c.c
后者才适合我们的jk2410的RTC 芯片,并且并没有作为misc设备(传统的RTC 的设备号是 ( 10,135 )) ,
而drivers/rtc/rtc-s3c.c 的主设备号应该是kernel动态分配的,我的板子cat /proc/devices 得到的信息是(254,0)
而且 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就自己计时了,除非电池没电了。
板子第一次启动后,
假如设置系统时间为2007年10月2日,13:49分,可以这样设置
1> date 100213492007
2> hwclock –w
如果没有出错, 就已经把2007年10月2日,13:49分 写入RTC chip了,
测试:
反复执行hwclock ,看看是否时间在变化。
3> 重启板子, 测试, 执行hwclock ,看看时间是否在流逝 。