2010年10月28日 星期四

嵌入式Linux系统移植 – RTC

移植步骤:
将前面生成的内核加载到开发板中的时候,我们可以发现以下的内容:
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
TCP cubic registered
NET: Registered protocol family 1
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
IP-Config: Complete:
device=eth0, addr=10.12.33.38, mask=255.255.255.0, gw=10.12.33.254,
红色字体部分表示S3C2410的RTC支持已经在kernel中,但是没有将rtc device加入SMDK2410 targetboard的device列表中,所以我们需要将RTC加入初始化的设备列表中。
修改文件arch/arm/mach-s3c2410/mach-smdk2410.c,在数组smdk2410_devices[]中添加&s3c_device_rtc:
rookiesean@rookiesean-desktop:~/workspace/linux-2.6.23.8$ cd arch/arm/mach-s3c2410/
rookiesean@rookiesean-desktop:~/workspace/linux-2.6.23.8/arch/arm/mach-s3c2410$ vim 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, // sean chi 20Aug2010, added.
};
static void __init smdk2410_map_io(void)
{
s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));
重新编译内核后,加载内核到开发板,发现以下内容:
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
…………
NET: Registered protocol family 1
s3c2410-rtc s3c2410-rtc: hctosys: invalid date/time
IP-Config: Complete:
device=eth0, addr=10.12.33.38, mask=255.255.255.0, gw=10.12.33.254,
以上信息表示RTC设备已经初始化成功。红色字体问题表示从硬件时钟(hc)处读到的时间转换到系统时钟(sys)的过程发生错误,硬件时钟传递的 时间参数是一个不合法的时间参数(invalid date/time)。从内核函数int rtc_valid_tm(struct rtc_time *tm),可以看出,当year小于1970时,认为是时间 invalid,函数返回-EINVAL。
/*
* Does the rtc_time represent a valid date/time?
*/
int rtc_valid_tm(struct rtc_time *tm)
{
if (tm->tm_year < 70
|| ((unsigned)tm->tm_mon) >= 12
|| tm->tm_mday < 1
|| tm->tm_mday > rtc_month_days(tm->tm_mon, tm->tm_year + 1900)
|| ((unsigned)tm->tm_hour) >= 24
|| ((unsigned)tm->tm_min) >= 60
|| ((unsigned)tm->tm_sec) >= 60)
return -EINVAL;
return 0;
}
从根文件系统上运行hwclock可以看到,hwclock的初始值是小于1970的,也验证了上面所说出现invalid date/time的原因:
[root@armsys /]# hwclock
Wed Dec 31 23:59:59 1969 0.000000 seconds
所以我们需要设置正确的系统时间,然后再把系统时间传递给RTC:
[root@armsys /]# date 082013342010.0
Fri Aug 20 13:34:00 UTC 2010
[root@armsys /]# hwclock -w
[root@armsys /]# hwclock
Fri Aug 20 13:34:42 2010 0.000000 seconds
为了使系统时间和RTC时间同步,可以在初始化文件中添加命令
hwclock –s
使每次开机时读取RTC时间,并同步给系统时间。
[root@armsys /]# vi /etc/init.d/rcS
#! /bin/sh
echo “Processing etc/init.d/rc.s”
#hostname ${HOSTNAME}
echo “Mount all”
/bin/mount -a
echo “Start mdev….”
/bin/echo /sbin/mdev >proc/sys/kernel/hotplug
mdev -s
echo “Set RTC…”
/sbin/hwclock -s
echo “******************************************”
echo ” rookiesean’s rootfs ”
echo ” 8Aug2010 ”
echo “******************************************”
echo
搞定。

引用自
http://blog.rookiesean.com/2010/08/29/%E5%B5%8C%E5%85%A5%E5%BC%8Flinux%E7%B3%BB%E7%BB%9F%E7%A7%BB%E6%A4%8D-rtc/

這個網站裡的東西都可以參考
http://blog.rookiesean.com/

沒有留言:

張貼留言