原帖:http://topic.csdn.net/u/20081125/17/f47176f4-b310-4ae0-b232-ad972fc870e5.html
rssn_net:
我为S3C2410平台成功移植了2.6.27内核,busybox和文件系统也都做好了,可是我发现系统中所有与时间有关的操作都不正确,延时大约慢8倍,例如,运行 “sleep 1s” 命令,时间为8秒,ping命令的时间间隔也为8秒
我估计是时钟参数不正确,但不知道应该如何修改,请朋友们指正,谢谢!
有没有人遇到同样的问题啊?这个问题实在是困扰我很长时间了~~~
-----------------------------------------------------------------
回复1:我觉得这个问题是你的bootloader 出了问题,你到bootloader源码里找找 设置时钟的地方去检查一下 ,或许你就发现问题所以啦
回复2:请问 楼主的问题解决了没有?我也遇到同样的问题啊。我怀疑不是Bootloader那里设置有什么错误,因为同一个Bootloader我引导以前的内核linux2.6.25没有任何问题。而且新的内核2.6.27我跑另一个at91sam9260的板子一点问题都没有,怀疑针对2410和2440的有部分时钟代码作了修改。关键还是那个时钟心跳tick()跑的很慢,定时器4每次产生的中断好像都变慢了。
回复3:你的s3c2410的板子有没有其他的系统,比如wince,如果有的话看看里面的时钟是否也会有这样的问题,
如果有的话,则应该是硬件方面的问题了,
如果没有的话,应该是你的linux内核中的RTC驱动可能不是很正确,看看这部分的代码。
------------------------------------------------------------------
问题分析与解决:
首先,排除Bootloader的可能,我把vivi重新编译了一遍,vivi中的sleep()延时很准确,我认为系统时钟的参数不可能是从vivi继承过来的,因为所有设备在Linux内核启动时都要初始化一次,所有参数都要重新设置,所以不可能是Bootloader的问题。
其次,RTC驱动没有问题,RTC 跟 System Clock 是不同的,我的RTC时钟走得很准,而且每次内核启动都会自动读取RTC时间,将其配置为系统当前时间,只是之后的所有时间都慢了8倍。
前天在一位朋友的帮助下,问题得到解决,方法如下:
问题出在内核对pwm定时器的初始化上,源文件linux/arch/arm/plat-s3c24xx/time.c 存在bug,找到:
/* configure clock tick*/ timer_usec_ticks= timer_mask_usec_ticks(6, pclk);
tcfg1&= ~S3C2410_TCFG1_MUX4_MASK;
tcfg1|= S3C2410_TCFG1_MUX4_DIV2;
tcfg0&= ~S3C2410_TCFG_PRESCALER1_MASK;
tcfg0|= ((6 - 1)/ 2)<< S3C2410_TCFG_PRESCALER1_SHIFT;
tcnt= (pclk/ 6)/ HZ;
}
将 tcnt = (pclk / 6) / HZ; 改为 tcnt = (pclk / 48) / HZ;