无敌大黄蜂

为at91sam9260ek降频

0
阅读(38522)

为ARM降频,着手点是AT公司提供的bootstrap。需要修改的地方是D:\Bootstrap-v1.8\board\at91sam9260ek\nandflash/at91sam9260ek.h  中

#define PLLA_SETTINGS 0x2030BF09

说说它的含义吧。其实它就是对CKGR_PLLAR寄存器的初始值,也就是它决定了PLLA的

频率,相应决定了masterClock

看PLLAR寄存器的定义

masterClock =[(mainClock/DIVA)*(MULA+1)]/2        mainClock 就是外部晶振频率。

比如我做的项目外部晶振是18.432MHZ,0x2030BF09 就是

masterClock=[(18.432/9)(48+1)]/2=50.176MHZ   就把以前100M降到近50M了。

但是降完频以后你会发现系统时钟也相应慢了。

其实这也是有原因的,因为linux系统时钟是通过计数“滴答”来计时的。它先从硬件时钟读取当前时间,然后通过PIT计数器每10ms计一个数,一个重要的宏LATCH,linux用宏LATCH定义写到PIT计数器中的初值,它定义在include/linux/jiffies.h中,

 #define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */

HZ在ARM中是100,at91sam9260的PIT的时钟是masterClock/16  。

那就可以计算CLOCK_TICK_RATE 的值了。

((CLOCK_TICK_RATE + 100/2) / 100)/(50.176M/16)=10ms

得出CLOCK_TICK_RATE =3135950.

CLOCK_TICK_RATE 定义在 include/asm-arm/atch-at91sam9200/timex.h中

#define CLOCK_TICK_RATE  (AT91SAM9_MASTER_CLOCK/16)

把这个定义直接改为

#define CLOCK_TICK_RATE 3135950

重新编译内核,看时钟正常了吧!!

 

使用的是linux-2.6.20