分析uboot移植第一阶段的各种代码

2023-06-08  

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。