Start porting kernel 2.6.27.8 to qq2440 (5) -- clock issue

      把kernel boot起来后,然后重新编译了kernel,添加网络支持,因为2.6.27.8里面的网卡cs8900的驱动还有待修改,所以只好用usbnet,用usbdevice来模拟网卡,同时给kernel加上rootfs on nfs 支持。在PC几上建好qq2440_rootfs的目录,把基本的lib复制过去,然后编译了busybox,也复制过去。重新启动开发板,设置好命令行参数后,系统已经能正常启动了,进入到busybox的命令行。
      试了几个命令后,发现系统有点缓慢,插入u盘后,很长时间,才能显示u盘的信息,但是系统的load average也不高,本来没在意这个现象,后来观察了下/proc/interrupts,发现timer tick明显偏少,估计了一下,一秒种才20-30次,但是config里面的HZ明明是200啊。执行了一下sleep 1,居然花了差不多8秒种,很明显,系统的时钟出了问题。。
      s3c2440的时钟最开始由12M的晶振产生,由MPLL合成405M的clock送给ARM核,同时产生其他的频率供给其它部件。linux使用了s3c2440的timer 4产生tick 中断。timer 4的输入来自于PCLK。PCLK的频率应该是40.625 MHz,这个频率应该是稳定的,因为UART也是使用这个频率分频产生波特率的,现在UART正常工作,PCKL应该没有问题。那么就是Timer 4的配置可能有问题了。看了下arch/plat-s3c24xx/timer.c里面的timer的初始化过程,主要是分频的设置和count down value的设置,反复研究啦下,也没有问题。。。。
      后来实在没辙了,启动系统后,写了个小程序,在user space里面读关于timer配置的寄存器,才发现出了问题。TCFG1,就是分频的设置,timer 4应该设成1/2, 实际却是1/16,才造成时间相差了8倍。问题是time.c里面的设置是没有问题的。后来搜索了一下代码,才发现,在arch/plat-s3c24xx/pwm-clock.c里面初始化了5个定时器,包括timer4,也就是说timer4又被设置了一遍,覆盖了系统之前的设置,后来在pwm里面去掉了timer4,系统终于恢复了正常。

你可能感兴趣的:(Start porting kernel 2.6.27.8 to qq2440 (5) -- clock issue)