一直uboot的过程:
1. 选择是什么架构的单片机或者平台 在总的make file 里面
2. 更改时钟配置
3. 更改串口相关的时钟配置
4. 选用适当的norflash
5.选用适当的nandflash
1. 100ask24x0_config : unconfig
@(MKCONFIG)(MKCONFIG)(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
其中 第一个参数 ARM 表示的是架构是什么架构 我们这里的架构是ARM架构
第二个参数是 什么CPU 这里是 Arm920t的CPU
第三个参数是什么开发板:这里是 100ask24x0的开发板
第四个参数是Vendor: 这里是没有vendor
第五个参数是它属于什么SOC单片机的类型:这里是S3c24x0
2. 时钟的配置问题
在100ask24x0.c board_init中
两个结构体S3C24X0_CLOCK_POWER 这个是我们需要用的结构体 此结构体在S3C24X0.h 里面定义了
其中CLKDIVN是表示分频。我们设置分频是FLCK 为400MHz
S3C2440_CLKDIV 是0x05 我们可以得到 FCLK :HCLK :FCLK = 1:4:8
假如 FCLK是400MHZ 那么HCLK的速度是100Mhz FCLK的频率是50Mhz
LOCKTIME:是启动时间延迟 我们选用0xFFFFFFFF
MPLLCON: 我们选择400MHz
UPLL 我们选择 48MHz
gd->bd->bi_boot_params = 0x30000100 这里面存储的是我们自己的uboot 存的参数
那么我们此时的时钟频率是
FCLK = 400Mhz
HCLK = 100Mhz
PCLK = 50Mhz
2. 下面开始看get_HCLK 函数
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
if(gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
else
{
clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;
switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK)
{
case S3C2440_CLKDIVN_HDIVN_1:
hdiv = 1;
break;
case S3C2440_CLKDIVN_HDIVN_2:
hdiv = 2;
break;
case S3C2440_CLKDIVN_HDIVN_4_8:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
break;
case S3C2440_CLKDIVN_HDIVN_3_6:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF)? 6 : 3;
break;
}
return get_FCLK()/hdiv;
}
}
clkdiv = clk_power->CLKDIVN; camdiv = clk_power->CAMDIVN; clkdiv = 0x05 camdiv = 0; 所以说
clkdiv & S3C2440_CLKDIVN_HDIVN_MASK(3<<1) == 4 所以说 在S3C2440_CLKDIVN_HDIVN_4_8 hdiv = 4; 那么Hlck = 100Mhz
在get_PCLK 函数
ulong get_PCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
if(gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
else
{
clkdiv = clk_power->CLKDIVN;
clkdiv = clk_power->CAMDIVN;
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK)
{
case S3C2440_CLKDIVN_HDIVN_1:
hdiv = 1;
break;
case S3C2440_CLKDIVN_HDIVN_2:
hdiv = 2;
break;
case S3C2440_CLKDIVN_HDIVN_4_8:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF)? 8 : 4;
break;
case S3C2440_CLKDIVN_HDIVN_3_6:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF)? 6 : 3;
break;
}
return get_FCLK()/hdiv/((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2 : 1);
}
}
得到 PLCK = 50Mhz。
这几个函数是给USART提供时钟的 请注意
相关文章