一直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提供时钟的 请注意