为at91sam9260ek降频
0赞为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
